@@ -19,7 +19,7 @@ namespace StyleCop.Analyzers.CodeGeneration
1919 using Microsoft . CodeAnalysis . Text ;
2020
2121 [ Generator ]
22- internal sealed class SyntaxLightupGenerator : ISourceGenerator
22+ internal sealed class SyntaxLightupGenerator : IIncrementalGenerator
2323 {
2424 private enum NodeKind
2525 {
@@ -28,33 +28,37 @@ private enum NodeKind
2828 Concrete ,
2929 }
3030
31- public void Initialize ( GeneratorInitializationContext context )
31+ public void Initialize ( IncrementalGeneratorInitializationContext context )
3232 {
33+ var compilation = context . CompilationProvider ;
34+ var syntaxFiles = context . AdditionalTextsProvider . Where ( static x => Path . GetFileName ( x . Path ) == "Syntax.xml" ) ;
35+ context . RegisterSourceOutput (
36+ syntaxFiles . Combine ( compilation ) ,
37+ ( context , value ) => this . Execute ( in context , value . Right , value . Left ) ) ;
3338 }
3439
35- public void Execute ( GeneratorExecutionContext context )
40+ private void Execute ( in SourceProductionContext context , Compilation compilation , AdditionalText syntaxFile )
3641 {
37- var syntaxFile = context . AdditionalFiles . Single ( x => Path . GetFileName ( x . Path ) == "Syntax.xml" ) ;
3842 var syntaxText = syntaxFile . GetText ( context . CancellationToken ) ;
3943 if ( syntaxText is null )
4044 {
4145 throw new InvalidOperationException ( "Failed to read Syntax.xml" ) ;
4246 }
4347
44- var syntaxData = new SyntaxData ( in context , XDocument . Parse ( syntaxText . ToString ( ) ) ) ;
48+ var syntaxData = new SyntaxData ( compilation , XDocument . Parse ( syntaxText . ToString ( ) ) ) ;
4549 this . GenerateSyntaxWrappers ( in context , syntaxData ) ;
4650 this . GenerateSyntaxWrapperHelper ( in context , syntaxData . Nodes ) ;
4751 }
4852
49- private void GenerateSyntaxWrappers ( in GeneratorExecutionContext context , SyntaxData syntaxData )
53+ private void GenerateSyntaxWrappers ( in SourceProductionContext context , SyntaxData syntaxData )
5054 {
5155 foreach ( var node in syntaxData . Nodes )
5256 {
5357 this . GenerateSyntaxWrapper ( in context , syntaxData , node ) ;
5458 }
5559 }
5660
57- private void GenerateSyntaxWrapper ( in GeneratorExecutionContext context , SyntaxData syntaxData , NodeData nodeData )
61+ private void GenerateSyntaxWrapper ( in SourceProductionContext context , SyntaxData syntaxData , NodeData nodeData )
5862 {
5963 if ( nodeData . WrapperName is null )
6064 {
@@ -806,7 +810,7 @@ private void GenerateSyntaxWrapper(in GeneratorExecutionContext context, SyntaxD
806810 context . AddSource ( nodeData . WrapperName + ".g.cs" , SourceText . From ( wrapperNamespace . ToFullString ( ) , Encoding . UTF8 ) ) ;
807811 }
808812
809- private void GenerateSyntaxWrapperHelper ( in GeneratorExecutionContext context , ImmutableArray < NodeData > wrapperTypes )
813+ private void GenerateSyntaxWrapperHelper ( in SourceProductionContext context , ImmutableArray < NodeData > wrapperTypes )
810814 {
811815 // private static readonly ImmutableDictionary<Type, Type> WrappedTypes;
812816 var wrappedTypes = SyntaxFactory . FieldDeclaration (
@@ -1138,12 +1142,12 @@ private sealed class SyntaxData
11381142 {
11391143 private readonly Dictionary < string , NodeData > nameToNode ;
11401144
1141- public SyntaxData ( in GeneratorExecutionContext context , XDocument document )
1145+ public SyntaxData ( Compilation compilation , XDocument document )
11421146 {
11431147 var nodesBuilder = ImmutableArray . CreateBuilder < NodeData > ( ) ;
11441148 foreach ( var element in document . XPathSelectElement ( "/Tree[@Root='SyntaxNode']" ) . XPathSelectElements ( "PredefinedNode|AbstractNode|Node" ) )
11451149 {
1146- nodesBuilder . Add ( new NodeData ( in context , element ) ) ;
1150+ nodesBuilder . Add ( new NodeData ( compilation , element ) ) ;
11471151 }
11481152
11491153 this . Nodes = nodesBuilder . ToImmutable ( ) ;
@@ -1180,7 +1184,7 @@ public SyntaxData(in GeneratorExecutionContext context, XDocument document)
11801184
11811185 private sealed class NodeData
11821186 {
1183- public NodeData ( in GeneratorExecutionContext context , XElement element )
1187+ public NodeData ( Compilation compilation , XElement element )
11841188 {
11851189 this . Kind = element . Name . LocalName switch
11861190 {
@@ -1192,9 +1196,9 @@ public NodeData(in GeneratorExecutionContext context, XElement element)
11921196
11931197 this . Name = element . Attribute ( "Name" ) . Value ;
11941198
1195- this . ExistingType = context . Compilation . GetTypeByMetadataName ( $ "Microsoft.CodeAnalysis.CSharp.Syntax.{ this . Name } ")
1196- ?? context . Compilation . GetTypeByMetadataName ( $ "Microsoft.CodeAnalysis.CSharp.{ this . Name } ")
1197- ?? context . Compilation . GetTypeByMetadataName ( $ "Microsoft.CodeAnalysis.{ this . Name } ") ;
1199+ this . ExistingType = compilation . GetTypeByMetadataName ( $ "Microsoft.CodeAnalysis.CSharp.Syntax.{ this . Name } ")
1200+ ?? compilation . GetTypeByMetadataName ( $ "Microsoft.CodeAnalysis.CSharp.{ this . Name } ")
1201+ ?? compilation . GetTypeByMetadataName ( $ "Microsoft.CodeAnalysis.{ this . Name } ") ;
11981202 if ( this . ExistingType ? . DeclaredAccessibility == Accessibility . Public )
11991203 {
12001204 this . WrapperName = null ;
0 commit comments