mirror of
https://github.com/microsoft/TypeScript.git
synced 2025-11-18 17:21:48 +00:00
* Initial support for globs in tsconfig.json * Added caching, more tests * Added stubs to ChakraHost interface for readDirectoryNames/readFileNames * Fixed typos in comments * Changed name of 'reduce' method added to FileSet * Heavily revised implementation that relies on an updated 'readDirectory' API. * more tests * Minor update to shims.ts for forthcoming VS support for globs. * Detailed comments for regular expressions and renamed some files. * Comment cleanup * Fixed new linter warnings * Add upper limit for the program size, fix readDirectory for the symlink files * Add comments * CR feedback / Change upper limit / Add disableSizeLimit compiler option * online and offline CR feedback * Don't count current opened client file if it's TS file * Speed up file searching * Make language service optional for a project * Fix failed tests * Fix project updateing issue after editing config file * Fixing linter and test errors * Bringing back excludes error and fixing faulty test * Fixing lint errors * Passing regular expressions to native hosts * Fix merging issues and multiple project scenario * Refactoring * add test and spit commandLineParser changes to another PR * Fix #8523 * check the declaration and use order if both are not in module file * Type guards using discriminant properties of string literal types * Fix #9098: report missing function impelementation errors for merged classes and namespaces * Narrow type in case/default sections in switch on discriminant property * No implicit returns following exhaustive switch statements * Narrow non-union types to ensure consistent results * Add tests * No Need to store dot token when parsing property access expression * Added tests. * Accepted baselines. * Check tuple types when getting the type node's type. * Accepted baselines. * Fix #9173: clear out lib and types before creating a program in transpileModule * Added tests. * Accepted baselines. * Always check type assertion types. * Clear out unused compiler options when transpiling * Accepted baselines. * improve error message for extending interface * accept baselines * Use helper functions to simplify range tests * Remove String, Number, and Boolean from TypeFlags.Falsy * Add regression test * Accept new baselines * Allow property declarations in .js files * Remove old test * Do not use Object.assing in test * Fix comment * Refactor code to make if statements cheaper * ignore casing when converting a source file path to relative path * add tests & add branches for module interface * Using baselines for transpile unittests (#9195) * Conver to Transpile unittest to use baselines instead * Add baselines * Fix linting error * use resolveEntityName to find interface * add new tests for extends interface * address code style * Refactor navigation bar * routine dom update * Updating readDirectory for tsserverProjectSystem unit tests * Array#map -> ts.map. * Responding to PR feedback * Add conditional index signature for Canvas2DContextAttributes (https://github.com/Microsoft/TypeScript/issues/9244) * Add libcheck tests * Add missing worker types * Accept webworker baselines * Classify `this` in parameter position as a keyword * Adding more matchFiles test cases * Use implicit boolean casts; it doesn't hurt performance * Use getCanonicalFileName * export interface used by other exported functions * Fix from merging with master * Update tests and baselines from merging with master * Remove using dotToken as it is no longer needed * Update baselines from removing dotToken * Address PR: Add NodeEmitFlags to no indent when emit * Address PR; and refactor setting NodeEmitFlags for createMemberAccessForPropertyName * Update baselines
186 lines
6.7 KiB
TypeScript
186 lines
6.7 KiB
TypeScript
/// <reference path="harness.ts" />
|
|
/// <reference path="..\compiler\commandLineParser.ts"/>
|
|
namespace Utils {
|
|
export class VirtualFileSystemEntry {
|
|
fileSystem: VirtualFileSystem;
|
|
name: string;
|
|
|
|
constructor(fileSystem: VirtualFileSystem, name: string) {
|
|
this.fileSystem = fileSystem;
|
|
this.name = name;
|
|
}
|
|
|
|
isDirectory() { return false; }
|
|
isFile() { return false; }
|
|
isFileSystem() { return false; }
|
|
}
|
|
|
|
export class VirtualFile extends VirtualFileSystemEntry {
|
|
content: string;
|
|
isFile() { return true; }
|
|
}
|
|
|
|
export abstract class VirtualFileSystemContainer extends VirtualFileSystemEntry {
|
|
abstract getFileSystemEntries(): VirtualFileSystemEntry[];
|
|
|
|
getFileSystemEntry(name: string): VirtualFileSystemEntry {
|
|
for (const entry of this.getFileSystemEntries()) {
|
|
if (this.fileSystem.sameName(entry.name, name)) {
|
|
return entry;
|
|
}
|
|
}
|
|
return undefined;
|
|
}
|
|
|
|
getDirectories(): VirtualDirectory[] {
|
|
return <VirtualDirectory[]>ts.filter(this.getFileSystemEntries(), entry => entry.isDirectory());
|
|
}
|
|
|
|
getFiles(): VirtualFile[] {
|
|
return <VirtualFile[]>ts.filter(this.getFileSystemEntries(), entry => entry.isFile());
|
|
}
|
|
|
|
getDirectory(name: string): VirtualDirectory {
|
|
const entry = this.getFileSystemEntry(name);
|
|
return entry.isDirectory() ? <VirtualDirectory>entry : undefined;
|
|
}
|
|
|
|
getFile(name: string): VirtualFile {
|
|
const entry = this.getFileSystemEntry(name);
|
|
return entry.isFile() ? <VirtualFile>entry : undefined;
|
|
}
|
|
}
|
|
|
|
export class VirtualDirectory extends VirtualFileSystemContainer {
|
|
private entries: VirtualFileSystemEntry[] = [];
|
|
|
|
isDirectory() { return true; }
|
|
|
|
getFileSystemEntries() { return this.entries.slice(); }
|
|
|
|
addDirectory(name: string): VirtualDirectory {
|
|
const entry = this.getFileSystemEntry(name);
|
|
if (entry === undefined) {
|
|
const directory = new VirtualDirectory(this.fileSystem, name);
|
|
this.entries.push(directory);
|
|
return directory;
|
|
}
|
|
else if (entry.isDirectory()) {
|
|
return <VirtualDirectory>entry;
|
|
}
|
|
else {
|
|
return undefined;
|
|
}
|
|
}
|
|
|
|
addFile(name: string, content?: string): VirtualFile {
|
|
const entry = this.getFileSystemEntry(name);
|
|
if (entry === undefined) {
|
|
const file = new VirtualFile(this.fileSystem, name);
|
|
file.content = content;
|
|
this.entries.push(file);
|
|
return file;
|
|
}
|
|
else if (entry.isFile()) {
|
|
const file = <VirtualFile>entry;
|
|
file.content = content;
|
|
return file;
|
|
}
|
|
else {
|
|
return undefined;
|
|
}
|
|
}
|
|
}
|
|
|
|
export class VirtualFileSystem extends VirtualFileSystemContainer {
|
|
private root: VirtualDirectory;
|
|
|
|
currentDirectory: string;
|
|
useCaseSensitiveFileNames: boolean;
|
|
|
|
constructor(currentDirectory: string, useCaseSensitiveFileNames: boolean) {
|
|
super(undefined, "");
|
|
this.fileSystem = this;
|
|
this.root = new VirtualDirectory(this, "");
|
|
this.currentDirectory = currentDirectory;
|
|
this.useCaseSensitiveFileNames = useCaseSensitiveFileNames;
|
|
}
|
|
|
|
isFileSystem() { return true; }
|
|
|
|
getFileSystemEntries() { return this.root.getFileSystemEntries(); }
|
|
|
|
addDirectory(path: string) {
|
|
const components = ts.getNormalizedPathComponents(path, this.currentDirectory);
|
|
let directory: VirtualDirectory = this.root;
|
|
for (const component of components) {
|
|
directory = directory.addDirectory(component);
|
|
if (directory === undefined) {
|
|
break;
|
|
}
|
|
}
|
|
|
|
return directory;
|
|
}
|
|
|
|
addFile(path: string, content?: string) {
|
|
const absolutePath = ts.getNormalizedAbsolutePath(path, this.currentDirectory);
|
|
const fileName = ts.getBaseFileName(path);
|
|
const directoryPath = ts.getDirectoryPath(absolutePath);
|
|
const directory = this.addDirectory(directoryPath);
|
|
return directory ? directory.addFile(fileName, content) : undefined;
|
|
}
|
|
|
|
fileExists(path: string) {
|
|
const entry = this.traversePath(path);
|
|
return entry !== undefined && entry.isFile();
|
|
}
|
|
|
|
sameName(a: string, b: string) {
|
|
return this.useCaseSensitiveFileNames ? a === b : a.toLowerCase() === b.toLowerCase();
|
|
}
|
|
|
|
traversePath(path: string) {
|
|
let directory: VirtualDirectory = this.root;
|
|
for (const component of ts.getNormalizedPathComponents(path, this.currentDirectory)) {
|
|
const entry = directory.getFileSystemEntry(component);
|
|
if (entry === undefined) {
|
|
return undefined;
|
|
}
|
|
else if (entry.isDirectory()) {
|
|
directory = <VirtualDirectory>entry;
|
|
}
|
|
else {
|
|
return entry;
|
|
}
|
|
}
|
|
|
|
return directory;
|
|
}
|
|
}
|
|
|
|
export class MockParseConfigHost extends VirtualFileSystem implements ts.ParseConfigHost {
|
|
constructor(currentDirectory: string, ignoreCase: boolean, files: string[]) {
|
|
super(currentDirectory, ignoreCase);
|
|
for (const file of files) {
|
|
this.addFile(file);
|
|
}
|
|
}
|
|
|
|
readDirectory(path: string, extensions: string[], excludes: string[], includes: string[]) {
|
|
return ts.matchFiles(path, extensions, excludes, includes, this.useCaseSensitiveFileNames, this.currentDirectory, (path: string) => this.getAccessibleFileSystemEntries(path));
|
|
}
|
|
|
|
getAccessibleFileSystemEntries(path: string) {
|
|
const entry = this.traversePath(path);
|
|
if (entry && entry.isDirectory()) {
|
|
const directory = <VirtualDirectory>entry;
|
|
return {
|
|
files: ts.map(directory.getFiles(), f => f.name),
|
|
directories: ts.map(directory.getDirectories(), d => d.name)
|
|
};
|
|
}
|
|
return { files: [], directories: [] };
|
|
}
|
|
}
|
|
} |