Skip to content

Commit c29a7da

Browse files
committed
feat: all previous statements should no excption
1 parent 8aa2e1a commit c29a7da

File tree

1 file changed

+25
-31
lines changed

1 file changed

+25
-31
lines changed

src/parser/common/semanticContextCollector.ts

+25-31
Original file line numberDiff line numberDiff line change
@@ -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

Comments
 (0)