@@ -89,7 +89,7 @@ export abstract class BasicSQL<
8989 allTokens : Token [ ] ,
9090 caretTokenIndex : number
9191 ) : Token [ ] {
92- // antlr4-c3 may return both entity and alias candidates; use the nearest candidate's start index as boundary
92+ // antlr4-c3 可能同时返回实体和别名候选,使用后续最近候选的起始位置作为边界
9393 const endTokenIndex = Array . from ( candidates . rules . values ( ) ) . reduce (
9494 ( nearestStartTokenIndex , candidateRule ) => {
9595 if ( candidateRule . startTokenIndex <= candidateStartTokenIndex ) {
@@ -103,12 +103,34 @@ export abstract class BasicSQL<
103103 . slice ( candidateStartTokenIndex , endTokenIndex )
104104 . reverse ( )
105105 . find ( ( token ) => token . channel === Token . DEFAULT_CHANNEL ) ;
106- // look past hidden tokens to detect dot, preserving dot and following identifier in incomplete qualified names
107- const rangeEndTokenIndex =
108- endTokenIndex <= caretTokenIndex &&
109- ( allTokens [ endTokenIndex ] ?. text === '.' || previousVisibleToken ?. text === '.' )
110- ? endTokenIndex + 1
111- : endTokenIndex ;
106+ const visibleTokenIndexes = allTokens
107+ . slice ( endTokenIndex , caretTokenIndex + 1 )
108+ . reduce < number [ ] > ( ( indexes , token , offset ) => {
109+ if ( token . channel === Token . DEFAULT_CHANNEL ) {
110+ indexes . push ( endTokenIndex + offset ) ;
111+ }
112+ return indexes ;
113+ } , [ ] ) ;
114+ const firstVisibleToken = allTokens [ visibleTokenIndexes [ 0 ] ] ;
115+ let rangeEndTokenIndex = endTokenIndex ;
116+
117+ // 候选边界可能落在多级限定名中间,需要沿标识符与点号链继续扩展
118+ if ( previousVisibleToken ?. text === '.' || firstVisibleToken ?. text === '.' ) {
119+ let visibleTokenOffset = 0 ;
120+ if ( previousVisibleToken ?. text === '.' && firstVisibleToken ) {
121+ rangeEndTokenIndex = visibleTokenIndexes [ visibleTokenOffset ] + 1 ;
122+ visibleTokenOffset += 1 ;
123+ }
124+
125+ while ( allTokens [ visibleTokenIndexes [ visibleTokenOffset ] ] ?. text === '.' ) {
126+ rangeEndTokenIndex = visibleTokenIndexes [ visibleTokenOffset ] + 1 ;
127+ visibleTokenOffset += 1 ;
128+ if ( visibleTokenOffset < visibleTokenIndexes . length ) {
129+ rangeEndTokenIndex = visibleTokenIndexes [ visibleTokenOffset ] + 1 ;
130+ visibleTokenOffset += 1 ;
131+ }
132+ }
133+ }
112134
113135 return allTokens
114136 . slice ( candidateStartTokenIndex , rangeEndTokenIndex )
0 commit comments