Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
2 changes: 1 addition & 1 deletion Directory.Packages.props
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@
<PackageVersion Include="McMaster.NETCore.Plugins" Version="1.4.0" />
<PackageVersion Include="Argu" Version="6.2.5" />
<PackageVersion Include="Glob" Version="1.1.9" />
<PackageVersion Include="Ionide.ProjInfo.ProjectSystem" Version="0.71.0" />
<PackageVersion Include="Ionide.ProjInfo.ProjectSystem" Version="0.72.0" /> <!-- Older versions of NuGet.ProjectModel.JsonUtility use Newtonsoft and this package so happens to depend on newtonsoft too-->
<PackageVersion Include="Microsoft.Build" Version="$(MsBuildPackageVersion)" ExcludeAssets="runtime" />
<PackageVersion Include="Microsoft.Build.Framework" Version="$(MsBuildPackageVersion)" ExcludeAssets="runtime" />
<PackageVersion Include="Microsoft.Build.Tasks.Core" Version="$(MsBuildPackageVersion)" ExcludeAssets="runtime" />
Expand Down
20 changes: 14 additions & 6 deletions src/FSharp.Analyzers.SDK/FSharp.Analyzers.SDK.Client.fs
Original file line number Diff line number Diff line change
Expand Up @@ -9,9 +9,11 @@ open System.Text.RegularExpressions
open McMaster.NETCore.Plugins
open Microsoft.Extensions.Logging

type AnalyzerName = string

type AnalysisResult =
{
AnalyzerName: string
AnalyzerName: AnalyzerName
Output: Result<Message list, exn>
}

Expand All @@ -20,7 +22,7 @@ module Client =
type RegisteredAnalyzer<'TContext when 'TContext :> Context> =
{
AssemblyPath: string
Name: string
Name: AnalyzerName
Analyzer: Analyzer<'TContext>
ShortDescription: string option
HelpUri: string option
Expand Down Expand Up @@ -135,8 +137,8 @@ type AssemblyLoadStats =
}

type ExcludeInclude =
| ExcludeFilter of (string -> bool)
| IncludeFilter of (string -> bool)
| ExcludeFilter of (AnalyzerName -> bool)
| IncludeFilter of (AnalyzerName -> bool)

type Client<'TAttribute, 'TContext when 'TAttribute :> AnalyzerAttribute and 'TContext :> Context>(logger: ILogger) =
do TASTCollecting.logger <- logger
Expand Down Expand Up @@ -263,8 +265,11 @@ type Client<'TAttribute, 'TContext when 'TAttribute :> AnalyzerAttribute and 'TC
}

member x.RunAnalyzers(ctx: 'TContext) : Async<AnalyzerMessage list> =
x.RunAnalyzers(ctx, fun _ -> true)

member x.RunAnalyzers(ctx: 'TContext, analyzerPredicate: Client.RegisteredAnalyzer<'TContext> -> bool) : Async<AnalyzerMessage list> =
async {
let analyzers = registeredAnalyzers.Values |> Seq.collect id
let analyzers = registeredAnalyzers.Values |> Seq.collect id |> Seq.filter analyzerPredicate

let! messagesPerAnalyzer =
analyzers
Expand Down Expand Up @@ -298,8 +303,11 @@ type Client<'TAttribute, 'TContext when 'TAttribute :> AnalyzerAttribute and 'TC
}

member x.RunAnalyzersSafely(ctx: 'TContext) : Async<AnalysisResult list> =
x.RunAnalyzersSafely(ctx, fun _ -> true)

member x.RunAnalyzersSafely(ctx: 'TContext, analyzerPredicate: Client.RegisteredAnalyzer<'TContext> -> bool) : Async<AnalysisResult list> =
async {
let analyzers = registeredAnalyzers.Values |> Seq.collect id
let analyzers = registeredAnalyzers.Values |> Seq.collect id |> Seq.filter analyzerPredicate

let! results =
analyzers
Expand Down
25 changes: 25 additions & 0 deletions src/FSharp.Analyzers.SDK/FSharp.Analyzers.SDK.Client.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -8,6 +8,16 @@ type AnalysisResult =
Output: Result<Message list, exn>
}

module Client =
type RegisteredAnalyzer<'TContext when 'TContext :> Context> =
{
AssemblyPath: string
Name: string
Analyzer: Analyzer<'TContext>
ShortDescription: string option
HelpUri: string option
}

type AssemblyLoadStats =
{
/// The number of DLLs from which we tried to load analyzers.
Expand Down Expand Up @@ -35,8 +45,23 @@ type Client<'TAttribute, 'TContext when 'TAttribute :> AnalyzerAttribute and 'TC
/// <returns>number of found dlls matching `*Analyzer*.dll` and number of registered analyzers</returns>
member LoadAnalyzers: dir: string * ?excludeInclude: ExcludeInclude -> AssemblyLoadStats
/// <summary>Runs all registered analyzers for given context (file).</summary>
/// <param name="ctx">The context (file) to analyze.</param>
/// <returns>list of messages. Ignores errors from the analyzers</returns>
member RunAnalyzers: ctx: 'TContext -> Async<AnalyzerMessage list>

/// <summary>Runs all registered analyzers for given context (file).</summary>
/// <param name="ctx">The context (file) to analyze.</param>
/// <param name="analyzerPredicate">A predicate function to filter which analyzers to run.</param>
/// <returns>list of messages. Ignores errors from the analyzers</returns>
member RunAnalyzers: ctx: 'TContext * analyzerPredicate: (Client.RegisteredAnalyzer<'TContext> -> bool) -> Async<AnalyzerMessage list>

/// <summary>Runs all registered analyzers for given context (file).</summary>
/// <param name="ctx">The context (file) to analyze.</param>
/// <returns>list of results per analyzer which can either be messages or an exception.</returns>
member RunAnalyzersSafely: ctx: 'TContext -> Async<AnalysisResult list>

/// <summary>Runs all registered analyzers for given context (file).</summary>
/// <param name="ctx">The context (file) to analyze.</param>
/// <param name="analyzerPredicate">A predicate function to filter which analyzers to run.</param>
/// <returns>list of results per analyzer which can either be messages or an exception.</returns>
member RunAnalyzersSafely: ctx: 'TContext * analyzerPredicate: (Client.RegisteredAnalyzer<'TContext> -> bool) -> Async<AnalysisResult list>