Handle indirect imports of JSX elements from external modules

Fixes #4675
This commit is contained in:
Ryan Cavanaugh 2015-09-30 15:20:56 -07:00
parent a4db4be4b6
commit 590569b87d
5 changed files with 144 additions and 1 deletions

View File

@ -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;

View File

@ -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 = <Route />;
//// [test.jsx]
define(["require", "exports", 'react-router'], function (require, exports, ReactRouter) {
var Route = ReactRouter.Route;
var routes = <Route />;
});

View File

@ -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 = <Route />;
>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))
}

View File

@ -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 = <Route />;
>routes : any
><Route /> : 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
}

View File

@ -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 = <Route />;