@@ -17,16 +17,13 @@ abstract class SemanticContextCollector {
1717 if ( allTokens ?. length ) {
1818 let i = tokenIndex ? tokenIndex - 1 : allTokens . length - 1 ;
1919 /**
20- * Find the previous no-white-space token.
20+ * Find the previous no-hidden token.
2121 * If can't find tokenIndex or current token is whiteSpace at caretPosition,
2222 * prevTokenIndex is useful to help us determine if it is new statement.
2323 */
2424 while ( i >= 0 ) {
25- const isWhiteSpaceToken =
26- allTokens [ i ] . type === this . getWhiteSpaceRuleType ( ) ||
27- allTokens [ i ] . text === '\n' ;
2825 if (
29- ! isWhiteSpaceToken &&
26+ allTokens [ i ] . channel !== Token . HIDDEN_CHANNEL &&
3027 ( allTokens [ i ] . line < caretPosition ?. lineNumber ||
3128 ( allTokens [ i ] . line === caretPosition . lineNumber &&
3229 allTokens [ i ] . column < caretPosition . column ) )
@@ -61,12 +58,23 @@ abstract class SemanticContextCollector {
6158
6259 abstract getStatementRuleType ( ) : number ;
6360
64- private getPrevStatementRule ( node : TerminalNode | ErrorNode | ParserRuleContext ) {
61+ private previousStatementHasError ( node : TerminalNode | ErrorNode | ParserRuleContext ) {
6562 let parent = node . parent as ParserRuleContext ;
66- if ( ! parent ) return null ;
63+ if ( ! parent ) return false ;
64+
6765 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 ;
7078 }
7179
7280 /**
@@ -99,7 +107,9 @@ abstract class SemanticContextCollector {
99107 ctx . exception === null ;
100108
101109 if ( isWhiteSpaceToken && ( isPrevTokenSplitSymbol || isPrevTokenEndOfStatement ) ) {
102- this . _isNewStatement = true ;
110+ if ( ! this . previousStatementHasError ( ctx ) ) {
111+ this . _isNewStatement = true ;
112+ }
103113 }
104114 }
105115
@@ -118,22 +128,12 @@ abstract class SemanticContextCollector {
118128
119129 let parent : ParserRuleContext | null = node . parent as ParserRuleContext ;
120130 let currentNode : TerminalNode | ParserRuleContext = node ;
131+
121132 /**
122133 * The error node is a direct child node of the program node
123134 */
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 ) ;
137137 return ;
138138 }
139139
@@ -160,16 +160,13 @@ abstract class SemanticContextCollector {
160160 const currentStatementRuleIndex =
161161 programRule ?. children ?. findIndex ( ( node ) => node === parent ) || - 1 ;
162162 if ( currentStatementRuleIndex > 0 ) {
163- const prevStatementRule = programRule ! . children ! [
164- currentStatementRuleIndex - 1
165- ] as ParserRuleContext ;
166163 /**
167164 * When you typed a keyword and doesn't match any rule, you will get a EOF error,
168165 * For example, just typed 'CREATE', 'INSERT'.
169166 */
170167 const isStatementEOF = parent . exception ?. offendingToken ?. text === '<EOF>' ;
171168 isNewStatement =
172- prevStatementRule . exception !== null && ! isStatementEOF
169+ this . previousStatementHasError ( parent ) && ! isStatementEOF
173170 ? false
174171 : isNewStatement ;
175172 }
@@ -211,10 +208,7 @@ abstract class SemanticContextCollector {
211208 const currentStatementRuleIndex =
212209 programRule ?. children ?. findIndex ( ( node ) => node === parent ) || - 1 ;
213210 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 ;
218212 }
219213 }
220214
0 commit comments