Skip to content

Commit 30cc1cc

Browse files
committed
Add support for new import syntax in preprocessFile
1 parent 65431a9 commit 30cc1cc

File tree

2 files changed

+166
-15
lines changed

2 files changed

+166
-15
lines changed

src/services/services.ts

Lines changed: 122 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -1752,36 +1752,145 @@ module ts {
17521752
});
17531753
}
17541754

1755+
1756+
1757+
function recordModuleName() {
1758+
var importPath = scanner.getTokenValue();
1759+
var pos = scanner.getTokenPos();
1760+
importedFiles.push({
1761+
fileName: importPath,
1762+
pos: pos,
1763+
end: pos + importPath.length
1764+
});
1765+
}
1766+
17551767
function processImport(): void {
17561768
scanner.setText(sourceText);
17571769
var token = scanner.scan();
17581770
// Look for:
1759-
// import foo = module("foo");
1771+
// import "mod";
1772+
// import d from "mod"
1773+
// import {a as A } from "mod";
1774+
// import * as NS from "mod"
1775+
// import d, {a, b as B} from "mod"
1776+
// import i = require("mod");
1777+
//
1778+
// export * from "mod"
1779+
// export {a as b} from "mod"
1780+
17601781
while (token !== SyntaxKind.EndOfFileToken) {
17611782
if (token === SyntaxKind.ImportKeyword) {
17621783
token = scanner.scan();
1763-
if (token === SyntaxKind.Identifier) {
1764-
token = scanner.scan();
1765-
if (token === SyntaxKind.EqualsToken) {
1784+
if (token === SyntaxKind.StringLiteral) {
1785+
// import "mod";
1786+
recordModuleName();
1787+
continue;
1788+
}
1789+
else {
1790+
if (token === SyntaxKind.Identifier) {
17661791
token = scanner.scan();
1767-
if (token === SyntaxKind.RequireKeyword) {
1792+
if (token === SyntaxKind.FromKeyword) {
1793+
token = scanner.scan();
1794+
if (token === SyntaxKind.StringLiteral) {
1795+
// import d from "mod";
1796+
recordModuleName();
1797+
continue
1798+
}
1799+
}
1800+
else if (token === SyntaxKind.EqualsToken) {
17681801
token = scanner.scan();
1769-
if (token === SyntaxKind.OpenParenToken) {
1802+
if (token === SyntaxKind.RequireKeyword) {
1803+
token = scanner.scan();
1804+
if (token === SyntaxKind.OpenParenToken) {
1805+
token = scanner.scan();
1806+
if (token === SyntaxKind.StringLiteral) {
1807+
// import i = require("mod");
1808+
recordModuleName();
1809+
continue;
1810+
}
1811+
}
1812+
}
1813+
}
1814+
else if (token === SyntaxKind.CommaToken) {
1815+
// consume comma and keep going
1816+
token = scanner.scan();
1817+
}
1818+
else {
1819+
// unknown syntax
1820+
continue;
1821+
}
1822+
}
1823+
1824+
if (token === SyntaxKind.OpenBraceToken) {
1825+
token = scanner.scan();
1826+
// consume "{ a as B, c, d as D}" clauses
1827+
while (token !== SyntaxKind.OpenBraceToken && token !== SyntaxKind.CloseBraceToken) {
1828+
token = scanner.scan();
1829+
}
1830+
1831+
if (token === SyntaxKind.CloseBraceToken) {
1832+
token = scanner.scan();
1833+
if (token === SyntaxKind.FromKeyword) {
17701834
token = scanner.scan();
17711835
if (token === SyntaxKind.StringLiteral) {
1772-
var importPath = scanner.getTokenValue();
1773-
var pos = scanner.getTokenPos();
1774-
importedFiles.push({
1775-
fileName: importPath,
1776-
pos: pos,
1777-
end: pos + importPath.length
1778-
});
1836+
// import {a as A} from "mod";
1837+
// import d, {a, b as B} from "mod"
1838+
recordModuleName();
1839+
}
1840+
}
1841+
}
1842+
}
1843+
else if (token === SyntaxKind.AsteriskToken) {
1844+
token = scanner.scan();
1845+
if (token === SyntaxKind.AsKeyword) {
1846+
token = scanner.scan();
1847+
if (token === SyntaxKind.Identifier) {
1848+
token = scanner.scan();
1849+
if (token === SyntaxKind.FromKeyword) {
1850+
token = scanner.scan();
1851+
if (token === SyntaxKind.StringLiteral) {
1852+
// import * as NS from "mod"
1853+
// import d, * as NS from "mod"
1854+
recordModuleName();
1855+
}
17791856
}
17801857
}
17811858
}
17821859
}
17831860
}
17841861
}
1862+
else if (token === SyntaxKind.ExportKeyword) {
1863+
token = scanner.scan();
1864+
if (token === SyntaxKind.OpenBraceToken) {
1865+
token = scanner.scan();
1866+
// consume "{ a as B, c, d as D}" clauses
1867+
while (token !== SyntaxKind.OpenBraceToken && token !== SyntaxKind.CloseBraceToken) {
1868+
token = scanner.scan();
1869+
}
1870+
1871+
if (token === SyntaxKind.CloseBraceToken) {
1872+
token = scanner.scan();
1873+
if (token === SyntaxKind.FromKeyword) {
1874+
token = scanner.scan();
1875+
if (token === SyntaxKind.StringLiteral) {
1876+
// export {a as A} from "mod";
1877+
// export {a, b as B} from "mod"
1878+
recordModuleName();
1879+
}
1880+
}
1881+
}
1882+
}
1883+
else if (token === SyntaxKind.AsteriskToken) {
1884+
token = scanner.scan();
1885+
if (token === SyntaxKind.FromKeyword) {
1886+
token = scanner.scan();
1887+
if (token === SyntaxKind.StringLiteral) {
1888+
// export * from "mod"
1889+
recordModuleName();
1890+
}
1891+
}
1892+
}
1893+
}
17851894
token = scanner.scan();
17861895
}
17871896
scanner.setText(undefined);

tests/cases/unittests/services/preProcessFile.ts

Lines changed: 44 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ describe('PreProcessFile:', function () {
2626
var expectedImportedFile = expectedImportedFiles[i];
2727

2828
assert.equal(resultImportedFile.fileName, expectedImportedFile.fileName, "Imported file path does not match expected. Expected: " + expectedImportedFile.fileName + ". Actual: " + resultImportedFile.fileName + ".");
29-
29+
3030
assert.equal(resultImportedFile.pos, expectedImportedFile.pos, "Imported file position does not match expected. Expected: " + expectedImportedFile.pos + ". Actual: " + resultImportedFile.pos + ".");
3131

3232
assert.equal(resultImportedFile.end, expectedImportedFile.end, "Imported file length does not match expected. Expected: " + expectedImportedFile.end + ". Actual: " + resultImportedFile.end + ".");
@@ -37,7 +37,7 @@ describe('PreProcessFile:', function () {
3737
var expectedReferencedFile = expectedReferencedFiles[i];
3838

3939
assert.equal(resultReferencedFile.fileName, expectedReferencedFile.fileName, "Referenced file path does not match expected. Expected: " + expectedReferencedFile.fileName + ". Actual: " + resultReferencedFile.fileName + ".");
40-
40+
4141
assert.equal(resultReferencedFile.pos, expectedReferencedFile.pos, "Referenced file position does not match expected. Expected: " + expectedReferencedFile.pos + ". Actual: " + resultReferencedFile.pos + ".");
4242

4343
assert.equal(resultReferencedFile.end, expectedReferencedFile.end, "Referenced file length does not match expected. Expected: " + expectedReferencedFile.end + ". Actual: " + resultReferencedFile.end + ".");
@@ -108,6 +108,48 @@ describe('PreProcessFile:', function () {
108108
isLibFile: false
109109
})
110110
});
111+
112+
it("Correctly return ES6 imports", function () {
113+
test("import * as ns from \"m1\";" + "\n" +
114+
"import def, * as ns from \"m2\";" + "\n" +
115+
"import def from \"m3\";" + "\n" +
116+
"import {a} from \"m4\";" + "\n" +
117+
"import {a as A} from \"m5\";" + "\n" +
118+
"import {a as A, b, c as C} from \"m6\";" + "\n" +
119+
"import def , {a, b, c as C} from \"m7\";" + "\n",
120+
true,
121+
{
122+
referencedFiles: [],
123+
importedFiles: [
124+
{ fileName: "m1", pos: 20, end: 22 },
125+
{ fileName: "m2", pos: 51, end: 53 },
126+
{ fileName: "m3", pos: 73, end: 75 },
127+
{ fileName: "m4", pos: 95, end: 97 },
128+
{ fileName: "m5", pos: 122, end: 124 },
129+
{ fileName: "m6", pos: 160, end: 162 },
130+
{ fileName: "m7", pos: 199, end: 201 }
131+
],
132+
isLibFile: false
133+
})
134+
});
135+
136+
it("Correctly return ES6 exports", function () {
137+
test("export * from \"m1\";" + "\n" +
138+
"export {a} from \"m2\";" + "\n" +
139+
"export {a as A} from \"m3\";" + "\n" +
140+
"export {a as A, b, c as C} from \"m4\";" + "\n",
141+
true,
142+
{
143+
referencedFiles: [],
144+
importedFiles: [
145+
{ fileName: "m1", pos: 14, end: 16 },
146+
{ fileName: "m2", pos: 36, end: 38 },
147+
{ fileName: "m3", pos: 63, end: 65 },
148+
{ fileName: "m4", pos: 101, end: 103 },
149+
],
150+
isLibFile: false
151+
})
152+
});
111153
});
112154
});
113155

0 commit comments

Comments
 (0)