@@ -107,10 +107,10 @@ internal CXNode ParseRootNode()
107107
108108 internal CXElement ParseElement ( )
109109 {
110- if ( IsIncremental && CurrentNode is CXElement element )
110+ if ( IsIncremental && CurrentNode is CXElement incElement )
111111 {
112112 EatNode ( ) ;
113- return element ;
113+ return incElement ;
114114 }
115115
116116 using var _ = Lexer . SetMode ( CXLexer . LexMode . Default ) ;
@@ -153,10 +153,11 @@ CurrentToken.Kind is CXTokenKind.GreaterThan
153153 end ,
154154 out var endStart ,
155155 out var endIdent ,
156- out var endClose
156+ out var endClose ,
157+ out var onCreate
157158 ) ;
158159
159- return new CXElement (
160+ var element = new CXElement (
160161 start ,
161162 identifier ,
162163 attributes ,
@@ -166,6 +167,10 @@ out var endClose
166167 endIdent ,
167168 endClose
168169 ) { Diagnostics = diagnostics } ;
170+
171+ onCreate ? . Invoke ( element ) ;
172+
173+ return element ;
169174 default :
170175 case CXTokenKind . ForwardSlashGreaterThan :
171176 return new CXElement (
@@ -181,8 +186,11 @@ void ParseClosingElement(
181186 CXToken elementEnd ,
182187 out CXToken elementEndStart ,
183188 out CXToken ? elementEndIdent ,
184- out CXToken elementEndClose )
189+ out CXToken elementEndClose ,
190+ out Action < CXElement > ? onCreate
191+ )
185192 {
193+ onCreate = null ;
186194 var sentinel = _tokenIndex ;
187195
188196 elementEndStart = Expect ( CXTokenKind . LessThanForwardSlash ) ;
@@ -213,20 +221,17 @@ var missingStructure
213221 missingStructure
214222 )
215223 {
216- var diagnosticSpan = TextSpan . FromBounds ( start . Span . Start , elementEnd . Span . End ) ;
217-
218- diagnostics . Add (
219- CXDiagnostic . MissingElementClosingTag ( identifier , diagnosticSpan )
220- ) ;
221-
222- var missingSpan = elementEndStart . Span ;
224+ onCreate = node =>
225+ {
226+ node . AddDiagnostic ( CXDiagnostic . MissingElementClosingTag ( identifier , node ) ) ;
227+ } ;
223228
224- elementEndStart = CXToken . CreateMissing ( CXTokenKind . LessThanForwardSlash , missingSpan ) ;
225- elementEndIdent = identifier is not null
226- ? CXToken . CreateMissing ( CXTokenKind . Identifier , missingSpan , identifier . Value )
229+ elementEndStart = CXToken . CreateMissing ( CXTokenKind . LessThanForwardSlash ) ;
230+ elementEndIdent = identifier is not null
231+ ? CXToken . CreateMissing ( CXTokenKind . Identifier , identifier . Value )
227232 : null ;
228- elementEndClose = CXToken . CreateMissing ( CXTokenKind . GreaterThan , missingSpan ) ;
229-
233+ elementEndClose = CXToken . CreateMissing ( CXTokenKind . GreaterThan ) ;
234+
230235 // rollback
231236 _tokenIndex = sentinel ;
232237 }
@@ -392,7 +397,7 @@ internal CXValue ParseAttributeValue()
392397 ParseElement ( ) ,
393398 Expect ( CXTokenKind . CloseParenthesis )
394399 ) ;
395-
400+
396401 case CXTokenKind . Interpolation :
397402 return new CXValue . Interpolation (
398403 Eat ( ) ,
@@ -522,7 +527,6 @@ internal CXToken Expect(params ReadOnlySpan<CXTokenKind> kinds)
522527
523528 return new CXToken (
524529 kinds [ 0 ] ,
525- new TextSpan ( current . Span . Start , 1 ) ,
526530 0 ,
527531 0 ,
528532 Flags : CXTokenFlags . Missing ,
@@ -540,7 +544,6 @@ internal CXToken Expect(CXTokenKind kind)
540544 {
541545 return new CXToken (
542546 kind ,
543- new TextSpan ( token . Span . Start , 1 ) ,
544547 0 ,
545548 0 ,
546549 Flags : CXTokenFlags . Missing ,
0 commit comments