From 9560895ec21d597332b27540ea5a0932d857d24a Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 10 Jun 2015 18:18:37 -0700 Subject: [PATCH 1/7] Don't bother trying to semantically classify names that could never be typenames. --- src/compiler/binder.ts | 7 +++++++ src/compiler/program.ts | 16 ++++++++++++++++ src/compiler/types.ts | 3 +++ src/services/services.ts | 14 +++++++++----- 4 files changed, 35 insertions(+), 5 deletions(-) diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index d411b840dc..f672a94844 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -90,10 +90,12 @@ module ts { let lastContainer: Node; let symbolCount = 0; let Symbol = objectAllocator.getSymbolConstructor(); + let typeNames: Map = {}; if (!file.locals) { bind(file); file.symbolCount = symbolCount; + file.typeNames = typeNames; } return; @@ -194,6 +196,11 @@ module ts { symbol = hasProperty(symbolTable, name) ? symbolTable[name] : (symbolTable[name] = createSymbol(SymbolFlags.None, name)); + + if (name && (includes & (SymbolFlags.Class | SymbolFlags.Enum | SymbolFlags.TypeAlias | SymbolFlags.Interface | SymbolFlags.TypeParameter | SymbolFlags.Module))) { + typeNames[name] = name; + } + if (symbol.flags & excludes) { if (node.name) { node.name.parent = node; diff --git a/src/compiler/program.ts b/src/compiler/program.ts index c09b70a0c6..ceebb1db11 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -148,6 +148,7 @@ module ts { let commonSourceDirectory: string; let diagnosticsProducingTypeChecker: TypeChecker; let noDiagnosticsTypeChecker: TypeChecker; + let typeNames: Map; let start = new Date().getTime(); @@ -172,6 +173,7 @@ module ts { getDeclarationDiagnostics, getCompilerOptionsDiagnostics, getTypeChecker, + getTypeNames, getDiagnosticsProducingTypeChecker, getCommonSourceDirectory: () => commonSourceDirectory, emit, @@ -183,6 +185,20 @@ module ts { }; return program; + function getTypeNames() { + if (!typeNames) { + // Initialize a checker so that all our files are bound. + getTypeChecker(); + typeNames = {}; + + for (let sourceFile of files) { + copyMap(sourceFile.typeNames, typeNames); + } + } + + return typeNames; + } + function getEmitHost(writeFileCallback?: WriteFileCallback): EmitHost { return { getCanonicalFileName: fileName => host.getCanonicalFileName(fileName), diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 70962ea13c..3607c11d2b 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -422,6 +422,7 @@ module ts { /* @internal */ locals?: SymbolTable; // Locals associated with node (initialized by binding) /* @internal */ nextContainer?: Node; // Next container in declaration order (initialized by binding) /* @internal */ localSymbol?: Symbol; // Local symbol declared by node (initialized by binding only for exported nodes) + /* @internal */ typeNames?: Map; } export interface NodeArray extends Array, TextRange { @@ -1223,6 +1224,8 @@ module ts { // language service). /* @internal */ getDiagnosticsProducingTypeChecker(): TypeChecker; + /* @internal */ getTypeNames(): Map; + /* @internal */ getNodeCount(): number; /* @internal */ getIdentifierCount(): number; /* @internal */ getSymbolCount(): number; diff --git a/src/services/services.ts b/src/services/services.ts index 5e8392fa9d..eda3a255e4 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -5992,6 +5992,7 @@ module ts { let typeChecker = program.getTypeChecker(); let result: number[] = []; + let typeNames = program.getTypeNames(); processNode(sourceFile); return { spans: result, endOfLineState: EndOfLineState.None }; @@ -6048,11 +6049,14 @@ module ts { // Only walk into nodes that intersect the requested span. if (node && textSpanIntersectsWith(span, node.getFullStart(), node.getFullWidth())) { if (node.kind === SyntaxKind.Identifier && !nodeIsMissing(node)) { - let symbol = typeChecker.getSymbolAtLocation(node); - if (symbol) { - let type = classifySymbol(symbol, getMeaningFromLocation(node)); - if (type) { - pushClassification(node.getStart(), node.getWidth(), type); + let identifier = node; + if (typeNames[identifier.text]) { + let symbol = typeChecker.getSymbolAtLocation(node); + if (symbol) { + let type = classifySymbol(symbol, getMeaningFromLocation(node)); + if (type) { + pushClassification(node.getStart(), node.getWidth(), type); + } } } } From dbfdb96f3956419d0040399757a4d7e6cef6c299 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Wed, 10 Jun 2015 18:24:34 -0700 Subject: [PATCH 2/7] Add explanatory comment --- src/services/services.ts | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/src/services/services.ts b/src/services/services.ts index eda3a255e4..255b1f80e5 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -6050,6 +6050,10 @@ module ts { if (node && textSpanIntersectsWith(span, node.getFullStart(), node.getFullWidth())) { if (node.kind === SyntaxKind.Identifier && !nodeIsMissing(node)) { let identifier = node; + + // Only bother calling into the typechecker if this is an identifier that + // could possibly resolve to a type name. This makes classification run + // in a third of the time it would normally take. if (typeNames[identifier.text]) { let symbol = typeChecker.getSymbolAtLocation(node); if (symbol) { From 3ed4309e45b8f26d45277c548287d205d739e62a Mon Sep 17 00:00:00 2001 From: Tingan Ho Date: Thu, 11 Jun 2015 14:32:27 +0800 Subject: [PATCH 3/7] Fixes type predicate formatting --- src/services/formatting/formattingScanner.ts | 2 +- src/services/formatting/rules.ts | 5 +++-- src/services/formatting/tokenRange.ts | 2 +- tests/cases/fourslash/functionTypePredicateFormatting.ts | 7 +++++++ 4 files changed, 12 insertions(+), 4 deletions(-) create mode 100644 tests/cases/fourslash/functionTypePredicateFormatting.ts diff --git a/src/services/formatting/formattingScanner.ts b/src/services/formatting/formattingScanner.ts index e09b5dfba9..0d4dd8eacd 100644 --- a/src/services/formatting/formattingScanner.ts +++ b/src/services/formatting/formattingScanner.ts @@ -224,7 +224,7 @@ module ts.formatting { } function isOnToken(): boolean { - let current = (lastTokenInfo && lastTokenInfo.token.kind) || scanner.getToken(); + let current = (lastTokenInfo && lastTokenInfo.token.kind) || scanner.getToken(); let startPos = (lastTokenInfo && lastTokenInfo.token.pos) || scanner.getStartPos(); return startPos < endPos && current !== SyntaxKind.EndOfFileToken && !isTrivia(current); } diff --git a/src/services/formatting/rules.ts b/src/services/formatting/rules.ts index 9cf6d8ff4b..3352253a86 100644 --- a/src/services/formatting/rules.ts +++ b/src/services/formatting/rules.ts @@ -193,7 +193,7 @@ module ts.formatting { // Insert space after function keyword for anonymous functions public SpaceAfterAnonymousFunctionKeyword: Rule; public NoSpaceAfterAnonymousFunctionKeyword: Rule; - + // Insert space after @ in decorator public SpaceBeforeAt: Rule; public NoSpaceAfterAt: Rule; @@ -470,8 +470,9 @@ module ts.formatting { switch (context.contextNode.kind) { case SyntaxKind.BinaryExpression: case SyntaxKind.ConditionalExpression: + case SyntaxKind.TypePredicate: return true; - + // equals in binding elements: function foo([[x, y] = [1, 2]]) case SyntaxKind.BindingElement: // equals in type X = ... diff --git a/src/services/formatting/tokenRange.ts b/src/services/formatting/tokenRange.ts index 712d6f3792..59a376f15f 100644 --- a/src/services/formatting/tokenRange.ts +++ b/src/services/formatting/tokenRange.ts @@ -112,7 +112,7 @@ module ts.formatting { static AnyIncludingMultilineComments = TokenRange.FromTokens(TokenRange.Any.GetTokens().concat([SyntaxKind.MultiLineCommentTrivia])); static Keywords = TokenRange.FromRange(SyntaxKind.FirstKeyword, SyntaxKind.LastKeyword); static BinaryOperators = TokenRange.FromRange(SyntaxKind.FirstBinaryOperator, SyntaxKind.LastBinaryOperator); - static BinaryKeywordOperators = TokenRange.FromTokens([SyntaxKind.InKeyword, SyntaxKind.InstanceOfKeyword, SyntaxKind.OfKeyword]); + static BinaryKeywordOperators = TokenRange.FromTokens([SyntaxKind.InKeyword, SyntaxKind.InstanceOfKeyword, SyntaxKind.OfKeyword, SyntaxKind.IsKeyword]); static UnaryPrefixOperators = TokenRange.FromTokens([SyntaxKind.PlusPlusToken, SyntaxKind.MinusMinusToken, SyntaxKind.TildeToken, SyntaxKind.ExclamationToken]); static UnaryPrefixExpressions = TokenRange.FromTokens([SyntaxKind.NumericLiteral, SyntaxKind.Identifier, SyntaxKind.OpenParenToken, SyntaxKind.OpenBracketToken, SyntaxKind.OpenBraceToken, SyntaxKind.ThisKeyword, SyntaxKind.NewKeyword]); static UnaryPreincrementExpressions = TokenRange.FromTokens([SyntaxKind.Identifier, SyntaxKind.OpenParenToken, SyntaxKind.ThisKeyword, SyntaxKind.NewKeyword]); diff --git a/tests/cases/fourslash/functionTypePredicateFormatting.ts b/tests/cases/fourslash/functionTypePredicateFormatting.ts new file mode 100644 index 0000000000..4195e261da --- /dev/null +++ b/tests/cases/fourslash/functionTypePredicateFormatting.ts @@ -0,0 +1,7 @@ +/// + +//// /**/function bar(a: A): a is B {} + +goTo.marker(); +format.document(); +verify.currentLineContentIs("function bar(a: A): a is B { }"); \ No newline at end of file From 970dc49a2d3d82d47d659b922dcbda560c9d6362 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Thu, 11 Jun 2015 14:30:58 -0700 Subject: [PATCH 4/7] do not report extra error if file was already found without extension --- src/compiler/program.ts | 19 +++++++++++-------- tests/cases/unittests/transpile.ts | 26 +++++++++++++++----------- 2 files changed, 26 insertions(+), 19 deletions(-) diff --git a/src/compiler/program.ts b/src/compiler/program.ts index c09b70a0c6..e5b5f7cc46 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -335,14 +335,17 @@ module ts { } } else { - if (options.allowNonTsExtensions && !findSourceFile(fileName, isDefaultLib, refFile, refPos, refEnd)) { - diagnostic = Diagnostics.File_0_not_found; - diagnosticArgument = [fileName]; - } - else if (!forEach(supportedExtensions, extension => findSourceFile(fileName + extension, isDefaultLib, refFile, refPos, refEnd))) { - diagnostic = Diagnostics.File_0_not_found; - fileName += ".ts"; - diagnosticArgument = [fileName]; + var nonTsFile: SourceFile = options.allowNonTsExtensions && findSourceFile(fileName, isDefaultLib, refFile, refPos, refEnd); + if (!nonTsFile) { + if (options.allowNonTsExtensions) { + diagnostic = Diagnostics.File_0_not_found; + diagnosticArgument = [fileName]; + } + else if (!forEach(supportedExtensions, extension => findSourceFile(fileName + extension, isDefaultLib, refFile, refPos, refEnd))) { + diagnostic = Diagnostics.File_0_not_found; + fileName += ".ts"; + diagnosticArgument = [fileName]; + } } } diff --git a/tests/cases/unittests/transpile.ts b/tests/cases/unittests/transpile.ts index 7aa9106880..47f8bd04cb 100644 --- a/tests/cases/unittests/transpile.ts +++ b/tests/cases/unittests/transpile.ts @@ -3,9 +3,9 @@ module ts { describe("Transpile", () => { - function runTest(input: string, compilerOptions: ts.CompilerOptions = {}, moduleName?: string, expectedOutput?: string, expectedDiagnosticCodes: number[] = []): void { + function runTest(input: string, compilerOptions: ts.CompilerOptions = {}, fileName?: string, moduleName?: string, expectedOutput?: string, expectedDiagnosticCodes: number[] = []): void { let diagnostics: Diagnostic[] = []; - let result = transpile(input, compilerOptions, "file.ts", diagnostics, moduleName); + let result = transpile(input, compilerOptions, fileName || "file.ts", diagnostics, moduleName); for (let i = 0; i < expectedDiagnosticCodes.length; i++) { assert.equal(expectedDiagnosticCodes[i], diagnostics[i] && diagnostics[i].code, `Could not find expeced diagnostic.`); @@ -19,41 +19,41 @@ module ts { it("Generates correct compilerOptions diagnostics", () => { // Expecting 5047: "Option 'isolatedModules' can only be used when either option'--module' is provided or option 'target' is 'ES6' or higher." - runTest(`var x = 0;`, {}, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ [5047]); + runTest(`var x = 0;`, {}, /*fileName*/ undefined, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ [5047]); }); it("Generates no diagnostics with valid inputs", () => { // No errors - runTest(`var x = 0;`, { module: ModuleKind.CommonJS }, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ []); + runTest(`var x = 0;`, { module: ModuleKind.CommonJS }, /*fileName*/ undefined, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ []); }); it("Generates no diagnostics for missing file references", () => { runTest(`/// var x = 0;`, - { module: ModuleKind.CommonJS }, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ []); + { module: ModuleKind.CommonJS }, /*fileName*/ undefined, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ []); }); it("Generates no diagnostics for missing module imports", () => { runTest(`import {a} from "module2";`, - { module: ModuleKind.CommonJS }, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ []); + { module: ModuleKind.CommonJS }, /*fileName*/ undefined,/*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ []); }); it("Generates expected syntactic diagnostics", () => { runTest(`a b`, - { module: ModuleKind.CommonJS }, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ [1005]); /// 1005: ';' Expected + { module: ModuleKind.CommonJS }, /*fileName*/ undefined, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ [1005]); /// 1005: ';' Expected }); it("Does not generate semantic diagnostics", () => { runTest(`var x: string = 0;`, - { module: ModuleKind.CommonJS }, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ []); + { module: ModuleKind.CommonJS }, /*fileName*/ undefined, /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/ []); }); it("Generates module output", () => { - runTest(`var x = 0;`, { module: ModuleKind.AMD }, /*moduleName*/undefined, `define(["require", "exports"], function (require, exports) {\r\n var x = 0;\r\n});\r\n`); + runTest(`var x = 0;`, { module: ModuleKind.AMD }, /*fileName*/ undefined, /*moduleName*/undefined, `define(["require", "exports"], function (require, exports) {\r\n var x = 0;\r\n});\r\n`); }); it("Uses correct newLine character", () => { - runTest(`var x = 0;`, { module: ModuleKind.CommonJS, newLine: NewLineKind.LineFeed }, /*moduleName*/undefined, `var x = 0;\n`, /*expectedDiagnosticCodes*/ []); + runTest(`var x = 0;`, { module: ModuleKind.CommonJS, newLine: NewLineKind.LineFeed }, /*fileName*/ undefined, /*moduleName*/undefined, `var x = 0;\n`, /*expectedDiagnosticCodes*/ []); }); it("Sets module name", () => { @@ -66,7 +66,11 @@ var x = 0;`, ` }\n` + ` }\n` + `});\n`; - runTest("var x = 1;", { module: ModuleKind.System, newLine: NewLineKind.LineFeed }, "NamedModule", output) + runTest("var x = 1;", { module: ModuleKind.System, newLine: NewLineKind.LineFeed }, /*fileName*/ undefined, "NamedModule", output) }); + it("No extra errors for file without extension", () => { + runTest(`var x = 0;`, { module: ModuleKind.CommonJS }, "file", /*moduleName*/undefined, /*expectedOutput*/ undefined, /*expectedDiagnosticCodes*/[]); + }); + }); } From 224e7630ea17c4547e97f85634f446b877955a67 Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Fri, 12 Jun 2015 09:01:48 -0700 Subject: [PATCH 5/7] use namespaces instead of modules in the codebase --- scripts/processDiagnosticMessages.ts | 2 +- src/compiler/binder.ts | 2 +- src/compiler/checker.ts | 2 +- src/compiler/commandLineParser.ts | 2 +- src/compiler/core.ts | 2 +- src/compiler/declarationEmitter.ts | 2 +- src/compiler/diagnosticInformationMap.generated.ts | 2 +- src/compiler/emitter.ts | 2 +- src/compiler/parser.ts | 2 +- src/compiler/program.ts | 2 +- src/compiler/scanner.ts | 2 +- src/compiler/sys.ts | 2 +- src/compiler/tsc.ts | 2 +- src/compiler/types.ts | 2 +- src/compiler/utilities.ts | 4 ++-- src/server/client.ts | 2 +- src/server/editorServices.ts | 2 +- src/server/protocol.d.ts | 2 +- src/server/server.ts | 2 +- src/server/session.ts | 2 +- src/services/breakpoints.ts | 2 +- src/services/formatting/formatting.ts | 2 +- src/services/formatting/formattingContext.ts | 2 +- src/services/formatting/formattingRequestKind.ts | 2 +- src/services/formatting/formattingScanner.ts | 2 +- src/services/formatting/rule.ts | 2 +- src/services/formatting/ruleAction.ts | 2 +- src/services/formatting/ruleDescriptor.ts | 2 +- src/services/formatting/ruleFlag.ts | 2 +- src/services/formatting/ruleOperation.ts | 2 +- src/services/formatting/ruleOperationContext.ts | 2 +- src/services/formatting/rules.ts | 2 +- src/services/formatting/rulesMap.ts | 2 +- src/services/formatting/rulesProvider.ts | 2 +- src/services/formatting/smartIndenter.ts | 2 +- src/services/formatting/tokenRange.ts | 2 +- src/services/navigateTo.ts | 2 +- src/services/navigationBar.ts | 2 +- src/services/outliningElementsCollector.ts | 2 +- src/services/patternMatcher.ts | 2 +- src/services/services.ts | 2 +- src/services/shims.ts | 2 +- src/services/signatureHelp.ts | 2 +- src/services/utilities.ts | 4 ++-- 44 files changed, 46 insertions(+), 46 deletions(-) diff --git a/scripts/processDiagnosticMessages.ts b/scripts/processDiagnosticMessages.ts index 9cfde5b296..0a81b99361 100644 --- a/scripts/processDiagnosticMessages.ts +++ b/scripts/processDiagnosticMessages.ts @@ -55,7 +55,7 @@ function buildInfoFileOutput(messageTable: InputDiagnosticMessageTable, nameMap: '// \r\n' + '/// \r\n' + '/* @internal */\r\n' + - 'module ts {\r\n' + + 'namespace ts {\r\n' + ' export var Diagnostics = {\r\n'; var names = Utilities.getObjectKeys(messageTable); for (var i = 0; i < names.length; i++) { diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index d411b840dc..ab391639d0 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts { +namespace ts { export let bindTime = 0; export const enum ModuleInstanceState { diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index c0c11bce5a..407651c684 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts { +namespace ts { let nextSymbolId = 1; let nextNodeId = 1; let nextMergeId = 1; diff --git a/src/compiler/commandLineParser.ts b/src/compiler/commandLineParser.ts index a3065bd7a4..07bccf4a5e 100644 --- a/src/compiler/commandLineParser.ts +++ b/src/compiler/commandLineParser.ts @@ -3,7 +3,7 @@ /// /// -module ts { +namespace ts { /* @internal */ export var optionDeclarations: CommandLineOption[] = [ { diff --git a/src/compiler/core.ts b/src/compiler/core.ts index dde1e3d6b5..0c0414f3b1 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts { +namespace ts { // Ternary values are defined such that // x & y is False if either x or y is False. // x & y is Maybe if either x or y is Maybe, but neither x or y is False. diff --git a/src/compiler/declarationEmitter.ts b/src/compiler/declarationEmitter.ts index 5c705f1819..a2edc632de 100644 --- a/src/compiler/declarationEmitter.ts +++ b/src/compiler/declarationEmitter.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts { +namespace ts { interface ModuleElementDeclarationEmitInfo { node: Node; outputPos: number; diff --git a/src/compiler/diagnosticInformationMap.generated.ts b/src/compiler/diagnosticInformationMap.generated.ts index 9f6190ead1..43330935f4 100644 --- a/src/compiler/diagnosticInformationMap.generated.ts +++ b/src/compiler/diagnosticInformationMap.generated.ts @@ -1,7 +1,7 @@ // /// /* @internal */ -module ts { +namespace ts { export var Diagnostics = { Unterminated_string_literal: { code: 1002, category: DiagnosticCategory.Error, key: "Unterminated string literal." }, Identifier_expected: { code: 1003, category: DiagnosticCategory.Error, key: "Identifier expected." }, diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index df40d10ddf..8081668f98 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -2,7 +2,7 @@ /// /* @internal */ -module ts { +namespace ts { export function isExternalModuleOrDeclarationFile(sourceFile: SourceFile) { return isExternalModule(sourceFile) || isDeclarationFile(sourceFile); } diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 627893d59e..f964febaf5 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -1,7 +1,7 @@ /// /// -module ts { +namespace ts { let nodeConstructors = new Array Node>(SyntaxKind.Count); /* @internal */ export let parseTime = 0; diff --git a/src/compiler/program.ts b/src/compiler/program.ts index c09b70a0c6..aa8a413aaa 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -1,7 +1,7 @@ /// /// -module ts { +namespace ts { /* @internal */ export let programTime = 0; /* @internal */ export let emitTime = 0; /* @internal */ export let ioReadTime = 0; diff --git a/src/compiler/scanner.ts b/src/compiler/scanner.ts index d7e65dff81..fd8883045f 100644 --- a/src/compiler/scanner.ts +++ b/src/compiler/scanner.ts @@ -1,7 +1,7 @@ /// /// -module ts { +namespace ts { export interface ErrorCallback { (message: DiagnosticMessage, length: number): void; } diff --git a/src/compiler/sys.ts b/src/compiler/sys.ts index 75e8af357b..a47d6959ba 100644 --- a/src/compiler/sys.ts +++ b/src/compiler/sys.ts @@ -1,6 +1,6 @@ /// -module ts { +namespace ts { export interface System { args: string[]; newLine: string; diff --git a/src/compiler/tsc.ts b/src/compiler/tsc.ts index 15cc665e35..2903c3a31f 100644 --- a/src/compiler/tsc.ts +++ b/src/compiler/tsc.ts @@ -1,7 +1,7 @@ /// /// -module ts { +namespace ts { export interface SourceFile { fileWatcher: FileWatcher; } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 70962ea13c..cf7a6dff2d 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1,4 +1,4 @@ -module ts { +namespace ts { export interface Map { [index: string]: T; } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 6c0943f22f..1aad9d5b06 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts { +namespace ts { export interface ReferencePathMatchResult { fileReference?: FileReference diagnosticMessage?: DiagnosticMessage @@ -2002,7 +2002,7 @@ module ts { } } -module ts { +namespace ts { export function getDefaultLibFileName(options: CompilerOptions): string { return options.target === ScriptTarget.ES6 ? "lib.es6.d.ts" : "lib.d.ts"; } diff --git a/src/server/client.ts b/src/server/client.ts index f1c5e424d4..3546f8339e 100644 --- a/src/server/client.ts +++ b/src/server/client.ts @@ -1,6 +1,6 @@ /// -module ts.server { +namespace ts.server { export interface SessionClientHost extends LanguageServiceHost { writeMessage(message: string): void; diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index bc9e685825..9e235e2cc7 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -4,7 +4,7 @@ /// /// -module ts.server { +namespace ts.server { export interface Logger { close(): void; isVerbose(): boolean; diff --git a/src/server/protocol.d.ts b/src/server/protocol.d.ts index ef9ad7984f..336bc11c9f 100644 --- a/src/server/protocol.d.ts +++ b/src/server/protocol.d.ts @@ -1,7 +1,7 @@ /** * Declaration module describing the TypeScript Server protocol */ -declare module ts.server.protocol { +declare namespace ts.server.protocol { /** * A TypeScript Server message */ diff --git a/src/server/server.ts b/src/server/server.ts index 828deca2b2..b4b35edd3f 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -1,7 +1,7 @@ /// /// -module ts.server { +namespace ts.server { var nodeproto: typeof NodeJS._debugger = require('_debugger'); var readline: NodeJS.ReadLine = require('readline'); var path: NodeJS.Path = require('path'); diff --git a/src/server/session.ts b/src/server/session.ts index a4cb3e59b4..f9cfb4f9f7 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -4,7 +4,7 @@ /// /// -module ts.server { +namespace ts.server { var spaceCache:string[] = []; interface StackTraceError extends Error { diff --git a/src/services/breakpoints.ts b/src/services/breakpoints.ts index 41079c0820..4d3d7d331a 100644 --- a/src/services/breakpoints.ts +++ b/src/services/breakpoints.ts @@ -4,7 +4,7 @@ /// /* @internal */ -module ts.BreakpointResolver { +namespace ts.BreakpointResolver { /** * Get the breakpoint span in given sourceFile */ diff --git a/src/services/formatting/formatting.ts b/src/services/formatting/formatting.ts index ef25d23a5c..011f7d7fa5 100644 --- a/src/services/formatting/formatting.ts +++ b/src/services/formatting/formatting.ts @@ -4,7 +4,7 @@ /// /* @internal */ -module ts.formatting { +namespace ts.formatting { export interface TextRangeWithKind extends TextRange { kind: SyntaxKind; diff --git a/src/services/formatting/formattingContext.ts b/src/services/formatting/formattingContext.ts index 84c09b86bb..c9b9952a49 100644 --- a/src/services/formatting/formattingContext.ts +++ b/src/services/formatting/formattingContext.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts.formatting { +namespace ts.formatting { export class FormattingContext { public currentTokenSpan: TextRangeWithKind; public nextTokenSpan: TextRangeWithKind; diff --git a/src/services/formatting/formattingRequestKind.ts b/src/services/formatting/formattingRequestKind.ts index 4bdc83ffd4..d0397e4a8d 100644 --- a/src/services/formatting/formattingRequestKind.ts +++ b/src/services/formatting/formattingRequestKind.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts.formatting { +namespace ts.formatting { export const enum FormattingRequestKind { FormatDocument, FormatSelection, diff --git a/src/services/formatting/formattingScanner.ts b/src/services/formatting/formattingScanner.ts index 0d4dd8eacd..7e77878051 100644 --- a/src/services/formatting/formattingScanner.ts +++ b/src/services/formatting/formattingScanner.ts @@ -2,7 +2,7 @@ /// /* @internal */ -module ts.formatting { +namespace ts.formatting { let scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false); export interface FormattingScanner { diff --git a/src/services/formatting/rule.ts b/src/services/formatting/rule.ts index f1bb39e69c..543295f364 100644 --- a/src/services/formatting/rule.ts +++ b/src/services/formatting/rule.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts.formatting { +namespace ts.formatting { export class Rule { constructor( public Descriptor: RuleDescriptor, diff --git a/src/services/formatting/ruleAction.ts b/src/services/formatting/ruleAction.ts index e5734b1a03..13e9043e1c 100644 --- a/src/services/formatting/ruleAction.ts +++ b/src/services/formatting/ruleAction.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts.formatting { +namespace ts.formatting { export const enum RuleAction { Ignore = 0x00000001, Space = 0x00000002, diff --git a/src/services/formatting/ruleDescriptor.ts b/src/services/formatting/ruleDescriptor.ts index f3492715f3..96506adc3d 100644 --- a/src/services/formatting/ruleDescriptor.ts +++ b/src/services/formatting/ruleDescriptor.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts.formatting { +namespace ts.formatting { export class RuleDescriptor { constructor(public LeftTokenRange: Shared.TokenRange, public RightTokenRange: Shared.TokenRange) { } diff --git a/src/services/formatting/ruleFlag.ts b/src/services/formatting/ruleFlag.ts index 4e6e002c18..7619f232ad 100644 --- a/src/services/formatting/ruleFlag.ts +++ b/src/services/formatting/ruleFlag.ts @@ -2,7 +2,7 @@ /* @internal */ -module ts.formatting { +namespace ts.formatting { export const enum RuleFlags { None, CanDeleteNewLines diff --git a/src/services/formatting/ruleOperation.ts b/src/services/formatting/ruleOperation.ts index 1cca437e49..e897513bd2 100644 --- a/src/services/formatting/ruleOperation.ts +++ b/src/services/formatting/ruleOperation.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts.formatting { +namespace ts.formatting { export class RuleOperation { public Context: RuleOperationContext; public Action: RuleAction; diff --git a/src/services/formatting/ruleOperationContext.ts b/src/services/formatting/ruleOperationContext.ts index 69ed3453a7..515250d726 100644 --- a/src/services/formatting/ruleOperationContext.ts +++ b/src/services/formatting/ruleOperationContext.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts.formatting { +namespace ts.formatting { export class RuleOperationContext { private customContextChecks: { (context: FormattingContext): boolean; }[]; diff --git a/src/services/formatting/rules.ts b/src/services/formatting/rules.ts index 3352253a86..c10e3ee69e 100644 --- a/src/services/formatting/rules.ts +++ b/src/services/formatting/rules.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts.formatting { +namespace ts.formatting { export class Rules { public getRuleName(rule: Rule) { let o: ts.Map = this; diff --git a/src/services/formatting/rulesMap.ts b/src/services/formatting/rulesMap.ts index 5aae6f40fc..4f231bd842 100644 --- a/src/services/formatting/rulesMap.ts +++ b/src/services/formatting/rulesMap.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts.formatting { +namespace ts.formatting { export class RulesMap { public map: RulesBucket[]; public mapRowLength: number; diff --git a/src/services/formatting/rulesProvider.ts b/src/services/formatting/rulesProvider.ts index 0867bcf31c..bd8f4fc3a5 100644 --- a/src/services/formatting/rulesProvider.ts +++ b/src/services/formatting/rulesProvider.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts.formatting { +namespace ts.formatting { export class RulesProvider { private globalRules: Rules; private options: ts.FormatCodeOptions; diff --git a/src/services/formatting/smartIndenter.ts b/src/services/formatting/smartIndenter.ts index 9cd28a40a5..a82e57f050 100644 --- a/src/services/formatting/smartIndenter.ts +++ b/src/services/formatting/smartIndenter.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts.formatting { +namespace ts.formatting { export module SmartIndenter { const enum Value { diff --git a/src/services/formatting/tokenRange.ts b/src/services/formatting/tokenRange.ts index 59a376f15f..27a43280f2 100644 --- a/src/services/formatting/tokenRange.ts +++ b/src/services/formatting/tokenRange.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts.formatting { +namespace ts.formatting { export module Shared { export interface ITokenAccess { GetTokens(): SyntaxKind[]; diff --git a/src/services/navigateTo.ts b/src/services/navigateTo.ts index aec3bdf765..a4cc7ec2ad 100644 --- a/src/services/navigateTo.ts +++ b/src/services/navigateTo.ts @@ -1,5 +1,5 @@ /* @internal */ -module ts.NavigateTo { +namespace ts.NavigateTo { type RawNavigateToItem = { name: string; fileName: string; matchKind: PatternMatchKind; isCaseSensitive: boolean; declaration: Declaration }; export function getNavigateToItems(program: Program, cancellationToken: CancellationTokenObject, searchValue: string, maxResultCount: number): NavigateToItem[] { diff --git a/src/services/navigationBar.ts b/src/services/navigationBar.ts index 8acdbac20c..ead9bc519c 100644 --- a/src/services/navigationBar.ts +++ b/src/services/navigationBar.ts @@ -1,7 +1,7 @@ /// /* @internal */ -module ts.NavigationBar { +namespace ts.NavigationBar { export function getNavigationBarItems(sourceFile: SourceFile): ts.NavigationBarItem[] { // If the source file has any child items, then it included in the tree // and takes lexical ownership of all other top-level items. diff --git a/src/services/outliningElementsCollector.ts b/src/services/outliningElementsCollector.ts index d413f61120..08b089cd75 100644 --- a/src/services/outliningElementsCollector.ts +++ b/src/services/outliningElementsCollector.ts @@ -1,5 +1,5 @@ /* @internal */ -module ts { +namespace ts { export module OutliningElementsCollector { export function collectElements(sourceFile: SourceFile): OutliningSpan[] { let elements: OutliningSpan[] = []; diff --git a/src/services/patternMatcher.ts b/src/services/patternMatcher.ts index 88cd9fdbb0..d56c7fac97 100644 --- a/src/services/patternMatcher.ts +++ b/src/services/patternMatcher.ts @@ -1,5 +1,5 @@ /* @internal */ -module ts { +namespace ts { // Note(cyrusn): this enum is ordered from strongest match type to weakest match type. export enum PatternMatchKind { exact, diff --git a/src/services/services.ts b/src/services/services.ts index 5e8392fa9d..105859f7cc 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -10,7 +10,7 @@ /// /// -module ts { +namespace ts { /** The version of the language service API */ export let servicesVersion = "0.4" diff --git a/src/services/shims.ts b/src/services/shims.ts index 004393fb3b..c158b041e9 100644 --- a/src/services/shims.ts +++ b/src/services/shims.ts @@ -19,7 +19,7 @@ var debugObjectHost = (this); /* @internal */ -module ts { +namespace ts { export interface ScriptSnapshotShim { /** Gets a portion of the script snapshot specified by [start, end). */ getText(start: number, end: number): string; diff --git a/src/services/signatureHelp.ts b/src/services/signatureHelp.ts index 77aba4c85c..fce4e2c302 100644 --- a/src/services/signatureHelp.ts +++ b/src/services/signatureHelp.ts @@ -1,6 +1,6 @@ /// /* @internal */ -module ts.SignatureHelp { +namespace ts.SignatureHelp { // A partially written generic type expression is not guaranteed to have the correct syntax tree. the expression could be parsed as less than/greater than expression or a comma expression // or some other combination depending on what the user has typed so far. For the purposes of signature help we need to consider any location after "<" as a possible generic type reference. diff --git a/src/services/utilities.ts b/src/services/utilities.ts index da0a0aa96c..73b88a3df2 100644 --- a/src/services/utilities.ts +++ b/src/services/utilities.ts @@ -1,6 +1,6 @@ // These utilities are common to multiple language service features. /* @internal */ -module ts { +namespace ts { export interface ListItemInfo { listItemIndex: number; list: Node; @@ -502,7 +502,7 @@ module ts { // Display-part writer helpers /* @internal */ -module ts { +namespace ts { export function isFirstDeclarationOfSymbolParameter(symbol: Symbol) { return symbol.declarations && symbol.declarations.length > 0 && symbol.declarations[0].kind === SyntaxKind.Parameter; } From 5b7ca78c92463a9162856c178f7a644e6e292a65 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Fri, 12 Jun 2015 12:53:24 -0700 Subject: [PATCH 6/7] PR feedback. --- src/compiler/binder.ts | 8 ++++---- src/compiler/program.ts | 14 +++++++------- src/compiler/types.ts | 10 ++++++++-- src/services/services.ts | 7 +++++-- 4 files changed, 24 insertions(+), 15 deletions(-) diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 61791390e1..e3cd0da60d 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -90,12 +90,12 @@ namespace ts { let lastContainer: Node; let symbolCount = 0; let Symbol = objectAllocator.getSymbolConstructor(); - let typeNames: Map = {}; + let classifiableNames: Map = {}; if (!file.locals) { bind(file); file.symbolCount = symbolCount; - file.typeNames = typeNames; + file.classifiableNames = classifiableNames; } return; @@ -197,8 +197,8 @@ namespace ts { ? symbolTable[name] : (symbolTable[name] = createSymbol(SymbolFlags.None, name)); - if (name && (includes & (SymbolFlags.Class | SymbolFlags.Enum | SymbolFlags.TypeAlias | SymbolFlags.Interface | SymbolFlags.TypeParameter | SymbolFlags.Module))) { - typeNames[name] = name; + if (name && (includes & SymbolFlags.Classifiable)) { + classifiableNames[name] = name; } if (symbol.flags & excludes) { diff --git a/src/compiler/program.ts b/src/compiler/program.ts index 469c5b4cde..8ab3e73858 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -148,7 +148,7 @@ namespace ts { let commonSourceDirectory: string; let diagnosticsProducingTypeChecker: TypeChecker; let noDiagnosticsTypeChecker: TypeChecker; - let typeNames: Map; + let classifiableNames: Map; let start = new Date().getTime(); @@ -173,7 +173,7 @@ namespace ts { getDeclarationDiagnostics, getCompilerOptionsDiagnostics, getTypeChecker, - getTypeNames, + getClassifiableNames, getDiagnosticsProducingTypeChecker, getCommonSourceDirectory: () => commonSourceDirectory, emit, @@ -185,18 +185,18 @@ namespace ts { }; return program; - function getTypeNames() { - if (!typeNames) { + function getClassifiableNames() { + if (!classifiableNames) { // Initialize a checker so that all our files are bound. getTypeChecker(); - typeNames = {}; + classifiableNames = {}; for (let sourceFile of files) { - copyMap(sourceFile.typeNames, typeNames); + copyMap(sourceFile.classifiableNames, classifiableNames); } } - return typeNames; + return classifiableNames; } function getEmitHost(writeFileCallback?: WriteFileCallback): EmitHost { diff --git a/src/compiler/types.ts b/src/compiler/types.ts index f88e877e4c..8be7c1792a 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -422,7 +422,6 @@ namespace ts { /* @internal */ locals?: SymbolTable; // Locals associated with node (initialized by binding) /* @internal */ nextContainer?: Node; // Next container in declaration order (initialized by binding) /* @internal */ localSymbol?: Symbol; // Local symbol declared by node (initialized by binding only for exported nodes) - /* @internal */ typeNames?: Map; } export interface NodeArray extends Array, TextRange { @@ -1173,6 +1172,8 @@ namespace ts { // Stores a line map for the file. // This field should never be used directly to obtain line map, use getLineMap function instead. /* @internal */ lineMap: number[]; + + /* @internal */ classifiableNames?: Map; } export interface ScriptReferenceHost { @@ -1224,7 +1225,7 @@ namespace ts { // language service). /* @internal */ getDiagnosticsProducingTypeChecker(): TypeChecker; - /* @internal */ getTypeNames(): Map; + /* @internal */ getClassifiableNames(): Map; /* @internal */ getNodeCount(): number; /* @internal */ getIdentifierCount(): number; @@ -1522,6 +1523,11 @@ namespace ts { PropertyOrAccessor = Property | Accessor, Export = ExportNamespace | ExportType | ExportValue, + + /* @internal */ + // The set of things we consider semantically classifiable. Used to speed up the LS during + // classification. + Classifiable = Class | Enum | TypeAlias | Interface | TypeParameter | Module, } export interface Symbol { diff --git a/src/services/services.ts b/src/services/services.ts index 1ae735ac20..f8fe0038af 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -5992,7 +5992,7 @@ namespace ts { let typeChecker = program.getTypeChecker(); let result: number[] = []; - let typeNames = program.getTypeNames(); + let classifiableNames = program.getClassifiableNames(); processNode(sourceFile); return { spans: result, endOfLineState: EndOfLineState.None }; @@ -6005,6 +6005,9 @@ namespace ts { function classifySymbol(symbol: Symbol, meaningAtPosition: SemanticMeaning): ClassificationType { let flags = symbol.getFlags(); + if ((flags & SymbolFlags.Classifiable) === 0) { + return; + } if (flags & SymbolFlags.Class) { return ClassificationType.className; @@ -6054,7 +6057,7 @@ namespace ts { // Only bother calling into the typechecker if this is an identifier that // could possibly resolve to a type name. This makes classification run // in a third of the time it would normally take. - if (typeNames[identifier.text]) { + if (classifiableNames[identifier.text]) { let symbol = typeChecker.getSymbolAtLocation(node); if (symbol) { let type = classifySymbol(symbol, getMeaningFromLocation(node)); From 804b976c737b7dabc5fb8093abc7eae9d58ac538 Mon Sep 17 00:00:00 2001 From: Cyrus Najmabadi Date: Fri, 12 Jun 2015 13:13:45 -0700 Subject: [PATCH 7/7] PR feedback. --- src/services/services.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/services/services.ts b/src/services/services.ts index f8fe0038af..3939e62cfd 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -6005,7 +6005,7 @@ namespace ts { function classifySymbol(symbol: Symbol, meaningAtPosition: SemanticMeaning): ClassificationType { let flags = symbol.getFlags(); - if ((flags & SymbolFlags.Classifiable) === 0) { + if ((flags & SymbolFlags.Classifiable) === SymbolFlags.None) { return; }