Skip to content

Commit 951f7cf

Browse files
committed
Support navigateTo for new import/export syntax
1 parent 7b7d2b6 commit 951f7cf

3 files changed

Lines changed: 87 additions & 0 deletions

File tree

src/services/services.ts

Lines changed: 42 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -802,6 +802,11 @@ module ts {
802802
case SyntaxKind.EnumDeclaration:
803803
case SyntaxKind.ModuleDeclaration:
804804
case SyntaxKind.ImportEqualsDeclaration:
805+
case SyntaxKind.ExportSpecifier:
806+
case SyntaxKind.ImportSpecifier:
807+
case SyntaxKind.ImportEqualsDeclaration:
808+
case SyntaxKind.ImportClause:
809+
case SyntaxKind.NamespaceImport:
805810
case SyntaxKind.GetAccessor:
806811
case SyntaxKind.SetAccessor:
807812
case SyntaxKind.TypeLiteral:
@@ -841,6 +846,37 @@ module ts {
841846
case SyntaxKind.PropertySignature:
842847
namedDeclarations.push(<Declaration>node);
843848
break;
849+
850+
case SyntaxKind.ExportDeclaration:
851+
// Handle named exports case e.g.:
852+
// export {a, b as B} from "mod";
853+
if ((<ExportDeclaration>node).exportClause) {
854+
forEach((<ExportDeclaration>node).exportClause.elements, visit);
855+
}
856+
break;
857+
858+
case SyntaxKind.ImportDeclaration:
859+
var importClause = (<ImportDeclaration>node).importClause;
860+
if (importClause) {
861+
// Handle default import case e.g.:
862+
// import d from "mod";
863+
if (importClause.name) {
864+
namedDeclarations.push(importClause);
865+
}
866+
867+
// Handle named bindings in imports e.g.:
868+
// import * as NS from "mod";
869+
// import {a, b as B} from "mod";
870+
if (importClause.namedBindings) {
871+
if (importClause.namedBindings.kind === SyntaxKind.NamespaceImport) {
872+
namedDeclarations.push(<NamespaceImport>importClause.namedBindings);
873+
}
874+
else {
875+
forEach((<NamedImports>importClause.namedBindings).elements, visit);
876+
}
877+
}
878+
}
879+
break;
844880
}
845881
});
846882

@@ -2010,6 +2046,12 @@ module ts {
20102046
case SyntaxKind.TypeParameter: return ScriptElementKind.typeParameterElement;
20112047
case SyntaxKind.EnumMember: return ScriptElementKind.variableElement;
20122048
case SyntaxKind.Parameter: return (node.flags & NodeFlags.AccessibilityModifier) ? ScriptElementKind.memberVariableElement : ScriptElementKind.parameterElement;
2049+
case SyntaxKind.ImportEqualsDeclaration:
2050+
case SyntaxKind.ImportSpecifier:
2051+
case SyntaxKind.ImportClause:
2052+
case SyntaxKind.ExportSpecifier:
2053+
case SyntaxKind.NamespaceImport:
2054+
return ScriptElementKind.alias;
20132055
}
20142056
return ScriptElementKind.unknown;
20152057
}
Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,20 @@
1+
/// <reference path="fourslash.ts" />
2+
3+
////export { {| "itemName": "a", "kind": "alias", "parentName": "" |}a } from "a";
4+
////
5+
////export { {| "itemName": "B", "kind": "alias", "parentName": "" |}b as B } from "a";
6+
////
7+
////export { {| "itemName": "c", "kind": "alias", "parentName": "" |}c,
8+
//// {| "itemName": "D", "kind": "alias", "parentName": "" |}d as D } from "a";
9+
////
10+
////{| "itemName": "f", "kind": "alias", "parentName": "" |}export import f = require("a");
11+
12+
test.markers().forEach(marker => {
13+
verify.navigationItemsListContains(
14+
marker.data.itemName,
15+
marker.data.kind,
16+
marker.data.itemName,
17+
"exact",
18+
marker.fileName,
19+
marker.data.parentName);
20+
});
Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,25 @@
1+
/// <reference path="fourslash.ts" />
2+
3+
////import {| "itemName": "ns", "kind": "alias", "parentName": "" |}* as ns from "a";
4+
////
5+
////import { {| "itemName": "a", "kind": "alias", "parentName": "" |}a } from "a";
6+
////
7+
////import { {| "itemName": "B", "kind": "alias", "parentName": "" |}b as B } from "a";
8+
////
9+
////import { {| "itemName": "c", "kind": "alias", "parentName": "" |}c,
10+
//// {| "itemName": "D", "kind": "alias", "parentName": "" |}d as D } from "a";
11+
////
12+
////import {| "itemName": "d1", "kind": "alias", "parentName": "" |}d1, {
13+
//// {| "itemName": "e", "kind": "alias", "parentName": "" |}e } from "a";
14+
////
15+
////{| "itemName": "f", "kind": "alias", "parentName": "" |}import f = require("a");
16+
17+
test.markers().forEach(marker => {
18+
verify.navigationItemsListContains(
19+
marker.data.itemName,
20+
marker.data.kind,
21+
marker.data.itemName,
22+
"exact",
23+
marker.fileName,
24+
marker.data.parentName);
25+
});

0 commit comments

Comments
 (0)