"#pragma warning disable CS0219 // Variable assigned but never used",
};
- private record struct CompilationData(bool AllowUnsafe, bool CheckOverflow);
+ private record struct CompilationData(bool AllowUnsafe, bool CheckOverflow, LanguageVersion LanguageVersion);
public void Initialize(IncrementalGeneratorInitializationContext context)
{
context.CompilationProvider
.Select((x, _) =>
x.Options is CSharpCompilationOptions options ?
- new CompilationData(options.AllowUnsafe, options.CheckOverflow) :
+ new CompilationData(options.AllowUnsafe, options.CheckOverflow, ((CSharpCompilation)x).LanguageVersion) :
default);
// Produces one entry per generated regex. This may be:
// If we're unable to generate a full implementation for this regex, report a diagnostic.
// We'll still output a limited implementation that just caches a new Regex(...).
- if (!SupportsCodeGeneration(regexMethod, out string? reason))
+ if (!SupportsCodeGeneration(regexMethod, methodOrDiagnosticAndCompilationData.Right.LanguageVersion, out string? reason))
{
return (regexMethod, reason, Diagnostic.Create(DiagnosticDescriptors.LimitedSourceGeneration, regexMethod.MethodSyntax.GetLocation()));
}
// It also provides a human-readable string to explain the reason. It will be emitted by the source generator
// as a comment into the C# code, hence there's no need to localize.
/// </remarks>
- private static bool SupportsCodeGeneration(RegexMethod method, [NotNullWhen(false)] out string? reason)
+ private static bool SupportsCodeGeneration(RegexMethod method, LanguageVersion languageVersion, [NotNullWhen(false)] out string? reason)
{
- if (method.MethodSyntax.SyntaxTree.Options is CSharpParseOptions { LanguageVersion: <= LanguageVersion.CSharp10 })
+ if (languageVersion <= LanguageVersion.CSharp10)
{
reason = "the language version must be C# 11 or higher.";
return false;