Skip to content

Commit

Permalink
fix(lexer): fixed loc tracking for jsx and optimized jsx scanning
Browse files Browse the repository at this point in the history
  • Loading branch information
KFlash committed Jul 6, 2019
1 parent 712d8e6 commit 708a1a6
Show file tree
Hide file tree
Showing 4 changed files with 28 additions and 35 deletions.
2 changes: 1 addition & 1 deletion package.json
Original file line number Diff line number Diff line change
@@ -1,6 +1,6 @@
{
"name": "meriyah",
"version": "1.3.0",
"version": "1.3.1",
"description": "A 100% compliant, self-hosted javascript parser with high focus on both performance and stability",
"main": "dist/meriyah.umd.js",
"module": "dist/meriyah.esm.js",
Expand Down
2 changes: 1 addition & 1 deletion src/lexer/index.ts
Original file line number Diff line number Diff line change
@@ -1,4 +1,4 @@
export { scanSingleToken, nextToken } from './scan';
export { scanSingleToken, nextToken, TokenLookup } from './scan';
export { skipMultiLineComment, skipSingleLineComment, skipHashBang } from './comments';
export {
nextCP,
Expand Down
37 changes: 20 additions & 17 deletions src/lexer/jsx.ts
Original file line number Diff line number Diff line change
Expand Up @@ -3,7 +3,7 @@ import { Chars } from '../chars';
import { Token } from '../token';
import { ParserState, Context } from '../common';
import { report, Errors } from '../errors';
import { nextCP, LexerState } from './';
import { nextCP, LexerState, TokenLookup } from './';
import { scanSingleToken } from './scan';

/**
Expand Down Expand Up @@ -51,31 +51,34 @@ export function scanJSXString(parser: ParserState): Token {
*/
export function scanJSXToken(parser: ParserState): Token {
parser.startIndex = parser.tokenIndex = parser.index;
parser.startColumn = parser.colPos = parser.column;
parser.startLine = parser.linePos = parser.line;

if (parser.index >= parser.end) return (parser.token = Token.EOF);

const char = parser.source.charCodeAt(parser.index);
const token = TokenLookup[parser.source.charCodeAt(parser.index)];

if (char === Chars.LessThan) {
if (parser.source.charCodeAt(parser.index + 1) === Chars.Slash) {
parser.column += 2;
parser.nextCP = parser.source.charCodeAt((parser.index += 2));
return (parser.token = Token.JSXClose);
}
nextCP(parser);
return (parser.token = Token.LessThan);
}
switch (token) {
case Token.LessThan: {
nextCP(parser);
if (parser.nextCP === Chars.Slash) {
nextCP(parser);
return (parser.token = Token.JSXClose);
}

if (char === Chars.LeftBrace) {
nextCP(parser);
return (parser.token = Token.LeftBrace);
return (parser.token = Token.LessThan);
}
case Token.LeftBrace: {
nextCP(parser);
return (parser.token = Token.LeftBrace);
}
default: // ignore
}

while (parser.index < parser.end) {
if (CharTypes[nextCP(parser)] & CharFlags.JSXToken) break;
}
while (parser.index < parser.end && (CharTypes[nextCP(parser)] & CharFlags.JSXToken) === 0) {}

parser.tokenValue = parser.source.slice(parser.tokenIndex, parser.index);

return (parser.token = Token.JSXText);
}

Expand Down
22 changes: 6 additions & 16 deletions src/parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -8370,15 +8370,7 @@ function parseJsxAttribute(
value = parseJSXRootElementOrFragment(parser, context, /*isJSXChild*/ 1, tokenIndex, linePos, colPos);
break;
case Token.LeftBrace:
value = parseJSXExpressionContainer(
parser,
context,
/*isJSXChild*/ 1,
/* isAttr */ 1,
tokenIndex,
linePos,
colPos
);
value = parseJSXExpressionContainer(parser, context, 1, 1, tokenIndex, linePos, colPos);
break;
default:
report(parser, Errors.InvalidJSXAttributeValue);
Expand Down Expand Up @@ -8438,20 +8430,18 @@ function parseJSXExpressionContainer(
line: number,
column: number
): ESTree.JSXExpressionContainer | ESTree.JSXSpreadChild {
consume(parser, context, Token.LeftBrace);
nextToken(parser, context);
const { tokenIndex, linePos, colPos } = parser;
if (parser.token === Token.Ellipsis) return parseJSXSpreadChild(parser, context, tokenIndex, linePos, colPos);

let expression: ESTree.Expression | ESTree.JSXEmptyExpression | null = null;

if (parser.token !== Token.RightBrace) {
expression = parseExpression(parser, context, 1, 0, 0, tokenIndex, linePos, colPos);
} else {
if (parser.token === Token.RightBrace) {
// JSX attributes must only be assigned a non-empty 'expression'
if (isAttr) {
report(parser, Errors.InvalidNonEmptyJSXExpr);
}
if (isAttr) report(parser, Errors.InvalidNonEmptyJSXExpr);
expression = parseJSXEmptyExpression(parser, context, tokenIndex, linePos, colPos);
} else {
expression = parseExpression(parser, context, 1, 0, 0, tokenIndex, linePos, colPos);
}
if (isJSXChild) {
consume(parser, context, Token.RightBrace);
Expand Down

0 comments on commit 708a1a6

Please sign in to comment.