From 590569b87d25733ebf1aebf24b8812331fcf132c Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Wed, 30 Sep 2015 15:20:56 -0700 Subject: [PATCH] Handle indirect imports of JSX elements from external modules Fixes #4675 --- src/compiler/checker.ts | 4 +- tests/baselines/reference/tsxPreserveEmit1.js | 32 ++++++++++++++ .../reference/tsxPreserveEmit1.symbols | 41 ++++++++++++++++++ .../reference/tsxPreserveEmit1.types | 42 +++++++++++++++++++ .../conformance/jsx/tsxPreserveEmit1.tsx | 26 ++++++++++++ 5 files changed, 144 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/tsxPreserveEmit1.js create mode 100644 tests/baselines/reference/tsxPreserveEmit1.symbols create mode 100644 tests/baselines/reference/tsxPreserveEmit1.types create mode 100644 tests/cases/conformance/jsx/tsxPreserveEmit1.tsx diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index d57f9eaed1b..c4da6e3d320 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7463,7 +7463,9 @@ namespace ts { // Look up the value in the current scope if (valueSymbol && valueSymbol !== unknownSymbol) { links.jsxFlags |= JsxFlags.ClassElement; - getSymbolLinks(valueSymbol).referenced = true; + if (valueSymbol.flags & SymbolFlags.Alias) { + markAliasSymbolAsReferenced(valueSymbol); + } } return valueSymbol || unknownSymbol; diff --git a/tests/baselines/reference/tsxPreserveEmit1.js b/tests/baselines/reference/tsxPreserveEmit1.js new file mode 100644 index 00000000000..80aeef6b297 --- /dev/null +++ b/tests/baselines/reference/tsxPreserveEmit1.js @@ -0,0 +1,32 @@ +//// [tests/cases/conformance/jsx/tsxPreserveEmit1.tsx] //// + +//// [react.d.ts] + +declare module 'react' { + var x: any; + export = x; +} + +declare module ReactRouter { + var Route: any; + interface Thing { } +} +declare module 'react-router' { + export = ReactRouter; +} + +//// [test.tsx] +// Should emit 'react-router' in the AMD dependency list +import React = require('react'); +import ReactRouter = require('react-router'); + +import Route = ReactRouter.Route; + +var routes = ; + + +//// [test.jsx] +define(["require", "exports", 'react-router'], function (require, exports, ReactRouter) { + var Route = ReactRouter.Route; + var routes = ; +}); diff --git a/tests/baselines/reference/tsxPreserveEmit1.symbols b/tests/baselines/reference/tsxPreserveEmit1.symbols new file mode 100644 index 00000000000..6dcf4d9ac49 --- /dev/null +++ b/tests/baselines/reference/tsxPreserveEmit1.symbols @@ -0,0 +1,41 @@ +=== tests/cases/conformance/jsx/test.tsx === +// Should emit 'react-router' in the AMD dependency list +import React = require('react'); +>React : Symbol(React, Decl(test.tsx, 0, 0)) + +import ReactRouter = require('react-router'); +>ReactRouter : Symbol(ReactRouter, Decl(test.tsx, 1, 32)) + +import Route = ReactRouter.Route; +>Route : Symbol(Route, Decl(test.tsx, 2, 45)) +>ReactRouter : Symbol(ReactRouter, Decl(react.d.ts, 4, 1)) +>Route : Symbol(ReactRouter.Route, Decl(react.d.ts, 7, 4)) + +var routes = ; +>routes : Symbol(routes, Decl(test.tsx, 6, 3)) +>Route : Symbol(Route, Decl(test.tsx, 2, 45)) + +=== tests/cases/conformance/jsx/react.d.ts === + +declare module 'react' { + var x: any; +>x : Symbol(x, Decl(react.d.ts, 2, 4)) + + export = x; +>x : Symbol(x, Decl(react.d.ts, 2, 4)) +} + +declare module ReactRouter { +>ReactRouter : Symbol(ReactRouter, Decl(react.d.ts, 4, 1)) + + var Route: any; +>Route : Symbol(Route, Decl(react.d.ts, 7, 4)) + + interface Thing { } +>Thing : Symbol(Thing, Decl(react.d.ts, 7, 16)) +} +declare module 'react-router' { + export = ReactRouter; +>ReactRouter : Symbol(ReactRouter, Decl(react.d.ts, 4, 1)) +} + diff --git a/tests/baselines/reference/tsxPreserveEmit1.types b/tests/baselines/reference/tsxPreserveEmit1.types new file mode 100644 index 00000000000..ea64e2d2e94 --- /dev/null +++ b/tests/baselines/reference/tsxPreserveEmit1.types @@ -0,0 +1,42 @@ +=== tests/cases/conformance/jsx/test.tsx === +// Should emit 'react-router' in the AMD dependency list +import React = require('react'); +>React : any + +import ReactRouter = require('react-router'); +>ReactRouter : typeof ReactRouter + +import Route = ReactRouter.Route; +>Route : any +>ReactRouter : typeof ReactRouter +>Route : any + +var routes = ; +>routes : any +> : any +>Route : any + +=== tests/cases/conformance/jsx/react.d.ts === + +declare module 'react' { + var x: any; +>x : any + + export = x; +>x : any +} + +declare module ReactRouter { +>ReactRouter : typeof ReactRouter + + var Route: any; +>Route : any + + interface Thing { } +>Thing : Thing +} +declare module 'react-router' { + export = ReactRouter; +>ReactRouter : typeof ReactRouter +} + diff --git a/tests/cases/conformance/jsx/tsxPreserveEmit1.tsx b/tests/cases/conformance/jsx/tsxPreserveEmit1.tsx new file mode 100644 index 00000000000..e75a1dbfde2 --- /dev/null +++ b/tests/cases/conformance/jsx/tsxPreserveEmit1.tsx @@ -0,0 +1,26 @@ +//@module: amd +//@jsx: preserve +//@target: ES5 + +//@Filename: react.d.ts +declare module 'react' { + var x: any; + export = x; +} + +declare module ReactRouter { + var Route: any; + interface Thing { } +} +declare module 'react-router' { + export = ReactRouter; +} + +//@Filename: test.tsx +// Should emit 'react-router' in the AMD dependency list +import React = require('react'); +import ReactRouter = require('react-router'); + +import Route = ReactRouter.Route; + +var routes = ;