diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts
index 619027bfc1e..1f5807c1249 100644
--- a/src/harness/fourslash.ts
+++ b/src/harness/fourslash.ts
@@ -1573,7 +1573,8 @@ module FourSlash {
public goToTypeDefinition(definitionIndex: number) {
if (definitionIndex === 0) {
this.scenarioActions.push('');
- } else {
+ }
+ else {
this.taoInvalidReason = 'GoToTypeDefinition not supported for non-zero definition indices';
}
@@ -1610,8 +1611,18 @@ module FourSlash {
var assertFn = negative ? assert.notEqual : assert.equal;
var definitions = this.languageService.getDefinitionAtPosition(this.activeFile.fileName, this.currentCaretPosition);
+ var actualCount = definitions && definitions.length || 0;
- assertFn(definitions.length, expectedCount, this.messageAtLastKnownMarker("Definitions Count"));
+ assertFn(actualCount, expectedCount, this.messageAtLastKnownMarker("Definitions Count"));
+ }
+
+ public verifyTypeDefinitionsCount(negative: boolean, expectedCount: number) {
+ var assertFn = negative ? assert.notEqual : assert.equal;
+
+ var definitions = this.languageService.getTypeDefinitionAtPosition(this.activeFile.fileName, this.currentCaretPosition);
+ var actualCount = definitions && definitions.length || 0;
+
+ assertFn(actualCount, expectedCount, this.messageAtLastKnownMarker("Type definitions Count"));
}
public verifyDefinitionsName(negative: boolean, expectedName: string, expectedContainerName: string) {
diff --git a/src/services/services.ts b/src/services/services.ts
index 5d830f44f45..50d962fbe7d 100644
--- a/src/services/services.ts
+++ b/src/services/services.ts
@@ -3876,7 +3876,7 @@ module ts {
};
}
- function getDefintionFromSymbol(symbol: Symbol, node: Node): DefinitionInfo[]{
+ function getDefinitionFromSymbol(symbol: Symbol, node: Node): DefinitionInfo[] {
let typeChecker = program.getTypeChecker();
let result: DefinitionInfo[] = [];
let declarations = symbol.getDeclarations();
@@ -3939,7 +3939,6 @@ module ts {
return false;
}
-
}
/// Goto definition
@@ -4016,7 +4015,7 @@ module ts {
declaration => createDefinitionInfo(declaration, shorthandSymbolKind, shorthandSymbolName, shorthandContainerName));
}
- return getDefintionFromSymbol(symbol, node);
+ return getDefinitionFromSymbol(symbol, node);
}
/// Goto type
@@ -4046,7 +4045,7 @@ module ts {
var result: DefinitionInfo[] = [];
forEach((type).types, t => {
if (t.symbol) {
- result.push(...getDefintionFromSymbol(t.symbol, node));
+ result.push(...getDefinitionFromSymbol(t.symbol, node));
}
});
return result;
@@ -4056,7 +4055,7 @@ module ts {
return undefined;
}
- return getDefintionFromSymbol(type.symbol, node);
+ return getDefinitionFromSymbol(type.symbol, node);
}
function getOccurrencesAtPosition(fileName: string, position: number): ReferenceEntry[] {
diff --git a/src/services/shims.ts b/src/services/shims.ts
index 786e3da66d4..127ace96e6a 100644
--- a/src/services/shims.ts
+++ b/src/services/shims.ts
@@ -561,7 +561,7 @@ module ts {
return this.forwardJSONCall(
"getDefinitionAtPosition('" + fileName + "', " + position + ")",
() => {
- return this.languageService.getDefinitionAtPosition(fileName, position);
+ return this.languageService.getTypeDefinitionAtPosition(fileName, position);
});
}
diff --git a/tests/cases/fourslash/fourslash.ts b/tests/cases/fourslash/fourslash.ts
index 720ae4e7e6a..a5efdd18148 100644
--- a/tests/cases/fourslash/fourslash.ts
+++ b/tests/cases/fourslash/fourslash.ts
@@ -238,6 +238,10 @@ module FourSlashInterface {
FourSlash.currentTestState.verifyDefinitionsCount(this.negative, expectedCount);
}
+ public typeDefinitionCountIs(expectedCount: number) {
+ FourSlash.currentTestState.verifyTypeDefinitionsCount(this.negative, expectedCount);
+ }
+
public definitionLocationExists() {
FourSlash.currentTestState.verifyDefinitionLocationExists(this.negative);
}
diff --git a/tests/cases/fourslash/goToTypeDefinitionModule.ts b/tests/cases/fourslash/goToTypeDefinitionModule.ts
new file mode 100644
index 00000000000..2afccab97c3
--- /dev/null
+++ b/tests/cases/fourslash/goToTypeDefinitionModule.ts
@@ -0,0 +1,19 @@
+///
+
+// @Filename: goToTypeDefinitioAliases_module1.ts
+/////*definition*/module M {
+//// export var p;
+////}
+////var m: typeof M;
+
+// @Filename: goToTypeDefinitioAliases_module3.ts
+/////*reference1*/M;
+/////*reference2*/m;
+
+goTo.marker('reference1');
+goTo.type();
+verify.caretAtMarker('definition');
+
+goTo.marker('reference2');
+goTo.type();
+verify.caretAtMarker('definition');
\ No newline at end of file
diff --git a/tests/cases/fourslash/goToTypeDefinitionPrimitives.ts b/tests/cases/fourslash/goToTypeDefinitionPrimitives.ts
new file mode 100644
index 00000000000..d38a0c16343
--- /dev/null
+++ b/tests/cases/fourslash/goToTypeDefinitionPrimitives.ts
@@ -0,0 +1,25 @@
+///
+
+// @Filename: module1.ts
+////var w: {a: number};
+////var x = "string";
+////var y: number | string;
+////var z; // any
+
+// @Filename: module2.ts
+////w./*reference1*/a;
+/////*reference2*/x;
+/////*reference3*/y;
+/////*reference4*/y;
+
+goTo.marker('reference1');
+verify.typeDefinitionCountIs(0);
+
+goTo.marker('reference1');
+verify.typeDefinitionCountIs(0);
+
+goTo.marker('reference2');
+verify.typeDefinitionCountIs(0);
+
+goTo.marker('reference4');
+verify.typeDefinitionCountIs(0);