Fix completions when the ts installation and project are on two different windows drive (#35733)

* Fix completions when the ts installation and project are on two different windows drive
Fixes #35512

* Fix typo
This commit is contained in:
Sheetal Nandi 2019-12-17 14:19:52 -08:00 committed by GitHub
parent c73af610fe
commit f90cde4706
No known key found for this signature in database
GPG key ID: 4AEE18F83AFDEB23
3 changed files with 139 additions and 4 deletions

View file

@ -171,7 +171,7 @@ namespace ts.moduleSpecifiers {
return match ? match.length : 0;
}
function comparePathsByNumberOfDirectrorySeparators(a: string, b: string) {
function comparePathsByNumberOfDirectorySeparators(a: string, b: string) {
return compareValues(
numberOfDirectorySeparators(a),
numberOfDirectorySeparators(b)
@ -216,7 +216,6 @@ namespace ts.moduleSpecifiers {
for (
let directory = getDirectoryPath(toPath(importingFileName, cwd, getCanonicalFileName));
allFileNames.size !== 0;
directory = getDirectoryPath(directory)
) {
const directoryStart = ensureTrailingDirectorySeparator(directory);
let pathsInDirectory: string[] | undefined;
@ -228,10 +227,18 @@ namespace ts.moduleSpecifiers {
});
if (pathsInDirectory) {
if (pathsInDirectory.length > 1) {
pathsInDirectory.sort(comparePathsByNumberOfDirectrorySeparators);
pathsInDirectory.sort(comparePathsByNumberOfDirectorySeparators);
}
sortedPaths.push(...pathsInDirectory);
}
const newDirectory = getDirectoryPath(directory);
if (newDirectory === directory) break;
directory = newDirectory;
}
if (allFileNames.size) {
const remainingPaths = arrayFrom(allFileNames.values());
if (remainingPaths.length > 1) remainingPaths.sort(comparePathsByNumberOfDirectorySeparators);
sortedPaths.push(...remainingPaths);
}
return sortedPaths;
}

View file

@ -645,7 +645,7 @@ interface Array<T> { length: number; [n: number]: T; }`
}
else {
// root folder
Debug.assert(this.fs.size === 0);
Debug.assert(this.fs.size === 0 || !!this.windowsStyleRoot);
this.fs.set(path, folder);
}
}

View file

@ -118,5 +118,133 @@ namespace ts.projectSystem {
}
]);
});
it("works when files are included from two different drives of windows", () => {
const projectRoot = "e:/myproject";
const appPackage: File = {
path: `${projectRoot}/package.json`,
content: JSON.stringify({
name: "test",
version: "0.1.0",
dependencies: {
"react": "^16.12.0",
"react-router-dom": "^5.1.2",
}
})
};
const appFile: File = {
path: `${projectRoot}/src/app.js`,
content: `import React from 'react';
import {
BrowserRouter as Router,
} from "react-router-dom";
`
};
const localNodeModules = `${projectRoot}/node_modules`;
const localAtTypes = `${localNodeModules}/@types`;
const localReactPackage: File = {
path: `${localAtTypes}/react/package.json`,
content: JSON.stringify({
name: "@types/react",
version: "16.9.14",
})
};
const localReact: File = {
path: `${localAtTypes}/react/index.d.ts`,
content: `import * as PropTypes from 'prop-types';
`
};
const localReactRouterDomPackage: File = {
path: `${localNodeModules}/react-router-dom/package.json`,
content: JSON.stringify({
name: "react-router-dom",
version: "5.1.2",
})
};
const localReactRouterDom: File = {
path: `${localNodeModules}/react-router-dom/index.js`,
content: `export function foo() {}`
};
const localPropTypesPackage: File = {
path: `${localAtTypes}/prop-types/package.json`,
content: JSON.stringify({
name: "@types/prop-types",
version: "15.7.3",
})
};
const localPropTypes: File = {
path: `${localAtTypes}/prop-types/index.d.ts`,
content: `export type ReactComponentLike =
| string
| ((props: any, context?: any) => any)
| (new (props: any, context?: any) => any);
`
};
const globalCacheLocation = `c:/typescript`;
const globalAtTypes = `${globalCacheLocation}/node_modules/@types`;
const globalReactRouterDomPackage: File = {
path: `${globalAtTypes}/react-router-dom/package.json`,
content: JSON.stringify({
name: "@types/react-router-dom",
version: "5.1.2",
})
};
const globalReactRouterDom: File = {
path: `${globalAtTypes}/react-router-dom/index.d.ts`,
content: `import * as React from 'react';
export interface BrowserRouterProps {
basename?: string;
getUserConfirmation?: ((message: string, callback: (ok: boolean) => void) => void);
forceRefresh?: boolean;
keyLength?: number;
}`
};
const globalReactPackage: File = {
path: `${globalAtTypes}/react/package.json`,
content: localReactPackage.content
};
const globalReact: File = {
path: `${globalAtTypes}/react/index.d.ts`,
content: localReact.content
};
const filesInProject = [
appFile,
localReact,
localPropTypes,
globalReactRouterDom,
globalReact,
];
const files = [
...filesInProject,
appPackage, libFile,
localReactPackage,
localReactRouterDomPackage, localReactRouterDom,
localPropTypesPackage,
globalReactRouterDomPackage,
globalReactPackage,
];
const host = createServerHost(files, { windowsStyleRoot: "c:/" });
const session = createSession(host, {
typingsInstaller: new TestTypingsInstaller(globalCacheLocation, /*throttleLimit*/ 5, host),
});
const service = session.getProjectService();
openFilesForSession([appFile], session);
checkNumberOfProjects(service, { inferredProjects: 1 });
const windowsStyleLibFilePath = "c:/" + libFile.path.substring(1);
checkProjectActualFiles(service.inferredProjects[0], filesInProject.map(f => f.path).concat(windowsStyleLibFilePath));
session.executeCommandSeq<protocol.CompletionsRequest>({
command: protocol.CommandTypes.CompletionInfo,
arguments: {
file: appFile.path,
line: 5,
offset: 1,
includeExternalModuleExports: true,
includeInsertTextCompletions: true
}
});
});
});
}