Reuse hash token instead of new primaryTopicToken

Set whether we're in a pipeline in order to determine how to parse the
hash. The error message changes as a result, since the `hash` never
enters the block.
This commit is contained in:
James DiGioia
2018-07-22 18:46:31 -04:00
parent 6e41edb90f
commit afd0638b74
5 changed files with 27 additions and 21 deletions

View File

@@ -298,6 +298,7 @@ export default class ExpressionParser extends LValParser {
const op = this.state.type;
if (op === tt.pipeline) {
this.state.inPipeline = true;
this.checkPipelineAtInfixOperator(left, leftStartPos);
} else if (op === tt.nullishCoalescing) {
this.expectPlugin("nullishCoalescingOperator");
@@ -931,26 +932,30 @@ export default class ExpressionParser extends LValParser {
}
}
case tt.primaryTopicReference: {
this.expectPlugin("pipelineOperator");
node = this.startNode();
case tt.hash: {
if (this.state.inPipeline) {
this.expectPlugin("pipelineOperator");
node = this.startNode();
if ("smart" !== this.getPluginOption("pipelineOperator", "proposal")) {
this.raise(
node.start,
"Primary Topic Reference found but pipelineOperator not passed 'smart' for 'proposal' option.",
);
}
if (
"smart" !== this.getPluginOption("pipelineOperator", "proposal")
) {
this.raise(
node.start,
"Primary Topic Reference found but pipelineOperator not passed 'smart' for 'proposal' option.",
);
}
this.next();
if (this.primaryTopicReferenceIsAllowedInCurrentTopicContext()) {
this.registerTopicReference();
return this.finishNode(node, "PrimaryTopicReference");
} else {
throw this.raise(
node.start,
`Topic reference was used in a lexical context without topic binding`,
);
this.next();
if (this.primaryTopicReferenceIsAllowedInCurrentTopicContext()) {
this.registerTopicReference();
return this.finishNode(node, "PrimaryTopicReference");
} else {
throw this.raise(
node.start,
`Topic reference was used in a lexical context without topic binding`,
);
}
}
}

View File

@@ -431,7 +431,7 @@ export default class Tokenizer extends LocationParser {
)}'`,
);
} else {
this.finishOp(tt.primaryTopicReference, 1);
this.finishOp(tt.hash, 1);
}
} else {
this.raise(

View File

@@ -26,6 +26,7 @@ export default class State {
this.maybeInArrowParameters = false;
this.inGenerator = false;
this.inAsync = false;
this.inPipeline = false;
this.inPropertyName = false;
this.inType = false;
this.inClassProperty = false;
@@ -110,6 +111,7 @@ export default class State {
inGenerator: boolean;
inMethod: boolean | N.MethodKind;
inAsync: boolean;
inPipeline: boolean;
inType: boolean;
noAnonFunctionType: boolean;
inPropertyName: boolean;

View File

@@ -86,7 +86,6 @@ export const types: { [name: string]: TokenType } = {
regexp: new TokenType("regexp", { startsExpr }),
string: new TokenType("string", { startsExpr }),
name: new TokenType("name", { startsExpr }),
primaryTopicReference: new TokenType("#", { startsExpr }),
eof: new TokenType("eof"),
// Punctuation token types.

View File

@@ -1,4 +1,4 @@
{
"plugins": [["pipelineOperator", { "proposal": "smart" }]],
"throws": "Topic reference was used in a lexical context without topic binding (1:4)"
"throws": "Unexpected token (1:4)"
}