Skip to content

Commit 0415b95

Browse files
committed
Passing regular expressions to native hosts
1 parent aa5c51c commit 0415b95

4 files changed

Lines changed: 47 additions & 14 deletions

File tree

src/compiler/commandLineParser.ts

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1021,13 +1021,14 @@ namespace ts {
10211021
//
10221022
// /a/b/* - Watch /a/b directly to catch any new file
10231023
// /a/b/a?z - Watch /a/b directly to catch any new file matching a?z
1024-
const excludeRegExp = getRegularExpressionForWildcard(exclude, path, "exclude", useCaseSensitiveFileNames);
1024+
const rawExcludeRegex = getRegularExpressionForWildcard(exclude, path, "exclude");
1025+
const excludeRegex = rawExcludeRegex && new RegExp(rawExcludeRegex, useCaseSensitiveFileNames ? "" : "i");
10251026
const wildcardDirectories: Map<WatchDirectoryFlags> = {};
10261027
if (include !== undefined) {
10271028
const recursiveKeys: string[] = [];
10281029
for (const file of include) {
10291030
const name = combinePaths(path, file);
1030-
if (excludeRegExp && excludeRegExp.test(name)) {
1031+
if (excludeRegex && excludeRegex.test(name)) {
10311032
continue;
10321033
}
10331034

src/compiler/core.ts

Lines changed: 31 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -911,7 +911,7 @@ namespace ts {
911911
const reservedCharacterPattern = /[^\w\s\/]/g;
912912
const wildcardCharCodes = [CharacterCodes.asterisk, CharacterCodes.question];
913913

914-
export function getRegularExpressionForWildcard(specs: string[], basePath: string, usage: "files" | "directories" | "exclude", useCaseSensitiveFileNames: boolean) {
914+
export function getRegularExpressionForWildcard(specs: string[], basePath: string, usage: "files" | "directories" | "exclude") {
915915
if (specs === undefined || specs.length === 0) {
916916
return undefined;
917917
}
@@ -978,7 +978,7 @@ namespace ts {
978978
return undefined;
979979
}
980980

981-
return new RegExp("^(" + pattern + (usage === "exclude" ? ")($|/)" : ")$"), useCaseSensitiveFileNames ? "" : "i");
981+
return "^(" + pattern + (usage === "exclude" ? ")($|/)" : ")$");
982982
}
983983

984984
function replaceWildcardCharacter(match: string) {
@@ -990,15 +990,39 @@ namespace ts {
990990
directories: string[];
991991
}
992992

993-
export function matchFiles(path: string, extensions: string[], excludes: string[], includes: string[], useCaseSensitiveFileNames: boolean, currentDirectory: string, getFileSystemEntries: (path: string) => FileSystemEntries): string[] {
993+
interface FileMatcherPatterns {
994+
includeFilePattern: string;
995+
includeDirectoryPattern: string;
996+
excludePattern: string;
997+
basePaths: string[];
998+
}
999+
1000+
export function getFileMatcherPatterns(path: string, extensions: string[], excludes: string[], includes: string[], useCaseSensitiveFileNames: boolean, currentDirectory: string): FileMatcherPatterns {
9941001
path = normalizePath(path);
9951002
currentDirectory = normalizePath(currentDirectory);
9961003
const absolutePath = combinePaths(currentDirectory, path);
997-
const includeFileRegex = getRegularExpressionForWildcard(includes, absolutePath, "files", useCaseSensitiveFileNames);
998-
const includeDirectoryRegex = getRegularExpressionForWildcard(includes, absolutePath, "directories", useCaseSensitiveFileNames);
999-
const excludeRegex = getRegularExpressionForWildcard(excludes, absolutePath, "exclude", useCaseSensitiveFileNames);
1004+
1005+
return {
1006+
includeFilePattern: getRegularExpressionForWildcard(includes, absolutePath, "files"),
1007+
includeDirectoryPattern: getRegularExpressionForWildcard(includes, absolutePath, "directories"),
1008+
excludePattern: getRegularExpressionForWildcard(excludes, absolutePath, "exclude"),
1009+
basePaths: getBasePaths(path, includes, useCaseSensitiveFileNames)
1010+
};
1011+
}
1012+
1013+
export function matchFiles(path: string, extensions: string[], excludes: string[], includes: string[], useCaseSensitiveFileNames: boolean, currentDirectory: string, getFileSystemEntries: (path: string) => FileSystemEntries): string[] {
1014+
path = normalizePath(path);
1015+
currentDirectory = normalizePath(currentDirectory);
1016+
1017+
const patterns = getFileMatcherPatterns(path, extensions, excludes, includes, useCaseSensitiveFileNames, currentDirectory);
1018+
1019+
const regexFlag = useCaseSensitiveFileNames ? "" : "i";
1020+
const includeFileRegex = patterns.includeFilePattern && new RegExp(patterns.includeFilePattern, regexFlag);
1021+
const includeDirectoryRegex = patterns.includeDirectoryPattern && new RegExp(patterns.includeDirectoryPattern, regexFlag);
1022+
const excludeRegex = patterns.excludePattern && new RegExp(patterns.excludePattern, regexFlag);
1023+
10001024
const result: string[] = [];
1001-
for (const basePath of getBasePaths(path, includes, useCaseSensitiveFileNames)) {
1025+
for (const basePath of patterns.basePaths) {
10021026
visitDirectory(basePath, combinePaths(currentDirectory, basePath));
10031027
}
10041028
return result;

src/compiler/sys.ts

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -73,7 +73,7 @@ namespace ts {
7373
readFile(path: string): string;
7474
writeFile(path: string, contents: string): void;
7575
getDirectories(path: string): string[];
76-
readDirectory(path: string, extensions?: string[], exclude?: string[], include?: string[]): string[];
76+
readDirectory(path: string, extensions?: string[], basePaths?: string[], excludeEx?: string, includeFileEx?: string, includeDirEx?: string): string[];
7777
watchFile?(path: string, callback: FileWatcherCallback): FileWatcher;
7878
watchDirectory?(path: string, callback: DirectoryWatcherCallback, recursive?: boolean): FileWatcher;
7979
realpath(path: string): string;
@@ -558,7 +558,10 @@ namespace ts {
558558
getExecutingFilePath: () => ChakraHost.executingFile,
559559
getCurrentDirectory: () => ChakraHost.currentDirectory,
560560
getDirectories: ChakraHost.getDirectories,
561-
readDirectory: ChakraHost.readDirectory,
561+
readDirectory: (path: string, extensions?: string[], excludes?: string[], includes?: string[]) => {
562+
const pattern = getFileMatcherPatterns(path, extensions, excludes, includes, !!ChakraHost.useCaseSensitiveFileNames, ChakraHost.currentDirectory);
563+
return ChakraHost.readDirectory(path, extensions, pattern.basePaths, pattern.excludePattern, pattern.includeFilePattern, pattern.includeDirectoryPattern);
564+
},
562565
exit: ChakraHost.quit,
563566
realpath
564567
};

src/services/shims.ts

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -80,8 +80,9 @@ namespace ts {
8080
* @param exclude A JSON encoded string[] containing the paths to exclude
8181
* when enumerating the directory.
8282
*/
83-
readDirectory(rootDir: string, extension: string, exclude?: string, include?: string, depth?: number): string;
83+
readDirectory(rootDir: string, extension: string, basePaths?: string, excludeEx?: string, includeFileEx?: string, includeDirEx?: string, depth?: number): string;
8484
useCaseSensitiveFileNames?(): boolean;
85+
getCurrentDirectory(): string;
8586
trace(s: string): void;
8687
}
8788

@@ -453,11 +454,15 @@ namespace ts {
453454
// Wrap the API changes for 2.0 release. This try/catch
454455
// should be removed once TypeScript 2.0 has shipped.
455456
try {
457+
const pattern = getFileMatcherPatterns(rootDir, extensions, exclude, include,
458+
this.shimHost.useCaseSensitiveFileNames(), this.shimHost.getCurrentDirectory());
456459
return JSON.parse(this.shimHost.readDirectory(
457460
rootDir,
458461
JSON.stringify(extensions),
459-
JSON.stringify(exclude),
460-
JSON.stringify(include),
462+
JSON.stringify(pattern.basePaths),
463+
pattern.excludePattern,
464+
pattern.includeFilePattern,
465+
pattern.includeDirectoryPattern,
461466
depth
462467
));
463468
}

0 commit comments

Comments
 (0)