diff --git a/src/compiler/program.ts b/src/compiler/program.ts
index 7593f4f5434f5..fb74f1dcaab33 100644
--- a/src/compiler/program.ts
+++ b/src/compiler/program.ts
@@ -187,8 +187,22 @@ namespace ts {
const typeReferenceExtensions = [".d.ts"];
function getEffectiveTypeRoots(options: CompilerOptions, host: ModuleResolutionHost) {
- return options.typeRoots ||
- map(defaultTypeRoots, d => combinePaths(options.configFilePath ? getDirectoryPath(options.configFilePath) : host.getCurrentDirectory(), d));
+ if (options.typeRoots) {
+ return options.typeRoots;
+ }
+
+ let currentDirectory: string;
+ if (options.configFilePath) {
+ currentDirectory = getDirectoryPath(options.configFilePath);
+ }
+ else if (host.getCurrentDirectory) {
+ currentDirectory = host.getCurrentDirectory();
+ }
+
+ if (!currentDirectory) {
+ return undefined;
+ }
+ return map(defaultTypeRoots, d => combinePaths(currentDirectory, d));
}
/**
@@ -228,7 +242,7 @@ namespace ts {
const failedLookupLocations: string[] = [];
// Check primary library paths
- if (typeRoots.length) {
+ if (typeRoots && typeRoots.length) {
if (traceEnabled) {
trace(host, Diagnostics.Resolving_with_primary_search_path_0, typeRoots.join(", "));
}
@@ -1046,9 +1060,11 @@ namespace ts {
let result: string[] = [];
if (host.directoryExists && host.getDirectories) {
const typeRoots = getEffectiveTypeRoots(options, host);
- for (const root of typeRoots) {
- if (host.directoryExists(root)) {
- result = result.concat(host.getDirectories(root));
+ if (typeRoots) {
+ for (const root of typeRoots) {
+ if (host.directoryExists(root)) {
+ result = result.concat(host.getDirectories(root));
+ }
}
}
}
diff --git a/tests/cases/fourslash/server/typeReferenceOnServer.ts b/tests/cases/fourslash/server/typeReferenceOnServer.ts
new file mode 100644
index 0000000000000..574ea6f60c46e
--- /dev/null
+++ b/tests/cases/fourslash/server/typeReferenceOnServer.ts
@@ -0,0 +1,9 @@
+///
+
+///////
+////var x: number;
+////x./*1*/
+
+goTo.marker("1");
+verify.not.completionListIsEmpty();
+