Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

WIP - [RFC FST-1033] analyzers draft #11057

Closed
wants to merge 57 commits into from
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
Show all changes
57 commits
Select commit Hold shift + click to select a range
d3efce4
analyzers draft
Feb 8, 2021
03d01a6
analyzers draft
Feb 8, 2021
0f2d736
analyzers draft
Feb 8, 2021
3b1c7f4
fix some basics
Feb 9, 2021
e025cd7
update surface area
Feb 9, 2021
92ca504
update surface area
Feb 9, 2021
89675e7
updates to contain more in result types
Feb 13, 2021
4ddc61e
allow analyzers to run in fsi.exe with --runanalyzers, also respect -…
Feb 16, 2021
c4b50cc
update baseline
Feb 16, 2021
46ab877
Merge branch 'main' of https://github.com/dotnet/fsharp into feature/…
Feb 16, 2021
d134f4c
fix issues with .NET core scripting references in editing
Feb 17, 2021
ea42d54
fix issues with .NET core scripting references in editing
Feb 17, 2021
0634df8
fix issues with .NET core scripting references in editing
Feb 17, 2021
3da2ab5
fix issues with .NET core scripting references in editing
Feb 17, 2021
84fe602
add tests
Feb 17, 2021
89b6a4f
Merge branch 'main' of https://github.com/dotnet/fsharp into feature/…
Feb 17, 2021
4fbf151
Merge branch 'fix-11115' into feature/analyzers
Feb 17, 2021
f3fd8ef
Merge branch 'main' of https://github.com/dotnet/fsharp into feature/…
Feb 17, 2021
77817f0
add test project
Feb 17, 2021
6d899df
interpret compilerToolPath as a path, not a file
Feb 18, 2021
647f820
interpret compilerToolPath as a path, not a file
Feb 18, 2021
534226e
better incrementality for analyzers
Feb 25, 2021
af2679c
test script for analyzer
Feb 25, 2021
8718983
merge main
Feb 25, 2021
a964a1e
merge main
Mar 1, 2021
c2e9b9f
merge main
Mar 1, 2021
8e49b2e
merge main
Mar 1, 2021
0c2751c
merge main
Mar 1, 2021
d63f87e
fix regression 11176
Mar 3, 2021
bfad0d2
integrate main
Mar 3, 2021
0bb5548
integrate fix-11176
Mar 3, 2021
dd72dcd
merge main
Mar 3, 2021
c5fdb0c
Merge branch 'main' of https://github.com/dotnet/fsharp into feature/…
Mar 4, 2021
b364d95
fix build
Mar 4, 2021
1c90ead
fix build
Mar 4, 2021
6bf0f5e
Merge branch 'main' of https://github.com/dotnet/fsharp into feature/…
Mar 11, 2021
39dc1dd
integrate main
Mar 26, 2021
57fd135
Merge branch 'main' of https://github.com/dotnet/fsharp into feature/…
Mar 26, 2021
2b3592c
Don't deploy Full extension after build
Mar 26, 2021
d013209
Merge branch 't6' into feature/analyzers
Mar 26, 2021
d5a5915
merge main
Apr 14, 2021
87a9caf
Merge branch 'main' of https://github.com/dotnet/fsharp into feature/…
Apr 16, 2021
ed79d68
merge main
May 24, 2021
d924143
update baselines
May 24, 2021
3ecf924
fix baselines
May 26, 2021
87c241c
Merge branch 'main' of https://github.com/dotnet/fsharp into feature/…
May 26, 2021
0abfaee
update baselines
May 27, 2021
97c1bfc
fix build
Jun 3, 2021
66286b8
Merge branch 'main' of https://github.com/dotnet/fsharp into feature/…
Jun 4, 2021
163017d
Merge branch 'main' of https://github.com/dotnet/fsharp into feature/…
Jun 7, 2021
d898cf0
merge main and cleanup
Jun 8, 2021
b56f7b7
merge main
dsyme Jun 9, 2021
e7daabd
merge main
Jun 24, 2021
6ec7ba2
Merge branch 'main' of https://github.com/dotnet/fsharp into feature/…
Jun 24, 2021
7693168
simplify code
Jun 24, 2021
355dbd7
fix build
Jun 24, 2021
6f29d6e
Merge branch 'main' of https://github.com/dotnet/fsharp into feature/…
Jun 25, 2021
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
15 changes: 15 additions & 0 deletions VisualFSharp.sln
Original file line number Diff line number Diff line change
Expand Up @@ -158,6 +158,8 @@ Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Compiler.Service", "
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "FSharp.Compiler.Service.Tests", "tests\FSharp.Compiler.Service.Tests\FSharp.Compiler.Service.Tests.fsproj", "{14F3D3D6-5C8E-43C2-98A2-17EA704D4DEA}"
EndProject
Project("{6EC3EE1D-3C4E-46DD-8F32-0CC8E7565705}") = "Test.Analyzer", "tests\service\data\Test.Analyzer\Test.Analyzer.fsproj", "{A341304E-7223-4931-88B5-690EE88C2241}"
EndProject
Project("{9A19103F-16F7-4668-BE54-9A1E7A4F7556}") = "VisualFSharpDebug", "vsintegration\Vsix\VisualFSharpFull\VisualFSharpDebug.csproj", "{A422D673-8E3B-4924-821B-DD3174173426}"
EndProject
Project("{2150E333-8FDC-42A3-9474-1A3956D46DE8}") = "Benchmarks", "Benchmarks", "{DFB6ADD7-3149-43D9-AFA0-FC4A818B472B}"
Expand Down Expand Up @@ -936,6 +938,18 @@ Global
{14F3D3D6-5C8E-43C2-98A2-17EA704D4DEA}.Release|Any CPU.Build.0 = Release|Any CPU
{14F3D3D6-5C8E-43C2-98A2-17EA704D4DEA}.Release|x86.ActiveCfg = Release|Any CPU
{14F3D3D6-5C8E-43C2-98A2-17EA704D4DEA}.Release|x86.Build.0 = Release|Any CPU
{A341304E-7223-4931-88B5-690EE88C2241}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A341304E-7223-4931-88B5-690EE88C2241}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A341304E-7223-4931-88B5-690EE88C2241}.Debug|x86.ActiveCfg = Debug|Any CPU
{A341304E-7223-4931-88B5-690EE88C2241}.Debug|x86.Build.0 = Debug|Any CPU
{A341304E-7223-4931-88B5-690EE88C2241}.Proto|Any CPU.ActiveCfg = Debug|Any CPU
{A341304E-7223-4931-88B5-690EE88C2241}.Proto|Any CPU.Build.0 = Debug|Any CPU
{A341304E-7223-4931-88B5-690EE88C2241}.Proto|x86.ActiveCfg = Debug|Any CPU
{A341304E-7223-4931-88B5-690EE88C2241}.Proto|x86.Build.0 = Debug|Any CPU
{A341304E-7223-4931-88B5-690EE88C2241}.Release|Any CPU.ActiveCfg = Release|Any CPU
{A341304E-7223-4931-88B5-690EE88C2241}.Release|Any CPU.Build.0 = Release|Any CPU
{A341304E-7223-4931-88B5-690EE88C2241}.Release|x86.ActiveCfg = Release|Any CPU
{A341304E-7223-4931-88B5-690EE88C2241}.Release|x86.Build.0 = Release|Any CPU
{A422D673-8E3B-4924-821B-DD3174173426}.Debug|Any CPU.ActiveCfg = Debug|Any CPU
{A422D673-8E3B-4924-821B-DD3174173426}.Debug|Any CPU.Build.0 = Debug|Any CPU
{A422D673-8E3B-4924-821B-DD3174173426}.Debug|x86.ActiveCfg = Debug|Any CPU
Expand Down Expand Up @@ -1058,6 +1072,7 @@ Global
{0610FB97-7C15-422A-86FD-32335C6DF14D} = {CFE3259A-2D30-4EB0-80D5-E8B5F3D01449}
{B5A9BBD9-2F45-4722-A6CA-BAE3C64CD4E2} = {3881429D-A97A-49EB-B7AE-A82BA5FE9C77}
{14F3D3D6-5C8E-43C2-98A2-17EA704D4DEA} = {CFE3259A-2D30-4EB0-80D5-E8B5F3D01449}
{A341304E-7223-4931-88B5-690EE88C2241} = {35636A82-401A-4C3A-B2AB-EB7DC5E9C268}
{A422D673-8E3B-4924-821B-DD3174173426} = {4C7B48D7-19AF-4AE7-9D1D-3BB289D5480D}
{564E7DC5-11CB-4FCF-ABDD-23AD93AF3A61} = {DFB6ADD7-3149-43D9-AFA0-FC4A818B472B}
{208E36EE-665C-42D2-B767-C6DB03C4FEB2} = {47112E07-9FF1-43E7-8021-F2A21D6A19A0}
Expand Down
21 changes: 13 additions & 8 deletions src/fsharp/CompilerConfig.fs
Original file line number Diff line number Diff line change
Expand Up @@ -337,7 +337,7 @@ type TcConfigBuilder =
mutable light: bool option
mutable conditionalCompilationDefines: string list
mutable loadedSources: (range * string * string) list
mutable compilerToolPaths: string list
mutable compilerToolPaths: (range * string) list
mutable referencedDLLs: AssemblyReference list
mutable packageManagerLines: Map<string, PackageManagerLine list>
mutable projectReferences: IProjectReference list
Expand Down Expand Up @@ -507,7 +507,7 @@ type TcConfigBuilder =
member tcConfigB.GetNativeProbingRoots () =
seq {
yield! tcConfigB.includes
yield! tcConfigB.compilerToolPaths
yield! List.map snd tcConfigB.compilerToolPaths
yield! (tcConfigB.referencedDLLs |> Seq.map(fun ref -> Path.GetDirectoryName(ref.Text)))
yield tcConfigB.implicitIncludeDir
}
Expand Down Expand Up @@ -782,11 +782,16 @@ type TcConfigBuilder =
member tcConfigB.AddEmbeddedResource filename =
tcConfigB.embedResources <- tcConfigB.embedResources ++ filename

member tcConfigB.AddCompilerToolsByPath (path) =
if not (tcConfigB.compilerToolPaths |> List.exists (fun text -> path = text)) then // NOTE: We keep same paths if range is different.
let compilerToolPath = tcConfigB.compilerToolPaths |> List.tryPick (fun text -> if text = path then Some text else None)
if compilerToolPath.IsNone then
tcConfigB.compilerToolPaths <- tcConfigB.compilerToolPaths ++ path
member tcConfigB.AddCompilerToolsByPath (m, path) =
if FileSystem.IsInvalidPathShim path then
warning(Error(FSComp.SR.etCompilerToolPathDidntExist(path), m))
// TODO: check this is the right place to resolve paths
else
let rootedPath = if Path.IsPathRooted(path) then path else Path.Combine(tcConfigB.implicitIncludeDir, path)
if not (Directory.Exists rootedPath) then
warning(Error(FSComp.SR.etCompilerToolPathDidntExist(rootedPath), m))
elif not (tcConfigB.compilerToolPaths |> List.exists (fun (_m, text) -> rootedPath = text)) then
tcConfigB.compilerToolPaths <- tcConfigB.compilerToolPaths ++ (m, rootedPath)

member tcConfigB.AddReferencedAssemblyByPath (m, path) =
if FileSystem.IsInvalidPathShim path then
Expand All @@ -808,7 +813,7 @@ type TcConfigBuilder =
| ErrorReportType.Warning -> warning(Error(error, m))
| ErrorReportType.Error -> errorR(Error(error, m)))

let dm = dependencyProvider.TryFindDependencyManagerInPath(tcConfigB.compilerToolPaths, output , reportError, path)
let dm = dependencyProvider.TryFindDependencyManagerInPath(List.map snd tcConfigB.compilerToolPaths, output , reportError, path)

match dm with
| _, dependencyManager when not(isNull dependencyManager) ->
Expand Down
6 changes: 3 additions & 3 deletions src/fsharp/CompilerConfig.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -153,7 +153,7 @@ type TcConfigBuilder =
mutable conditionalCompilationDefines: string list
/// Sources added into the build with #load
mutable loadedSources: (range * string * string) list
mutable compilerToolPaths: string list
mutable compilerToolPaths: (range * string) list
mutable referencedDLLs: AssemblyReference list
mutable packageManagerLines: Map<string, PackageManagerLine list>
mutable projectReferences: IProjectReference list
Expand Down Expand Up @@ -302,7 +302,7 @@ type TcConfigBuilder =

member AddIncludePath: range * string * string -> unit

member AddCompilerToolsByPath: string -> unit
member AddCompilerToolsByPath: range * string -> unit

member AddReferencedAssemblyByPath: range * string -> unit

Expand Down Expand Up @@ -350,7 +350,7 @@ type TcConfig =
member conditionalCompilationDefines: string list
member subsystemVersion: int * int
member useHighEntropyVA: bool
member compilerToolPaths: string list
member compilerToolPaths: (range * string) list
member referencedDLLs: AssemblyReference list
member reduceMemoryUsage: ReduceMemoryFlag
member inputCodePage: int option
Expand Down
9 changes: 7 additions & 2 deletions src/fsharp/CompilerDiagnostics.fs
Original file line number Diff line number Diff line change
Expand Up @@ -125,6 +125,7 @@ let GetRangeOfDiagnostic(err: PhasedDiagnostic) =
| LetRecEvaluatedOutOfOrder (_, _, _, m)
| Error (_, m)
| ErrorWithSuggestions (_, m, _, _)
| CompilerToolDiagnostic (_, m)
| SyntaxError (_, m)
| InternalError (_, m)
| InterfaceNotRevealed(_, _, m)
Expand Down Expand Up @@ -342,6 +343,7 @@ let GetDiagnosticNumber(err: PhasedDiagnostic) =
| Error ((n, _), _) -> n
| ErrorWithSuggestions ((n, _), _, _, _) -> n
| Failure _ -> 192
| CompilerToolDiagnostic((n, _), _) -> n
| IllegalFileNameChar(fileName, invalidChar) -> fst (FSComp.SR.buildUnexpectedFileNameCharacter(fileName, string invalidChar))
#if !NO_EXTENSIONTYPING
| :? TypeProviderError as e -> e.Number
Expand All @@ -357,8 +359,9 @@ let GetWarningLevel err =
| LetRecEvaluatedOutOfOrder _
| DefensiveCopyWarning _ -> 5

| Error((n, _), _)
| ErrorWithSuggestions((n, _), _, _, _) ->
| CompilerToolDiagnostic((n, _), _)
| ErrorWithSuggestions((n, _), _, _, _)
| Error((n, _), _) ->
// 1178, tcNoComparisonNeeded1, "The struct, record or union type '%s' is not structurally comparable because the type parameter %s does not satisfy the 'comparison' constraint..."
// 1178, tcNoComparisonNeeded2, "The struct, record or union type '%s' is not structurally comparable because the type '%s' does not satisfy the 'comparison' constraint...."
// 1178, tcNoEqualityNeeded1, "The struct, record or union type '%s' does not support structural equality because the type parameter %s does not satisfy the 'equality' constraint..."
Expand Down Expand Up @@ -1448,6 +1451,8 @@ let OutputPhasedErrorR (os: StringBuilder) (err: PhasedDiagnostic) (canSuggestNa
os.Append(DecompileOpName s) |> ignore
suggestNames suggestionF idText

| CompilerToolDiagnostic ((_, s), _) -> os.Append s |> ignore

| InternalError (s, _)

| InvalidArgument s
Expand Down
2 changes: 1 addition & 1 deletion src/fsharp/CompilerImports.fs
Original file line number Diff line number Diff line change
Expand Up @@ -1374,7 +1374,7 @@ and [<Sealed>] TcImports(tcConfigP: TcConfigProvider, initialResolutions: TcAsse
tcConfig.isInteractive,
systemRuntimeContainsType,
primaryAssemblyVersion,
tcConfig.compilerToolPaths,
List.map snd tcConfig.compilerToolPaths,
m) ]
// Note, type providers are disposable objects. The TcImports owns the provider objects - when/if it is disposed, the providers are disposed.
// We ignore all exceptions from provider disposal.
Expand Down
4 changes: 2 additions & 2 deletions src/fsharp/CompilerOptions.fs
Original file line number Diff line number Diff line change
Expand Up @@ -568,14 +568,14 @@ let PrintOptionInfo (tcConfigB:TcConfigBuilder) =

let inputFileFlagsBoth (tcConfigB : TcConfigBuilder) = [
CompilerOption("reference", tagFile, OptionString (fun s -> tcConfigB.AddReferencedAssemblyByPath (rangeStartup, s)), None, Some (FSComp.SR.optsReference()))
CompilerOption("compilertool", tagFile, OptionString (fun s -> tcConfigB.AddCompilerToolsByPath s), None, Some (FSComp.SR.optsCompilerTool()))
CompilerOption("compilertool", tagFile, OptionString (fun s -> tcConfigB.AddCompilerToolsByPath (rangeStartup, s)), None, Some (FSComp.SR.optsCompilerTool()))
]

let referenceFlagAbbrev (tcConfigB : TcConfigBuilder) =
CompilerOption("r", tagFile, OptionString (fun s -> tcConfigB.AddReferencedAssemblyByPath (rangeStartup, s)), None, Some(FSComp.SR.optsShortFormOf("--reference")))

let compilerToolFlagAbbrev (tcConfigB : TcConfigBuilder) =
CompilerOption("t", tagFile, OptionString (fun s -> tcConfigB.AddCompilerToolsByPath s), None, Some(FSComp.SR.optsShortFormOf("--compilertool")))
CompilerOption("t", tagFile, OptionString (fun s -> tcConfigB.AddCompilerToolsByPath (rangeStartup, s)), None, Some(FSComp.SR.optsShortFormOf("--compilertool")))

let inputFileFlagsFsc tcConfigB = inputFileFlagsBoth tcConfigB

Expand Down
2 changes: 1 addition & 1 deletion src/fsharp/Diagnostics.fs
Original file line number Diff line number Diff line change
Expand Up @@ -12,7 +12,7 @@ type FSharpDiagnosticSeverity =
| Warning
| Error

type FSharpDiagnosticOptions =
type public FSharpDiagnosticOptions =
{
WarnLevel: int
GlobalWarnAsError: bool
Expand Down
25 changes: 18 additions & 7 deletions src/fsharp/ErrorLogger.fs
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,12 @@ let (|StopProcessing|_|) exn = match exn with StopProcessingExn _ -> Some () | _

let StopProcessing<'T> = StopProcessingExn None

exception CompilerToolDiagnostic of (int * string) * range with // int is e.g. 191 in FS0191
override this.Message =
match this :> exn with
| CompilerToolDiagnostic((_, msg), _) -> msg
| _ -> "impossible"

exception Error of (int * string) * range with // int is e.g. 191 in FS0191
override this.Message =
match this :> exn with
Expand Down Expand Up @@ -186,6 +192,8 @@ module BuildPhaseSubcategory =
[<Literal>]
let Interactive = "interactive"
[<Literal>]
let Analysis = "analysis"
[<Literal>]
let Internal = "internal" // Compiler ICE

[<DebuggerDisplay("{DebugDisplay()}")>]
Expand Down Expand Up @@ -288,15 +296,15 @@ type CapturingErrorLogger(nm) =
let mutable errorCount = 0
let diagnostics = ResizeArray()

override _.DiagnosticSink(phasedError, severity) =
override x.DiagnosticSink(phasedError, severity) =
if severity = FSharpDiagnosticSeverity.Error then errorCount <- errorCount + 1
diagnostics.Add (phasedError, severity)

override _.ErrorCount = errorCount
override x.ErrorCount = errorCount

member _.Diagnostics = diagnostics |> Seq.toList
member x.Diagnostics = diagnostics |> Seq.toList

member _.CommitDelayedDiagnostics(errorLogger:ErrorLogger) =
member x.CommitDelayedDiagnostics(errorLogger:ErrorLogger) =
// Eagerly grab all the errors and warnings from the mutable collection
let errors = diagnostics.ToArray()
errors |> Array.iter errorLogger.DiagnosticSink
Expand Down Expand Up @@ -385,11 +393,11 @@ module ErrorLoggerExtensions =
member x.Warning exn =
x.EmitDiagnostic (exn, FSharpDiagnosticSeverity.Warning)

member x.Error exn =
x.ErrorR exn
member x.Error exn =
x.EmitDiagnostic (exn, FSharpDiagnosticSeverity.Error)
raise (ReportedError (Some exn))

member x.SimulateError (ph: PhasedDiagnostic) =
member x.SimulateError (ph: PhasedDiagnostic) =
x.DiagnosticSink (ph, FSharpDiagnosticSeverity.Error)
raise (ReportedError (Some ph.Exception))

Expand Down Expand Up @@ -465,6 +473,9 @@ let errorR exn = CompileThreadStatic.ErrorLogger.ErrorR exn
/// Raises a warning with error recovery and returns unit.
let warning exn = CompileThreadStatic.ErrorLogger.Warning exn

/// Raises a warning with error recovery and returns unit.
let diagnostic (exn, severity) = CompileThreadStatic.ErrorLogger.EmitDiagnostic (exn, severity)

/// Raises a special exception and returns 'T - can be caught later at an errorRecovery point.
let error exn = CompileThreadStatic.ErrorLogger.Error exn

Expand Down
5 changes: 5 additions & 0 deletions src/fsharp/ErrorLogger.fsi
Original file line number Diff line number Diff line change
Expand Up @@ -41,6 +41,8 @@ val ( |StopProcessing|_| ): exn:exn -> unit option

val StopProcessing<'T> : exn

exception CompilerToolDiagnostic of (int * string) * range

exception Error of (int * string) * range

exception InternalError of msg: string * range
Expand Down Expand Up @@ -107,6 +109,7 @@ module BuildPhaseSubcategory =
[<LiteralAttribute>] val Output: string = "output"
[<LiteralAttribute>] val Interactive: string = "interactive"
[<LiteralAttribute>] val Internal: string = "internal"
[<LiteralAttribute>] val Analysis: string = "analysis"

type PhasedDiagnostic =
{ Exception: exn
Expand Down Expand Up @@ -202,6 +205,8 @@ val errorR: exn:exn -> unit

val warning: exn:exn -> unit

val diagnostic: exn:exn * severity: FSharpDiagnosticSeverity -> unit

val error: exn:exn -> 'a

val simulateError: p:PhasedDiagnostic -> 'a
Expand Down
2 changes: 1 addition & 1 deletion src/fsharp/ExtensionTyping.fs
Original file line number Diff line number Diff line change
Expand Up @@ -171,7 +171,7 @@ module internal ExtensionTyping =
() ]

with :? TypeProviderError as tpe ->
tpe.Iter(fun e -> errorR(Error((e.Number, e.ContextualErrorMessage), m)) )
tpe.Iter(fun e -> errorR(CompilerToolDiagnostic((e.Number, e.ContextualErrorMessage), m)) )
[]

let providers = Tainted<_>.CreateAll(providerSpecs)
Expand Down
7 changes: 7 additions & 0 deletions src/fsharp/FSComp.txt
Original file line number Diff line number Diff line change
Expand Up @@ -1489,6 +1489,7 @@ notAFunctionButMaybeDeclaration,"This value is not a function and cannot be appl
3245,tcCopyAndUpdateNeedsRecordType,"The input to a copy-and-update expression that creates an anonymous record must be either an anonymous record or a record"
3246,tcAugmentationsCannotHaveAttributes,"Attributes cannot be applied to type extensions."
3247,couldNotLoadDependencyManagerExtension,"The dependency manager extension %s could not be loaded. Message: %s"
3248,couldNotLoadAnalyzerExtension,"The analyzer extension %s could not be loaded. Message: %s"
3250,expressionHasNoName,"Expression does not have a name."
3251,chkNoFirstClassNameOf,"Using the 'nameof' operator as a first-class function value is not permitted."
3252,tcIllegalByrefsInOpenTypeDeclaration,"Byref types are not allowed in an open type declaration."
Expand Down Expand Up @@ -1533,6 +1534,12 @@ featureStructActivePattern,"struct representation for active patterns"
featureInterfacesWithMultipleGenericInstantiation,"interfaces with multiple generic instantiation"
3362,tcLiteralFieldAssignmentWithArg,"Cannot assign '%s' to a value marked literal"
3363,tcLiteralFieldAssignmentNoArg,"Cannot assign a value to another value marked literal"
3365,etAnalyzerLoadFailure,"The analyzer '%s' failed to load: '%s'"
3366,etAnalyzerDoesNotHaveValidConstructor,"The analyzer '%s' doesn't have a valid constructor."
3367,etAnalyzerConstructionException,"The analyzer '%s' raised an exception during analyzer construction: '%s'."
3368,etAnalyzerTypeInitializationException,"The analyzer '%s' raised an exception during analyzer type initialization: '%s'."
3369,etAnalyzerException,"The analyzer '%s' raised an exception during analysis of file '%s': '%s'."
3370,etCompilerToolPathDidntExist,"The compiler tool path '%s' did not exist."
forFormatInvalidForInterpolated,"Interpolated strings may not use '%%' format specifiers unless each is given an expression, e.g. '%%d{{1+1}}'."
forFormatInvalidForInterpolated2,".NET-style format specifiers such as '{{x,3}}' or '{{x:N5}}' may not be mixed with '%%' format specifiers."
forFormatInvalidForInterpolated3,"The '%%P' specifier may not be used explicitly."
Expand Down
Loading