diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 137d250300c..9da566ae793 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -4125,7 +4125,7 @@ namespace ts { case SyntaxKind.JsxTextAllWhiteSpaces: return parseJsxText(); case SyntaxKind.OpenBraceToken: - return parseJsxExpression(/*inExpressionContext*/ false); + return parseJsxExpression(/*inExpressionContext*/ false)!; case SyntaxKind.LessThanToken: return parseJsxElementOrSelfClosingElementOrFragment(/*inExpressionContext*/ false); } @@ -4236,10 +4236,13 @@ namespace ts { return expression; } - function parseJsxExpression(inExpressionContext: boolean): JsxExpression { + function parseJsxExpression(inExpressionContext: boolean): JsxExpression | undefined { const node = createNode(SyntaxKind.JsxExpression); - parseExpected(SyntaxKind.OpenBraceToken); + if (!parseExpected(SyntaxKind.OpenBraceToken)) { + return undefined; + } + if (token() !== SyntaxKind.CloseBraceToken) { node.dotDotDotToken = parseOptionalToken(SyntaxKind.DotDotDotToken); node.expression = parseAssignmentExpressionOrHigher(); diff --git a/tests/baselines/reference/jsxAttributeMissingInitializer.errors.txt b/tests/baselines/reference/jsxAttributeMissingInitializer.errors.txt new file mode 100644 index 00000000000..feeaaac525d --- /dev/null +++ b/tests/baselines/reference/jsxAttributeMissingInitializer.errors.txt @@ -0,0 +1,9 @@ +tests/cases/compiler/jsxAttributeMissingInitializer.tsx(1,21): error TS1005: '{' expected. + + +==== tests/cases/compiler/jsxAttributeMissingInitializer.tsx (1 errors) ==== + const x =
; + ~ +!!! error TS1005: '{' expected. + const y = 0; + \ No newline at end of file diff --git a/tests/baselines/reference/jsxAttributeMissingInitializer.js b/tests/baselines/reference/jsxAttributeMissingInitializer.js new file mode 100644 index 00000000000..e2b27aea696 --- /dev/null +++ b/tests/baselines/reference/jsxAttributeMissingInitializer.js @@ -0,0 +1,8 @@ +//// [jsxAttributeMissingInitializer.tsx] +const x =
; +const y = 0; + + +//// [jsxAttributeMissingInitializer.jsx] +var x =
; +var y = 0; diff --git a/tests/baselines/reference/jsxAttributeMissingInitializer.symbols b/tests/baselines/reference/jsxAttributeMissingInitializer.symbols new file mode 100644 index 00000000000..34a12bf0070 --- /dev/null +++ b/tests/baselines/reference/jsxAttributeMissingInitializer.symbols @@ -0,0 +1,8 @@ +=== tests/cases/compiler/jsxAttributeMissingInitializer.tsx === +const x =
; +>x : Symbol(x, Decl(jsxAttributeMissingInitializer.tsx, 0, 5)) +>foo : Symbol(foo, Decl(jsxAttributeMissingInitializer.tsx, 0, 14)) + +const y = 0; +>y : Symbol(y, Decl(jsxAttributeMissingInitializer.tsx, 1, 5)) + diff --git a/tests/baselines/reference/jsxAttributeMissingInitializer.types b/tests/baselines/reference/jsxAttributeMissingInitializer.types new file mode 100644 index 00000000000..b2f984c367e --- /dev/null +++ b/tests/baselines/reference/jsxAttributeMissingInitializer.types @@ -0,0 +1,12 @@ +=== tests/cases/compiler/jsxAttributeMissingInitializer.tsx === +const x =
; +>x : any +>
: any +>div : any +>foo : true +>div : any + +const y = 0; +>y : 0 +>0 : 0 + diff --git a/tests/baselines/reference/jsxEsprimaFbTestSuite.errors.txt b/tests/baselines/reference/jsxEsprimaFbTestSuite.errors.txt index 77f83ccbd36..7adde909489 100644 --- a/tests/baselines/reference/jsxEsprimaFbTestSuite.errors.txt +++ b/tests/baselines/reference/jsxEsprimaFbTestSuite.errors.txt @@ -1,14 +1,12 @@ tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(39,1): error TS2695: Left side of comma operator is unused and has no side effects. tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(39,17): error TS1005: '{' expected. -tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(39,23): error TS1005: '}' expected. -tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(39,29): error TS1005: '{' expected. +tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(39,23): error TS2304: Cannot find name 'right'. +tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(39,23): error TS2657: JSX expressions must have one parent element. tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(39,57): error TS1109: Expression expected. tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(39,58): error TS1109: Expression expected. -tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(41,1): error TS1003: Identifier expected. -tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(41,12): error TS2657: JSX expressions must have one parent element. -==== tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx (8 errors) ==== +==== tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx (6 errors) ==== declare var React: any; declare var 日本語; declare var AbC_def; @@ -48,24 +46,20 @@ tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(41,12): error TS2657: JSX

7x invalid-js-identifier
; right=monkeys /> gorillas />; - ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~~~~~~~~~~~~~~~~ !!! error TS2695: Left side of comma operator is unused and has no side effects. ~ !!! error TS1005: '{' expected. ~~~~~ -!!! error TS1005: '}' expected. - ~ -!!! error TS1005: '{' expected. +!!! error TS2304: Cannot find name 'right'. + ~~~~~ +!!! error TS2657: JSX expressions must have one parent element. ~ !!! error TS1109: Expression expected. ~ !!! error TS1109: Expression expected. ; - ~ -!!! error TS1003: Identifier expected. - ~ -!!! error TS2657: JSX expressions must have one parent element. ; diff --git a/tests/baselines/reference/jsxEsprimaFbTestSuite.js b/tests/baselines/reference/jsxEsprimaFbTestSuite.js index 465d265efb2..169429a7249 100644 --- a/tests/baselines/reference/jsxEsprimaFbTestSuite.js +++ b/tests/baselines/reference/jsxEsprimaFbTestSuite.js @@ -71,9 +71,9 @@ baz ;
@test content
;

7x invalid-js-identifier
; -} right={monkeys /> gorillas / > }/> - , - ; +, ; +right = monkeys /> gorillas / > ; +; ; (
) < x;
; diff --git a/tests/baselines/reference/jsxEsprimaFbTestSuite.symbols b/tests/baselines/reference/jsxEsprimaFbTestSuite.symbols index a65412ce06e..f6d2fef6081 100644 --- a/tests/baselines/reference/jsxEsprimaFbTestSuite.symbols +++ b/tests/baselines/reference/jsxEsprimaFbTestSuite.symbols @@ -71,7 +71,6 @@ baz right=monkeys /> gorillas />; >LeftRight : Symbol(LeftRight, Decl(jsxEsprimaFbTestSuite.tsx, 3, 11)) >left : Symbol(left, Decl(jsxEsprimaFbTestSuite.tsx, 38, 10)) ->right : Symbol(right, Decl(jsxEsprimaFbTestSuite.tsx, 38, 21)) ; >a : Symbol(a, Decl(jsxEsprimaFbTestSuite.tsx, 5, 11)) diff --git a/tests/baselines/reference/jsxEsprimaFbTestSuite.types b/tests/baselines/reference/jsxEsprimaFbTestSuite.types index f36758fb7d3..990f8332fd2 100644 --- a/tests/baselines/reference/jsxEsprimaFbTestSuite.types +++ b/tests/baselines/reference/jsxEsprimaFbTestSuite.types @@ -102,13 +102,14 @@ baz >div : any right=monkeys /> gorillas />; -> right=monkeys /> gorillas />; : any -> right=monkeys /> gorillas />; : any +> : any +>LeftRight : any ->left : any +>left : true > : any >a : any ->right : boolean +>right=monkeys /> gorillas /> : boolean +>right : any >monkeys /> gorillas /> : boolean >monkeys /> gorillas / : number >monkeys /> gorillas : any diff --git a/tests/baselines/reference/jsxInvalidEsprimaTestSuite.errors.txt b/tests/baselines/reference/jsxInvalidEsprimaTestSuite.errors.txt index 53541851b4a..68b615525b5 100644 --- a/tests/baselines/reference/jsxInvalidEsprimaTestSuite.errors.txt +++ b/tests/baselines/reference/jsxInvalidEsprimaTestSuite.errors.txt @@ -58,9 +58,9 @@ tests/cases/conformance/jsx/25.tsx(1,39): error TS1109: Expression expected. tests/cases/conformance/jsx/28.tsx(1,2): error TS17008: JSX element 'a' has no corresponding closing tag. tests/cases/conformance/jsx/28.tsx(1,6): error TS1005: '{' expected. tests/cases/conformance/jsx/28.tsx(2,1): error TS1005: '; ~ !!! error TS1005: '{' expected. - ~ -!!! error TS2304: Cannot find name 'd'. - ~ -!!! error TS1109: Expression expected. - ~ -!!! error TS1109: Expression expected. - -!!! error TS1005: '/' expected. ==== tests/cases/conformance/jsx/5.tsx (2 errors) ==== ; ~ @@ -315,12 +303,12 @@ tests/cases/conformance/jsx/9.tsx(1,16): error TS1109: Expression expected. !!! error TS1005: '; - ~ -!!! error TS17008: JSX element 'a' has no corresponding closing tag. + ~~~~~ +!!! error TS2695: Left side of comma operator is unused and has no side effects. ~ !!! error TS1005: '{' expected. ~ -!!! error TS1109: Expression expected. +!!! error TS1003: Identifier expected. !!! error TS1005: 'one
/* intervening comment */
two
;; < ; a / > ; //// [4.jsx] -
}/>; +; //// [5.jsx] ;; //// [6.jsx] @@ -148,10 +148,10 @@ var x =
one
/* intervening comment */, /* intervening comment */
>; //// [28.jsx] -; +; ; //// [29.jsx] -; +, <>; ; //// [30.jsx] }; diff --git a/tests/baselines/reference/jsxInvalidEsprimaTestSuite.symbols b/tests/baselines/reference/jsxInvalidEsprimaTestSuite.symbols index 3e9c94c6803..7be7925fa39 100644 --- a/tests/baselines/reference/jsxInvalidEsprimaTestSuite.symbols +++ b/tests/baselines/reference/jsxInvalidEsprimaTestSuite.symbols @@ -10,6 +10,7 @@ No type information for this code.=== tests/cases/conformance/jsx/3.tsx === No type information for this code.=== tests/cases/conformance/jsx/4.tsx === ; >b : Symbol(b, Decl(4.tsx, 0, 2)) +>d : Symbol(d, Decl(4.tsx, 0, 5)) === tests/cases/conformance/jsx/5.tsx === ; diff --git a/tests/baselines/reference/jsxInvalidEsprimaTestSuite.types b/tests/baselines/reference/jsxInvalidEsprimaTestSuite.types index 0791b6d9e85..adb7f6b7271 100644 --- a/tests/baselines/reference/jsxInvalidEsprimaTestSuite.types +++ b/tests/baselines/reference/jsxInvalidEsprimaTestSuite.types @@ -25,14 +25,10 @@ declare var React: any; === tests/cases/conformance/jsx/4.tsx === ; ->; : any +> : any >a : any ->b : boolean ->d /> : boolean ->d / : number ->d : any -> : any -> : any +>b : true +>d : true === tests/cases/conformance/jsx/5.tsx === ; @@ -251,17 +247,17 @@ var x =
one
/* intervening comment */
two
;;
; >; : any >a : any ->b : any +>b : true > : any === tests/cases/conformance/jsx/29.tsx === ; >; : any +>a : any ->b : boolean ->< : boolean -> : any +>b : true +><}>; : any > : any > : any diff --git a/tests/cases/compiler/jsxAttributeMissingInitializer.tsx b/tests/cases/compiler/jsxAttributeMissingInitializer.tsx new file mode 100644 index 00000000000..b532f62bd19 --- /dev/null +++ b/tests/cases/compiler/jsxAttributeMissingInitializer.tsx @@ -0,0 +1,3 @@ +// @jsx: preserve +const x =
; +const y = 0; diff --git a/tests/cases/fourslash/completionsJsxAttributeInitializer.ts b/tests/cases/fourslash/completionsJsxAttributeInitializer.ts index 510e0630de9..f473d0be422 100644 --- a/tests/cases/fourslash/completionsJsxAttributeInitializer.ts +++ b/tests/cases/fourslash/completionsJsxAttributeInitializer.ts @@ -12,12 +12,12 @@ verify.completionListContains("x", "(parameter) x: number", "", "parameter", und insertText: "{x}", }); -verify.completionListContains("p", "(property) p: number", "", "property", undefined, undefined, { +verify.completionListContains("p", "(JSX attribute) p: number", "", "JSX attribute", undefined, undefined, { includeInsertTextCompletions: true, insertText: "{this.p}", }); -verify.completionListContains("a b", '(property) "a b": number', "", "property", undefined, undefined, { +verify.completionListContains("a b", '(JSX attribute) "a b": number', "", "JSX attribute", undefined, undefined, { includeInsertTextCompletions: true, insertText: '{this["a b"]}', });