@@ -18,16 +18,49 @@ namespace Peachpie.CodeAnalysis.Syntax
1818 /// </summary>
1919 sealed class PhpTokenProvider : ITokenProvider < TValue , TSpan > , IDisposable
2020 {
21+ #region TokenSnapshot
22+
23+ public readonly struct TokenSnapshot // <ValueType, PositionType>
24+ {
25+ public readonly Tokens Token ;
26+
27+ public readonly TSpan TokenPosition ;
28+
29+ public readonly ReadOnlyMemory < char > TokenSource ;
30+
31+ public readonly TValue TokenValue ;
32+
33+ public TokenSnapshot ( Tokens token , ITokenProvider < TValue , TSpan > lexer )
34+ : this ( token , lexer . TokenPosition , lexer . TokenSource , lexer . TokenValue )
35+ {
36+ }
37+
38+ public TokenSnapshot ( Tokens token , TSpan position , ReadOnlyMemory < char > source , TValue value )
39+ {
40+ Token = token ;
41+ TokenPosition = position ;
42+ TokenSource = source ;
43+ TokenValue = value ;
44+ }
45+
46+ public TokenSnapshot WithToken ( Tokens token ) => new TokenSnapshot ( token , TokenPosition , TokenSource , TokenValue ) ;
47+ }
48+
49+ #endregion
50+
2151 readonly ITokenProvider < TValue , TSpan > _provider ;
52+
2253 readonly PhpSourceUnit _sourceunit ;
2354
2455 StringTable _strings ;
56+
2557 IDocBlock _docblock ;
2658
2759 /// <summary>
2860 /// Buffered tokens.
2961 /// </summary>
30- readonly List < CompleteToken > _buffer = new List < CompleteToken > ( ) ;
62+ readonly List < TokenSnapshot > _buffer = new List < TokenSnapshot > ( ) ;
63+
3164 int _bufferidx = 0 ;
3265
3366 public PhpTokenProvider ( ITokenProvider < TValue , TSpan > provider , PhpSourceUnit sourceunit )
@@ -41,22 +74,9 @@ public PhpTokenProvider(ITokenProvider<TValue, TSpan> provider, PhpSourceUnit so
4174
4275 public Tokens Token => ( _bufferidx < _buffer . Count ) ? _buffer [ _bufferidx ] . Token : default ;
4376
44- public TValue TokenValue
45- {
46- get => ( _bufferidx < _buffer . Count ) ? _buffer [ _bufferidx ] . TokenValue : _provider . TokenValue ;
47- set
48- {
49- if ( _bufferidx < _buffer . Count )
50- {
51- var previous = _buffer [ _bufferidx ] ;
52- _buffer [ _bufferidx ] = new CompleteToken ( previous . Token , value , previous . TokenPosition , previous . TokenText ) ;
53- }
54- else
55- {
56- _provider . TokenValue = value ;
57- }
58- }
59- }
77+ public TValue TokenValue => ( _bufferidx < _buffer . Count ) ? _buffer [ _bufferidx ] . TokenValue : _provider . TokenValue ;
78+
79+ public ReadOnlyMemory < char > TokenSource => ( _bufferidx < _buffer . Count ) ? _buffer [ _bufferidx ] . TokenSource : _provider . TokenSource ;
6080
6181 public TSpan TokenPosition => ( _bufferidx < _buffer . Count ) ? _buffer [ _bufferidx ] . TokenPosition : _provider . TokenPosition ;
6282
@@ -66,13 +86,7 @@ public string TokenText
6686 {
6787 if ( _bufferidx < _buffer . Count )
6888 {
69- var tinfo = _buffer [ _bufferidx ] ;
70- if ( tinfo . TokenText == null )
71- {
72- _buffer [ _bufferidx ] = tinfo = tinfo . WithTokenText ( _strings . Add ( _sourceunit . GetSourceCode ( TokenPosition ) ) ) ;
73- }
74-
75- return tinfo . TokenText ;
89+ return _buffer [ _bufferidx ] . TokenSource . ToString ( ) ;
7690 }
7791 else
7892 {
@@ -81,7 +95,7 @@ public string TokenText
8195 }
8296 }
8397
84- public ReadOnlySpan < char > TokenTextSpan => TokenText . AsSpan ( ) ;
98+ public ReadOnlySpan < char > TokenTextSpan => TokenSource . Span ;
8599
86100 public IDocBlock DocComment
87101 {
@@ -123,7 +137,7 @@ void BufferTokens(int count = 1)
123137 t = ( Tokens ) _provider . GetNextToken ( ) ;
124138
125139 // add to buffer
126- _buffer . Add ( new CompleteToken ( t , _provider . TokenValue , _provider . TokenPosition , null ) ) ;
140+ _buffer . Add ( new TokenSnapshot ( t , _provider ) ) ;
127141
128142 } while ( t != Tokens . END && _buffer . Count < count ) ;
129143 }
@@ -143,15 +157,15 @@ void IDisposable.Dispose()
143157 ( _provider as IDisposable ) ? . Dispose ( ) ;
144158 }
145159
146- public void UpdateToken ( CompleteToken t )
160+ public void UpdateToken ( TokenSnapshot t )
147161 {
148162 _buffer [ _bufferidx ] = t ;
149163 }
150164
151165 /// <summary>
152166 /// Gets token information.
153167 /// </summary>
154- public CompleteToken Lookup ( int index )
168+ public TokenSnapshot Lookup ( int index )
155169 {
156170 if ( index < 0 ) throw new ArgumentOutOfRangeException ( ) ;
157171
@@ -184,15 +198,5 @@ public void Remove(int start, int count)
184198 _buffer [ idx ] = _buffer [ idx ] . WithToken ( Tokens . T_WHITESPACE ) ;
185199 }
186200 }
187-
188- public CompleteToken WithTokenText ( CompleteToken token )
189- {
190- if ( token . TokenText == null )
191- {
192- token = token . WithTokenText ( _strings . Add ( _sourceunit . GetSourceCode ( token . TokenPosition ) ) ) ;
193- }
194-
195- return token ;
196- }
197201 }
198202}
0 commit comments