Skip to content

Commit

Permalink
fix(parser): Fixed non-failing cases
Browse files Browse the repository at this point in the history
  • Loading branch information
KFlash committed Jul 5, 2019
1 parent 7073fdd commit 2e3ff8d
Show file tree
Hide file tree
Showing 3 changed files with 56 additions and 13 deletions.
27 changes: 27 additions & 0 deletions src/common.ts
Original file line number Diff line number Diff line change
Expand Up @@ -409,3 +409,30 @@ export function finishNode<T extends Node>(

return node;
}


/** @internal */
export function isEqualTagName(lhs: any, rhs: any): boolean {
if (lhs.type !== rhs.type) {
return false;
}

if (lhs.type === 'JSXIdentifier') {
return lhs.name === rhs.name;
}

if (lhs.type === 'JSXNamespacedName') {
return lhs.namespace + ':' + lhs.name === rhs.namespace + ':' + rhs.name;
}

if (lhs.type === 'JSXMemberExpression') {
(
isEqualTagName(lhs.object, rhs.object) + '.' +
isEqualTagName(lhs.property, rhs.property)
) === (
isEqualTagName(lhs.object, rhs.object) + '.' +
isEqualTagName(lhs.property, rhs.property)
)
}
return true;
}
7 changes: 5 additions & 2 deletions src/parser.ts
Original file line number Diff line number Diff line change
Expand Up @@ -4,6 +4,7 @@ import * as ESTree from './estree';
import { report, reportAt, Errors } from './errors';
import { scanTemplateTail } from './lexer/template';
import { scanJSXIdentifier, scanJSXToken, scanJSXAttributeValue } from './lexer/jsx';
import { isEqualTagName } from './common';

import {
declareName,
Expand Down Expand Up @@ -8023,6 +8024,9 @@ function parseJSXRootElementOrFragment(
parser.linePos,
parser.colPos
);
if (!isEqualTagName(closingElement.name, openingElement.name)) {
report(parser, Errors.Unexpected);
}
}

return finishNode(parser, context, start, line, column, {
Expand Down Expand Up @@ -8315,7 +8319,7 @@ export function parseJSXSpreadAttribute(
line: number,
column: number
): ESTree.JSXSpreadAttribute {
consume(parser, context, Token.LeftBrace);
nextToken(parser, context);
consume(parser, context, Token.Ellipsis);
const expression = parseExpression(parser, context, 1, 0, 0, parser.tokenIndex, parser.linePos, parser.colPos);
consume(parser, context, Token.RightBrace);
Expand All @@ -8342,7 +8346,6 @@ function parseJsxAttribute(
column: number
): ESTree.JSXAttribute | ESTree.JSXSpreadAttribute {
if (parser.token === Token.LeftBrace) return parseJSXSpreadAttribute(parser, context, start, line, column);

scanJSXIdentifier(parser);
let value = null;
let name = parseJSXIdentifier(parser, context, start, line, column);
Expand Down
35 changes: 24 additions & 11 deletions test/parser/miscellaneous/jsx.ts
Original file line number Diff line number Diff line change
@@ -1,8 +1,8 @@
import { Context } from '../../../src/common';
import { pass, fail } from '../../test-utils';

describe('Expressions - Additive', () => {
fail('Declarations - Async Function (fail)', [
describe('Miscellaneous - JSX', () => {
fail('Miscellaneous - JSX (fail)', [
['<', Context.None],
['>', Context.None],
['<>', Context.None],
Expand All @@ -16,18 +16,35 @@ describe('Expressions - Additive', () => {
['</>', Context.OptionsJSX],
['<><//>', Context.OptionsJSX],
['<p>', Context.OptionsJSX],
//['<p></q>', Context.OptionsJSX],
['<p></q>', Context.OptionsJSX],
['<p></>', Context.OptionsJSX],
['<p><q></p>', Context.OptionsJSX],
// ['<1/>', Context.OptionsJSX],
['<div>one</div><div>two</div>', Context.OptionsJSX],
['</>', Context.OptionsJSX],
// ['<a:b.c />', Context.OptionsJSX],
['<a/!', Context.OptionsJSX],
['<img src={}>', Context.OptionsJSX],
['<a b=: />', Context.OptionsJSX],
['<xyz. />', Context.OptionsJSX],
// ['<.abc />', Context.OptionsJSX],
['<Foo></Bar>', Context.OptionsJSX],
['<dd><e></e></dddd>;', Context.OptionsJSX],
['<{...b} {...a }>{...b}</{...b}>', Context.OptionsJSX],
['<f><g/></ff>;', Context.OptionsJSX],
// ['<:path />', Context.OptionsJSX],
['<path></svg:path>', Context.OptionsJSX],
// ['<foo.bar></foo.baz>', Context.OptionsJSX],
['var x = <div>one</div> /* intervening comment */ <div>two</div>;', Context.OptionsJSX],
['<tag className=></tag>', Context.OptionsJSX],
//['<tag ... ></tag>', Context.OptionsJSX],
// ['<tag ...className></tag>', Context.OptionsJSX],
['<tag ${"className"}="tag"></tag>', Context.OptionsJSX],
['<a: />;', Context.OptionsJSX],
//['<:a />;', Context.OptionsJSX],
// ['<a></b>', Context.OptionsJSX],
['<a></b>', Context.OptionsJSX],
['<a foo="bar;', Context.OptionsJSX],
//['<a:b></b>;', Context.OptionsJSX],
['<a:b></b>;', Context.OptionsJSX],
['<a.b:c></a.b:c>;', Context.OptionsJSX],
['<a[foo]></a[foo]>;', Context.OptionsJSX],
['<a["foo"]></a["foo"]>;', Context.OptionsJSX],
Expand All @@ -41,10 +58,8 @@ describe('Expressions - Additive', () => {
// ['<a .../*hai*/asdf/>;', Context.OptionsJSX],
[' > ;', Context.OptionsJSX],
['<a>;</>;', Context.OptionsJSX],
//['<a b></b>;', Context.OptionsJSX],
// ['<a b c></a>;', Context.OptionsJSX],
// ['<a.b c></a.b>;', Context.OptionsJSX],
// ['<a.b.c></a>;', Context.OptionsJSX],
['<a b></b>;', Context.OptionsJSX],
['<a.b.c></a>;', Context.OptionsJSX],
[' < .a > ;', Context.OptionsJSX],
['a > ;', Context.OptionsJSX],
['[foo] > ;', Context.OptionsJSX],
Expand All @@ -54,15 +69,13 @@ describe('Expressions - Additive', () => {
['<div className"app">', Context.OptionsJSX],
['<div {props} />', Context.OptionsJSX],
['<a>></a>', Context.OptionsJSX],
//['<a>}</a>', Context.OptionsJSX],
['<div {...props}>stuff</div {...props}>', Context.OptionsJSX],
['<a><</a>', Context.OptionsJSX],
['[foo] > ;', Context.OptionsJSX],
['[foo] > ;', Context.OptionsJSX],
['[foo] > ;', Context.OptionsJSX],
['[foo] > ;', Context.OptionsJSX],
['var x = <div>one</div>, <div>two</div>;', Context.OptionsJSX]
//['<a>{"str"};}</a>;', Context.OptionsJSX],
]);

pass('Expressions - Additive (pass)', [
Expand Down

0 comments on commit 2e3ff8d

Please sign in to comment.