@@ -17,16 +17,13 @@ abstract class SemanticContextCollector {
17
17
if ( allTokens ?. length ) {
18
18
let i = tokenIndex ? tokenIndex - 1 : allTokens . length - 1 ;
19
19
/**
20
- * Find the previous no-white-space token.
20
+ * Find the previous no-hidden token.
21
21
* If can't find tokenIndex or current token is whiteSpace at caretPosition,
22
22
* prevTokenIndex is useful to help us determine if it is new statement.
23
23
*/
24
24
while ( i >= 0 ) {
25
- const isWhiteSpaceToken =
26
- allTokens [ i ] . type === this . getWhiteSpaceRuleType ( ) ||
27
- allTokens [ i ] . text === '\n' ;
28
25
if (
29
- ! isWhiteSpaceToken &&
26
+ allTokens [ i ] . channel !== Token . HIDDEN_CHANNEL &&
30
27
( allTokens [ i ] . line < caretPosition ?. lineNumber ||
31
28
( allTokens [ i ] . line === caretPosition . lineNumber &&
32
29
allTokens [ i ] . column < caretPosition . column ) )
@@ -61,12 +58,23 @@ abstract class SemanticContextCollector {
61
58
62
59
abstract getStatementRuleType ( ) : number ;
63
60
64
- private getPrevStatementRule ( node : TerminalNode | ErrorNode | ParserRuleContext ) {
61
+ private previousStatementHasError ( node : TerminalNode | ErrorNode | ParserRuleContext ) {
65
62
let parent = node . parent as ParserRuleContext ;
66
- if ( ! parent ) return null ;
63
+ if ( ! parent ) return false ;
64
+
67
65
const currentNodeIndex = parent . children ! . findIndex ( ( child ) => child === node ) ;
68
- if ( currentNodeIndex <= 0 ) return null ;
69
- return parent . children ! [ currentNodeIndex - 1 ] ;
66
+ if ( currentNodeIndex <= 0 ) return false ;
67
+
68
+ for ( let i = currentNodeIndex - 1 ; i >= 0 ; i -- ) {
69
+ const prevNode = parent . children ! [ i ] ;
70
+ if (
71
+ prevNode instanceof ErrorNode ||
72
+ ( prevNode instanceof ParserRuleContext && prevNode . exception !== null )
73
+ )
74
+ return true ;
75
+ }
76
+
77
+ return false ;
70
78
}
71
79
72
80
/**
@@ -99,7 +107,9 @@ abstract class SemanticContextCollector {
99
107
ctx . exception === null ;
100
108
101
109
if ( isWhiteSpaceToken && ( isPrevTokenSplitSymbol || isPrevTokenEndOfStatement ) ) {
102
- this . _isNewStatement = true ;
110
+ if ( ! this . previousStatementHasError ( ctx ) ) {
111
+ this . _isNewStatement = true ;
112
+ }
103
113
}
104
114
}
105
115
@@ -118,22 +128,12 @@ abstract class SemanticContextCollector {
118
128
119
129
let parent : ParserRuleContext | null = node . parent as ParserRuleContext ;
120
130
let currentNode : TerminalNode | ParserRuleContext = node ;
131
+
121
132
/**
122
133
* The error node is a direct child node of the program node
123
134
*/
124
- if ( parent . ruleIndex === this . getStatementRuleType ( ) || this . getIsRootRuleNode ( parent ) ) {
125
- const prevStatementRule = this . getPrevStatementRule ( currentNode ) ;
126
- if (
127
- prevStatementRule instanceof TerminalNode ||
128
- ( prevStatementRule &&
129
- ( ( prevStatementRule as ParserRuleContext ) . exception !== null ||
130
- ( prevStatementRule as ParserRuleContext ) . ruleIndex !==
131
- this . getStatementRuleType ( ) ) )
132
- ) {
133
- this . _isNewStatement = false ;
134
- } else {
135
- this . _isNewStatement = true ;
136
- }
135
+ if ( this . getIsRootRuleNode ( parent ) ) {
136
+ this . _isNewStatement = ! this . previousStatementHasError ( currentNode ) ;
137
137
return ;
138
138
}
139
139
@@ -160,16 +160,13 @@ abstract class SemanticContextCollector {
160
160
const currentStatementRuleIndex =
161
161
programRule ?. children ?. findIndex ( ( node ) => node === parent ) || - 1 ;
162
162
if ( currentStatementRuleIndex > 0 ) {
163
- const prevStatementRule = programRule ! . children ! [
164
- currentStatementRuleIndex - 1
165
- ] as ParserRuleContext ;
166
163
/**
167
164
* When you typed a keyword and doesn't match any rule, you will get a EOF error,
168
165
* For example, just typed 'CREATE', 'INSERT'.
169
166
*/
170
167
const isStatementEOF = parent . exception ?. offendingToken ?. text === '<EOF>' ;
171
168
isNewStatement =
172
- prevStatementRule . exception !== null && ! isStatementEOF
169
+ this . previousStatementHasError ( parent ) && ! isStatementEOF
173
170
? false
174
171
: isNewStatement ;
175
172
}
@@ -211,10 +208,7 @@ abstract class SemanticContextCollector {
211
208
const currentStatementRuleIndex =
212
209
programRule ?. children ?. findIndex ( ( node ) => node === parent ) || - 1 ;
213
210
if ( currentStatementRuleIndex > 0 ) {
214
- const prevStatementRule = programRule ! . children ! [
215
- currentStatementRuleIndex - 1
216
- ] as ParserRuleContext ;
217
- isNewStatement = prevStatementRule . exception !== null ? false : isNewStatement ;
211
+ isNewStatement = this . previousStatementHasError ( parent ) ? false : isNewStatement ;
218
212
}
219
213
}
220
214
0 commit comments