2
2
// The .NET Foundation licenses this file to you under the MIT license.
3
3
4
4
using System ;
5
+ using System . Diagnostics ;
5
6
using Microsoft . CodeAnalysis ;
6
7
using Microsoft . CodeAnalysis . CSharp ;
7
8
using Microsoft . CodeAnalysis . CSharp . Syntax ;
@@ -50,14 +51,22 @@ private class Visitor : Silk.NET.SilkTouch.Symbols.SymbolVisitor
50
51
{
51
52
public CSharpSyntaxNode ? Syntax => _syntax ;
52
53
private CSharpSyntaxNode ? _syntax = null ;
54
+ private SyntaxToken ? _syntaxToken = null ;
53
55
54
56
protected override StructSymbol VisitStruct ( StructSymbol structSymbol )
55
57
{
58
+ AssertClearState ( ) ;
59
+
60
+ VisitIdentifier ( structSymbol . Identifier ) ;
61
+ if ( _syntaxToken is not { } identifierToken )
62
+ throw new InvalidOperationException ( "Field Identifier was not visited correctly" ) ;
63
+ ClearState ( ) ;
64
+
56
65
var members = List < MemberDeclarationSyntax > ( ) ;
57
66
var modifiers = TokenList ( Token ( SyntaxTriviaList . Empty , SyntaxKind . PublicKeyword , TriviaList ( Space ) ) ) ;
58
67
_syntax = StructDeclaration
59
68
(
60
- List < AttributeListSyntax > ( ) , modifiers , Identifier ( structSymbol . Identifier . Value ) , null , null ,
69
+ List < AttributeListSyntax > ( ) , modifiers , identifierToken , null , null ,
61
70
List < TypeParameterConstraintClauseSyntax > ( ) , members
62
71
)
63
72
. WithKeyword ( Token ( SyntaxTriviaList . Empty , SyntaxKind . StructKeyword , TriviaList ( Space ) ) ) ;
@@ -66,21 +75,55 @@ protected override StructSymbol VisitStruct(StructSymbol structSymbol)
66
75
67
76
protected override FieldSymbol VisitField ( FieldSymbol fieldSymbol )
68
77
{
78
+ AssertClearState ( ) ;
79
+
80
+ VisitIdentifier ( fieldSymbol . Type . Identifier ) ;
81
+ if ( _syntax is not IdentifierNameSyntax typeIdentifierSyntax )
82
+ throw new InvalidOperationException ( "Field type Identifier was not visited correctly" ) ;
83
+ ClearState ( ) ;
84
+
85
+ VisitIdentifier ( fieldSymbol . Identifier ) ;
86
+ if ( _syntaxToken is not { } identifierToken )
87
+ throw new InvalidOperationException ( "Field Identifier was not visited correctly" ) ;
88
+ ClearState ( ) ;
89
+
69
90
_syntax = FieldDeclaration
70
91
(
71
92
List < AttributeListSyntax > ( ) ,
72
93
TokenList ( Token ( SyntaxTriviaList . Empty , SyntaxKind . PublicKeyword , TriviaList ( Space ) ) ) ,
73
94
VariableDeclaration
74
95
(
75
- IdentifierName ( fieldSymbol . Type . Identifier . Value ) ,
96
+ typeIdentifierSyntax ,
76
97
SingletonSeparatedList
77
98
(
78
99
VariableDeclarator
79
- ( Identifier ( TriviaList ( Space ) , fieldSymbol . Identifier . Value , SyntaxTriviaList . Empty ) )
100
+ ( identifierToken . WithLeadingTrivia ( TriviaList ( Space ) ) )
80
101
)
81
102
)
82
103
) ;
83
104
return fieldSymbol ;
84
105
}
106
+
107
+ protected override IdentifierSymbol VisitIdentifier ( IdentifierSymbol identifierSymbol )
108
+ {
109
+ AssertClearState ( ) ;
110
+
111
+ _syntaxToken = Identifier ( SyntaxTriviaList . Empty , identifierSymbol . Value , SyntaxTriviaList . Empty ) ;
112
+ _syntax = IdentifierName ( _syntaxToken . Value ) ;
113
+ return identifierSymbol ;
114
+ }
115
+
116
+ [ Conditional ( "DEBUG" ) ]
117
+ private void AssertClearState ( )
118
+ {
119
+ Debug . Assert ( _syntax is null ) ;
120
+ Debug . Assert ( ! _syntaxToken . HasValue ) ;
121
+ }
122
+
123
+ private void ClearState ( )
124
+ {
125
+ _syntax = null ;
126
+ _syntaxToken = null ;
127
+ }
85
128
}
86
129
}
0 commit comments