diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts
index c5ffd98f9aea8..b1adf6e29bffa 100644
--- a/src/compiler/checker.ts
+++ b/src/compiler/checker.ts
@@ -24574,11 +24574,7 @@ namespace ts {
return getJsxElementTypeAt(node) || anyType;
}
- /**
- * Returns true iff the JSX element name would be a valid JS identifier, ignoring restrictions about keywords not being identifiers
- */
function isUnhyphenatedJsxName(name: string | __String) {
- // - is the only character supported in JSX attribute names that isn't valid in JavaScript identifiers
return !stringContains(name as string, "-");
}
diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts
index 5f5248e1073f3..9f9ed352ab7f3 100644
--- a/src/compiler/scanner.ts
+++ b/src/compiler/scanner.ts
@@ -2305,9 +2305,11 @@ namespace ts {
// they allow dashes
function scanJsxIdentifier(): SyntaxKind {
if (tokenIsIdentifierOrKeyword(token)) {
- // An identifier or keyword has already been parsed - check for a `-` and then append it and everything after it to the token
+ // An identifier or keyword has already been parsed - check for a `-` or a single instance of `:` and then append it and
+ // everything after it to the token
// Do note that this means that `scanJsxIdentifier` effectively _mutates_ the visible token without advancing to a new token
// Any caller should be expecting this behavior and should only read the pos or token value after calling it.
+ let namespaceSeparator = false;
while (pos < end) {
const ch = text.charCodeAt(pos);
if (ch === CharacterCodes.minus) {
@@ -2315,12 +2317,23 @@ namespace ts {
pos++;
continue;
}
+ else if (ch === CharacterCodes.colon && !namespaceSeparator) {
+ tokenValue += ":";
+ pos++;
+ namespaceSeparator = true;
+ continue;
+ }
const oldPos = pos;
tokenValue += scanIdentifierParts(); // reuse `scanIdentifierParts` so unicode escapes are handled
if (pos === oldPos) {
break;
}
}
+ // Do not include a trailing namespace separator in the token, since this is against the spec.
+ if (tokenValue.slice(-1) === ":") {
+ tokenValue = tokenValue.slice(0, -1);
+ pos--;
+ }
}
return token;
}
diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts
index 973528096a1f3..9791931a335fc 100644
--- a/src/compiler/utilities.ts
+++ b/src/compiler/utilities.ts
@@ -3810,7 +3810,7 @@ namespace ts {
export function isIntrinsicJsxName(name: __String | string) {
const ch = (name as string).charCodeAt(0);
- return (ch >= CharacterCodes.a && ch <= CharacterCodes.z) || stringContains((name as string), "-");
+ return (ch >= CharacterCodes.a && ch <= CharacterCodes.z) || stringContains((name as string), "-") || stringContains((name as string), ":");
}
const indentStrings: string[] = ["", " "];
diff --git a/tests/baselines/reference/jsxEsprimaFbTestSuite.errors.txt b/tests/baselines/reference/jsxEsprimaFbTestSuite.errors.txt
index c9e4aeb457cbe..22f3c94b6e1e0 100644
--- a/tests/baselines/reference/jsxEsprimaFbTestSuite.errors.txt
+++ b/tests/baselines/reference/jsxEsprimaFbTestSuite.errors.txt
@@ -1,10 +1,10 @@
-tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(39,1): error TS2657: JSX expressions must have one parent element.
-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,23): error TS2304: Cannot find name 'right'.
-tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(39,41): error TS1382: Unexpected token. Did you mean `{'>'}` or `>`?
-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(40,1): error TS2657: JSX expressions must have one parent element.
+tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(40,17): error TS1005: '{' expected.
+tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(40,23): error TS1005: ';' expected.
+tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(40,23): error TS2304: Cannot find name 'right'.
+tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(40,41): error TS1382: Unexpected token. Did you mean `{'>'}` or `>`?
+tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(40,57): error TS1109: Expression expected.
+tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(40,58): error TS1109: Expression expected.
==== tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx (7 errors) ====
@@ -15,12 +15,13 @@ tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx(39,58): error TS1109: Expr
declare var x;
declare var a;
declare var props;
+ declare var value;
;
- //; Namespace unsuported
+ ;
- // {value} ; Namespace unsuported
+ {value} ;
;
diff --git a/tests/baselines/reference/jsxEsprimaFbTestSuite.js b/tests/baselines/reference/jsxEsprimaFbTestSuite.js
index 169429a724954..8fe51d678f76e 100644
--- a/tests/baselines/reference/jsxEsprimaFbTestSuite.js
+++ b/tests/baselines/reference/jsxEsprimaFbTestSuite.js
@@ -6,12 +6,13 @@ declare var LeftRight;
declare var x;
declare var a;
declare var props;
+declare var value;
;
-//; Namespace unsuported
+;
-// {value} ; Namespace unsuported
+ {value} ;
;
@@ -56,8 +57,8 @@ baz
//// [jsxEsprimaFbTestSuite.jsx]
;
-//; Namespace unsuported
-// {value} ; Namespace unsuported
+;
+ {value} ;
;
;
;
diff --git a/tests/baselines/reference/jsxEsprimaFbTestSuite.symbols b/tests/baselines/reference/jsxEsprimaFbTestSuite.symbols
index f6d2fef6081d2..64d739a9d62dd 100644
--- a/tests/baselines/reference/jsxEsprimaFbTestSuite.symbols
+++ b/tests/baselines/reference/jsxEsprimaFbTestSuite.symbols
@@ -20,23 +20,29 @@ declare var a;
declare var props;
>props : Symbol(props, Decl(jsxEsprimaFbTestSuite.tsx, 6, 11))
+declare var value;
+>value : Symbol(value, Decl(jsxEsprimaFbTestSuite.tsx, 7, 11))
+
;
-//; Namespace unsuported
+;
+>n:v : Symbol(n:v, Decl(jsxEsprimaFbTestSuite.tsx, 11, 4))
-// {value} ; Namespace unsuported
+ {value} ;
+>n:foo : Symbol(n:foo, Decl(jsxEsprimaFbTestSuite.tsx, 13, 2))
+>value : Symbol(value, Decl(jsxEsprimaFbTestSuite.tsx, 7, 11))
;
->b : Symbol(b, Decl(jsxEsprimaFbTestSuite.tsx, 14, 2))
->c : Symbol(c, Decl(jsxEsprimaFbTestSuite.tsx, 14, 10))
->d : Symbol(d, Decl(jsxEsprimaFbTestSuite.tsx, 14, 16))
->e : Symbol(e, Decl(jsxEsprimaFbTestSuite.tsx, 14, 26))
->f : Symbol(f, Decl(jsxEsprimaFbTestSuite.tsx, 14, 43))
->g : Symbol(g, Decl(jsxEsprimaFbTestSuite.tsx, 14, 59))
->h : Symbol(h, Decl(jsxEsprimaFbTestSuite.tsx, 14, 71))
+>b : Symbol(b, Decl(jsxEsprimaFbTestSuite.tsx, 15, 2))
+>c : Symbol(c, Decl(jsxEsprimaFbTestSuite.tsx, 15, 10))
+>d : Symbol(d, Decl(jsxEsprimaFbTestSuite.tsx, 15, 16))
+>e : Symbol(e, Decl(jsxEsprimaFbTestSuite.tsx, 15, 26))
+>f : Symbol(f, Decl(jsxEsprimaFbTestSuite.tsx, 15, 43))
+>g : Symbol(g, Decl(jsxEsprimaFbTestSuite.tsx, 15, 59))
+>h : Symbol(h, Decl(jsxEsprimaFbTestSuite.tsx, 15, 71))
;
->b : Symbol(b, Decl(jsxEsprimaFbTestSuite.tsx, 16, 2))
+>b : Symbol(b, Decl(jsxEsprimaFbTestSuite.tsx, 17, 2))
;
@@ -49,7 +55,7 @@ declare var props;
>AbC_def : Symbol(AbC_def, Decl(jsxEsprimaFbTestSuite.tsx, 2, 11))
test="&&">
->test : Symbol(test, Decl(jsxEsprimaFbTestSuite.tsx, 22, 8))
+>test : Symbol(test, Decl(jsxEsprimaFbTestSuite.tsx, 23, 8))
bar
baz
@@ -57,7 +63,7 @@ baz
>AbC_def : Symbol(AbC_def, Decl(jsxEsprimaFbTestSuite.tsx, 2, 11))
: } />;
->b : Symbol(b, Decl(jsxEsprimaFbTestSuite.tsx, 28, 2))
+>b : Symbol(b, Decl(jsxEsprimaFbTestSuite.tsx, 29, 2))
>x : Symbol(x, Decl(jsxEsprimaFbTestSuite.tsx, 4, 11))
{};
@@ -70,7 +76,7 @@ baz
right=monkeys /> gorillas />;
>LeftRight : Symbol(LeftRight, Decl(jsxEsprimaFbTestSuite.tsx, 3, 11))
->left : Symbol(left, Decl(jsxEsprimaFbTestSuite.tsx, 38, 10))
+>left : Symbol(left, Decl(jsxEsprimaFbTestSuite.tsx, 39, 10))
;
>a : Symbol(a, Decl(jsxEsprimaFbTestSuite.tsx, 5, 11))
@@ -88,11 +94,11 @@ baz
;
>props : Symbol(props, Decl(jsxEsprimaFbTestSuite.tsx, 6, 11))
->post : Symbol(post, Decl(jsxEsprimaFbTestSuite.tsx, 48, 15))
+>post : Symbol(post, Decl(jsxEsprimaFbTestSuite.tsx, 49, 15))
;
->pre : Symbol(pre, Decl(jsxEsprimaFbTestSuite.tsx, 50, 4))
->pre2 : Symbol(pre2, Decl(jsxEsprimaFbTestSuite.tsx, 50, 18))
+>pre : Symbol(pre, Decl(jsxEsprimaFbTestSuite.tsx, 51, 4))
+>pre2 : Symbol(pre2, Decl(jsxEsprimaFbTestSuite.tsx, 51, 18))
>props : Symbol(props, Decl(jsxEsprimaFbTestSuite.tsx, 6, 11))
;
diff --git a/tests/baselines/reference/jsxEsprimaFbTestSuite.types b/tests/baselines/reference/jsxEsprimaFbTestSuite.types
index 990f8332fd272..7061befb881aa 100644
--- a/tests/baselines/reference/jsxEsprimaFbTestSuite.types
+++ b/tests/baselines/reference/jsxEsprimaFbTestSuite.types
@@ -20,13 +20,29 @@ declare var a;
declare var props;
>props : any
+declare var value;
+>value : any
+
;
> : any
>a : any
-//; Namespace unsuported
+;
+> : any
+>n:a : any
+>n:v : true
-// {value} ; Namespace unsuported
+ {value} ;
+> {value} : any
+>a : any
+>n:foo : string
+>value : any
+> : any
+>b : any
+> : any
+>c : any
+>b : any
+>a : any
;
> : any
diff --git a/tests/baselines/reference/jsxInvalidEsprimaTestSuite.errors.txt b/tests/baselines/reference/jsxInvalidEsprimaTestSuite.errors.txt
index a7deeac2aaaeb..be20bc527a510 100644
--- a/tests/baselines/reference/jsxInvalidEsprimaTestSuite.errors.txt
+++ b/tests/baselines/reference/jsxInvalidEsprimaTestSuite.errors.txt
@@ -75,13 +75,9 @@ tests/cases/conformance/jsx/5.tsx(1,2): error TS17008: JSX element 'a' has no co
tests/cases/conformance/jsx/5.tsx(1,5): error TS1005: '' expected.
tests/cases/conformance/jsx/6.tsx(1,4): error TS17002: Expected corresponding JSX closing tag for 'a'.
tests/cases/conformance/jsx/7.tsx(1,13): error TS1002: Unterminated string literal.
-tests/cases/conformance/jsx/8.tsx(1,3): error TS1003: Identifier expected.
-tests/cases/conformance/jsx/8.tsx(1,6): error TS17002: Expected corresponding JSX closing tag for 'a'.
-tests/cases/conformance/jsx/9.tsx(1,3): error TS1003: Identifier expected.
-tests/cases/conformance/jsx/9.tsx(1,5): error TS1003: Identifier expected.
-tests/cases/conformance/jsx/9.tsx(1,11): error TS1005: '>' expected.
-tests/cases/conformance/jsx/9.tsx(1,12): error TS2304: Cannot find name 'b'.
-tests/cases/conformance/jsx/9.tsx(1,16): error TS1109: Expression expected.
+tests/cases/conformance/jsx/8.tsx(1,6): error TS17002: Expected corresponding JSX closing tag for 'a:b'.
+tests/cases/conformance/jsx/9.tsx(1,2): error TS2304: Cannot find name 'a:b'.
+tests/cases/conformance/jsx/9.tsx(1,10): error TS2304: Cannot find name 'a:b'.
==== tests/cases/conformance/jsx/1.tsx (3 errors) ====
@@ -128,24 +124,16 @@ tests/cases/conformance/jsx/9.tsx(1,16): error TS1109: Expression expected.
;
//// [8.jsx]
-;
+;
//// [9.jsx]
-;
-b.c > ;
+;
//// [10.jsx]
;
c > ;
diff --git a/tests/baselines/reference/jsxInvalidEsprimaTestSuite.symbols b/tests/baselines/reference/jsxInvalidEsprimaTestSuite.symbols
index 3e029e49c79a6..b5e2de25fcde3 100644
--- a/tests/baselines/reference/jsxInvalidEsprimaTestSuite.symbols
+++ b/tests/baselines/reference/jsxInvalidEsprimaTestSuite.symbols
@@ -22,14 +22,9 @@ No type information for this code.=== tests/cases/conformance/jsx/7.tsx ===
=== tests/cases/conformance/jsx/8.tsx ===
;
->b : Symbol(b, Decl(8.tsx, 0, 3))
-
-=== tests/cases/conformance/jsx/9.tsx ===
+No type information for this code.=== tests/cases/conformance/jsx/9.tsx ===
;
->b : Symbol(b, Decl(9.tsx, 0, 3))
->c : Symbol(c, Decl(9.tsx, 0, 5))
-
-=== tests/cases/conformance/jsx/10.tsx ===
+No type information for this code.=== tests/cases/conformance/jsx/10.tsx ===
;
>c : Symbol(c, Decl(10.tsx, 0, 5))
diff --git a/tests/baselines/reference/jsxInvalidEsprimaTestSuite.types b/tests/baselines/reference/jsxInvalidEsprimaTestSuite.types
index 3b7ca699c8c86..cb54dc62c3af7 100644
--- a/tests/baselines/reference/jsxInvalidEsprimaTestSuite.types
+++ b/tests/baselines/reference/jsxInvalidEsprimaTestSuite.types
@@ -51,22 +51,18 @@ declare var React: any;
=== tests/cases/conformance/jsx/8.tsx ===
;
> : any
->a : any
->b : true
+>a:b : any
>b : any
=== tests/cases/conformance/jsx/9.tsx ===
;
->a : any
->b : true
->c : true
->a : any
->b.c> : boolean
->b.c : any
->b : any
+> : any
+>a:b.c : any
+>a:b : any
+>c : any
+>a:b.c : any
+>a:b : any
>c : any
-> : any
=== tests/cases/conformance/jsx/10.tsx ===
;
diff --git a/tests/baselines/reference/jsxNamespacePrefixInName.errors.txt b/tests/baselines/reference/jsxNamespacePrefixInName.errors.txt
new file mode 100644
index 0000000000000..2eb3df02ad13a
--- /dev/null
+++ b/tests/baselines/reference/jsxNamespacePrefixInName.errors.txt
@@ -0,0 +1,119 @@
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(7,32): error TS1003: Identifier expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(8,32): error TS1003: Identifier expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(8,45): error TS1005: '>' expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(8,50): error TS1005: ',' expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(8,51): error TS1109: Expression expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(9,32): error TS1003: Identifier expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(9,60): error TS1005: '>' expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(9,65): error TS1005: ',' expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(9,66): error TS1109: Expression expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(10,32): error TS1003: Identifier expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(10,53): error TS1005: '>' expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(10,58): error TS1005: ',' expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(10,59): error TS1109: Expression expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(11,32): error TS1003: Identifier expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(11,68): error TS1005: '>' expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(11,73): error TS1005: ',' expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(11,74): error TS1109: Expression expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(21,21): error TS1003: Identifier expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(22,26): error TS1003: Identifier expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(22,27): error TS1003: Identifier expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(22,29): error TS1005: '...' expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(24,21): error TS1109: Expression expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(24,22): error TS1109: Expression expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(24,25): error TS1005: ',' expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(24,30): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(24,38): error TS1005: ':' expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(24,41): error TS1109: Expression expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(24,42): error TS1109: Expression expected.
+tests/cases/compiler/jsxNamespacePrefixInName.tsx(25,24): error TS1003: Identifier expected.
+
+
+==== tests/cases/compiler/jsxNamespacePrefixInName.tsx (29 errors) ====
+ var justElement1 = ;
+ var justElement2 = ;
+ var justElement3 = ;
+ var justElement4 = {"text"};
+ var justElement5 = {"text"};
+
+ var tooManySeparators1 = ;
+ ~
+!!! error TS1003: Identifier expected.
+ var tooManySeparators2 = ;
+ ~
+!!! error TS1003: Identifier expected.
+ ~
+!!! error TS1005: '>' expected.
+ ~
+!!! error TS1005: ',' expected.
+ ~
+!!! error TS1109: Expression expected.
+ var tooManySeparators3 = ;
+ ~
+!!! error TS1003: Identifier expected.
+ ~
+!!! error TS1005: '>' expected.
+ ~
+!!! error TS1005: ',' expected.
+ ~
+!!! error TS1109: Expression expected.
+ var tooManySeparators4 = {"text"};
+ ~
+!!! error TS1003: Identifier expected.
+ ~
+!!! error TS1005: '>' expected.
+ ~
+!!! error TS1005: ',' expected.
+ ~
+!!! error TS1109: Expression expected.
+ var tooManySeparators5 = {"text"};
+ ~
+!!! error TS1003: Identifier expected.
+ ~
+!!! error TS1005: '>' expected.
+ ~
+!!! error TS1005: ',' expected.
+ ~
+!!! error TS1109: Expression expected.
+
+ var justAttribute1 = ;
+ var justAttribute2 = ;
+ var justAttribute3 = {"text"};
+
+ var both1 = ;
+ var both2 = ;
+ var both3 = {"text"};
+
+ var endOfIdent1 = ;
+ ~
+!!! error TS1003: Identifier expected.
+ var endOfIdent2 = ;
+ ~
+!!! error TS1003: Identifier expected.
+ ~
+!!! error TS1003: Identifier expected.
+ ~~~~~~~
+!!! error TS1005: '...' expected.
+
+ var beginOfIdent1 = <:a attr={"value"} />;
+ ~
+!!! error TS1109: Expression expected.
+ ~
+!!! error TS1109: Expression expected.
+ ~~~~
+!!! error TS1005: ',' expected.
+ ~~~~~~~~~
+!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
+ ~
+!!! error TS1005: ':' expected.
+ ~
+!!! error TS1109: Expression expected.
+ ~
+!!! error TS1109: Expression expected.
+ var beginOfIdent2 = ;
+ ~
+!!! error TS1003: Identifier expected.
+
+ var upcaseComponent1 = ; // Parsed as intrinsic
+ var upcaseComponent2 = ; // Parsed as instrinsic
+
\ No newline at end of file
diff --git a/tests/baselines/reference/jsxNamespacePrefixInName.js b/tests/baselines/reference/jsxNamespacePrefixInName.js
new file mode 100644
index 0000000000000..eca335921a34a
--- /dev/null
+++ b/tests/baselines/reference/jsxNamespacePrefixInName.js
@@ -0,0 +1,58 @@
+//// [jsxNamespacePrefixInName.tsx]
+var justElement1 = ;
+var justElement2 = ;
+var justElement3 = ;
+var justElement4 = {"text"};
+var justElement5 = {"text"};
+
+var tooManySeparators1 = ;
+var tooManySeparators2 = ;
+var tooManySeparators3 = ;
+var tooManySeparators4 = {"text"};
+var tooManySeparators5 = {"text"};
+
+var justAttribute1 = ;
+var justAttribute2 = ;
+var justAttribute3 = {"text"};
+
+var both1 = ;
+var both2 = ;
+var both3 = {"text"};
+
+var endOfIdent1 = ;
+var endOfIdent2 = ;
+
+var beginOfIdent1 = <:a attr={"value"} />;
+var beginOfIdent2 = ;
+
+var upcaseComponent1 = ; // Parsed as intrinsic
+var upcaseComponent2 = ; // Parsed as instrinsic
+
+
+//// [jsxNamespacePrefixInName.jsx]
+var justElement1 = ;
+var justElement2 = ;
+var justElement3 = ;
+var justElement4 = {"text"};
+var justElement5 = {"text"};
+var tooManySeparators1 = ;
+var tooManySeparators2 = , ment;
+ > ;
+var tooManySeparators3 = , ment;
+ > ;
+var tooManySeparators4 = {"text"}, ment;
+ > ;
+var tooManySeparators5 = {"text"}, ment;
+ > ;
+var justAttribute1 = ;
+var justAttribute2 = ;
+var justAttribute3 = {"text"};
+var both1 = ;
+var both2 = ;
+var both3 = {"text"};
+var endOfIdent1 = ;
+var endOfIdent2 = ;
+var beginOfIdent1 = < , a, attr = { "value": } / > ;
+var beginOfIdent2 = ;
+var upcaseComponent1 = ; // Parsed as intrinsic
+var upcaseComponent2 = ; // Parsed as instrinsic
diff --git a/tests/baselines/reference/jsxNamespacePrefixInName.symbols b/tests/baselines/reference/jsxNamespacePrefixInName.symbols
new file mode 100644
index 0000000000000..876ffa59e06b2
--- /dev/null
+++ b/tests/baselines/reference/jsxNamespacePrefixInName.symbols
@@ -0,0 +1,92 @@
+=== tests/cases/compiler/jsxNamespacePrefixInName.tsx ===
+var justElement1 = ;
+>justElement1 : Symbol(justElement1, Decl(jsxNamespacePrefixInName.tsx, 0, 3))
+
+var justElement2 = ;
+>justElement2 : Symbol(justElement2, Decl(jsxNamespacePrefixInName.tsx, 1, 3))
+
+var justElement3 = ;
+>justElement3 : Symbol(justElement3, Decl(jsxNamespacePrefixInName.tsx, 2, 3))
+>attr : Symbol(attr, Decl(jsxNamespacePrefixInName.tsx, 2, 29))
+
+var justElement4 = {"text"};
+>justElement4 : Symbol(justElement4, Decl(jsxNamespacePrefixInName.tsx, 3, 3))
+
+var justElement5 = {"text"};
+>justElement5 : Symbol(justElement5, Decl(jsxNamespacePrefixInName.tsx, 4, 3))
+>attr : Symbol(attr, Decl(jsxNamespacePrefixInName.tsx, 4, 29))
+
+var tooManySeparators1 = ;
+>tooManySeparators1 : Symbol(tooManySeparators1, Decl(jsxNamespacePrefixInName.tsx, 6, 3))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInName.tsx, 6, 32))
+
+var tooManySeparators2 = ;
+>tooManySeparators2 : Symbol(tooManySeparators2, Decl(jsxNamespacePrefixInName.tsx, 7, 3))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInName.tsx, 7, 32))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInName.tsx, 7, 45), Decl(jsxNamespacePrefixInName.tsx, 8, 60), Decl(jsxNamespacePrefixInName.tsx, 9, 53), Decl(jsxNamespacePrefixInName.tsx, 10, 68))
+
+var tooManySeparators3 = ;
+>tooManySeparators3 : Symbol(tooManySeparators3, Decl(jsxNamespacePrefixInName.tsx, 8, 3))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInName.tsx, 8, 32))
+>attr : Symbol(attr, Decl(jsxNamespacePrefixInName.tsx, 8, 36))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInName.tsx, 7, 45), Decl(jsxNamespacePrefixInName.tsx, 8, 60), Decl(jsxNamespacePrefixInName.tsx, 9, 53), Decl(jsxNamespacePrefixInName.tsx, 10, 68))
+
+var tooManySeparators4 = {"text"};
+>tooManySeparators4 : Symbol(tooManySeparators4, Decl(jsxNamespacePrefixInName.tsx, 9, 3))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInName.tsx, 9, 32))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInName.tsx, 7, 45), Decl(jsxNamespacePrefixInName.tsx, 8, 60), Decl(jsxNamespacePrefixInName.tsx, 9, 53), Decl(jsxNamespacePrefixInName.tsx, 10, 68))
+
+var tooManySeparators5 = {"text"};
+>tooManySeparators5 : Symbol(tooManySeparators5, Decl(jsxNamespacePrefixInName.tsx, 10, 3))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInName.tsx, 10, 32))
+>attr : Symbol(attr, Decl(jsxNamespacePrefixInName.tsx, 10, 36))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInName.tsx, 7, 45), Decl(jsxNamespacePrefixInName.tsx, 8, 60), Decl(jsxNamespacePrefixInName.tsx, 9, 53), Decl(jsxNamespacePrefixInName.tsx, 10, 68))
+
+var justAttribute1 = ;
+>justAttribute1 : Symbol(justAttribute1, Decl(jsxNamespacePrefixInName.tsx, 12, 3))
+>a:attr : Symbol(a:attr, Decl(jsxNamespacePrefixInName.tsx, 12, 29))
+
+var justAttribute2 = ;
+>justAttribute2 : Symbol(justAttribute2, Decl(jsxNamespacePrefixInName.tsx, 13, 3))
+>a:attr : Symbol(a:attr, Decl(jsxNamespacePrefixInName.tsx, 13, 29))
+
+var justAttribute3 = {"text"};
+>justAttribute3 : Symbol(justAttribute3, Decl(jsxNamespacePrefixInName.tsx, 14, 3))
+>a:attr : Symbol(a:attr, Decl(jsxNamespacePrefixInName.tsx, 14, 29))
+
+var both1 = ;
+>both1 : Symbol(both1, Decl(jsxNamespacePrefixInName.tsx, 16, 3))
+>a:attr : Symbol(a:attr, Decl(jsxNamespacePrefixInName.tsx, 16, 22))
+
+var both2 = ;
+>both2 : Symbol(both2, Decl(jsxNamespacePrefixInName.tsx, 17, 3))
+>k:attr : Symbol(k:attr, Decl(jsxNamespacePrefixInName.tsx, 17, 22))
+
+var both3 = {"text"};
+>both3 : Symbol(both3, Decl(jsxNamespacePrefixInName.tsx, 18, 3))
+>a:attr : Symbol(a:attr, Decl(jsxNamespacePrefixInName.tsx, 18, 22))
+
+var endOfIdent1 = ;
+>endOfIdent1 : Symbol(endOfIdent1, Decl(jsxNamespacePrefixInName.tsx, 20, 3))
+>attr : Symbol(attr, Decl(jsxNamespacePrefixInName.tsx, 20, 21))
+
+var endOfIdent2 = ;
+>endOfIdent2 : Symbol(endOfIdent2, Decl(jsxNamespacePrefixInName.tsx, 21, 3))
+>attr : Symbol(attr, Decl(jsxNamespacePrefixInName.tsx, 21, 20))
+
+var beginOfIdent1 = <:a attr={"value"} />;
+>beginOfIdent1 : Symbol(beginOfIdent1, Decl(jsxNamespacePrefixInName.tsx, 23, 3))
+>a : Symbol(a, Decl(jsxNamespacePrefixInName.tsx, 23, 22))
+>attr : Symbol(attr, Decl(jsxNamespacePrefixInName.tsx, 23, 23))
+>"value" : Symbol("value", Decl(jsxNamespacePrefixInName.tsx, 23, 30))
+
+var beginOfIdent2 = ;
+>beginOfIdent2 : Symbol(beginOfIdent2, Decl(jsxNamespacePrefixInName.tsx, 24, 3))
+>attr : Symbol(attr, Decl(jsxNamespacePrefixInName.tsx, 24, 24))
+
+var upcaseComponent1 = ; // Parsed as intrinsic
+>upcaseComponent1 : Symbol(upcaseComponent1, Decl(jsxNamespacePrefixInName.tsx, 26, 3))
+
+var upcaseComponent2 = ; // Parsed as instrinsic
+>upcaseComponent2 : Symbol(upcaseComponent2, Decl(jsxNamespacePrefixInName.tsx, 27, 3))
+
diff --git a/tests/baselines/reference/jsxNamespacePrefixInName.types b/tests/baselines/reference/jsxNamespacePrefixInName.types
new file mode 100644
index 0000000000000..616ac016b7935
--- /dev/null
+++ b/tests/baselines/reference/jsxNamespacePrefixInName.types
@@ -0,0 +1,186 @@
+=== tests/cases/compiler/jsxNamespacePrefixInName.tsx ===
+var justElement1 = ;
+>justElement1 : any
+> : any
+>a:element : any
+
+var justElement2 = ;
+>justElement2 : any
+> : any
+>a:element : any
+>a:element : any
+
+var justElement3 = ;
+>justElement3 : any
+> : any
+>a:element : any
+>attr : string
+>"value" : "value"
+>a:element : any
+
+var justElement4 = {"text"};
+>justElement4 : any
+>{"text"} : any
+>a:element : any
+>"text" : "text"
+>a:element : any
+
+var justElement5 = {"text"};
+>justElement5 : any
+>{"text"} : any
+>a:element : any
+>attr : string
+>"value" : "value"
+>"text" : "text"
+>a:element : any
+
+var tooManySeparators1 = ;
+>tooManySeparators1 : any
+> : any
+>a:ele : any
+>ment : true
+
+var tooManySeparators2 = ;
+>tooManySeparators2 : any
+>a:ele : any
+>ment : true
+>a:ele : any
+>ment : any
+>> : boolean
+> : any
+> : any
+
+var tooManySeparators3 = ;
+>tooManySeparators3 : any
+>a:ele : any
+>ment : true
+>attr : string
+>"value" : "value"
+>a:ele : any
+>ment : any
+>> : boolean
+> : any
+> : any
+
+var tooManySeparators4 = {"text"};
+>tooManySeparators4 : any
+>{"text"}a:ele : any
+>ment : true
+>"text" : "text"
+>a:ele : any
+>ment : any
+>> : boolean
+> : any
+> : any
+
+var tooManySeparators5 = {"text"};
+>tooManySeparators5 : any
+>{"text"}a:ele : any
+>ment : true
+>attr : string
+>"value" : "value"
+>"text" : "text"
+>a:ele : any
+>ment : any
+>> : boolean
+> : any
+> : any
+
+var justAttribute1 = ;
+>justAttribute1 : any
+> : any
+>element : any
+>a:attr : string
+>"value" : "value"
+
+var justAttribute2 = ;
+>justAttribute2 : any
+> : any
+>element : any
+>a:attr : string
+>"value" : "value"
+>element : any
+
+var justAttribute3 = {"text"};
+>justAttribute3 : any
+>{"text"} : any
+>element : any
+>a:attr : string
+>"value" : "value"
+>"text" : "text"
+>element : any
+
+var both1 = ;
+>both1 : any
+> : any
+>a:element : any
+>a:attr : string
+>"value" : "value"
+
+var both2 = ;
+>both2 : any
+> : any
+>a:element : any
+>k:attr : string
+>"value" : "value"
+>a:element : any
+
+var both3 = {"text"};
+>both3 : any
+>{"text"} : any
+>a:element : any
+>a:attr : string
+>"value" : "value"
+>"text" : "text"
+>a:element : any
+
+var endOfIdent1 = ;
+>endOfIdent1 : any
+> : any
+>a : any
+>attr : string
+>"value" : "value"
+
+var endOfIdent2 = ;
+>endOfIdent2 : any
+> : any
+>a : any
+>attr : true
+>"value" : "value"
+
+var beginOfIdent1 = <:a attr={"value"} />;
+>beginOfIdent1 : boolean
+>< : boolean
+> : any
+> : any
+>a : any
+>attr : boolean
+>{"value"} /> : boolean
+>{"value"} / : number
+>{"value"} : { value: any; }
+>"value" : any
+> : any
+> : any
+> : any
+
+var beginOfIdent2 = ;
+>beginOfIdent2 : any
+> : any
+>a : any
+>attr : string
+>"value" : "value"
+
+var upcaseComponent1 = ; // Parsed as intrinsic
+>upcaseComponent1 : any
+> : any
+>ns:Upcase : any
+
+var upcaseComponent2 = ; // Parsed as instrinsic
+>upcaseComponent2 : any
+> : any
+>Upcase:element : any
+
diff --git a/tests/baselines/reference/jsxNamespacePrefixInNameReact.errors.txt b/tests/baselines/reference/jsxNamespacePrefixInNameReact.errors.txt
new file mode 100644
index 0000000000000..890fc67fc262a
--- /dev/null
+++ b/tests/baselines/reference/jsxNamespacePrefixInNameReact.errors.txt
@@ -0,0 +1,121 @@
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(9,32): error TS1003: Identifier expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(10,32): error TS1003: Identifier expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(10,45): error TS1005: '>' expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(10,50): error TS1005: ',' expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(10,51): error TS1109: Expression expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(11,32): error TS1003: Identifier expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(11,60): error TS1005: '>' expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(11,65): error TS1005: ',' expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(11,66): error TS1109: Expression expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(12,32): error TS1003: Identifier expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(12,53): error TS1005: '>' expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(12,58): error TS1005: ',' expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(12,59): error TS1109: Expression expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(13,32): error TS1003: Identifier expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(13,68): error TS1005: '>' expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(13,73): error TS1005: ',' expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(13,74): error TS1109: Expression expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(23,21): error TS1003: Identifier expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(24,26): error TS1003: Identifier expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(24,27): error TS1003: Identifier expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(24,29): error TS1005: '...' expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(26,21): error TS1109: Expression expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(26,22): error TS1109: Expression expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(26,25): error TS1005: ',' expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(26,30): error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(26,38): error TS1005: ':' expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(26,41): error TS1109: Expression expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(26,42): error TS1109: Expression expected.
+tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx(27,24): error TS1003: Identifier expected.
+
+
+==== tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx (29 errors) ====
+ declare var React: any;
+
+ var justElement1 = ;
+ var justElement2 = ;
+ var justElement3 = ;
+ var justElement4 = {"text"};
+ var justElement5 = {"text"};
+
+ var tooManySeparators1 = ;
+ ~
+!!! error TS1003: Identifier expected.
+ var tooManySeparators2 = ;
+ ~
+!!! error TS1003: Identifier expected.
+ ~
+!!! error TS1005: '>' expected.
+ ~
+!!! error TS1005: ',' expected.
+ ~
+!!! error TS1109: Expression expected.
+ var tooManySeparators3 = ;
+ ~
+!!! error TS1003: Identifier expected.
+ ~
+!!! error TS1005: '>' expected.
+ ~
+!!! error TS1005: ',' expected.
+ ~
+!!! error TS1109: Expression expected.
+ var tooManySeparators4 = {"text"};
+ ~
+!!! error TS1003: Identifier expected.
+ ~
+!!! error TS1005: '>' expected.
+ ~
+!!! error TS1005: ',' expected.
+ ~
+!!! error TS1109: Expression expected.
+ var tooManySeparators5 = {"text"};
+ ~
+!!! error TS1003: Identifier expected.
+ ~
+!!! error TS1005: '>' expected.
+ ~
+!!! error TS1005: ',' expected.
+ ~
+!!! error TS1109: Expression expected.
+
+ var justAttribute1 = ;
+ var justAttribute2 = ;
+ var justAttribute3 = {"text"};
+
+ var both1 = ;
+ var both2 = ;
+ var both3 = {"text"};
+
+ var endOfIdent1 = ;
+ ~
+!!! error TS1003: Identifier expected.
+ var endOfIdent2 = ;
+ ~
+!!! error TS1003: Identifier expected.
+ ~
+!!! error TS1003: Identifier expected.
+ ~~~~~~~
+!!! error TS1005: '...' expected.
+
+ var beginOfIdent1 = <:a attr={"value"} />;
+ ~
+!!! error TS1109: Expression expected.
+ ~
+!!! error TS1109: Expression expected.
+ ~~~~
+!!! error TS1005: ',' expected.
+ ~~~~~~~~~
+!!! error TS2362: The left-hand side of an arithmetic operation must be of type 'any', 'number', 'bigint' or an enum type.
+ ~
+!!! error TS1005: ':' expected.
+ ~
+!!! error TS1109: Expression expected.
+ ~
+!!! error TS1109: Expression expected.
+ var beginOfIdent2 = ;
+ ~
+!!! error TS1003: Identifier expected.
+
+ var upcaseComponent1 = ; // Parsed as intrinsic
+ var upcaseComponent2 = ; // Parsed as instrinsic
+
\ No newline at end of file
diff --git a/tests/baselines/reference/jsxNamespacePrefixInNameReact.js b/tests/baselines/reference/jsxNamespacePrefixInNameReact.js
new file mode 100644
index 0000000000000..c0cee80308aac
--- /dev/null
+++ b/tests/baselines/reference/jsxNamespacePrefixInNameReact.js
@@ -0,0 +1,71 @@
+//// [jsxNamespacePrefixInNameReact.tsx]
+declare var React: any;
+
+var justElement1 = ;
+var justElement2 = ;
+var justElement3 = ;
+var justElement4 = {"text"};
+var justElement5 = {"text"};
+
+var tooManySeparators1 = ;
+var tooManySeparators2 = ;
+var tooManySeparators3 = ;
+var tooManySeparators4 = {"text"};
+var tooManySeparators5 = {"text"};
+
+var justAttribute1 = ;
+var justAttribute2 = ;
+var justAttribute3 = {"text"};
+
+var both1 = ;
+var both2 = ;
+var both3 = {"text"};
+
+var endOfIdent1 = ;
+var endOfIdent2 = ;
+
+var beginOfIdent1 = <:a attr={"value"} />;
+var beginOfIdent2 = ;
+
+var upcaseComponent1 = ; // Parsed as intrinsic
+var upcaseComponent2 = ; // Parsed as instrinsic
+
+
+//// [jsxNamespacePrefixInNameReact.js]
+var __assign = (this && this.__assign) || function () {
+ __assign = Object.assign || function(t) {
+ for (var s, i = 1, n = arguments.length; i < n; i++) {
+ s = arguments[i];
+ for (var p in s) if (Object.prototype.hasOwnProperty.call(s, p))
+ t[p] = s[p];
+ }
+ return t;
+ };
+ return __assign.apply(this, arguments);
+};
+var justElement1 = React.createElement("a:element", null);
+var justElement2 = React.createElement("a:element", null);
+var justElement3 = React.createElement("a:element", { attr: "value" });
+var justElement4 = React.createElement("a:element", null, "text");
+var justElement5 = React.createElement("a:element", { attr: "value" }, "text");
+var tooManySeparators1 = React.createElement("a:ele", { ment: true });
+var tooManySeparators2 = React.createElement("a:ele", { ment: true }), ment;
+ > ;
+var tooManySeparators3 = React.createElement("a:ele", { ment: true, attr: "value" }), ment;
+ > ;
+var tooManySeparators4 = React.createElement("a:ele", { ment: true }, "text"), ment;
+ > ;
+var tooManySeparators5 = React.createElement("a:ele", { ment: true, attr: "value" }, "text"), ment;
+ > ;
+var justAttribute1 = React.createElement("element", { "a:attr": "value" });
+var justAttribute2 = React.createElement("element", { "a:attr": "value" });
+var justAttribute3 = React.createElement("element", { "a:attr": "value" }, "text");
+var both1 = React.createElement("a:element", { "a:attr": "value" });
+var both2 = React.createElement("a:element", { "k:attr": "value" });
+var both3 = React.createElement("a:element", { "a:attr": "value" }, "text");
+var endOfIdent1 = React.createElement("a", { attr: "value" });
+var endOfIdent2 = React.createElement("a", __assign({ attr: true }, "value"));
+var beginOfIdent1 = < , a, attr = { "value": } / > ;
+var beginOfIdent2 = React.createElement("a", { attr: "value" });
+var upcaseComponent1 = React.createElement("ns:Upcase", null); // Parsed as intrinsic
+var upcaseComponent2 = React.createElement("Upcase:element", null); // Parsed as instrinsic
diff --git a/tests/baselines/reference/jsxNamespacePrefixInNameReact.symbols b/tests/baselines/reference/jsxNamespacePrefixInNameReact.symbols
new file mode 100644
index 0000000000000..34136573521b5
--- /dev/null
+++ b/tests/baselines/reference/jsxNamespacePrefixInNameReact.symbols
@@ -0,0 +1,95 @@
+=== tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx ===
+declare var React: any;
+>React : Symbol(React, Decl(jsxNamespacePrefixInNameReact.tsx, 0, 11))
+
+var justElement1 = ;
+>justElement1 : Symbol(justElement1, Decl(jsxNamespacePrefixInNameReact.tsx, 2, 3))
+
+var justElement2 = ;
+>justElement2 : Symbol(justElement2, Decl(jsxNamespacePrefixInNameReact.tsx, 3, 3))
+
+var justElement3 = ;
+>justElement3 : Symbol(justElement3, Decl(jsxNamespacePrefixInNameReact.tsx, 4, 3))
+>attr : Symbol(attr, Decl(jsxNamespacePrefixInNameReact.tsx, 4, 29))
+
+var justElement4 = {"text"};
+>justElement4 : Symbol(justElement4, Decl(jsxNamespacePrefixInNameReact.tsx, 5, 3))
+
+var justElement5 = {"text"};
+>justElement5 : Symbol(justElement5, Decl(jsxNamespacePrefixInNameReact.tsx, 6, 3))
+>attr : Symbol(attr, Decl(jsxNamespacePrefixInNameReact.tsx, 6, 29))
+
+var tooManySeparators1 = ;
+>tooManySeparators1 : Symbol(tooManySeparators1, Decl(jsxNamespacePrefixInNameReact.tsx, 8, 3))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInNameReact.tsx, 8, 32))
+
+var tooManySeparators2 = ;
+>tooManySeparators2 : Symbol(tooManySeparators2, Decl(jsxNamespacePrefixInNameReact.tsx, 9, 3))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInNameReact.tsx, 9, 32))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInNameReact.tsx, 9, 45), Decl(jsxNamespacePrefixInNameReact.tsx, 10, 60), Decl(jsxNamespacePrefixInNameReact.tsx, 11, 53), Decl(jsxNamespacePrefixInNameReact.tsx, 12, 68))
+
+var tooManySeparators3 = ;
+>tooManySeparators3 : Symbol(tooManySeparators3, Decl(jsxNamespacePrefixInNameReact.tsx, 10, 3))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInNameReact.tsx, 10, 32))
+>attr : Symbol(attr, Decl(jsxNamespacePrefixInNameReact.tsx, 10, 36))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInNameReact.tsx, 9, 45), Decl(jsxNamespacePrefixInNameReact.tsx, 10, 60), Decl(jsxNamespacePrefixInNameReact.tsx, 11, 53), Decl(jsxNamespacePrefixInNameReact.tsx, 12, 68))
+
+var tooManySeparators4 = {"text"};
+>tooManySeparators4 : Symbol(tooManySeparators4, Decl(jsxNamespacePrefixInNameReact.tsx, 11, 3))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInNameReact.tsx, 11, 32))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInNameReact.tsx, 9, 45), Decl(jsxNamespacePrefixInNameReact.tsx, 10, 60), Decl(jsxNamespacePrefixInNameReact.tsx, 11, 53), Decl(jsxNamespacePrefixInNameReact.tsx, 12, 68))
+
+var tooManySeparators5 = {"text"};
+>tooManySeparators5 : Symbol(tooManySeparators5, Decl(jsxNamespacePrefixInNameReact.tsx, 12, 3))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInNameReact.tsx, 12, 32))
+>attr : Symbol(attr, Decl(jsxNamespacePrefixInNameReact.tsx, 12, 36))
+>ment : Symbol(ment, Decl(jsxNamespacePrefixInNameReact.tsx, 9, 45), Decl(jsxNamespacePrefixInNameReact.tsx, 10, 60), Decl(jsxNamespacePrefixInNameReact.tsx, 11, 53), Decl(jsxNamespacePrefixInNameReact.tsx, 12, 68))
+
+var justAttribute1 = ;
+>justAttribute1 : Symbol(justAttribute1, Decl(jsxNamespacePrefixInNameReact.tsx, 14, 3))
+>a:attr : Symbol(a:attr, Decl(jsxNamespacePrefixInNameReact.tsx, 14, 29))
+
+var justAttribute2 = ;
+>justAttribute2 : Symbol(justAttribute2, Decl(jsxNamespacePrefixInNameReact.tsx, 15, 3))
+>a:attr : Symbol(a:attr, Decl(jsxNamespacePrefixInNameReact.tsx, 15, 29))
+
+var justAttribute3 = {"text"};
+>justAttribute3 : Symbol(justAttribute3, Decl(jsxNamespacePrefixInNameReact.tsx, 16, 3))
+>a:attr : Symbol(a:attr, Decl(jsxNamespacePrefixInNameReact.tsx, 16, 29))
+
+var both1 = ;
+>both1 : Symbol(both1, Decl(jsxNamespacePrefixInNameReact.tsx, 18, 3))
+>a:attr : Symbol(a:attr, Decl(jsxNamespacePrefixInNameReact.tsx, 18, 22))
+
+var both2 = ;
+>both2 : Symbol(both2, Decl(jsxNamespacePrefixInNameReact.tsx, 19, 3))
+>k:attr : Symbol(k:attr, Decl(jsxNamespacePrefixInNameReact.tsx, 19, 22))
+
+var both3 = {"text"};
+>both3 : Symbol(both3, Decl(jsxNamespacePrefixInNameReact.tsx, 20, 3))
+>a:attr : Symbol(a:attr, Decl(jsxNamespacePrefixInNameReact.tsx, 20, 22))
+
+var endOfIdent1 = ;
+>endOfIdent1 : Symbol(endOfIdent1, Decl(jsxNamespacePrefixInNameReact.tsx, 22, 3))
+>attr : Symbol(attr, Decl(jsxNamespacePrefixInNameReact.tsx, 22, 21))
+
+var endOfIdent2 = ;
+>endOfIdent2 : Symbol(endOfIdent2, Decl(jsxNamespacePrefixInNameReact.tsx, 23, 3))
+>attr : Symbol(attr, Decl(jsxNamespacePrefixInNameReact.tsx, 23, 20))
+
+var beginOfIdent1 = <:a attr={"value"} />;
+>beginOfIdent1 : Symbol(beginOfIdent1, Decl(jsxNamespacePrefixInNameReact.tsx, 25, 3))
+>a : Symbol(a, Decl(jsxNamespacePrefixInNameReact.tsx, 25, 22))
+>attr : Symbol(attr, Decl(jsxNamespacePrefixInNameReact.tsx, 25, 23))
+>"value" : Symbol("value", Decl(jsxNamespacePrefixInNameReact.tsx, 25, 30))
+
+var beginOfIdent2 = ;
+>beginOfIdent2 : Symbol(beginOfIdent2, Decl(jsxNamespacePrefixInNameReact.tsx, 26, 3))
+>attr : Symbol(attr, Decl(jsxNamespacePrefixInNameReact.tsx, 26, 24))
+
+var upcaseComponent1 = ; // Parsed as intrinsic
+>upcaseComponent1 : Symbol(upcaseComponent1, Decl(jsxNamespacePrefixInNameReact.tsx, 28, 3))
+
+var upcaseComponent2 = ; // Parsed as instrinsic
+>upcaseComponent2 : Symbol(upcaseComponent2, Decl(jsxNamespacePrefixInNameReact.tsx, 29, 3))
+
diff --git a/tests/baselines/reference/jsxNamespacePrefixInNameReact.types b/tests/baselines/reference/jsxNamespacePrefixInNameReact.types
new file mode 100644
index 0000000000000..e67a617796670
--- /dev/null
+++ b/tests/baselines/reference/jsxNamespacePrefixInNameReact.types
@@ -0,0 +1,189 @@
+=== tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx ===
+declare var React: any;
+>React : any
+
+var justElement1 = ;
+>justElement1 : any
+> : any
+>a:element : any
+
+var justElement2 = ;
+>justElement2 : any
+> : any
+>a:element : any
+>a:element : any
+
+var justElement3 = ;
+>justElement3 : any
+> : any
+>a:element : any
+>attr : string
+>"value" : "value"
+>a:element : any
+
+var justElement4 = {"text"};
+>justElement4 : any
+>{"text"} : any
+>a:element : any
+>"text" : "text"
+>a:element : any
+
+var justElement5 = {"text"};
+>justElement5 : any
+>{"text"} : any
+>a:element : any
+>attr : string
+>"value" : "value"
+>"text" : "text"
+>a:element : any
+
+var tooManySeparators1 = ;
+>tooManySeparators1 : any
+> : any
+>a:ele : any
+>ment : true
+
+var tooManySeparators2 = ;
+>tooManySeparators2 : any
+>a:ele : any
+>ment : true
+>a:ele : any
+>ment : any
+>> : boolean
+> : any
+> : any
+
+var tooManySeparators3 = ;
+>tooManySeparators3 : any
+>a:ele : any
+>ment : true
+>attr : string
+>"value" : "value"
+>a:ele : any
+>ment : any
+>> : boolean
+> : any
+> : any
+
+var tooManySeparators4 = {"text"};
+>tooManySeparators4 : any
+>{"text"}a:ele : any
+>ment : true
+>"text" : "text"
+>a:ele : any
+>ment : any
+>> : boolean
+> : any
+> : any
+
+var tooManySeparators5 = {"text"};
+>tooManySeparators5 : any
+>{"text"}a:ele : any
+>ment : true
+>attr : string
+>"value" : "value"
+>"text" : "text"
+>a:ele : any
+>ment : any
+>> : boolean
+> : any
+> : any
+
+var justAttribute1 = ;
+>justAttribute1 : any
+> : any
+>element : any
+>a:attr : string
+>"value" : "value"
+
+var justAttribute2 = ;
+>justAttribute2 : any
+> : any
+>element : any
+>a:attr : string
+>"value" : "value"
+>element : any
+
+var justAttribute3 = {"text"};
+>justAttribute3 : any
+>{"text"} : any
+>element : any
+>a:attr : string
+>"value" : "value"
+>"text" : "text"
+>element : any
+
+var both1 = ;
+>both1 : any
+> : any
+>a:element : any
+>a:attr : string
+>"value" : "value"
+
+var both2 = ;
+>both2 : any
+> : any
+>a:element : any
+>k:attr : string
+>"value" : "value"
+>a:element : any
+
+var both3 = {"text"};
+>both3 : any
+>{"text"} : any
+>a:element : any
+>a:attr : string
+>"value" : "value"
+>"text" : "text"
+>a:element : any
+
+var endOfIdent1 = ;
+>endOfIdent1 : any
+> : any
+>a : any
+>attr : string
+>"value" : "value"
+
+var endOfIdent2 = ;
+>endOfIdent2 : any
+> : any
+>a : any
+>attr : true
+>"value" : "value"
+
+var beginOfIdent1 = <:a attr={"value"} />;
+>beginOfIdent1 : boolean
+>< : boolean
+> : any
+> : any
+>a : any
+>attr : boolean
+>{"value"} /> : boolean
+>{"value"} / : number
+>{"value"} : { value: any; }
+>"value" : any
+> : any
+> : any
+> : any
+
+var beginOfIdent2 = ;
+>beginOfIdent2 : any
+> : any
+>a : any
+>attr : string
+>"value" : "value"
+
+var upcaseComponent1 = ; // Parsed as intrinsic
+>upcaseComponent1 : any
+> : any
+>ns:Upcase : any
+
+var upcaseComponent2 = ; // Parsed as instrinsic
+>upcaseComponent2 : any
+> : any
+>Upcase:element : any
+
diff --git a/tests/baselines/reference/jsxNamespacePrefixIntrinsics.errors.txt b/tests/baselines/reference/jsxNamespacePrefixIntrinsics.errors.txt
new file mode 100644
index 0000000000000..f7142133ebe14
--- /dev/null
+++ b/tests/baselines/reference/jsxNamespacePrefixIntrinsics.errors.txt
@@ -0,0 +1,34 @@
+tests/cases/compiler/jsxNamespacePrefixIntrinsics.tsx(15,18): error TS2339: Property 'element' does not exist on type 'JSX.IntrinsicElements'.
+tests/cases/compiler/jsxNamespacePrefixIntrinsics.tsx(16,30): error TS2322: Type '{ attribute: string; }' is not assignable to type '{ "ns:attribute": string; }'.
+ Property 'attribute' does not exist on type '{ "ns:attribute": string; }'.
+tests/cases/compiler/jsxNamespacePrefixIntrinsics.tsx(17,30): error TS2322: Type '{ "ns:invalid": string; }' is not assignable to type '{ "ns:attribute": string; }'.
+ Property 'ns:invalid' does not exist on type '{ "ns:attribute": string; }'.
+
+
+==== tests/cases/compiler/jsxNamespacePrefixIntrinsics.tsx (3 errors) ====
+ declare namespace JSX {
+ interface IntrinsicElements {
+ "ns:element": {
+ "ns:attribute": string;
+ },
+ "ns:NamespacedUpcaseAlsoIntrinsic": any,
+ "NS:NamespacedUpcaseAlsoIntrinsic": any
+ }
+ }
+
+ const valid = ;
+ const validUpcase1 = ;
+ const validUpcase2 = ;
+
+ const invalid1 = ;
+ ~~~~~~~~~~~
+!!! error TS2339: Property 'element' does not exist on type 'JSX.IntrinsicElements'.
+ const invalid2 = ;
+ ~~~~~~~~~
+!!! error TS2322: Type '{ attribute: string; }' is not assignable to type '{ "ns:attribute": string; }'.
+!!! error TS2322: Property 'attribute' does not exist on type '{ "ns:attribute": string; }'.
+ const invalid3 = ;
+ ~~~~~~~~~~
+!!! error TS2322: Type '{ "ns:invalid": string; }' is not assignable to type '{ "ns:attribute": string; }'.
+!!! error TS2322: Property 'ns:invalid' does not exist on type '{ "ns:attribute": string; }'.
+
\ No newline at end of file
diff --git a/tests/baselines/reference/jsxNamespacePrefixIntrinsics.js b/tests/baselines/reference/jsxNamespacePrefixIntrinsics.js
new file mode 100644
index 0000000000000..bc65094fe3cab
--- /dev/null
+++ b/tests/baselines/reference/jsxNamespacePrefixIntrinsics.js
@@ -0,0 +1,27 @@
+//// [jsxNamespacePrefixIntrinsics.tsx]
+declare namespace JSX {
+ interface IntrinsicElements {
+ "ns:element": {
+ "ns:attribute": string;
+ },
+ "ns:NamespacedUpcaseAlsoIntrinsic": any,
+ "NS:NamespacedUpcaseAlsoIntrinsic": any
+ }
+}
+
+const valid = ;
+const validUpcase1 = ;
+const validUpcase2 = ;
+
+const invalid1 = ;
+const invalid2 = ;
+const invalid3 = ;
+
+
+//// [jsxNamespacePrefixIntrinsics.jsx]
+var valid = ;
+var validUpcase1 = ;
+var validUpcase2 = ;
+var invalid1 = ;
+var invalid2 = ;
+var invalid3 = ;
diff --git a/tests/baselines/reference/jsxNamespacePrefixIntrinsics.symbols b/tests/baselines/reference/jsxNamespacePrefixIntrinsics.symbols
new file mode 100644
index 0000000000000..b12b339ca223a
--- /dev/null
+++ b/tests/baselines/reference/jsxNamespacePrefixIntrinsics.symbols
@@ -0,0 +1,48 @@
+=== tests/cases/compiler/jsxNamespacePrefixIntrinsics.tsx ===
+declare namespace JSX {
+>JSX : Symbol(JSX, Decl(jsxNamespacePrefixIntrinsics.tsx, 0, 0))
+
+ interface IntrinsicElements {
+>IntrinsicElements : Symbol(IntrinsicElements, Decl(jsxNamespacePrefixIntrinsics.tsx, 0, 23))
+
+ "ns:element": {
+>"ns:element" : Symbol(IntrinsicElements["ns:element"], Decl(jsxNamespacePrefixIntrinsics.tsx, 1, 31))
+
+ "ns:attribute": string;
+>"ns:attribute" : Symbol("ns:attribute", Decl(jsxNamespacePrefixIntrinsics.tsx, 2, 19))
+
+ },
+ "ns:NamespacedUpcaseAlsoIntrinsic": any,
+>"ns:NamespacedUpcaseAlsoIntrinsic" : Symbol(IntrinsicElements["ns:NamespacedUpcaseAlsoIntrinsic"], Decl(jsxNamespacePrefixIntrinsics.tsx, 4, 6))
+
+ "NS:NamespacedUpcaseAlsoIntrinsic": any
+>"NS:NamespacedUpcaseAlsoIntrinsic" : Symbol(IntrinsicElements["NS:NamespacedUpcaseAlsoIntrinsic"], Decl(jsxNamespacePrefixIntrinsics.tsx, 5, 44))
+ }
+}
+
+const valid = ;
+>valid : Symbol(valid, Decl(jsxNamespacePrefixIntrinsics.tsx, 10, 5))
+>ns:element : Symbol(JSX.IntrinsicElements["ns:element"], Decl(jsxNamespacePrefixIntrinsics.tsx, 1, 31))
+>ns:attribute : Symbol(ns:attribute, Decl(jsxNamespacePrefixIntrinsics.tsx, 10, 25))
+
+const validUpcase1 = ;
+>validUpcase1 : Symbol(validUpcase1, Decl(jsxNamespacePrefixIntrinsics.tsx, 11, 5))
+>ns:NamespacedUpcaseAlsoIntrinsic : Symbol(JSX.IntrinsicElements["ns:NamespacedUpcaseAlsoIntrinsic"], Decl(jsxNamespacePrefixIntrinsics.tsx, 4, 6))
+
+const validUpcase2 = ;
+>validUpcase2 : Symbol(validUpcase2, Decl(jsxNamespacePrefixIntrinsics.tsx, 12, 5))
+>NS:NamespacedUpcaseAlsoIntrinsic : Symbol(JSX.IntrinsicElements["NS:NamespacedUpcaseAlsoIntrinsic"], Decl(jsxNamespacePrefixIntrinsics.tsx, 5, 44))
+
+const invalid1 = ;
+>invalid1 : Symbol(invalid1, Decl(jsxNamespacePrefixIntrinsics.tsx, 14, 5))
+
+const invalid2 = ;
+>invalid2 : Symbol(invalid2, Decl(jsxNamespacePrefixIntrinsics.tsx, 15, 5))
+>ns:element : Symbol(JSX.IntrinsicElements["ns:element"], Decl(jsxNamespacePrefixIntrinsics.tsx, 1, 31))
+>attribute : Symbol(attribute, Decl(jsxNamespacePrefixIntrinsics.tsx, 15, 28))
+
+const invalid3 = ;
+>invalid3 : Symbol(invalid3, Decl(jsxNamespacePrefixIntrinsics.tsx, 16, 5))
+>ns:element : Symbol(JSX.IntrinsicElements["ns:element"], Decl(jsxNamespacePrefixIntrinsics.tsx, 1, 31))
+>ns:invalid : Symbol(ns:invalid, Decl(jsxNamespacePrefixIntrinsics.tsx, 16, 28))
+
diff --git a/tests/baselines/reference/jsxNamespacePrefixIntrinsics.types b/tests/baselines/reference/jsxNamespacePrefixIntrinsics.types
new file mode 100644
index 0000000000000..962128ca2f41a
--- /dev/null
+++ b/tests/baselines/reference/jsxNamespacePrefixIntrinsics.types
@@ -0,0 +1,51 @@
+=== tests/cases/compiler/jsxNamespacePrefixIntrinsics.tsx ===
+declare namespace JSX {
+ interface IntrinsicElements {
+ "ns:element": {
+>"ns:element" : { "ns:attribute": string; }
+
+ "ns:attribute": string;
+>"ns:attribute" : string
+
+ },
+ "ns:NamespacedUpcaseAlsoIntrinsic": any,
+>"ns:NamespacedUpcaseAlsoIntrinsic" : any
+
+ "NS:NamespacedUpcaseAlsoIntrinsic": any
+>"NS:NamespacedUpcaseAlsoIntrinsic" : any
+ }
+}
+
+const valid = ;
+>valid : any
+> : any
+>ns:element : any
+>ns:attribute : string
+
+const validUpcase1 = ;
+>validUpcase1 : any
+> : any
+>ns:NamespacedUpcaseAlsoIntrinsic : any
+
+const validUpcase2 = ;
+>validUpcase2 : any
+> : any
+>NS:NamespacedUpcaseAlsoIntrinsic : any
+
+const invalid1 = ;
+>invalid1 : any
+> : any
+>element : any
+
+const invalid2 = ;
+>invalid2 : any
+> : any
+>ns:element : any
+>attribute : string
+
+const invalid3 = ;
+>invalid3 : any
+> : any
+>ns:element : any
+>ns:invalid : string
+
diff --git a/tests/cases/compiler/jsxNamespacePrefixInName.tsx b/tests/cases/compiler/jsxNamespacePrefixInName.tsx
new file mode 100644
index 0000000000000..0729c1181f87a
--- /dev/null
+++ b/tests/cases/compiler/jsxNamespacePrefixInName.tsx
@@ -0,0 +1,30 @@
+// @jsx: preserve
+
+var justElement1 = ;
+var justElement2 = ;
+var justElement3 = ;
+var justElement4 = {"text"};
+var justElement5 = {"text"};
+
+var tooManySeparators1 = ;
+var tooManySeparators2 = ;
+var tooManySeparators3 = ;
+var tooManySeparators4 = {"text"};
+var tooManySeparators5 = {"text"};
+
+var justAttribute1 = ;
+var justAttribute2 = ;
+var justAttribute3 = {"text"};
+
+var both1 = ;
+var both2 = ;
+var both3 = {"text"};
+
+var endOfIdent1 = ;
+var endOfIdent2 = ;
+
+var beginOfIdent1 = <:a attr={"value"} />;
+var beginOfIdent2 = ;
+
+var upcaseComponent1 = ; // Parsed as intrinsic
+var upcaseComponent2 = ; // Parsed as instrinsic
diff --git a/tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx b/tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx
new file mode 100644
index 0000000000000..60473d74f6bc3
--- /dev/null
+++ b/tests/cases/compiler/jsxNamespacePrefixInNameReact.tsx
@@ -0,0 +1,31 @@
+// @jsx: react
+declare var React: any;
+
+var justElement1 = ;
+var justElement2 = ;
+var justElement3 = ;
+var justElement4 = {"text"};
+var justElement5 = {"text"};
+
+var tooManySeparators1 = ;
+var tooManySeparators2 = ;
+var tooManySeparators3 = ;
+var tooManySeparators4 = {"text"};
+var tooManySeparators5 = {"text"};
+
+var justAttribute1 = ;
+var justAttribute2 = ;
+var justAttribute3 = {"text"};
+
+var both1 = ;
+var both2 = ;
+var both3 = {"text"};
+
+var endOfIdent1 = ;
+var endOfIdent2 = ;
+
+var beginOfIdent1 = <:a attr={"value"} />;
+var beginOfIdent2 = ;
+
+var upcaseComponent1 = ; // Parsed as intrinsic
+var upcaseComponent2 = ; // Parsed as instrinsic
diff --git a/tests/cases/compiler/jsxNamespacePrefixIntrinsics.tsx b/tests/cases/compiler/jsxNamespacePrefixIntrinsics.tsx
new file mode 100644
index 0000000000000..bee8232dc815e
--- /dev/null
+++ b/tests/cases/compiler/jsxNamespacePrefixIntrinsics.tsx
@@ -0,0 +1,20 @@
+// @noImplicitAny: true
+// @jsx: preserve
+
+declare namespace JSX {
+ interface IntrinsicElements {
+ "ns:element": {
+ "ns:attribute": string;
+ },
+ "ns:NamespacedUpcaseAlsoIntrinsic": any,
+ "NS:NamespacedUpcaseAlsoIntrinsic": any
+ }
+}
+
+const valid = ;
+const validUpcase1 = ;
+const validUpcase2 = ;
+
+const invalid1 = ;
+const invalid2 = ;
+const invalid3 = ;
diff --git a/tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx b/tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx
index 163357454aacc..e18c6ddfc2ccf 100644
--- a/tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx
+++ b/tests/cases/conformance/jsx/jsxEsprimaFbTestSuite.tsx
@@ -6,12 +6,13 @@ declare var LeftRight;
declare var x;
declare var a;
declare var props;
+declare var value;
;
-//; Namespace unsuported
+;
-// {value} ; Namespace unsuported
+ {value} ;
;