From 60e1f301822daba4afa67a37ec777b4fa47b6691 Mon Sep 17 00:00:00 2001 From: vladima Date: Fri, 11 Dec 2015 17:16:28 -0800 Subject: [PATCH 01/61] allow usage of 'super' in object literal expressions --- src/compiler/checker.ts | 86 ++++++----- src/compiler/diagnosticMessages.json | 8 ++ src/compiler/utilities.ts | 54 ++++--- src/services/services.ts | 4 +- .../computedPropertyNames24_ES5.errors.txt | 4 +- .../computedPropertyNames24_ES6.errors.txt | 4 +- .../computedPropertyNames26_ES5.errors.txt | 4 +- .../computedPropertyNames26_ES6.errors.txt | 4 +- .../computedPropertyNames27_ES5.errors.txt | 4 +- .../computedPropertyNames27_ES6.errors.txt | 4 +- .../decoratorOnClassMethod12.errors.txt | 4 +- .../emitThisInSuperMethodCall.errors.txt | 12 +- .../reference/errorSuperCalls.errors.txt | 32 ++--- .../errorSuperPropertyAccess.errors.txt | 16 +-- .../superCallFromFunction1.errors.txt | 4 +- .../reference/superErrors.errors.txt | 32 ++--- .../superInObjectLiterals_ES5.errors.txt | 95 +++++++++++++ .../reference/superInObjectLiterals_ES5.js | 133 ++++++++++++++++++ .../superInObjectLiterals_ES6.errors.txt | 77 ++++++++++ .../reference/superInObjectLiterals_ES6.js | 119 ++++++++++++++++ ...essInComputedPropertiesOfNestedType_ES5.js | 46 ++++++ ...ComputedPropertiesOfNestedType_ES5.symbols | 29 ++++ ...InComputedPropertiesOfNestedType_ES5.types | 35 +++++ ...essInComputedPropertiesOfNestedType_ES6.js | 31 ++++ ...ComputedPropertiesOfNestedType_ES6.symbols | 29 ++++ ...InComputedPropertiesOfNestedType_ES6.types | 35 +++++ ...ect-literal-getters-and-setters.errors.txt | 16 +-- ...side-object-literal-getters-and-setters.js | 6 +- .../compiler/superInObjectLiterals_ES5.ts | 60 ++++++++ .../compiler/superInObjectLiterals_ES6.ts | 60 ++++++++ ...essInComputedPropertiesOfNestedType_ES5.ts | 15 ++ ...essInComputedPropertiesOfNestedType_ES6.ts | 15 ++ 32 files changed, 940 insertions(+), 137 deletions(-) create mode 100644 tests/baselines/reference/superInObjectLiterals_ES5.errors.txt create mode 100644 tests/baselines/reference/superInObjectLiterals_ES5.js create mode 100644 tests/baselines/reference/superInObjectLiterals_ES6.errors.txt create mode 100644 tests/baselines/reference/superInObjectLiterals_ES6.js create mode 100644 tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES5.js create mode 100644 tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES5.symbols create mode 100644 tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES5.types create mode 100644 tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES6.js create mode 100644 tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES6.symbols create mode 100644 tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES6.types create mode 100644 tests/cases/compiler/superInObjectLiterals_ES5.ts create mode 100644 tests/cases/compiler/superInObjectLiterals_ES6.ts create mode 100644 tests/cases/compiler/superPropertyAccessInComputedPropertiesOfNestedType_ES5.ts create mode 100644 tests/cases/compiler/superPropertyAccessInComputedPropertiesOfNestedType_ES6.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 76bd39a00bf..6af7ddba419 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7037,17 +7037,14 @@ namespace ts { function checkSuperExpression(node: Node): Type { const isCallExpression = node.parent.kind === SyntaxKind.CallExpression && (node.parent).expression === node; - const classDeclaration = getContainingClass(node); - const classType = classDeclaration && getDeclaredTypeOfSymbol(getSymbolOfNode(classDeclaration)); - const baseClassType = classType && getBaseTypes(classType)[0]; - let container = getSuperContainer(node, /*includeFunctions*/ true); + let container = getSuperContainer(node, /*stopOnFunctions*/ true); let needToCaptureLexicalThis = false; if (!isCallExpression) { // adjust the container reference in case if super is used inside arrow functions with arbitrary deep nesting while (container && container.kind === SyntaxKind.ArrowFunction) { - container = getSuperContainer(container, /*includeFunctions*/ true); + container = getSuperContainer(container, /*stopOnFunctions*/ true); needToCaptureLexicalThis = languageVersion < ScriptTarget.ES6; } } @@ -7055,43 +7052,64 @@ namespace ts { const canUseSuperExpression = isLegalUsageOfSuperExpression(container); let nodeCheckFlag: NodeCheckFlags = 0; - // always set NodeCheckFlags for 'super' expression node - if (canUseSuperExpression) { - if ((container.flags & NodeFlags.Static) || isCallExpression) { - nodeCheckFlag = NodeCheckFlags.SuperStatic; + if (!canUseSuperExpression) { + if (isCallExpression) { + error(node, Diagnostics.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors); + } + else if (!container || !container.parent || !(isClassLike(container.parent) || container.parent.kind === SyntaxKind.ObjectLiteralExpression)) { + error(node, Diagnostics.super_can_only_be_referenced_in_members_of_derived_classes_or_object_literal_expressions); } else { - nodeCheckFlag = NodeCheckFlags.SuperInstance; - } - - getNodeLinks(node).flags |= nodeCheckFlag; - - if (needToCaptureLexicalThis) { - // call expressions are allowed only in constructors so they should always capture correct 'this' - // super property access expressions can also appear in arrow functions - - // in this case they should also use correct lexical this - captureLexicalThis(node.parent, container); - } - } - - if (!baseClassType) { - if (!classDeclaration || !getClassExtendsHeritageClauseElement(classDeclaration)) { - error(node, Diagnostics.super_can_only_be_referenced_in_a_derived_class); + // issue more specific error if super is used in computed property name + let current = node; + while (current && current !== container && current.kind !== SyntaxKind.ComputedPropertyName) { + current = current.parent; + } + if (current && current.kind === SyntaxKind.ComputedPropertyName) { + error(node, Diagnostics.super_cannot_be_referenced_in_a_computed_property_name); + } + else { + error(node, Diagnostics.super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_derived_class); + } } return unknownType; } - if (!canUseSuperExpression) { - if (container && container.kind === SyntaxKind.ComputedPropertyName) { - error(node, Diagnostics.super_cannot_be_referenced_in_a_computed_property_name); - } - else if (isCallExpression) { - error(node, Diagnostics.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors); + if ((container.flags & NodeFlags.Static) || isCallExpression) { + nodeCheckFlag = NodeCheckFlags.SuperStatic; + } + else { + nodeCheckFlag = NodeCheckFlags.SuperInstance; + } + + getNodeLinks(node).flags |= nodeCheckFlag; + + if (needToCaptureLexicalThis) { + // call expressions are allowed only in constructors so they should always capture correct 'this' + // super property access expressions can also appear in arrow functions - + // in this case they should also use correct lexical this + captureLexicalThis(node.parent, container); + } + + if (container.parent.kind === SyntaxKind.ObjectLiteralExpression) { + if (languageVersion < ScriptTarget.ES6) { + error(node, Diagnostics.super_in_members_of_object_literal_expressions_is_only_allowed_when_option_target_is_ES2015_or_higher); + return unknownType; } else { - error(node, Diagnostics.super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_derived_class); + // for object literal assume that type of 'super' is 'any' + return anyType; } + } + // at this point the only legal case for parent is ClassLikeDeclaration + const classLikeDeclaration = container.parent; + const classType = getDeclaredTypeOfSymbol(getSymbolOfNode(classLikeDeclaration)); + const baseClassType = classType && getBaseTypes(classType)[0]; + if (!baseClassType) { + if (!getClassExtendsHeritageClauseElement(classLikeDeclaration)) { + error(node, Diagnostics.super_can_only_be_referenced_in_a_derived_class); + } return unknownType; } @@ -7121,8 +7139,8 @@ namespace ts { // - In a constructor, instance member function, instance member accessor, or instance member variable initializer where this references a derived class instance // - In a static member function or static member accessor - // topmost container must be something that is directly nested in the class declaration - if (container && isClassLike(container.parent)) { + // topmost container must be something that is directly nested in the class declaration\object literal expression + if (isClassLike(container.parent) || container.parent.kind === SyntaxKind.ObjectLiteralExpression) { if (container.flags & NodeFlags.Static) { return container.kind === SyntaxKind.MethodDeclaration || container.kind === SyntaxKind.MethodSignature || diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 54123808932..30b46e5cde2 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1759,6 +1759,14 @@ "category": "Error", "code": 2658 }, + "'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher.": { + "category": "Error", + "code": 2659 + }, + "'super' can only be referenced in members of derived classes or object literal expressions.": { + "category": "Error", + "code": 2660 + }, "Import declaration '{0}' is using private name '{1}'.": { "category": "Error", "code": 4000 diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index eee09fc641f..a85432418cc 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -775,26 +775,38 @@ namespace ts { } } - export function getSuperContainer(node: Node, includeFunctions: boolean): Node { + /** + * Given an super call\property node returns a closest node where either + * - super call\property is legal in the node and not legal in the parent node the node. + * i.e. super call is legal in constructor but not legal in the class body. + * - node is arrow function (so caller might need to call getSuperContainer in case if he needs to climb higher) + * - super call\property is definitely illegal in the node (but might be legal in some subnode) + * i.e. super property access is illegal in function declaration but can be legal in the statement list + */ + export function getSuperContainer(node: Node, stopOnFunctions: boolean): Node { while (true) { node = node.parent; - if (!node) return node; + if (!node) { + return node; + } switch (node.kind) { case SyntaxKind.ComputedPropertyName: - // If the grandparent node is an object literal (as opposed to a class), - // then the computed property is not a 'super' container. - // A computed property name in a class needs to be a super container - // so that we can error on it. - if (isClassLike(node.parent.parent)) { - return node; - } - // If this is a computed property, then the parent should not - // make it a super container. The parent might be a property - // in an object literal, like a method or accessor. But in order for - // such a parent to be a super container, the reference must be in - // the *body* of the container. node = node.parent; break; + case SyntaxKind.FunctionDeclaration: + case SyntaxKind.FunctionExpression: + case SyntaxKind.ArrowFunction: + if (!stopOnFunctions) { + continue; + } + case SyntaxKind.PropertyDeclaration: + case SyntaxKind.PropertySignature: + case SyntaxKind.MethodDeclaration: + case SyntaxKind.MethodSignature: + case SyntaxKind.Constructor: + case SyntaxKind.GetAccessor: + case SyntaxKind.SetAccessor: + return node; case SyntaxKind.Decorator: // Decorators are always applied outside of the body of a class or method. if (node.parent.kind === SyntaxKind.Parameter && isClassElement(node.parent.parent)) { @@ -808,20 +820,6 @@ namespace ts { node = node.parent; } break; - case SyntaxKind.FunctionDeclaration: - case SyntaxKind.FunctionExpression: - case SyntaxKind.ArrowFunction: - if (!includeFunctions) { - continue; - } - case SyntaxKind.PropertyDeclaration: - case SyntaxKind.PropertySignature: - case SyntaxKind.MethodDeclaration: - case SyntaxKind.MethodSignature: - case SyntaxKind.Constructor: - case SyntaxKind.GetAccessor: - case SyntaxKind.SetAccessor: - return node; } } } diff --git a/src/services/services.ts b/src/services/services.ts index a9dda549ead..2d42172832f 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -5780,7 +5780,7 @@ namespace ts { } function getReferencesForSuperKeyword(superKeyword: Node): ReferencedSymbol[] { - let searchSpaceNode = getSuperContainer(superKeyword, /*includeFunctions*/ false); + let searchSpaceNode = getSuperContainer(superKeyword, /*stopOnFunctions*/ false); if (!searchSpaceNode) { return undefined; } @@ -5815,7 +5815,7 @@ namespace ts { return; } - let container = getSuperContainer(node, /*includeFunctions*/ false); + let container = getSuperContainer(node, /*stopOnFunctions*/ false); // If we have a 'super' container, we must have an enclosing class. // Now make sure the owning class is the same as the search-space diff --git a/tests/baselines/reference/computedPropertyNames24_ES5.errors.txt b/tests/baselines/reference/computedPropertyNames24_ES5.errors.txt index 121b39450a6..e06373fb1e3 100644 --- a/tests/baselines/reference/computedPropertyNames24_ES5.errors.txt +++ b/tests/baselines/reference/computedPropertyNames24_ES5.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames24_ES5.ts(7,6): error TS2466: 'super' cannot be referenced in a computed property name. +tests/cases/conformance/es6/computedProperties/computedPropertyNames24_ES5.ts(7,6): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames24_ES5.ts (1 errors) ==== @@ -10,5 +10,5 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames24_ES5.ts(7, class C extends Base { [super.bar()]() { } ~~~~~ -!!! error TS2466: 'super' cannot be referenced in a computed property name. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames24_ES6.errors.txt b/tests/baselines/reference/computedPropertyNames24_ES6.errors.txt index cab0ba6a85c..331723afe34 100644 --- a/tests/baselines/reference/computedPropertyNames24_ES6.errors.txt +++ b/tests/baselines/reference/computedPropertyNames24_ES6.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames24_ES6.ts(9,6): error TS2466: 'super' cannot be referenced in a computed property name. +tests/cases/conformance/es6/computedProperties/computedPropertyNames24_ES6.ts(9,6): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames24_ES6.ts (1 errors) ==== @@ -12,5 +12,5 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames24_ES6.ts(9, // use of super in static properties initializers. [super.bar()]() { } ~~~~~ -!!! error TS2466: 'super' cannot be referenced in a computed property name. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames26_ES5.errors.txt b/tests/baselines/reference/computedPropertyNames26_ES5.errors.txt index e7039712734..c8e24abfa9d 100644 --- a/tests/baselines/reference/computedPropertyNames26_ES5.errors.txt +++ b/tests/baselines/reference/computedPropertyNames26_ES5.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames26_ES5.ts(8,12): error TS2466: 'super' cannot be referenced in a computed property name. +tests/cases/conformance/es6/computedProperties/computedPropertyNames26_ES5.ts(8,12): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames26_ES5.ts (1 errors) ==== @@ -11,6 +11,6 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames26_ES5.ts(8, [ { [super.bar()]: 1 }[0] ~~~~~ -!!! error TS2466: 'super' cannot be referenced in a computed property name. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. ]() { } } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames26_ES6.errors.txt b/tests/baselines/reference/computedPropertyNames26_ES6.errors.txt index d7e2b5ce7c5..ec20ed57144 100644 --- a/tests/baselines/reference/computedPropertyNames26_ES6.errors.txt +++ b/tests/baselines/reference/computedPropertyNames26_ES6.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames26_ES6.ts(10,12): error TS2466: 'super' cannot be referenced in a computed property name. +tests/cases/conformance/es6/computedProperties/computedPropertyNames26_ES6.ts(10,12): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames26_ES6.ts (1 errors) ==== @@ -13,6 +13,6 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames26_ES6.ts(10 [ { [super.bar()]: 1 }[0] ~~~~~ -!!! error TS2466: 'super' cannot be referenced in a computed property name. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. ]() { } } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames27_ES5.errors.txt b/tests/baselines/reference/computedPropertyNames27_ES5.errors.txt index 1fbc7b37543..97964d48176 100644 --- a/tests/baselines/reference/computedPropertyNames27_ES5.errors.txt +++ b/tests/baselines/reference/computedPropertyNames27_ES5.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames27_ES5.ts(4,7): error TS2466: 'super' cannot be referenced in a computed property name. +tests/cases/conformance/es6/computedProperties/computedPropertyNames27_ES5.ts(4,7): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames27_ES5.ts (1 errors) ==== @@ -7,5 +7,5 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames27_ES5.ts(4, class C extends Base { [(super(), "prop")]() { } ~~~~~ -!!! error TS2466: 'super' cannot be referenced in a computed property name. +!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames27_ES6.errors.txt b/tests/baselines/reference/computedPropertyNames27_ES6.errors.txt index edf84201647..30e1ce5b14f 100644 --- a/tests/baselines/reference/computedPropertyNames27_ES6.errors.txt +++ b/tests/baselines/reference/computedPropertyNames27_ES6.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames27_ES6.ts(4,7): error TS2466: 'super' cannot be referenced in a computed property name. +tests/cases/conformance/es6/computedProperties/computedPropertyNames27_ES6.ts(4,7): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames27_ES6.ts (1 errors) ==== @@ -7,5 +7,5 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames27_ES6.ts(4, class C extends Base { [(super(), "prop")]() { } ~~~~~ -!!! error TS2466: 'super' cannot be referenced in a computed property name. +!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. } \ No newline at end of file diff --git a/tests/baselines/reference/decoratorOnClassMethod12.errors.txt b/tests/baselines/reference/decoratorOnClassMethod12.errors.txt index 3ad3cabebe2..c285d5f12c9 100644 --- a/tests/baselines/reference/decoratorOnClassMethod12.errors.txt +++ b/tests/baselines/reference/decoratorOnClassMethod12.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/decorators/class/method/decoratorOnClassMethod12.ts(6,10): error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +tests/cases/conformance/decorators/class/method/decoratorOnClassMethod12.ts(6,10): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. ==== tests/cases/conformance/decorators/class/method/decoratorOnClassMethod12.ts (1 errors) ==== @@ -9,7 +9,7 @@ tests/cases/conformance/decorators/class/method/decoratorOnClassMethod12.ts(6,10 class C extends S { @super.decorator ~~~~~ -!!! error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. method() { } } } \ No newline at end of file diff --git a/tests/baselines/reference/emitThisInSuperMethodCall.errors.txt b/tests/baselines/reference/emitThisInSuperMethodCall.errors.txt index 06211ef771f..c8d694c8567 100644 --- a/tests/baselines/reference/emitThisInSuperMethodCall.errors.txt +++ b/tests/baselines/reference/emitThisInSuperMethodCall.errors.txt @@ -1,6 +1,6 @@ -tests/cases/compiler/emitThisInSuperMethodCall.ts(10,17): error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. -tests/cases/compiler/emitThisInSuperMethodCall.ts(17,17): error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. -tests/cases/compiler/emitThisInSuperMethodCall.ts(23,13): error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +tests/cases/compiler/emitThisInSuperMethodCall.ts(10,17): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/compiler/emitThisInSuperMethodCall.ts(17,17): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/compiler/emitThisInSuperMethodCall.ts(23,13): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. ==== tests/cases/compiler/emitThisInSuperMethodCall.ts (3 errors) ==== @@ -15,7 +15,7 @@ tests/cases/compiler/emitThisInSuperMethodCall.ts(23,13): error TS2338: 'super' function inner() { super.sayHello(); ~~~~~ -!!! error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. } }; } @@ -24,7 +24,7 @@ tests/cases/compiler/emitThisInSuperMethodCall.ts(23,13): error TS2338: 'super' () => { super.sayHello(); ~~~~~ -!!! error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. } } } @@ -32,7 +32,7 @@ tests/cases/compiler/emitThisInSuperMethodCall.ts(23,13): error TS2338: 'super' function inner() { super.sayHello(); ~~~~~ -!!! error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. } } } diff --git a/tests/baselines/reference/errorSuperCalls.errors.txt b/tests/baselines/reference/errorSuperCalls.errors.txt index 9ecc7a1565e..49bcb4b4d45 100644 --- a/tests/baselines/reference/errorSuperCalls.errors.txt +++ b/tests/baselines/reference/errorSuperCalls.errors.txt @@ -1,12 +1,12 @@ tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(4,9): error TS2335: 'super' can only be referenced in a derived class. -tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(9,9): error TS2335: 'super' can only be referenced in a derived class. -tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(14,9): error TS2335: 'super' can only be referenced in a derived class. -tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(18,9): error TS2335: 'super' can only be referenced in a derived class. -tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(22,9): error TS2335: 'super' can only be referenced in a derived class. -tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(26,9): error TS2335: 'super' can only be referenced in a derived class. -tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(30,16): error TS2335: 'super' can only be referenced in a derived class. -tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(34,9): error TS2335: 'super' can only be referenced in a derived class. -tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(38,9): error TS2335: 'super' can only be referenced in a derived class. +tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(9,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. +tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(14,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. +tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(18,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. +tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(22,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. +tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(26,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. +tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(30,16): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. +tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(34,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. +tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(38,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(46,14): error TS1034: 'super' must be followed by an argument list or member access. tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(58,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(62,9): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. @@ -27,50 +27,50 @@ tests/cases/conformance/expressions/superCalls/errorSuperCalls.ts(71,9): error T fn() { super(); ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. +!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. } //super call in class accessor (get and set) with no base type get foo() { super(); ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. +!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. return null; } set foo(v) { super(); ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. +!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. } //super call in class member initializer with no base type p = super(); ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. +!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. //super call in static class member function with no base type static fn() { super(); ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. +!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. } //super call in static class member initializer with no base type static k = super(); ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. +!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. //super call in static class accessor (get and set) with no base type static get q() { super(); ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. +!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. return null; } static set q(n) { super(); ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. +!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. } } diff --git a/tests/baselines/reference/errorSuperPropertyAccess.errors.txt b/tests/baselines/reference/errorSuperPropertyAccess.errors.txt index c34ed912046..c54ace99f17 100644 --- a/tests/baselines/reference/errorSuperPropertyAccess.errors.txt +++ b/tests/baselines/reference/errorSuperPropertyAccess.errors.txt @@ -15,8 +15,8 @@ tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts(65,23): error TS2340: Only public and protected methods of the base class are accessible via the 'super' keyword. tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts(68,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts(69,19): error TS2340: Only public and protected methods of the base class are accessible via the 'super' keyword. -tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts(73,13): error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. -tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts(76,40): error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts(73,13): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts(76,40): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts(87,15): error TS2340: Only public and protected methods of the base class are accessible via the 'super' keyword. tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts(91,23): error TS2340: Only public and protected methods of the base class are accessible via the 'super' keyword. tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts(94,9): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. @@ -34,8 +34,8 @@ tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts(120,15): error TS2340: Only public and protected methods of the base class are accessible via the 'super' keyword. tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts(121,15): error TS2340: Only public and protected methods of the base class are accessible via the 'super' keyword. tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts(122,9): error TS2341: Property 'privateStaticFunc' is private and only accessible within class 'SomeBase'. -tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts(127,16): error TS2335: 'super' can only be referenced in a derived class. -tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts(127,30): error TS2335: 'super' can only be referenced in a derived class. +tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts(127,16): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts(127,30): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. ==== tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess.ts (38 errors) ==== @@ -147,12 +147,12 @@ tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess function inner() { super.publicFunc(); ~~~~~ -!!! error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. } var x = { test: function () { return super.publicFunc(); } ~~~~~ -!!! error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. } } } @@ -239,7 +239,7 @@ tests/cases/conformance/expressions/superPropertyAccess/errorSuperPropertyAccess // In object literal var obj = { n: super.wat, p: super.foo() }; ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. \ No newline at end of file diff --git a/tests/baselines/reference/superCallFromFunction1.errors.txt b/tests/baselines/reference/superCallFromFunction1.errors.txt index 374a3aeb16c..b993d9f1253 100644 --- a/tests/baselines/reference/superCallFromFunction1.errors.txt +++ b/tests/baselines/reference/superCallFromFunction1.errors.txt @@ -1,4 +1,4 @@ -tests/cases/compiler/superCallFromFunction1.ts(3,5): error TS2335: 'super' can only be referenced in a derived class. +tests/cases/compiler/superCallFromFunction1.ts(3,5): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. ==== tests/cases/compiler/superCallFromFunction1.ts (1 errors) ==== @@ -6,5 +6,5 @@ tests/cases/compiler/superCallFromFunction1.ts(3,5): error TS2335: 'super' can o function foo() { super(value => String(value)); ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. +!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. } \ No newline at end of file diff --git a/tests/baselines/reference/superErrors.errors.txt b/tests/baselines/reference/superErrors.errors.txt index 26e0ba3a6c4..5c6d7365a67 100644 --- a/tests/baselines/reference/superErrors.errors.txt +++ b/tests/baselines/reference/superErrors.errors.txt @@ -1,15 +1,15 @@ -tests/cases/compiler/superErrors.ts(3,13): error TS2335: 'super' can only be referenced in a derived class. +tests/cases/compiler/superErrors.ts(3,13): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. tests/cases/compiler/superErrors.ts(3,18): error TS1034: 'super' must be followed by an argument list or member access. -tests/cases/compiler/superErrors.ts(4,19): error TS2335: 'super' can only be referenced in a derived class. +tests/cases/compiler/superErrors.ts(4,19): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. tests/cases/compiler/superErrors.ts(4,24): error TS1034: 'super' must be followed by an argument list or member access. -tests/cases/compiler/superErrors.ts(5,31): error TS2335: 'super' can only be referenced in a derived class. +tests/cases/compiler/superErrors.ts(5,31): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. tests/cases/compiler/superErrors.ts(5,36): error TS1034: 'super' must be followed by an argument list or member access. -tests/cases/compiler/superErrors.ts(22,13): error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. -tests/cases/compiler/superErrors.ts(27,27): error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. -tests/cases/compiler/superErrors.ts(31,36): error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +tests/cases/compiler/superErrors.ts(22,13): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/compiler/superErrors.ts(27,27): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/compiler/superErrors.ts(31,36): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. tests/cases/compiler/superErrors.ts(31,41): error TS1034: 'super' must be followed by an argument list or member access. -tests/cases/compiler/superErrors.ts(39,27): error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. -tests/cases/compiler/superErrors.ts(43,36): error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +tests/cases/compiler/superErrors.ts(39,27): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/compiler/superErrors.ts(43,36): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. tests/cases/compiler/superErrors.ts(43,41): error TS1034: 'super' must be followed by an argument list or member access. tests/cases/compiler/superErrors.ts(47,22): error TS1034: 'super' must be followed by an argument list or member access. tests/cases/compiler/superErrors.ts(48,28): error TS1034: 'super' must be followed by an argument list or member access. @@ -21,17 +21,17 @@ tests/cases/compiler/superErrors.ts(49,40): error TS1034: 'super' must be follow // super in a non class context var x = super; ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. ~ !!! error TS1034: 'super' must be followed by an argument list or member access. var y = () => super; ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. ~ !!! error TS1034: 'super' must be followed by an argument list or member access. var z = () => () => () => super; ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. ~ !!! error TS1034: 'super' must be followed by an argument list or member access. } @@ -52,20 +52,20 @@ tests/cases/compiler/superErrors.ts(49,40): error TS1034: 'super' must be follow function inner() { super.sayHello(); ~~~~~ -!!! error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. } // super call in a lambda in an inner function in a constructor function inner2() { var x = () => super.sayHello(); ~~~~~ -!!! error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. } // super call in a lambda in a function expression in a constructor (function() { return () => super; })(); ~~~~~ -!!! error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. ~ !!! error TS1034: 'super' must be followed by an argument list or member access. } @@ -77,13 +77,13 @@ tests/cases/compiler/superErrors.ts(49,40): error TS1034: 'super' must be follow function inner() { var x = () => super.sayHello(); ~~~~~ -!!! error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. } // super call in a lambda in a function expression in a constructor (function() { return () => super; })(); ~~~~~ -!!! error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. ~ !!! error TS1034: 'super' must be followed by an argument list or member access. } diff --git a/tests/baselines/reference/superInObjectLiterals_ES5.errors.txt b/tests/baselines/reference/superInObjectLiterals_ES5.errors.txt new file mode 100644 index 00000000000..944766cb5ae --- /dev/null +++ b/tests/baselines/reference/superInObjectLiterals_ES5.errors.txt @@ -0,0 +1,95 @@ +tests/cases/compiler/superInObjectLiterals_ES5.ts(7,9): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +tests/cases/compiler/superInObjectLiterals_ES5.ts(10,9): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +tests/cases/compiler/superInObjectLiterals_ES5.ts(14,9): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +tests/cases/compiler/superInObjectLiterals_ES5.ts(17,9): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/compiler/superInObjectLiterals_ES5.ts(20,9): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/compiler/superInObjectLiterals_ES5.ts(23,9): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/compiler/superInObjectLiterals_ES5.ts(39,17): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +tests/cases/compiler/superInObjectLiterals_ES5.ts(42,17): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +tests/cases/compiler/superInObjectLiterals_ES5.ts(46,17): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +tests/cases/compiler/superInObjectLiterals_ES5.ts(49,17): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/compiler/superInObjectLiterals_ES5.ts(52,17): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + + +==== tests/cases/compiler/superInObjectLiterals_ES5.ts (11 errors) ==== + var obj = { + __proto__: { + method() { + } + }, + method() { + super.method(); + ~~~~~ +!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. + }, + get prop() { + super.method(); + ~~~~~ +!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. + return 10; + }, + set prop(value) { + super.method(); + ~~~~~ +!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. + }, + p1: function () { + super.method(); + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + }, + p2: function f() { + super.method(); + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + }, + p3: () => { + super.method(); + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + } + }; + + class A { + method() { } + } + + class B extends A { + f() { + var obj = { + __proto__: { + method() { + } + }, + method() { + super.method(); + ~~~~~ +!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. + }, + get prop() { + super.method(); + ~~~~~ +!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. + return 10; + }, + set prop(value) { + super.method(); + ~~~~~ +!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. + }, + p1: function () { + super.method(); + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + }, + p2: function f() { + super.method(); + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + }, + p3: () => { + super.method(); + } + }; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/superInObjectLiterals_ES5.js b/tests/baselines/reference/superInObjectLiterals_ES5.js new file mode 100644 index 00000000000..f701ca7df7b --- /dev/null +++ b/tests/baselines/reference/superInObjectLiterals_ES5.js @@ -0,0 +1,133 @@ +//// [superInObjectLiterals_ES5.ts] +var obj = { + __proto__: { + method() { + } + }, + method() { + super.method(); + }, + get prop() { + super.method(); + return 10; + }, + set prop(value) { + super.method(); + }, + p1: function () { + super.method(); + }, + p2: function f() { + super.method(); + }, + p3: () => { + super.method(); + } +}; + +class A { + method() { } +} + +class B extends A { + f() { + var obj = { + __proto__: { + method() { + } + }, + method() { + super.method(); + }, + get prop() { + super.method(); + return 10; + }, + set prop(value) { + super.method(); + }, + p1: function () { + super.method(); + }, + p2: function f() { + super.method(); + }, + p3: () => { + super.method(); + } + }; + } +} + +//// [superInObjectLiterals_ES5.js] +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var obj = { + __proto__: { + method: function () { + } + }, + method: function () { + _super.prototype.method.call(this); + }, + get prop() { + _super.prototype.method.call(this); + return 10; + }, + set prop(value) { + _super.prototype.method.call(this); + }, + p1: function () { + _super.method.call(this); + }, + p2: function f() { + _super.method.call(this); + }, + p3: function () { + _super.method.call(this); + } +}; +var A = (function () { + function A() { + } + A.prototype.method = function () { }; + return A; +}()); +var B = (function (_super) { + __extends(B, _super); + function B() { + _super.apply(this, arguments); + } + B.prototype.f = function () { + var _this = this; + var obj = { + __proto__: { + method: function () { + } + }, + method: function () { + _super.prototype.method.call(this); + }, + get prop() { + _super.prototype.method.call(this); + return 10; + }, + set prop(value) { + _super.prototype.method.call(this); + }, + p1: function () { + _super.method.call(this); + }, + p2: function f() { + _super.method.call(this); + }, + p3: function () { + _super.prototype.method.call(_this); + } + }; + }; + return B; +}(A)); diff --git a/tests/baselines/reference/superInObjectLiterals_ES6.errors.txt b/tests/baselines/reference/superInObjectLiterals_ES6.errors.txt new file mode 100644 index 00000000000..dcd9692f5e3 --- /dev/null +++ b/tests/baselines/reference/superInObjectLiterals_ES6.errors.txt @@ -0,0 +1,77 @@ +tests/cases/compiler/superInObjectLiterals_ES6.ts(17,9): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/compiler/superInObjectLiterals_ES6.ts(20,9): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/compiler/superInObjectLiterals_ES6.ts(23,9): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/compiler/superInObjectLiterals_ES6.ts(49,17): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/compiler/superInObjectLiterals_ES6.ts(52,17): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + + +==== tests/cases/compiler/superInObjectLiterals_ES6.ts (5 errors) ==== + var obj = { + __proto__: { + method() { + } + }, + method() { + super.method(); + }, + get prop() { + super.method(); + return 10; + }, + set prop(value) { + super.method(); + }, + p1: function () { + super.method(); + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + }, + p2: function f() { + super.method(); + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + }, + p3: () => { + super.method(); + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + } + }; + + class A { + method() { } + } + + class B extends A { + f() { + var obj = { + __proto__: { + method() { + } + }, + method() { + super.method(); + }, + get prop() { + super.method(); + return 10; + }, + set prop(value) { + super.method(); + }, + p1: function () { + super.method(); + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + }, + p2: function f() { + super.method(); + ~~~~~ +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. + }, + p3: () => { + super.method(); + } + }; + } + } \ No newline at end of file diff --git a/tests/baselines/reference/superInObjectLiterals_ES6.js b/tests/baselines/reference/superInObjectLiterals_ES6.js new file mode 100644 index 00000000000..4cd62e68947 --- /dev/null +++ b/tests/baselines/reference/superInObjectLiterals_ES6.js @@ -0,0 +1,119 @@ +//// [superInObjectLiterals_ES6.ts] +var obj = { + __proto__: { + method() { + } + }, + method() { + super.method(); + }, + get prop() { + super.method(); + return 10; + }, + set prop(value) { + super.method(); + }, + p1: function () { + super.method(); + }, + p2: function f() { + super.method(); + }, + p3: () => { + super.method(); + } +}; + +class A { + method() { } +} + +class B extends A { + f() { + var obj = { + __proto__: { + method() { + } + }, + method() { + super.method(); + }, + get prop() { + super.method(); + return 10; + }, + set prop(value) { + super.method(); + }, + p1: function () { + super.method(); + }, + p2: function f() { + super.method(); + }, + p3: () => { + super.method(); + } + }; + } +} + +//// [superInObjectLiterals_ES6.js] +var obj = { + __proto__: { + method() { + } + }, + method() { + super.method(); + }, + get prop() { + super.method(); + return 10; + }, + set prop(value) { + super.method(); + }, + p1: function () { + super.method(); + }, + p2: function f() { + super.method(); + }, + p3: () => { + super.method(); + } +}; +class A { + method() { } +} +class B extends A { + f() { + var obj = { + __proto__: { + method() { + } + }, + method() { + super.method(); + }, + get prop() { + super.method(); + return 10; + }, + set prop(value) { + super.method(); + }, + p1: function () { + super.method(); + }, + p2: function f() { + super.method(); + }, + p3: () => { + super.method(); + } + }; + } +} diff --git a/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES5.js b/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES5.js new file mode 100644 index 00000000000..a91dfc76e3d --- /dev/null +++ b/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES5.js @@ -0,0 +1,46 @@ +//// [superPropertyAccessInComputedPropertiesOfNestedType_ES5.ts] +class A { + foo() { return 1; } +} + +class B extends A { + foo() { return 2; } + bar() { + return class { + [super.foo()]() { + return 100; + } + } + } +} + +//// [superPropertyAccessInComputedPropertiesOfNestedType_ES5.js] +var __extends = (this && this.__extends) || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); +}; +var A = (function () { + function A() { + } + A.prototype.foo = function () { return 1; }; + return A; +}()); +var B = (function (_super) { + __extends(B, _super); + function B() { + _super.apply(this, arguments); + } + B.prototype.foo = function () { return 2; }; + B.prototype.bar = function () { + return (function () { + function class_1() { + } + class_1.prototype[_super.prototype.foo.call(this)] = function () { + return 100; + }; + return class_1; + }()); + }; + return B; +}(A)); diff --git a/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES5.symbols b/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES5.symbols new file mode 100644 index 00000000000..1379d50179f --- /dev/null +++ b/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES5.symbols @@ -0,0 +1,29 @@ +=== tests/cases/compiler/superPropertyAccessInComputedPropertiesOfNestedType_ES5.ts === +class A { +>A : Symbol(A, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES5.ts, 0, 0)) + + foo() { return 1; } +>foo : Symbol(foo, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES5.ts, 0, 9)) +} + +class B extends A { +>B : Symbol(B, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES5.ts, 2, 1)) +>A : Symbol(A, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES5.ts, 0, 0)) + + foo() { return 2; } +>foo : Symbol(foo, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES5.ts, 4, 19)) + + bar() { +>bar : Symbol(bar, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES5.ts, 5, 23)) + + return class { + [super.foo()]() { +>super.foo : Symbol(A.foo, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES5.ts, 0, 9)) +>super : Symbol(A, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES5.ts, 0, 0)) +>foo : Symbol(A.foo, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES5.ts, 0, 9)) + + return 100; + } + } + } +} diff --git a/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES5.types b/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES5.types new file mode 100644 index 00000000000..d435bff69b5 --- /dev/null +++ b/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES5.types @@ -0,0 +1,35 @@ +=== tests/cases/compiler/superPropertyAccessInComputedPropertiesOfNestedType_ES5.ts === +class A { +>A : A + + foo() { return 1; } +>foo : () => number +>1 : number +} + +class B extends A { +>B : B +>A : A + + foo() { return 2; } +>foo : () => number +>2 : number + + bar() { +>bar : () => typeof (Anonymous class) + + return class { +>class { [super.foo()]() { return 100; } } : typeof (Anonymous class) + + [super.foo()]() { +>super.foo() : number +>super.foo : () => number +>super : A +>foo : () => number + + return 100; +>100 : number + } + } + } +} diff --git a/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES6.js b/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES6.js new file mode 100644 index 00000000000..825fa7682e2 --- /dev/null +++ b/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES6.js @@ -0,0 +1,31 @@ +//// [superPropertyAccessInComputedPropertiesOfNestedType_ES6.ts] +class A { + foo() { return 1; } +} + +class B extends A { + foo() { return 2; } + bar() { + return class { + [super.foo()]() { + return 100; + } + } + } +} + +//// [superPropertyAccessInComputedPropertiesOfNestedType_ES6.js] +class A { + foo() { return 1; } +} +class B extends A { + foo() { return 2; } + bar() { + return class { + [super.foo()]() { + return 100; + } + } + ; + } +} diff --git a/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES6.symbols b/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES6.symbols new file mode 100644 index 00000000000..12446259f32 --- /dev/null +++ b/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES6.symbols @@ -0,0 +1,29 @@ +=== tests/cases/compiler/superPropertyAccessInComputedPropertiesOfNestedType_ES6.ts === +class A { +>A : Symbol(A, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES6.ts, 0, 0)) + + foo() { return 1; } +>foo : Symbol(foo, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES6.ts, 0, 9)) +} + +class B extends A { +>B : Symbol(B, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES6.ts, 2, 1)) +>A : Symbol(A, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES6.ts, 0, 0)) + + foo() { return 2; } +>foo : Symbol(foo, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES6.ts, 4, 19)) + + bar() { +>bar : Symbol(bar, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES6.ts, 5, 23)) + + return class { + [super.foo()]() { +>super.foo : Symbol(A.foo, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES6.ts, 0, 9)) +>super : Symbol(A, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES6.ts, 0, 0)) +>foo : Symbol(A.foo, Decl(superPropertyAccessInComputedPropertiesOfNestedType_ES6.ts, 0, 9)) + + return 100; + } + } + } +} diff --git a/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES6.types b/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES6.types new file mode 100644 index 00000000000..817e3b73ba4 --- /dev/null +++ b/tests/baselines/reference/superPropertyAccessInComputedPropertiesOfNestedType_ES6.types @@ -0,0 +1,35 @@ +=== tests/cases/compiler/superPropertyAccessInComputedPropertiesOfNestedType_ES6.ts === +class A { +>A : A + + foo() { return 1; } +>foo : () => number +>1 : number +} + +class B extends A { +>B : B +>A : A + + foo() { return 2; } +>foo : () => number +>2 : number + + bar() { +>bar : () => typeof (Anonymous class) + + return class { +>class { [super.foo()]() { return 100; } } : typeof (Anonymous class) + + [super.foo()]() { +>super.foo() : number +>super.foo : () => number +>super : A +>foo : () => number + + return 100; +>100 : number + } + } + } +} diff --git a/tests/baselines/reference/super_inside-object-literal-getters-and-setters.errors.txt b/tests/baselines/reference/super_inside-object-literal-getters-and-setters.errors.txt index 4f1faf78a78..16a66bf6fa4 100644 --- a/tests/baselines/reference/super_inside-object-literal-getters-and-setters.errors.txt +++ b/tests/baselines/reference/super_inside-object-literal-getters-and-setters.errors.txt @@ -1,10 +1,10 @@ tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(4,13): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(5,20): error TS2335: 'super' can only be referenced in a derived class. +tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(5,20): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(7,13): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(8,13): error TS2335: 'super' can only be referenced in a derived class. -tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(11,20): error TS2335: 'super' can only be referenced in a derived class. +tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(8,13): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(11,20): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(20,17): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(21,24): error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(21,24): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. ==== tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts (7 errors) ==== @@ -16,19 +16,19 @@ tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(21,24): !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. return super._foo; ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. +!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. }, set foo(value: string) { ~~~ !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. super._foo = value; ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. +!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. }, test: function () { return super._foo; ~~~~~ -!!! error TS2335: 'super' can only be referenced in a derived class. +!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. } } } @@ -42,7 +42,7 @@ tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(21,24): !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. return super.test(); ~~~~~ -!!! error TS2338: 'super' property access is permitted only in a constructor, member function, or member accessor of a derived class. +!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. } }; } diff --git a/tests/baselines/reference/super_inside-object-literal-getters-and-setters.js b/tests/baselines/reference/super_inside-object-literal-getters-and-setters.js index be70ee33183..db6db37ac8a 100644 --- a/tests/baselines/reference/super_inside-object-literal-getters-and-setters.js +++ b/tests/baselines/reference/super_inside-object-literal-getters-and-setters.js @@ -38,10 +38,10 @@ var ObjectLiteral; var ThisInObjectLiteral = { _foo: '1', get foo() { - return _super._foo; + return _super.prototype._foo; }, set foo(value) { - _super._foo = value; + _super.prototype._foo = value; }, test: function () { return _super._foo; @@ -62,7 +62,7 @@ var SuperObjectTest = (function (_super) { SuperObjectTest.prototype.testing = function () { var test = { get F() { - return _super.test.call(this); + return _super.prototype.test.call(this); } }; }; diff --git a/tests/cases/compiler/superInObjectLiterals_ES5.ts b/tests/cases/compiler/superInObjectLiterals_ES5.ts new file mode 100644 index 00000000000..96cdfaa5b7b --- /dev/null +++ b/tests/cases/compiler/superInObjectLiterals_ES5.ts @@ -0,0 +1,60 @@ +// @target: ES5 +var obj = { + __proto__: { + method() { + } + }, + method() { + super.method(); + }, + get prop() { + super.method(); + return 10; + }, + set prop(value) { + super.method(); + }, + p1: function () { + super.method(); + }, + p2: function f() { + super.method(); + }, + p3: () => { + super.method(); + } +}; + +class A { + method() { } +} + +class B extends A { + f() { + var obj = { + __proto__: { + method() { + } + }, + method() { + super.method(); + }, + get prop() { + super.method(); + return 10; + }, + set prop(value) { + super.method(); + }, + p1: function () { + super.method(); + }, + p2: function f() { + super.method(); + }, + p3: () => { + super.method(); + } + }; + } +} \ No newline at end of file diff --git a/tests/cases/compiler/superInObjectLiterals_ES6.ts b/tests/cases/compiler/superInObjectLiterals_ES6.ts new file mode 100644 index 00000000000..05b2853a90b --- /dev/null +++ b/tests/cases/compiler/superInObjectLiterals_ES6.ts @@ -0,0 +1,60 @@ +// @target: ES6 +var obj = { + __proto__: { + method() { + } + }, + method() { + super.method(); + }, + get prop() { + super.method(); + return 10; + }, + set prop(value) { + super.method(); + }, + p1: function () { + super.method(); + }, + p2: function f() { + super.method(); + }, + p3: () => { + super.method(); + } +}; + +class A { + method() { } +} + +class B extends A { + f() { + var obj = { + __proto__: { + method() { + } + }, + method() { + super.method(); + }, + get prop() { + super.method(); + return 10; + }, + set prop(value) { + super.method(); + }, + p1: function () { + super.method(); + }, + p2: function f() { + super.method(); + }, + p3: () => { + super.method(); + } + }; + } +} \ No newline at end of file diff --git a/tests/cases/compiler/superPropertyAccessInComputedPropertiesOfNestedType_ES5.ts b/tests/cases/compiler/superPropertyAccessInComputedPropertiesOfNestedType_ES5.ts new file mode 100644 index 00000000000..9c7d28f96a4 --- /dev/null +++ b/tests/cases/compiler/superPropertyAccessInComputedPropertiesOfNestedType_ES5.ts @@ -0,0 +1,15 @@ +// @target: ES5 +class A { + foo() { return 1; } +} + +class B extends A { + foo() { return 2; } + bar() { + return class { + [super.foo()]() { + return 100; + } + } + } +} \ No newline at end of file diff --git a/tests/cases/compiler/superPropertyAccessInComputedPropertiesOfNestedType_ES6.ts b/tests/cases/compiler/superPropertyAccessInComputedPropertiesOfNestedType_ES6.ts new file mode 100644 index 00000000000..6a8c2e1a7d6 --- /dev/null +++ b/tests/cases/compiler/superPropertyAccessInComputedPropertiesOfNestedType_ES6.ts @@ -0,0 +1,15 @@ +// @target: ES6 +class A { + foo() { return 1; } +} + +class B extends A { + foo() { return 2; } + bar() { + return class { + [super.foo()]() { + return 100; + } + } + } +} \ No newline at end of file From 0f3eb0a058cee9a858c8d17fdc74e5d1494d4e3a Mon Sep 17 00:00:00 2001 From: Yui T Date: Fri, 11 Dec 2015 19:27:24 -0800 Subject: [PATCH 02/61] Initial fix for rename for parameter property declaration --- src/compiler/binder.ts | 5 +---- src/compiler/checker.ts | 11 +++++++++++ src/compiler/types.ts | 1 + src/compiler/utilities.ts | 6 ++++++ src/services/services.ts | 11 +++++++++++ 5 files changed, 30 insertions(+), 4 deletions(-) diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 2682a5938d1..9ce8b4f4eda 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -1444,10 +1444,7 @@ namespace ts { // If this is a property-parameter, then also declare the property symbol into the // containing class. - if (node.flags & NodeFlags.AccessibilityModifier && - node.parent.kind === SyntaxKind.Constructor && - isClassLike(node.parent.parent)) { - + if (isPropertyParameterDeclaration(node)) { const classDeclaration = node.parent.parent; declareSymbol(classDeclaration.symbol.members, classDeclaration.symbol, node, SymbolFlags.Property, SymbolFlags.PropertyExcludes); } diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 7d4bfb43de7..57c4353baf1 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -67,6 +67,7 @@ namespace ts { // The language service will always care about the narrowed type of a symbol, because that is // the type the language says the symbol should have. getTypeOfSymbolAtLocation: getNarrowedTypeOfSymbol, + getSymbolOfParameterPropertyDeclaration, getDeclaredTypeOfSymbol, getPropertiesOfType, getPropertyOfType, @@ -427,6 +428,16 @@ namespace ts { } // return undefined if we can't find a symbol. } + + function getSymbolOfParameterPropertyDeclaration(parameter: ParameterDeclaration, parameterName: string): Symbol[] { + const constructoDeclaration = parameter.parent; + const classDeclaration = parameter.parent.parent; + + const parameterSymbol = getSymbol(constructoDeclaration.locals, parameterName, SymbolFlags.Value); + const propertySymbol = getSymbol(classDeclaration.symbol.members, parameterName, SymbolFlags.Value); + + return parameterSymbol && propertySymbol ? [parameterSymbol, propertySymbol] : undefined; + } function isBlockScopedNameDeclaredBeforeUse(declaration: Declaration, usage: Node): boolean { const declarationFile = getSourceFileOfNode(declaration); diff --git a/src/compiler/types.ts b/src/compiler/types.ts index ff8ffa4ebd2..4c1fb2bb1cd 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1723,6 +1723,7 @@ namespace ts { getSymbolsInScope(location: Node, meaning: SymbolFlags): Symbol[]; getSymbolAtLocation(node: Node): Symbol; + getSymbolOfParameterPropertyDeclaration(parameter: ParameterDeclaration, parameterName: string): Symbol[]; getShorthandAssignmentValueSymbol(location: Node): Symbol; getTypeAtLocation(node: Node): Type; typeToString(type: Type, enclosingDeclaration?: Node, flags?: TypeFormatFlags): string; diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index eee09fc641f..472225d31e5 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -2741,4 +2741,10 @@ namespace ts { } } } + + export function isPropertyParameterDeclaration(node: ParameterDeclaration): boolean { + // If this is a property-parameter, then also declare the property symbol into the + // containing class. + return node.flags & NodeFlags.AccessibilityModifier && node.parent.kind === SyntaxKind.Constructor && isClassLike(node.parent.parent); + } } diff --git a/src/services/services.ts b/src/services/services.ts index a9dda549ead..4f2af5c35c4 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -5967,6 +5967,15 @@ namespace ts { } } + // If the symbol.valueDeclaration is a property parameter declaration, + // we should include both parameter declaration symbol and property declaration symbol + // Parameter Declaration symbol is only visible within function scope, so the symbol is stored in contructor.locals. + // Property Declaration symbol is a member of the class, so the symbol is stored in its class Declaration.symbol.members + if (symbol.valueDeclaration && symbol.valueDeclaration.kind === SyntaxKind.Parameter && + isPropertyParameterDeclaration(symbol.valueDeclaration)) { + result = result.concat(typeChecker.getSymbolOfParameterPropertyDeclaration(symbol.valueDeclaration, symbol.name)); + } + // If this is a union property, add all the symbols from all its source symbols in all unioned types. // If the symbol is an instantiation from a another symbol (e.g. widened symbol) , add the root the list forEach(typeChecker.getRootSymbols(symbol), rootSymbol => { @@ -6036,6 +6045,8 @@ namespace ts { }); } + // If the reference + // Unwrap symbols to get to the root (e.g. transient symbols as a result of widening) // Or a union property, use its underlying unioned symbols return forEach(typeChecker.getRootSymbols(referenceSymbol), rootSymbol => { From af65e86aaa9cbc28ac9cc767d12f74864de52f28 Mon Sep 17 00:00:00 2001 From: Yui T Date: Fri, 11 Dec 2015 19:28:21 -0800 Subject: [PATCH 03/61] Add tests --- .../renameParameterPropertyDeclaration.ts | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) create mode 100644 tests/cases/fourslash/renameParameterPropertyDeclaration.ts diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration.ts new file mode 100644 index 00000000000..34d8c9ef428 --- /dev/null +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration.ts @@ -0,0 +1,17 @@ +/// + +//// class Foo { +//// constructor(private privateParam: number, +//// public publicParam: string, +//// protected protectedParam: boolean) { +//// +//// let localPrivate = privateParam; +//// this.privateParam += 10; +//// +//// let localPublic = publicParam; +//// this.publicParam += " Hello!"; +//// +//// let localProtected = protectedParam; +//// this.protectedParam = !this.protectedParam; +//// } +//// } \ No newline at end of file From b00fa42dea98cdf3c9fd00923b6cd2a5ba288131 Mon Sep 17 00:00:00 2001 From: Yui T Date: Sat, 12 Dec 2015 15:52:55 -0800 Subject: [PATCH 04/61] Update tests --- ...HighlightAtParameterPropertyDeclaration.ts | 24 +++++++++++++++++++ ...indAllRefsParameterPropertyDeclaration1.ts | 18 ++++++++++++++ ...indAllRefsParameterPropertyDeclaration2.ts | 18 ++++++++++++++ ...indAllRefsParameterPropertyDeclaration3.ts | 18 ++++++++++++++ ...referenceInParameterPropertyDeclaration.ts | 24 +++++++++++++++++++ .../renameParameterPropertyDeclaration.ts | 17 ------------- .../renameParameterPropeterDeclaration1.ts | 14 +++++++++++ .../renameParameterPropeterDeclaration2.ts | 14 +++++++++++ .../renameParameterPropeterDeclaration3.ts | 14 +++++++++++ 9 files changed, 144 insertions(+), 17 deletions(-) create mode 100644 tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration.ts create mode 100644 tests/cases/fourslash/findAllRefsParameterPropertyDeclaration1.ts create mode 100644 tests/cases/fourslash/findAllRefsParameterPropertyDeclaration2.ts create mode 100644 tests/cases/fourslash/findAllRefsParameterPropertyDeclaration3.ts create mode 100644 tests/cases/fourslash/referenceInParameterPropertyDeclaration.ts delete mode 100644 tests/cases/fourslash/renameParameterPropertyDeclaration.ts create mode 100644 tests/cases/fourslash/renameParameterPropeterDeclaration1.ts create mode 100644 tests/cases/fourslash/renameParameterPropeterDeclaration2.ts create mode 100644 tests/cases/fourslash/renameParameterPropeterDeclaration3.ts diff --git a/tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration.ts b/tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration.ts new file mode 100644 index 00000000000..aeccd252fe9 --- /dev/null +++ b/tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration.ts @@ -0,0 +1,24 @@ +/// + +// @Filename: file1.ts +//// class Foo { +//// constructor(private /*0*/privateParam: number, +//// public /*1*/publicParam: string, +//// protected /*2*/protectedParam: boolean) { +//// +//// let localPrivate = /*3*/privateParam; +//// this./*4*/privateParam += 10; +//// +//// let localPublic = /*5*/publicParam; +//// this./*6*/publicParam += " Hello!"; +//// +//// let localProtected = /*7*/protectedParam; +//// this./*8*/protectedParam = false; +//// } +//// } + +let markers = test.markers() +for (let marker of markers) { + goTo.position(marker.position); + verify.documentHighlightsAtPositionCount(3, ["file1.ts"]); +} \ No newline at end of file diff --git a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration1.ts b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration1.ts new file mode 100644 index 00000000000..d0854262828 --- /dev/null +++ b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration1.ts @@ -0,0 +1,18 @@ +/// + +//// class Foo { +//// constructor(private |privateParam|: number) { +//// let localPrivate = |privateParam|; +//// this.|privateParam| += 10; +//// } +//// } + +let ranges = test.ranges(); +for (let range of ranges) { + goTo.position(range.start); + + verify.referencesCountIs(ranges.length); + for (let expectedRange of ranges) { + verify.referencesAtPositionContains(expectedRange); + } +} \ No newline at end of file diff --git a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration2.ts b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration2.ts new file mode 100644 index 00000000000..7e59567364a --- /dev/null +++ b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration2.ts @@ -0,0 +1,18 @@ +/// + +//// class Foo { +//// constructor(public |publicParam|: number) { +//// let localPublic = |publicParam|; +//// this.|publicParam| += 10; +//// } +//// } + +let ranges = test.ranges(); +for (let range of ranges) { + goTo.position(range.start); + + verify.referencesCountIs(ranges.length); + for (let expectedRange of ranges) { + verify.referencesAtPositionContains(expectedRange); + } +} \ No newline at end of file diff --git a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration3.ts b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration3.ts new file mode 100644 index 00000000000..2d78e9793f7 --- /dev/null +++ b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration3.ts @@ -0,0 +1,18 @@ +/// + +//// class Foo { +//// constructor(protected |protectedParam|: number) { +//// let localProtected = |protectedParam|; +//// this.|protectedParam| += 10; +//// } +//// } + +let ranges = test.ranges(); +for (let range of ranges) { + goTo.position(range.start); + + verify.referencesCountIs(ranges.length); + for (let expectedRange of ranges) { + verify.referencesAtPositionContains(expectedRange); + } +} \ No newline at end of file diff --git a/tests/cases/fourslash/referenceInParameterPropertyDeclaration.ts b/tests/cases/fourslash/referenceInParameterPropertyDeclaration.ts new file mode 100644 index 00000000000..4e86e7a4915 --- /dev/null +++ b/tests/cases/fourslash/referenceInParameterPropertyDeclaration.ts @@ -0,0 +1,24 @@ +/// + +// @Filename: file1.ts +//// class Foo { +//// constructor(private /*0*/privateParam: number, +//// public /*1*/publicParam: string, +//// protected /*2*/protectedParam: boolean) { +//// +//// let localPrivate = /*3*/privateParam; +//// this./*4*/privateParam += 10; +//// +//// let localPublic = /*5*/publicParam; +//// this./*6*/publicParam += " Hello!"; +//// +//// let localProtected = /*7*/protectedParam; +//// this./*8*/protectedParam = false; +//// } +//// } + +let markers = test.markers() +for (let marker of markers) { + goTo.position(marker.position); + verify.referencesCountIs(3); +} \ No newline at end of file diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration.ts deleted file mode 100644 index 34d8c9ef428..00000000000 --- a/tests/cases/fourslash/renameParameterPropertyDeclaration.ts +++ /dev/null @@ -1,17 +0,0 @@ -/// - -//// class Foo { -//// constructor(private privateParam: number, -//// public publicParam: string, -//// protected protectedParam: boolean) { -//// -//// let localPrivate = privateParam; -//// this.privateParam += 10; -//// -//// let localPublic = publicParam; -//// this.publicParam += " Hello!"; -//// -//// let localProtected = protectedParam; -//// this.protectedParam = !this.protectedParam; -//// } -//// } \ No newline at end of file diff --git a/tests/cases/fourslash/renameParameterPropeterDeclaration1.ts b/tests/cases/fourslash/renameParameterPropeterDeclaration1.ts new file mode 100644 index 00000000000..1faed546d91 --- /dev/null +++ b/tests/cases/fourslash/renameParameterPropeterDeclaration1.ts @@ -0,0 +1,14 @@ +/// + +//// class Foo { +//// constructor(private |privateParam|: number) { +//// let localPrivate = |privateParam|; +//// this.|privateParam| += 10; +//// } +//// } + +let ranges = test.ranges() +for (let range of ranges) { + goTo.position(range.start); + verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); +} \ No newline at end of file diff --git a/tests/cases/fourslash/renameParameterPropeterDeclaration2.ts b/tests/cases/fourslash/renameParameterPropeterDeclaration2.ts new file mode 100644 index 00000000000..e8eec5d3a0a --- /dev/null +++ b/tests/cases/fourslash/renameParameterPropeterDeclaration2.ts @@ -0,0 +1,14 @@ +/// + +//// class Foo { +//// constructor(public |publicParam|: number) { +//// let publicParam = |publicParam|; +//// this.|publicParam| += 10; +//// } +//// } + +let ranges = test.ranges() +for (let range of ranges) { + goTo.position(range.start); + verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); +} \ No newline at end of file diff --git a/tests/cases/fourslash/renameParameterPropeterDeclaration3.ts b/tests/cases/fourslash/renameParameterPropeterDeclaration3.ts new file mode 100644 index 00000000000..44f4cf68858 --- /dev/null +++ b/tests/cases/fourslash/renameParameterPropeterDeclaration3.ts @@ -0,0 +1,14 @@ +/// + +//// class Foo { +//// constructor(protected |protectedParam|: number) { +//// let protectedParam = |protectedParam|; +//// this.|protectedParam| += 10; +//// } +//// } + +let ranges = test.ranges() +for (let range of ranges) { + goTo.position(range.start); + verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); +} \ No newline at end of file From 94c3d27f411b4f72d8f6adb422e98d38324b23e6 Mon Sep 17 00:00:00 2001 From: Yui T Date: Sat, 12 Dec 2015 15:53:04 -0800 Subject: [PATCH 05/61] Fix linting --- src/compiler/checker.ts | 6 +++--- src/compiler/utilities.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 57c4353baf1..1646b51702a 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -428,14 +428,14 @@ namespace ts { } // return undefined if we can't find a symbol. } - + function getSymbolOfParameterPropertyDeclaration(parameter: ParameterDeclaration, parameterName: string): Symbol[] { const constructoDeclaration = parameter.parent; const classDeclaration = parameter.parent.parent; - + const parameterSymbol = getSymbol(constructoDeclaration.locals, parameterName, SymbolFlags.Value); const propertySymbol = getSymbol(classDeclaration.symbol.members, parameterName, SymbolFlags.Value); - + return parameterSymbol && propertySymbol ? [parameterSymbol, propertySymbol] : undefined; } diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 472225d31e5..566a578cedf 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -2741,7 +2741,7 @@ namespace ts { } } } - + export function isPropertyParameterDeclaration(node: ParameterDeclaration): boolean { // If this is a property-parameter, then also declare the property symbol into the // containing class. From f138953d887f8e5fd37af81e66adab662039bdba Mon Sep 17 00:00:00 2001 From: Yui T Date: Sat, 12 Dec 2015 16:13:30 -0800 Subject: [PATCH 06/61] Fix comment --- src/compiler/checker.ts | 8 +++++++- src/services/services.ts | 2 -- 2 files changed, 7 insertions(+), 3 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 31665734167..a2338c5ba5b 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -429,7 +429,13 @@ namespace ts { // return undefined if we can't find a symbol. } - function getSymbolOfParameterPropertyDeclaration(parameter: ParameterDeclaration, parameterName: string): Symbol[] { + /** + * Get symbols that represent parameter-property-declaration as parameter and as property declaration + * @param parameter a parameterDeclaration node + * @param parameterName a name of the parameter to get the symbols for. + * @return a tuple of two symbols + */ + function getSymbolOfParameterPropertyDeclaration(parameter: ParameterDeclaration, parameterName: string): [Symbol, Symbol] { const constructoDeclaration = parameter.parent; const classDeclaration = parameter.parent.parent; diff --git a/src/services/services.ts b/src/services/services.ts index 4f2af5c35c4..6728c0d5ebc 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -6045,8 +6045,6 @@ namespace ts { }); } - // If the reference - // Unwrap symbols to get to the root (e.g. transient symbols as a result of widening) // Or a union property, use its underlying unioned symbols return forEach(typeChecker.getRootSymbols(referenceSymbol), rootSymbol => { From 99722e442cb2e0bd018f133cad04afd29cc8c756 Mon Sep 17 00:00:00 2001 From: Yui T Date: Sat, 12 Dec 2015 16:38:11 -0800 Subject: [PATCH 07/61] Add tests for binding pattern in parameter property declaration --- ...ghlightAtParameterPropertyDeclaration1.ts} | 0 ...ighlightAtParameterPropertyDeclaration2.ts | 24 +++++++++++++++++++ ...ighlightAtParameterPropertyDeclaration3.ts | 24 +++++++++++++++++++ ...=> renameParameterPropertyDeclaration1.ts} | 0 ...=> renameParameterPropertyDeclaration2.ts} | 0 ...=> renameParameterPropertyDeclaration3.ts} | 0 .../renameParameterPropertyDeclaration4.ts | 13 ++++++++++ .../renameParameterPropertyDeclaration5.ts | 13 ++++++++++ 8 files changed, 74 insertions(+) rename tests/cases/fourslash/{documentHighlightAtParameterPropertyDeclaration.ts => documentHighlightAtParameterPropertyDeclaration1.ts} (100%) create mode 100644 tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration2.ts create mode 100644 tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration3.ts rename tests/cases/fourslash/{renameParameterPropeterDeclaration1.ts => renameParameterPropertyDeclaration1.ts} (100%) rename tests/cases/fourslash/{renameParameterPropeterDeclaration2.ts => renameParameterPropertyDeclaration2.ts} (100%) rename tests/cases/fourslash/{renameParameterPropeterDeclaration3.ts => renameParameterPropertyDeclaration3.ts} (100%) create mode 100644 tests/cases/fourslash/renameParameterPropertyDeclaration4.ts create mode 100644 tests/cases/fourslash/renameParameterPropertyDeclaration5.ts diff --git a/tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration.ts b/tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration1.ts similarity index 100% rename from tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration.ts rename to tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration1.ts diff --git a/tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration2.ts b/tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration2.ts new file mode 100644 index 00000000000..2658dd56371 --- /dev/null +++ b/tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration2.ts @@ -0,0 +1,24 @@ +/// + +// @Filename: file1.ts +//// class Foo { +//// constructor(private {/*0*/privateParam}: number, +//// public {/*1*/publicParam}: string, +//// protected {/*2*/protectedParam}: boolean) { +//// +//// let localPrivate = /*3*/privateParam; +//// this.privateParam += 10; // this is not valid syntax +//// +//// let localPublic = /*4*/publicParam; +//// this.publicParam += " Hello!"; // this is not valid syntax +//// +//// let localProtected = /*5*/protectedParam; +//// this.protectedParam = false; // this is not valid syntax +//// } +//// } + +let markers = test.markers() +for (let marker of markers) { + goTo.position(marker.position); + verify.documentHighlightsAtPositionCount(3, ["file1.ts"]); +} \ No newline at end of file diff --git a/tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration3.ts b/tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration3.ts new file mode 100644 index 00000000000..958e3bb45c9 --- /dev/null +++ b/tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration3.ts @@ -0,0 +1,24 @@ +/// + +// @Filename: file1.ts +//// class Foo { +//// constructor(private [/*0*/privateParam]: number, +//// public [/*1*/publicParam]: string, +//// protected [/*2*/protectedParam]: boolean) { +//// +//// let localPrivate = /*3*/privateParam; +//// this.privateParam += 10; // this is not valid syntax +//// +//// let localPublic = /*4*/publicParam; +//// this.publicParam += " Hello!"; // this is not valid syntax +//// +//// let localProtected = /*5*/protectedParam; +//// this.protectedParam = false; // this is not valid syntax +//// } +//// } + +let markers = test.markers() +for (let marker of markers) { + goTo.position(marker.position); + verify.documentHighlightsAtPositionCount(2, ["file1.ts"]); +} \ No newline at end of file diff --git a/tests/cases/fourslash/renameParameterPropeterDeclaration1.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration1.ts similarity index 100% rename from tests/cases/fourslash/renameParameterPropeterDeclaration1.ts rename to tests/cases/fourslash/renameParameterPropertyDeclaration1.ts diff --git a/tests/cases/fourslash/renameParameterPropeterDeclaration2.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration2.ts similarity index 100% rename from tests/cases/fourslash/renameParameterPropeterDeclaration2.ts rename to tests/cases/fourslash/renameParameterPropertyDeclaration2.ts diff --git a/tests/cases/fourslash/renameParameterPropeterDeclaration3.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration3.ts similarity index 100% rename from tests/cases/fourslash/renameParameterPropeterDeclaration3.ts rename to tests/cases/fourslash/renameParameterPropertyDeclaration3.ts diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration4.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration4.ts new file mode 100644 index 00000000000..21ba7da4141 --- /dev/null +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration4.ts @@ -0,0 +1,13 @@ +/// + +//// class Foo { +//// constructor(protected { |protectedParam| }) { +//// let myProtectedParam = |protectedParam|; +//// } +//// } + +let ranges = test.ranges() +for (let range of ranges) { + goTo.position(range.start); + verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); +} \ No newline at end of file diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration5.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration5.ts new file mode 100644 index 00000000000..a4bc00b697b --- /dev/null +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration5.ts @@ -0,0 +1,13 @@ +/// + +//// class Foo { +//// constructor(protected [ |protectedParam| ]) { +//// let myProtectedParam = |protectedParam|; +//// } +//// } + +let ranges = test.ranges() +for (let range of ranges) { + goTo.position(range.start); + verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); +} \ No newline at end of file From b65c5779a2e543c26849e4eb07d09fc849e07c87 Mon Sep 17 00:00:00 2001 From: vladima Date: Sat, 12 Dec 2015 23:07:18 -0800 Subject: [PATCH 08/61] addressed PR feedback --- src/compiler/checker.ts | 26 ++++++++++--------- .../computedPropertyNames24_ES5.errors.txt | 4 +-- .../computedPropertyNames24_ES6.errors.txt | 4 +-- .../computedPropertyNames26_ES5.errors.txt | 4 +-- .../computedPropertyNames26_ES6.errors.txt | 4 +-- .../computedPropertyNames27_ES5.errors.txt | 4 +-- .../computedPropertyNames27_ES6.errors.txt | 4 +-- .../computedPropertyNames30_ES5.errors.txt | 4 +-- .../computedPropertyNames30_ES6.errors.txt | 4 +-- 9 files changed, 30 insertions(+), 28 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 6af7ddba419..2dd567cbe90 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7053,24 +7053,26 @@ namespace ts { let nodeCheckFlag: NodeCheckFlags = 0; if (!canUseSuperExpression) { - if (isCallExpression) { + // issue more specific error if super is used in computed property name + // class A { foo() { return "1" }} + // class B { + // [super.foo()]() {} + // } + let current = node; + while (current && current !== container && current.kind !== SyntaxKind.ComputedPropertyName) { + current = current.parent; + } + if (current && current.kind === SyntaxKind.ComputedPropertyName) { + error(node, Diagnostics.super_cannot_be_referenced_in_a_computed_property_name); + } + else if (isCallExpression) { error(node, Diagnostics.Super_calls_are_not_permitted_outside_constructors_or_in_nested_functions_inside_constructors); } else if (!container || !container.parent || !(isClassLike(container.parent) || container.parent.kind === SyntaxKind.ObjectLiteralExpression)) { error(node, Diagnostics.super_can_only_be_referenced_in_members_of_derived_classes_or_object_literal_expressions); } else { - // issue more specific error if super is used in computed property name - let current = node; - while (current && current !== container && current.kind !== SyntaxKind.ComputedPropertyName) { - current = current.parent; - } - if (current && current.kind === SyntaxKind.ComputedPropertyName) { - error(node, Diagnostics.super_cannot_be_referenced_in_a_computed_property_name); - } - else { - error(node, Diagnostics.super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_derived_class); - } + error(node, Diagnostics.super_property_access_is_permitted_only_in_a_constructor_member_function_or_member_accessor_of_a_derived_class); } return unknownType; } diff --git a/tests/baselines/reference/computedPropertyNames24_ES5.errors.txt b/tests/baselines/reference/computedPropertyNames24_ES5.errors.txt index e06373fb1e3..121b39450a6 100644 --- a/tests/baselines/reference/computedPropertyNames24_ES5.errors.txt +++ b/tests/baselines/reference/computedPropertyNames24_ES5.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames24_ES5.ts(7,6): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/conformance/es6/computedProperties/computedPropertyNames24_ES5.ts(7,6): error TS2466: 'super' cannot be referenced in a computed property name. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames24_ES5.ts (1 errors) ==== @@ -10,5 +10,5 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames24_ES5.ts(7, class C extends Base { [super.bar()]() { } ~~~~~ -!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +!!! error TS2466: 'super' cannot be referenced in a computed property name. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames24_ES6.errors.txt b/tests/baselines/reference/computedPropertyNames24_ES6.errors.txt index 331723afe34..cab0ba6a85c 100644 --- a/tests/baselines/reference/computedPropertyNames24_ES6.errors.txt +++ b/tests/baselines/reference/computedPropertyNames24_ES6.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames24_ES6.ts(9,6): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/conformance/es6/computedProperties/computedPropertyNames24_ES6.ts(9,6): error TS2466: 'super' cannot be referenced in a computed property name. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames24_ES6.ts (1 errors) ==== @@ -12,5 +12,5 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames24_ES6.ts(9, // use of super in static properties initializers. [super.bar()]() { } ~~~~~ -!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +!!! error TS2466: 'super' cannot be referenced in a computed property name. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames26_ES5.errors.txt b/tests/baselines/reference/computedPropertyNames26_ES5.errors.txt index c8e24abfa9d..e7039712734 100644 --- a/tests/baselines/reference/computedPropertyNames26_ES5.errors.txt +++ b/tests/baselines/reference/computedPropertyNames26_ES5.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames26_ES5.ts(8,12): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/conformance/es6/computedProperties/computedPropertyNames26_ES5.ts(8,12): error TS2466: 'super' cannot be referenced in a computed property name. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames26_ES5.ts (1 errors) ==== @@ -11,6 +11,6 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames26_ES5.ts(8, [ { [super.bar()]: 1 }[0] ~~~~~ -!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +!!! error TS2466: 'super' cannot be referenced in a computed property name. ]() { } } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames26_ES6.errors.txt b/tests/baselines/reference/computedPropertyNames26_ES6.errors.txt index ec20ed57144..d7e2b5ce7c5 100644 --- a/tests/baselines/reference/computedPropertyNames26_ES6.errors.txt +++ b/tests/baselines/reference/computedPropertyNames26_ES6.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames26_ES6.ts(10,12): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +tests/cases/conformance/es6/computedProperties/computedPropertyNames26_ES6.ts(10,12): error TS2466: 'super' cannot be referenced in a computed property name. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames26_ES6.ts (1 errors) ==== @@ -13,6 +13,6 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames26_ES6.ts(10 [ { [super.bar()]: 1 }[0] ~~~~~ -!!! error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. +!!! error TS2466: 'super' cannot be referenced in a computed property name. ]() { } } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames27_ES5.errors.txt b/tests/baselines/reference/computedPropertyNames27_ES5.errors.txt index 97964d48176..1fbc7b37543 100644 --- a/tests/baselines/reference/computedPropertyNames27_ES5.errors.txt +++ b/tests/baselines/reference/computedPropertyNames27_ES5.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames27_ES5.ts(4,7): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. +tests/cases/conformance/es6/computedProperties/computedPropertyNames27_ES5.ts(4,7): error TS2466: 'super' cannot be referenced in a computed property name. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames27_ES5.ts (1 errors) ==== @@ -7,5 +7,5 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames27_ES5.ts(4, class C extends Base { [(super(), "prop")]() { } ~~~~~ -!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. +!!! error TS2466: 'super' cannot be referenced in a computed property name. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames27_ES6.errors.txt b/tests/baselines/reference/computedPropertyNames27_ES6.errors.txt index 30e1ce5b14f..edf84201647 100644 --- a/tests/baselines/reference/computedPropertyNames27_ES6.errors.txt +++ b/tests/baselines/reference/computedPropertyNames27_ES6.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames27_ES6.ts(4,7): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. +tests/cases/conformance/es6/computedProperties/computedPropertyNames27_ES6.ts(4,7): error TS2466: 'super' cannot be referenced in a computed property name. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames27_ES6.ts (1 errors) ==== @@ -7,5 +7,5 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames27_ES6.ts(4, class C extends Base { [(super(), "prop")]() { } ~~~~~ -!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. +!!! error TS2466: 'super' cannot be referenced in a computed property name. } \ No newline at end of file diff --git a/tests/baselines/reference/computedPropertyNames30_ES5.errors.txt b/tests/baselines/reference/computedPropertyNames30_ES5.errors.txt index deb80dbcca8..e64b83f609e 100644 --- a/tests/baselines/reference/computedPropertyNames30_ES5.errors.txt +++ b/tests/baselines/reference/computedPropertyNames30_ES5.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames30_ES5.ts(11,19): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. +tests/cases/conformance/es6/computedProperties/computedPropertyNames30_ES5.ts(11,19): error TS2466: 'super' cannot be referenced in a computed property name. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames30_ES5.ts (1 errors) ==== @@ -14,7 +14,7 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames30_ES5.ts(11 //treatment of other similar violations. [(super(), "prop")]() { } ~~~~~ -!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. +!!! error TS2466: 'super' cannot be referenced in a computed property name. }; } } diff --git a/tests/baselines/reference/computedPropertyNames30_ES6.errors.txt b/tests/baselines/reference/computedPropertyNames30_ES6.errors.txt index b10d184f799..a5771629ac2 100644 --- a/tests/baselines/reference/computedPropertyNames30_ES6.errors.txt +++ b/tests/baselines/reference/computedPropertyNames30_ES6.errors.txt @@ -1,4 +1,4 @@ -tests/cases/conformance/es6/computedProperties/computedPropertyNames30_ES6.ts(11,19): error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. +tests/cases/conformance/es6/computedProperties/computedPropertyNames30_ES6.ts(11,19): error TS2466: 'super' cannot be referenced in a computed property name. ==== tests/cases/conformance/es6/computedProperties/computedPropertyNames30_ES6.ts (1 errors) ==== @@ -14,7 +14,7 @@ tests/cases/conformance/es6/computedProperties/computedPropertyNames30_ES6.ts(11 //treatment of other similar violations. [(super(), "prop")]() { } ~~~~~ -!!! error TS2337: Super calls are not permitted outside constructors or in nested functions inside constructors. +!!! error TS2466: 'super' cannot be referenced in a computed property name. }; } } From 7e71686b1a969b083ee347bdb105fc8a30da6664 Mon Sep 17 00:00:00 2001 From: Yui T Date: Mon, 14 Dec 2015 10:14:35 -0800 Subject: [PATCH 09/61] Fix broken tests --- src/compiler/binder.ts | 2 +- src/compiler/checker.ts | 4 ++-- src/compiler/types.ts | 2 +- src/compiler/utilities.ts | 4 +--- src/services/services.ts | 4 ++-- .../documentHighlightAtParameterPropertyDeclaration2.ts | 2 +- 6 files changed, 8 insertions(+), 10 deletions(-) diff --git a/src/compiler/binder.ts b/src/compiler/binder.ts index 9ce8b4f4eda..b63348bfb60 100644 --- a/src/compiler/binder.ts +++ b/src/compiler/binder.ts @@ -1444,7 +1444,7 @@ namespace ts { // If this is a property-parameter, then also declare the property symbol into the // containing class. - if (isPropertyParameterDeclaration(node)) { + if (isParameterPropertyDeclaration(node)) { const classDeclaration = node.parent.parent; declareSymbol(classDeclaration.symbol.members, classDeclaration.symbol, node, SymbolFlags.Property, SymbolFlags.PropertyExcludes); } diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index a2338c5ba5b..9d14bb39206 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -67,7 +67,7 @@ namespace ts { // The language service will always care about the narrowed type of a symbol, because that is // the type the language says the symbol should have. getTypeOfSymbolAtLocation: getNarrowedTypeOfSymbol, - getSymbolOfParameterPropertyDeclaration, + getSymbolsOfParameterPropertyDeclaration, getDeclaredTypeOfSymbol, getPropertiesOfType, getPropertyOfType, @@ -435,7 +435,7 @@ namespace ts { * @param parameterName a name of the parameter to get the symbols for. * @return a tuple of two symbols */ - function getSymbolOfParameterPropertyDeclaration(parameter: ParameterDeclaration, parameterName: string): [Symbol, Symbol] { + function getSymbolsOfParameterPropertyDeclaration(parameter: ParameterDeclaration, parameterName: string): [Symbol, Symbol] { const constructoDeclaration = parameter.parent; const classDeclaration = parameter.parent.parent; diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 4c1fb2bb1cd..ad446792f04 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1723,7 +1723,7 @@ namespace ts { getSymbolsInScope(location: Node, meaning: SymbolFlags): Symbol[]; getSymbolAtLocation(node: Node): Symbol; - getSymbolOfParameterPropertyDeclaration(parameter: ParameterDeclaration, parameterName: string): Symbol[]; + getSymbolsOfParameterPropertyDeclaration(parameter: ParameterDeclaration, parameterName: string): Symbol[]; getShorthandAssignmentValueSymbol(location: Node): Symbol; getTypeAtLocation(node: Node): Type; typeToString(type: Type, enclosingDeclaration?: Node, flags?: TypeFormatFlags): string; diff --git a/src/compiler/utilities.ts b/src/compiler/utilities.ts index 566a578cedf..384f27c8868 100644 --- a/src/compiler/utilities.ts +++ b/src/compiler/utilities.ts @@ -2742,9 +2742,7 @@ namespace ts { } } - export function isPropertyParameterDeclaration(node: ParameterDeclaration): boolean { - // If this is a property-parameter, then also declare the property symbol into the - // containing class. + export function isParameterPropertyDeclaration(node: ParameterDeclaration): boolean { return node.flags & NodeFlags.AccessibilityModifier && node.parent.kind === SyntaxKind.Constructor && isClassLike(node.parent.parent); } } diff --git a/src/services/services.ts b/src/services/services.ts index 6728c0d5ebc..8e2e4913edd 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -5972,8 +5972,8 @@ namespace ts { // Parameter Declaration symbol is only visible within function scope, so the symbol is stored in contructor.locals. // Property Declaration symbol is a member of the class, so the symbol is stored in its class Declaration.symbol.members if (symbol.valueDeclaration && symbol.valueDeclaration.kind === SyntaxKind.Parameter && - isPropertyParameterDeclaration(symbol.valueDeclaration)) { - result = result.concat(typeChecker.getSymbolOfParameterPropertyDeclaration(symbol.valueDeclaration, symbol.name)); + isParameterPropertyDeclaration(symbol.valueDeclaration)) { + result = result.concat(typeChecker.getSymbolsOfParameterPropertyDeclaration(symbol.valueDeclaration, symbol.name)); } // If this is a union property, add all the symbols from all its source symbols in all unioned types. diff --git a/tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration2.ts b/tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration2.ts index 2658dd56371..f5d6764205b 100644 --- a/tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration2.ts +++ b/tests/cases/fourslash/documentHighlightAtParameterPropertyDeclaration2.ts @@ -20,5 +20,5 @@ let markers = test.markers() for (let marker of markers) { goTo.position(marker.position); - verify.documentHighlightsAtPositionCount(3, ["file1.ts"]); + verify.documentHighlightsAtPositionCount(2, ["file1.ts"]); } \ No newline at end of file From c5df5d768e34486f6cff985d9ad521ec906a8e6a Mon Sep 17 00:00:00 2001 From: Yui T Date: Mon, 14 Dec 2015 12:57:02 -0800 Subject: [PATCH 10/61] Fix linting issue --- Jakefile.js | 3 +- src/services/services.ts | 1073 +++++++++++++++++++------------------- 2 files changed, 538 insertions(+), 538 deletions(-) diff --git a/Jakefile.js b/Jakefile.js index beb16d2886f..91bd805a27b 100644 --- a/Jakefile.js +++ b/Jakefile.js @@ -924,7 +924,8 @@ function lintFileAsync(options, path, cb) { var lintTargets = compilerSources .concat(harnessCoreSources) .concat(serverCoreSources) - .concat(scriptSources); + .concat(scriptSources) + .concat([path.join(servicesDirectory,"services.ts")]); desc("Runs tslint on the compiler sources"); task("lint", ["build-rules"], function() { diff --git a/src/services/services.ts b/src/services/services.ts index 8e2e4913edd..092f987eb5a 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -12,7 +12,7 @@ namespace ts { /** The version of the language service API */ - export let servicesVersion = "0.4" + export const servicesVersion = "0.4"; export interface Node { getSourceFile(): SourceFile; @@ -48,7 +48,7 @@ namespace ts { getConstructSignatures(): Signature[]; getStringIndexType(): Type; getNumberIndexType(): Type; - getBaseTypes(): ObjectType[] + getBaseTypes(): ObjectType[]; } export interface Signature { @@ -97,7 +97,7 @@ namespace ts { dispose?(): void; } - export module ScriptSnapshot { + export namespace ScriptSnapshot { class StringScriptSnapshot implements IScriptSnapshot { constructor(private text: string) { @@ -126,12 +126,12 @@ namespace ts { referencedFiles: FileReference[]; importedFiles: FileReference[]; ambientExternalModules: string[]; - isLibFile: boolean + isLibFile: boolean; } - let scanner: Scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ true); + const scanner: Scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ true); - let emptyArray: any[] = []; + const emptyArray: any[] = []; const jsDocTagNames = [ "augments", @@ -174,7 +174,7 @@ namespace ts { let jsDocCompletionEntries: CompletionEntry[]; function createNode(kind: SyntaxKind, pos: number, end: number, flags: NodeFlags, parent?: Node): NodeObject { - let node = new NodeObject(kind, pos, end); + const node = new NodeObject(kind, pos, end); node.flags = flags; node.parent = parent; return node; @@ -235,8 +235,8 @@ namespace ts { private addSyntheticNodes(nodes: Node[], pos: number, end: number): number { scanner.setTextPos(pos); while (pos < end) { - let token = scanner.scan(); - let textPos = scanner.getTextPos(); + const token = scanner.scan(); + const textPos = scanner.getTextPos(); nodes.push(createNode(token, pos, textPos, NodeFlags.Synthetic, this)); pos = textPos; } @@ -244,13 +244,11 @@ namespace ts { } private createSyntaxList(nodes: NodeArray): Node { - let list = createNode(SyntaxKind.SyntaxList, nodes.pos, nodes.end, NodeFlags.Synthetic, this); + const list = createNode(SyntaxKind.SyntaxList, nodes.pos, nodes.end, NodeFlags.Synthetic, this); list._children = []; let pos = nodes.pos; - - - for (let node of nodes) { + for (const node of nodes) { if (pos < node.pos) { pos = this.addSyntheticNodes(list._children, pos, node.pos); } @@ -269,14 +267,14 @@ namespace ts { scanner.setText((sourceFile || this.getSourceFile()).text); children = []; let pos = this.pos; - let processNode = (node: Node) => { + const processNode = (node: Node) => { if (pos < node.pos) { pos = this.addSyntheticNodes(children, pos, node.pos); } children.push(node); pos = node.end; }; - let processNodes = (nodes: NodeArray) => { + const processNodes = (nodes: NodeArray) => { if (pos < nodes.pos) { pos = this.addSyntheticNodes(children, pos, nodes.pos); } @@ -308,20 +306,20 @@ namespace ts { } public getFirstToken(sourceFile?: SourceFile): Node { - let children = this.getChildren(sourceFile); + const children = this.getChildren(sourceFile); if (!children.length) { return undefined; } - let child = children[0]; + const child = children[0]; return child.kind < SyntaxKind.FirstNode ? child : child.getFirstToken(sourceFile); } public getLastToken(sourceFile?: SourceFile): Node { - let children = this.getChildren(sourceFile); + const children = this.getChildren(sourceFile); - let child = lastOrUndefined(children); + const child = lastOrUndefined(children); if (!child) { return undefined; } @@ -366,8 +364,8 @@ namespace ts { } function getJsDocCommentsFromDeclarations(declarations: Declaration[], name: string, canUseParsedParamTagComments: boolean) { - let documentationComment = []; - let docComments = getJsDocCommentsSeparatedByNewLines(); + const documentationComment = []; + const docComments = getJsDocCommentsSeparatedByNewLines(); ts.forEach(docComments, docComment => { if (documentationComment.length) { documentationComment.push(lineBreakPart()); @@ -378,22 +376,22 @@ namespace ts { return documentationComment; function getJsDocCommentsSeparatedByNewLines() { - let paramTag = "@param"; - let jsDocCommentParts: SymbolDisplayPart[] = []; + const paramTag = "@param"; + const jsDocCommentParts: SymbolDisplayPart[] = []; ts.forEach(declarations, (declaration, indexOfDeclaration) => { // Make sure we are collecting doc comment from declaration once, // In case of union property there might be same declaration multiple times // which only varies in type parameter - // Eg. let a: Array | Array; a.length + // Eg. const a: Array | Array; a.length // The property length will have two declarations of property length coming // from Array - Array and Array if (indexOf(declarations, declaration) === indexOfDeclaration) { - let sourceFileOfDeclaration = getSourceFileOfNode(declaration); + const sourceFileOfDeclaration = getSourceFileOfNode(declaration); // If it is parameter - try and get the jsDoc comment with @param tag from function declaration's jsDoc comments if (canUseParsedParamTagComments && declaration.kind === SyntaxKind.Parameter) { ts.forEach(getJsDocCommentTextRange(declaration.parent, sourceFileOfDeclaration), jsDocCommentTextRange => { - let cleanedParamJsDocComment = getCleanedParamJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); + const cleanedParamJsDocComment = getCleanedParamJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); if (cleanedParamJsDocComment) { addRange(jsDocCommentParts, cleanedParamJsDocComment); } @@ -413,7 +411,7 @@ namespace ts { // Get the cleaned js doc comment text from the declaration ts.forEach(getJsDocCommentTextRange( declaration.kind === SyntaxKind.VariableDeclaration ? declaration.parent.parent : declaration, sourceFileOfDeclaration), jsDocCommentTextRange => { - let cleanedJsDocComment = getCleanedJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); + const cleanedJsDocComment = getCleanedJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); if (cleanedJsDocComment) { addRange(jsDocCommentParts, cleanedJsDocComment); } @@ -439,7 +437,7 @@ namespace ts { } for (; pos < end; pos++) { - let ch = sourceFile.text.charCodeAt(pos); + const ch = sourceFile.text.charCodeAt(pos); if (!isWhiteSpace(ch) || isLineBreak(ch)) { // Either found lineBreak or non whiteSpace return pos; @@ -480,7 +478,7 @@ namespace ts { function getCleanedJsDocComment(pos: number, end: number, sourceFile: SourceFile) { let spacesToRemoveAfterAsterisk: number; - let docComments: SymbolDisplayPart[] = []; + const docComments: SymbolDisplayPart[] = []; let blankLineCount = 0; let isInParamTag = false; @@ -491,7 +489,7 @@ namespace ts { // If the comment starts with '*' consume the spaces on this line if (pos < end && sourceFile.text.charCodeAt(pos) === CharacterCodes.asterisk) { - let lineStartPos = pos + 1; + const lineStartPos = pos + 1; pos = consumeWhiteSpacesOnTheLine(pos + 1, end, sourceFile, spacesToRemoveAfterAsterisk); // Set the spaces to remove after asterisk as margin if not already set @@ -505,7 +503,7 @@ namespace ts { // Analyse text on this line while (pos < end && !isLineBreak(sourceFile.text.charCodeAt(pos))) { - let ch = sourceFile.text.charAt(pos); + const ch = sourceFile.text.charAt(pos); if (ch === "@") { // If it is @param tag if (isParamTag(pos, end, sourceFile)) { @@ -544,7 +542,7 @@ namespace ts { function getCleanedParamJsDocComment(pos: number, end: number, sourceFile: SourceFile) { let paramHelpStringMargin: number; - let paramDocComments: SymbolDisplayPart[] = []; + const paramDocComments: SymbolDisplayPart[] = []; while (pos < end) { if (isParamTag(pos, end, sourceFile)) { let blankLineCount = 0; @@ -559,7 +557,7 @@ namespace ts { if (sourceFile.text.charCodeAt(pos) === CharacterCodes.openBrace) { pos++; for (let curlies = 1; pos < end; pos++) { - let charCode = sourceFile.text.charCodeAt(pos); + const charCode = sourceFile.text.charCodeAt(pos); // { character means we need to find another } to match the found one if (charCode === CharacterCodes.openBrace) { @@ -603,9 +601,9 @@ namespace ts { } let paramHelpString = ""; - let firstLineParamHelpStringPos = pos; + const firstLineParamHelpStringPos = pos; while (pos < end) { - let ch = sourceFile.text.charCodeAt(pos); + const ch = sourceFile.text.charCodeAt(pos); // at line break, set this comment line text and go to next line if (isLineBreak(ch)) { @@ -674,15 +672,15 @@ namespace ts { } // Now consume white spaces max - let startOfLinePos = pos; + const startOfLinePos = pos; pos = consumeWhiteSpacesOnTheLine(pos, end, sourceFile, paramHelpStringMargin); if (pos >= end) { return; } - let consumedSpaces = pos - startOfLinePos; + const consumedSpaces = pos - startOfLinePos; if (consumedSpaces < paramHelpStringMargin) { - let ch = sourceFile.text.charCodeAt(pos); + const ch = sourceFile.text.charCodeAt(pos); if (ch === CharacterCodes.asterisk) { // Consume more spaces after asterisk pos = consumeWhiteSpacesOnTheLine(pos + 1, end, sourceFile, paramHelpStringMargin - consumedSpaces - 1); @@ -815,7 +813,7 @@ namespace ts { private namedDeclarations: Map; constructor(kind: SyntaxKind, pos: number, end: number) { - super(kind, pos, end) + super(kind, pos, end); } public update(newText: string, textChangeRange: TextChangeRange): SourceFile { @@ -843,16 +841,16 @@ namespace ts { } private computeNamedDeclarations(): Map { - let result: Map = {}; + const result: Map = {}; forEachChild(this, visit); return result; function addDeclaration(declaration: Declaration) { - let name = getDeclarationName(declaration); + const name = getDeclarationName(declaration); if (name) { - let declarations = getDeclarations(name); + const declarations = getDeclarations(name); declarations.push(declaration); } } @@ -863,13 +861,13 @@ namespace ts { function getDeclarationName(declaration: Declaration) { if (declaration.name) { - let result = getTextOfIdentifierOrLiteral(declaration.name); + const result = getTextOfIdentifierOrLiteral(declaration.name); if (result !== undefined) { return result; } if (declaration.name.kind === SyntaxKind.ComputedPropertyName) { - let expr = (declaration.name).expression; + const expr = (declaration.name).expression; if (expr.kind === SyntaxKind.PropertyAccessExpression) { return (expr).name.text; } @@ -899,12 +897,12 @@ namespace ts { case SyntaxKind.FunctionDeclaration: case SyntaxKind.MethodDeclaration: case SyntaxKind.MethodSignature: - let functionDeclaration = node; - let declarationName = getDeclarationName(functionDeclaration); + const functionDeclaration = node; + const declarationName = getDeclarationName(functionDeclaration); if (declarationName) { - let declarations = getDeclarations(declarationName); - let lastDeclaration = lastOrUndefined(declarations); + const declarations = getDeclarations(declarationName); + const lastDeclaration = lastOrUndefined(declarations); // Check whether this declaration belongs to an "overload group". if (lastDeclaration && functionDeclaration.parent === lastDeclaration.parent && functionDeclaration.symbol === lastDeclaration.symbol) { @@ -980,7 +978,7 @@ namespace ts { break; case SyntaxKind.ImportDeclaration: - let importClause = (node).importClause; + const importClause = (node).importClause; if (importClause) { // Handle default import case e.g.: // import d from "mod"; @@ -1113,8 +1111,8 @@ namespace ts { } export interface Classifications { - spans: number[], - endOfLineState: EndOfLineState + spans: number[]; + endOfLineState: EndOfLineState; } export interface ClassifiedSpan { @@ -1171,7 +1169,7 @@ namespace ts { highlightSpans: HighlightSpan[]; } - export module HighlightSpanKind { + export namespace HighlightSpanKind { export const none = "none"; export const definition = "definition"; export const reference = "reference"; @@ -1220,7 +1218,7 @@ namespace ts { InsertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: boolean; PlaceOpenBraceOnNewLineForFunctions: boolean; PlaceOpenBraceOnNewLineForControlBlocks: boolean; - [s: string]: boolean | number| string; + [s: string]: boolean | number | string; } export interface DefinitionInfo { @@ -1500,7 +1498,7 @@ namespace ts { } // TODO: move these to enums - export module ScriptElementKind { + export namespace ScriptElementKind { export const unknown = ""; export const warning = "warning"; @@ -1529,7 +1527,7 @@ namespace ts { export const enumElement = "enum"; // Inside module and script only - // let v = .. + // const v = .. export const variableElement = "var"; // Inside function @@ -1581,7 +1579,7 @@ namespace ts { export const letElement = "let"; } - export module ScriptElementKindModifier { + export namespace ScriptElementKindModifier { export const none = ""; export const publicMemberModifier = "public"; export const privateMemberModifier = "private"; @@ -1723,8 +1721,8 @@ namespace ts { this.fileNameToEntry = createFileMap(); // Initialize the list with the root file names - let rootFileNames = host.getScriptFileNames(); - for (let fileName of rootFileNames) { + const rootFileNames = host.getScriptFileNames(); + for (const fileName of rootFileNames) { this.createEntry(fileName, toPath(fileName, this.currentDirectory, getCanonicalFileName)); } @@ -1738,7 +1736,7 @@ namespace ts { private createEntry(fileName: string, path: Path) { let entry: HostFileInformation; - let scriptSnapshot = this.host.getScriptSnapshot(fileName); + const scriptSnapshot = this.host.getScriptSnapshot(fileName); if (scriptSnapshot) { entry = { hostFileName: fileName, @@ -1760,7 +1758,7 @@ namespace ts { } public getOrCreateEntry(fileName: string): HostFileInformation { - let path = toPath(fileName, this.currentDirectory, this.getCanonicalFileName) + const path = toPath(fileName, this.currentDirectory, this.getCanonicalFileName); if (this.contains(path)) { return this.getEntry(path); } @@ -1769,7 +1767,7 @@ namespace ts { } public getRootFileNames(): string[] { - let fileNames: string[] = []; + const fileNames: string[] = []; this.fileNameToEntry.forEachValue((path, value) => { if (value) { @@ -1781,12 +1779,12 @@ namespace ts { } public getVersion(path: Path): string { - let file = this.getEntry(path); + const file = this.getEntry(path); return file && file.version; } public getScriptSnapshot(path: Path): IScriptSnapshot { - let file = this.getEntry(path); + const file = this.getEntry(path); return file && file.scriptSnapshot; } } @@ -1803,22 +1801,22 @@ namespace ts { } public getCurrentSourceFile(fileName: string): SourceFile { - let scriptSnapshot = this.host.getScriptSnapshot(fileName); + const scriptSnapshot = this.host.getScriptSnapshot(fileName); if (!scriptSnapshot) { // The host does not know about this file. throw new Error("Could not find file: '" + fileName + "'."); } - let version = this.host.getScriptVersion(fileName); + const version = this.host.getScriptVersion(fileName); let sourceFile: SourceFile; if (this.currentFileName !== fileName) { // This is a new file, just parse it - sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, ScriptTarget.Latest, version, /*setNodeParents:*/ true); + sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, ScriptTarget.Latest, version, /*setNodeParents*/ true); } else if (this.currentFileVersion !== version) { // This is the same file, just a newer version. Incrementally parse the file. - let editRange = scriptSnapshot.getChangeRange(this.currentFileScriptSnapshot); + const editRange = scriptSnapshot.getChangeRange(this.currentFileScriptSnapshot); sourceFile = updateLanguageServiceSourceFile(this.currentSourceFile, scriptSnapshot, version, editRange); } @@ -1863,7 +1861,7 @@ namespace ts { * - noResolve = true */ export function transpileModule(input: string, transpileOptions: TranspileOptions): TranspileOutput { - let options = transpileOptions.compilerOptions ? clone(transpileOptions.compilerOptions) : getDefaultCompilerOptions(); + const options = transpileOptions.compilerOptions ? clone(transpileOptions.compilerOptions) : getDefaultCompilerOptions(); options.isolatedModules = true; @@ -1879,21 +1877,22 @@ namespace ts { options.noResolve = true; // if jsx is specified then treat file as .tsx - let inputFileName = transpileOptions.fileName || (options.jsx ? "module.tsx" : "module.ts"); - let sourceFile = createSourceFile(inputFileName, input, options.target); + const inputFileName = transpileOptions.fileName || (options.jsx ? "module.tsx" : "module.ts"); + const sourceFile = createSourceFile(inputFileName, input, options.target); if (transpileOptions.moduleName) { sourceFile.moduleName = transpileOptions.moduleName; } sourceFile.renamedDependencies = transpileOptions.renamedDependencies; - let newLine = getNewLineCharacter(options); + const newLine = getNewLineCharacter(options); // Output let outputText: string; let sourceMapText: string; + // Create a compilerHost object to allow the compiler to read and write files - let compilerHost: CompilerHost = { + const compilerHost: CompilerHost = { getSourceFile: (fileName, target) => fileName === normalizeSlashes(inputFileName) ? sourceFile : undefined, writeFile: (name, text, writeByteOrderMark) => { if (fileExtensionIs(name, ".map")) { @@ -1914,7 +1913,7 @@ namespace ts { readFile: (fileName): string => "" }; - let program = createProgram([inputFileName], options, compilerHost); + const program = createProgram([inputFileName], options, compilerHost); let diagnostics: Diagnostic[]; if (transpileOptions.reportDiagnostics) { @@ -1934,22 +1933,22 @@ namespace ts { * This is a shortcut function for transpileModule - it accepts transpileOptions as parameters and returns only outputText part of the result. */ export function transpile(input: string, compilerOptions?: CompilerOptions, fileName?: string, diagnostics?: Diagnostic[], moduleName?: string): string { - let output = transpileModule(input, { compilerOptions, fileName, reportDiagnostics: !!diagnostics, moduleName }); + const output = transpileModule(input, { compilerOptions, fileName, reportDiagnostics: !!diagnostics, moduleName }); // addRange correctly handles cases when wither 'from' or 'to' argument is missing addRange(diagnostics, output.diagnostics); return output.outputText; } export function createLanguageServiceSourceFile(fileName: string, scriptSnapshot: IScriptSnapshot, scriptTarget: ScriptTarget, version: string, setNodeParents: boolean): SourceFile { - let text = scriptSnapshot.getText(0, scriptSnapshot.getLength()); - let sourceFile = createSourceFile(fileName, text, scriptTarget, setNodeParents); + const text = scriptSnapshot.getText(0, scriptSnapshot.getLength()); + const sourceFile = createSourceFile(fileName, text, scriptTarget, setNodeParents); setSourceFileFields(sourceFile, scriptSnapshot, version); // after full parsing we can use table with interned strings as name table sourceFile.nameTable = sourceFile.identifiers; return sourceFile; } - export let disableIncrementalParsing = false; + export const disableIncrementalParsing = false; export function updateLanguageServiceSourceFile(sourceFile: SourceFile, scriptSnapshot: IScriptSnapshot, version: string, textChangeRange: TextChangeRange, aggressiveChecks?: boolean): SourceFile { // If we were given a text change range, and our version or open-ness changed, then @@ -1961,12 +1960,12 @@ namespace ts { let newText: string; // grab the fragment from the beginning of the original text to the beginning of the span - let prefix = textChangeRange.span.start !== 0 + const prefix = textChangeRange.span.start !== 0 ? sourceFile.text.substr(0, textChangeRange.span.start) : ""; // grab the fragment from the end of the span till the end of the original text - let suffix = textSpanEnd(textChangeRange.span) !== sourceFile.text.length + const suffix = textSpanEnd(textChangeRange.span) !== sourceFile.text.length ? sourceFile.text.substr(textSpanEnd(textChangeRange.span)) : ""; @@ -1976,7 +1975,7 @@ namespace ts { } else { // it was actual edit, fetch the fragment of new text that correspond to new span - let changedText = scriptSnapshot.getText(textChangeRange.span.start, textChangeRange.span.start + textChangeRange.newLength); + const changedText = scriptSnapshot.getText(textChangeRange.span.start, textChangeRange.span.start + textChangeRange.newLength); // combine prefix, changed text and suffix newText = prefix && suffix ? prefix + changedText + suffix @@ -1985,7 +1984,7 @@ namespace ts { : (changedText + suffix); } - let newSourceFile = updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks); + const newSourceFile = updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks); setSourceFileFields(newSourceFile, scriptSnapshot, version); // after incremental parsing nameTable might not be up-to-date // drop it so it can be lazily recreated later @@ -2006,7 +2005,7 @@ namespace ts { } // Otherwise, just create a new source file. - return createLanguageServiceSourceFile(sourceFile.fileName, scriptSnapshot, sourceFile.languageVersion, version, /*setNodeParents:*/ true); + return createLanguageServiceSourceFile(sourceFile.fileName, scriptSnapshot, sourceFile.languageVersion, version, /*setNodeParents*/ true); } export function createGetCanonicalFileName(useCaseSensitivefileNames: boolean): (fileName: string) => string { @@ -2019,15 +2018,15 @@ namespace ts { export function createDocumentRegistry(useCaseSensitiveFileNames?: boolean, currentDirectory = ""): DocumentRegistry { // Maps from compiler setting target (ES3, ES5, etc.) to all the cached documents we have // for those settings. - let buckets: Map> = {}; - let getCanonicalFileName = createGetCanonicalFileName(!!useCaseSensitiveFileNames); + const buckets: Map> = {}; + const getCanonicalFileName = createGetCanonicalFileName(!!useCaseSensitiveFileNames); function getKeyFromCompilationSettings(settings: CompilerOptions): string { return "_" + settings.target + "|" + settings.module + "|" + settings.noResolve + "|" + settings.jsx + +"|" + settings.allowJs; } function getBucketForCompilationSettings(settings: CompilerOptions, createIfMissing: boolean): FileMap { - let key = getKeyFromCompilationSettings(settings); + const key = getKeyFromCompilationSettings(settings); let bucket = lookUp(buckets, key); if (!bucket && createIfMissing) { buckets[key] = bucket = createFileMap(); @@ -2036,9 +2035,9 @@ namespace ts { } function reportStats() { - let bucketInfoArray = Object.keys(buckets).filter(name => name && name.charAt(0) === '_').map(name => { - let entries = lookUp(buckets, name); - let sourceFiles: { name: string; refCount: number; references: string[]; }[] = []; + const bucketInfoArray = Object.keys(buckets).filter(name => name && name.charAt(0) === "_").map(name => { + const entries = lookUp(buckets, name); + const sourceFiles: { name: string; refCount: number; references: string[]; }[] = []; entries.forEachValue((key, entry) => { sourceFiles.push({ name: key, @@ -2052,15 +2051,15 @@ namespace ts { sourceFiles }; }); - return JSON.stringify(bucketInfoArray, null, 2); + return JSON.stringify(bucketInfoArray, undefined, 2); } function acquireDocument(fileName: string, compilationSettings: CompilerOptions, scriptSnapshot: IScriptSnapshot, version: string): SourceFile { - return acquireOrUpdateDocument(fileName, compilationSettings, scriptSnapshot, version, /*acquiring:*/ true); + return acquireOrUpdateDocument(fileName, compilationSettings, scriptSnapshot, version, /*acquiring*/ true); } function updateDocument(fileName: string, compilationSettings: CompilerOptions, scriptSnapshot: IScriptSnapshot, version: string): SourceFile { - return acquireOrUpdateDocument(fileName, compilationSettings, scriptSnapshot, version, /*acquiring:*/ false); + return acquireOrUpdateDocument(fileName, compilationSettings, scriptSnapshot, version, /*acquiring*/ false); } function acquireOrUpdateDocument( @@ -2070,14 +2069,14 @@ namespace ts { version: string, acquiring: boolean): SourceFile { - let bucket = getBucketForCompilationSettings(compilationSettings, /*createIfMissing*/ true); - let path = toPath(fileName, currentDirectory, getCanonicalFileName); + const bucket = getBucketForCompilationSettings(compilationSettings, /*createIfMissing*/ true); + const path = toPath(fileName, currentDirectory, getCanonicalFileName); let entry = bucket.get(path); if (!entry) { Debug.assert(acquiring, "How could we be trying to update a document that the registry doesn't have?"); // Have never seen this file with these settings. Create a new source file for it. - let sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, compilationSettings.target, version, /*setNodeParents:*/ false); + const sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, compilationSettings.target, version, /*setNodeParents*/ false); entry = { sourceFile: sourceFile, @@ -2109,12 +2108,12 @@ namespace ts { } function releaseDocument(fileName: string, compilationSettings: CompilerOptions): void { - let bucket = getBucketForCompilationSettings(compilationSettings, false); + const bucket = getBucketForCompilationSettings(compilationSettings, /*createIfMissing*/false); Debug.assert(bucket !== undefined); - let path = toPath(fileName, currentDirectory, getCanonicalFileName); + const path = toPath(fileName, currentDirectory, getCanonicalFileName); - let entry = bucket.get(path); + const entry = bucket.get(path); entry.languageServiceRefCount--; Debug.assert(entry.languageServiceRefCount >= 0); @@ -2132,19 +2131,19 @@ namespace ts { } export function preProcessFile(sourceText: string, readImportFiles = true, detectJavaScriptImports = false): PreProcessedFileInfo { - let referencedFiles: FileReference[] = []; - let importedFiles: FileReference[] = []; + const referencedFiles: FileReference[] = []; + const importedFiles: FileReference[] = []; let ambientExternalModules: string[]; let isNoDefaultLib = false; function processTripleSlashDirectives(): void { - let commentRanges = getLeadingCommentRanges(sourceText, 0); + const commentRanges = getLeadingCommentRanges(sourceText, 0); forEach(commentRanges, commentRange => { - let comment = sourceText.substring(commentRange.pos, commentRange.end); - let referencePathMatchResult = getFileReferenceFromReferencePath(comment, commentRange); + const comment = sourceText.substring(commentRange.pos, commentRange.end); + const referencePathMatchResult = getFileReferenceFromReferencePath(comment, commentRange); if (referencePathMatchResult) { isNoDefaultLib = referencePathMatchResult.isNoDefaultLib; - let fileReference = referencePathMatchResult.fileReference; + const fileReference = referencePathMatchResult.fileReference; if (fileReference) { referencedFiles.push(fileReference); } @@ -2160,8 +2159,8 @@ namespace ts { } function recordModuleName() { - let importPath = scanner.getTokenValue(); - let pos = scanner.getTokenPos(); + const importPath = scanner.getTokenValue(); + const pos = scanner.getTokenPos(); importedFiles.push({ fileName: importPath, pos: pos, @@ -2213,7 +2212,7 @@ namespace ts { } } else if (token === SyntaxKind.EqualsToken) { - if (tryConsumeRequireCall(/* skipCurrentToken */ true)) { + if (tryConsumeRequireCall(/*skipCurrentToken*/ true)) { return true; } } @@ -2311,7 +2310,7 @@ namespace ts { if (token === SyntaxKind.Identifier || isKeyword(token)) { token = scanner.scan(); if (token === SyntaxKind.EqualsToken) { - if (tryConsumeRequireCall(/* skipCurrentToken */ true)) { + if (tryConsumeRequireCall(/*skipCurrentToken*/ true)) { return true; } } @@ -2410,7 +2409,7 @@ namespace ts { if (tryConsumeDeclare() || tryConsumeImport() || tryConsumeExport() || - (detectJavaScriptImports && (tryConsumeRequireCall(/* skipCurrentToken */ false) || tryConsumeDefine()))) { + (detectJavaScriptImports && (tryConsumeRequireCall(/*skipCurrentToken*/ false) || tryConsumeDefine()))) { continue; } else { @@ -2550,8 +2549,8 @@ namespace ts { return true; } else if (position === comment.end) { - let text = sourceFile.text; - let width = comment.end - comment.pos; + const text = sourceFile.text; + const width = comment.end - comment.pos; // is single line comment or just /* if (width <= 2 || text.charCodeAt(comment.pos + 1) === CharacterCodes.slash) { return true; @@ -2583,7 +2582,7 @@ namespace ts { } // A cache of completion entries for keywords, these do not change between sessions - let keywordCompletions: CompletionEntry[] = []; + const keywordCompletions: CompletionEntry[] = []; for (let i = SyntaxKind.FirstKeyword; i <= SyntaxKind.LastKeyword; i++) { keywordCompletions.push({ name: tokenToString(i), @@ -2673,15 +2672,15 @@ namespace ts { export function createLanguageService(host: LanguageServiceHost, documentRegistry: DocumentRegistry = createDocumentRegistry(host.useCaseSensitiveFileNames && host.useCaseSensitiveFileNames(), host.getCurrentDirectory())): LanguageService { - let syntaxTreeCache: SyntaxTreeCache = new SyntaxTreeCache(host); + const syntaxTreeCache: SyntaxTreeCache = new SyntaxTreeCache(host); let ruleProvider: formatting.RulesProvider; let program: Program; let lastProjectVersion: string; - let useCaseSensitivefileNames = false; - let cancellationToken = new CancellationTokenObject(host.getCancellationToken && host.getCancellationToken()); + const useCaseSensitivefileNames = false; + const cancellationToken = new CancellationTokenObject(host.getCancellationToken && host.getCancellationToken()); - let currentDirectory = host.getCurrentDirectory(); + const currentDirectory = host.getCurrentDirectory(); // Check if the localized messages json is set, otherwise query the host for it if (!localizedDiagnosticMessages && host.getLocalizedDiagnosticMessages) { localizedDiagnosticMessages = host.getLocalizedDiagnosticMessages(); @@ -2693,10 +2692,10 @@ namespace ts { } } - let getCanonicalFileName = createGetCanonicalFileName(useCaseSensitivefileNames); + const getCanonicalFileName = createGetCanonicalFileName(useCaseSensitivefileNames); function getValidSourceFile(fileName: string): SourceFile { - let sourceFile = program.getSourceFile(fileName); + const sourceFile = program.getSourceFile(fileName); if (!sourceFile) { throw new Error("Could not find file: '" + fileName + "'."); } @@ -2716,7 +2715,7 @@ namespace ts { function synchronizeHostData(): void { // perform fast check if host supports it if (host.getProjectVersion) { - let hostProjectVersion = host.getProjectVersion(); + const hostProjectVersion = host.getProjectVersion(); if (hostProjectVersion) { if (lastProjectVersion === hostProjectVersion) { return; @@ -2740,17 +2739,17 @@ namespace ts { // the program points to old source files that have been invalidated because of // incremental parsing. - let oldSettings = program && program.getCompilerOptions(); - let newSettings = hostCache.compilationSettings(); - let changesInCompilationSettingsAffectSyntax = oldSettings && + const oldSettings = program && program.getCompilerOptions(); + const newSettings = hostCache.compilationSettings(); + const changesInCompilationSettingsAffectSyntax = oldSettings && (oldSettings.target !== newSettings.target || oldSettings.module !== newSettings.module || oldSettings.noResolve !== newSettings.noResolve || - oldSettings.jsx !== newSettings.jsx || + oldSettings.jsx !== newSettings.jsx || oldSettings.allowJs !== newSettings.allowJs); // Now create a new compiler - let compilerHost: CompilerHost = { + const compilerHost: CompilerHost = { getSourceFile: getOrCreateSourceFile, getCancellationToken: () => cancellationToken, getCanonicalFileName, @@ -2766,22 +2765,22 @@ namespace ts { }, readFile: (fileName): string => { // stub missing host functionality - let entry = hostCache.getOrCreateEntry(fileName); + const entry = hostCache.getOrCreateEntry(fileName); return entry && entry.scriptSnapshot.getText(0, entry.scriptSnapshot.getLength()); } }; if (host.resolveModuleNames) { - compilerHost.resolveModuleNames = (moduleNames, containingFile) => host.resolveModuleNames(moduleNames, containingFile) + compilerHost.resolveModuleNames = (moduleNames, containingFile) => host.resolveModuleNames(moduleNames, containingFile); } - let newProgram = createProgram(hostCache.getRootFileNames(), newSettings, compilerHost, program); + const newProgram = createProgram(hostCache.getRootFileNames(), newSettings, compilerHost, program); // Release any files we have acquired in the old program but are // not part of the new program. if (program) { - let oldSourceFiles = program.getSourceFiles(); - for (let oldSourceFile of oldSourceFiles) { + const oldSourceFiles = program.getSourceFiles(); + for (const oldSourceFile of oldSourceFiles) { if (!newProgram.getSourceFile(oldSourceFile.fileName) || changesInCompilationSettingsAffectSyntax) { documentRegistry.releaseDocument(oldSourceFile.fileName, oldSettings); } @@ -2804,7 +2803,7 @@ namespace ts { // The program is asking for this file, check first if the host can locate it. // If the host can not locate the file, then it does not exist. return undefined // to the program to allow reporting of errors for missing files. - let hostFileInformation = hostCache.getOrCreateEntry(fileName); + const hostFileInformation = hostCache.getOrCreateEntry(fileName); if (!hostFileInformation) { return undefined; } @@ -2814,7 +2813,7 @@ namespace ts { // can not be reused. we have to dump all syntax trees and create new ones. if (!changesInCompilationSettingsAffectSyntax) { // Check if the old program had this file already - let oldSourceFile = program && program.getSourceFile(fileName); + const oldSourceFile = program && program.getSourceFile(fileName); if (oldSourceFile) { // We already had a source file for this file name. Go to the registry to // ensure that we get the right up to date version of it. We need this to @@ -2851,7 +2850,7 @@ namespace ts { if (!sourceFile) { return false; } - let path = sourceFile.path || toPath(sourceFile.fileName, currentDirectory, getCanonicalFileName); + const path = sourceFile.path || toPath(sourceFile.fileName, currentDirectory, getCanonicalFileName); return sourceFile.version === hostCache.getVersion(path); } @@ -2862,13 +2861,13 @@ namespace ts { } // If number of files in the program do not match, it is not up-to-date - let rootFileNames = hostCache.getRootFileNames(); + const rootFileNames = hostCache.getRootFileNames(); if (program.getSourceFiles().length !== rootFileNames.length) { return false; } // If any file is not up-to-date, then the whole program is not up-to-date - for (let fileName of rootFileNames) { + for (const fileName of rootFileNames) { if (!sourceFileUpToDate(program.getSourceFile(fileName))) { return false; } @@ -2910,18 +2909,18 @@ namespace ts { function getSemanticDiagnostics(fileName: string): Diagnostic[] { synchronizeHostData(); - let targetSourceFile = getValidSourceFile(fileName); + const targetSourceFile = getValidSourceFile(fileName); // Only perform the action per file regardless of '-out' flag as LanguageServiceHost is expected to call this function per file. // Therefore only get diagnostics for given file. - let semanticDiagnostics = program.getSemanticDiagnostics(targetSourceFile, cancellationToken); + const semanticDiagnostics = program.getSemanticDiagnostics(targetSourceFile, cancellationToken); if (!program.getCompilerOptions().declaration) { return semanticDiagnostics; } // If '-d' is enabled, check for emitter error. One example of emitter error is export class implements non-export interface - let declarationDiagnostics = program.getDeclarationDiagnostics(targetSourceFile, cancellationToken); + const declarationDiagnostics = program.getDeclarationDiagnostics(targetSourceFile, cancellationToken); return concatenate(semanticDiagnostics, declarationDiagnostics); } @@ -2937,14 +2936,14 @@ namespace ts { * @return undefined if the name is of external module otherwise a name with striped of any quote */ function getCompletionEntryDisplayNameForSymbol(symbol: Symbol, target: ScriptTarget, performCharacterChecks: boolean, location: Node): string { - let displayName: string = getDeclaredName(program.getTypeChecker(), symbol, location); + const displayName: string = getDeclaredName(program.getTypeChecker(), symbol, location); if (displayName) { - let firstCharCode = displayName.charCodeAt(0); + const firstCharCode = displayName.charCodeAt(0); // First check of the displayName is not external module; if it is an external module, it is not valid entry if ((symbol.flags & SymbolFlags.Namespace) && (firstCharCode === CharacterCodes.singleQuote || firstCharCode === CharacterCodes.doubleQuote)) { // If the symbol is external module, don't show it in the completion list - // (i.e declare module "http" { let x; } | // <= request completion here, "http" should not be there) + // (i.e declare module "http" { const x; } | // <= request completion here, "http" should not be there) return undefined; } } @@ -2987,20 +2986,20 @@ namespace ts { } function getCompletionData(fileName: string, position: number) { - let typeChecker = program.getTypeChecker(); - let syntacticStart = new Date().getTime(); - let sourceFile = getValidSourceFile(fileName); - let isJavaScriptFile = isSourceFileJavaScript(sourceFile); + const typeChecker = program.getTypeChecker(); + const syntacticStart = new Date().getTime(); + const sourceFile = getValidSourceFile(fileName); + const isJavaScriptFile = isSourceFileJavaScript(sourceFile); let isJsDocTagName = false; let start = new Date().getTime(); - let currentToken = getTokenAtPosition(sourceFile, position); + const currentToken = getTokenAtPosition(sourceFile, position); log("getCompletionData: Get current token: " + (new Date().getTime() - start)); start = new Date().getTime(); // Completion not allowed inside comments, bail out if this is the case - let insideComment = isInsideComment(sourceFile, currentToken, position); + const insideComment = isInsideComment(sourceFile, currentToken, position); log("getCompletionData: Is inside comment: " + (new Date().getTime() - start)); if (insideComment) { @@ -3014,7 +3013,7 @@ namespace ts { // /** @type {number | string} */ // Completion should work in the brackets let insideJsDocTagExpression = false; - let tag = getJsDocTagAtPosition(sourceFile, position); + const tag = getJsDocTagAtPosition(sourceFile, position); if (tag) { if (tag.tagName.pos <= position && position <= tag.tagName.end) { isJsDocTagName = true; @@ -3024,7 +3023,7 @@ namespace ts { case SyntaxKind.JSDocTypeTag: case SyntaxKind.JSDocParameterTag: case SyntaxKind.JSDocReturnTag: - let tagWithExpression = tag; + const tagWithExpression = tag; if (tagWithExpression.typeExpression) { insideJsDocTagExpression = tagWithExpression.typeExpression.pos < position && position < tagWithExpression.typeExpression.end; } @@ -3045,7 +3044,7 @@ namespace ts { } start = new Date().getTime(); - let previousToken = findPrecedingToken(position, sourceFile); + const previousToken = findPrecedingToken(position, sourceFile); log("getCompletionData: Get previous token 1: " + (new Date().getTime() - start)); // The decision to provide completion depends on the contextToken, which is determined through the previousToken. @@ -3055,7 +3054,7 @@ namespace ts { // Check if the caret is at the end of an identifier; this is a partial identifier that we want to complete: e.g. a.toS| // Skip this partial identifier and adjust the contextToken to the token that precedes it. if (contextToken && position <= contextToken.end && isWord(contextToken.kind)) { - let start = new Date().getTime(); + const start = new Date().getTime(); contextToken = findPrecedingToken(contextToken.getFullStart(), sourceFile); log("getCompletionData: Get previous token 2: " + (new Date().getTime() - start)); } @@ -3076,7 +3075,7 @@ namespace ts { return undefined; } - let { parent, kind } = contextToken; + const { parent, kind } = contextToken; if (kind === SyntaxKind.DotToken) { if (parent.kind === SyntaxKind.PropertyAccessExpression) { node = (contextToken.parent).expression; @@ -3103,7 +3102,7 @@ namespace ts { } } - let semanticStart = new Date().getTime(); + const semanticStart = new Date().getTime(); let isMemberCompletion: boolean; let isNewIdentifierLocation: boolean; let symbols: Symbol[] = []; @@ -3112,7 +3111,7 @@ namespace ts { getTypeScriptMemberSymbols(); } else if (isRightOfOpenTag) { - let tagSymbols = typeChecker.getJsxIntrinsicTagNames(); + const tagSymbols = typeChecker.getJsxIntrinsicTagNames(); if (tryGetGlobalSymbols()) { symbols = tagSymbols.concat(symbols.filter(s => !!(s.flags & SymbolFlags.Value))); } @@ -3123,7 +3122,7 @@ namespace ts { isNewIdentifierLocation = false; } else if (isStartingCloseTag) { - let tagName = (contextToken.parent.parent).openingElement.tagName; + const tagName = (contextToken.parent.parent).openingElement.tagName; symbols = [typeChecker.getSymbolAtLocation(tagName)]; isMemberCompletion = true; @@ -3157,7 +3156,7 @@ namespace ts { if (symbol && symbol.flags & SymbolFlags.HasExports) { // Extract module or enum members - let exportedSymbols = typeChecker.getExportsOfModule(symbol); + const exportedSymbols = typeChecker.getExportsOfModule(symbol); forEach(exportedSymbols, symbol => { if (typeChecker.isValidPropertyAccess((node.parent), symbol.name)) { symbols.push(symbol); @@ -3166,14 +3165,14 @@ namespace ts { } } - let type = typeChecker.getTypeAtLocation(node); + const type = typeChecker.getTypeAtLocation(node); addTypeProperties(type); } function addTypeProperties(type: Type) { if (type) { // Filter private properties - for (let symbol of type.getApparentProperties()) { + for (const symbol of type.getApparentProperties()) { if (typeChecker.isValidPropertyAccess((node.parent), symbol.name)) { symbols.push(symbol); } @@ -3185,8 +3184,8 @@ namespace ts { // each individual type has. This is because we're going to add all identifiers // anyways. So we might as well elevate the members that were at least part // of the individual types to a higher status since we know what they are. - let unionType = type; - for (let elementType of unionType.types) { + const unionType = type; + for (const elementType of unionType.types) { addTypeProperties(elementType); } } @@ -3256,14 +3255,14 @@ namespace ts { // - 'contextToken' was adjusted to the token prior to 'previousToken' // because we were at the end of an identifier. // - 'previousToken' is defined. - let adjustedPosition = previousToken !== contextToken ? + const adjustedPosition = previousToken !== contextToken ? previousToken.getStart() : position; - let scopeNode = getScopeNode(contextToken, adjustedPosition, sourceFile) || sourceFile; + const scopeNode = getScopeNode(contextToken, adjustedPosition, sourceFile) || sourceFile; /// TODO filter meaning based on the current context - let symbolMeanings = SymbolFlags.Type | SymbolFlags.Value | SymbolFlags.Namespace | SymbolFlags.Alias; + const symbolMeanings = SymbolFlags.Type | SymbolFlags.Value | SymbolFlags.Namespace | SymbolFlags.Alias; symbols = typeChecker.getSymbolsInScope(scopeNode, symbolMeanings); return true; @@ -3282,8 +3281,8 @@ namespace ts { } function isCompletionListBlocker(contextToken: Node): boolean { - let start = new Date().getTime(); - let result = isInStringOrRegularExpressionOrTemplateLiteral(contextToken) || + const start = new Date().getTime(); + const result = isInStringOrRegularExpressionOrTemplateLiteral(contextToken) || isSolelyIdentifierDefinitionLocation(contextToken) || isDotOfNumericLiteral(contextToken) || isInJsxText(contextToken); @@ -3310,27 +3309,27 @@ namespace ts { function isNewIdentifierDefinitionLocation(previousToken: Node): boolean { if (previousToken) { - let containingNodeKind = previousToken.parent.kind; + const containingNodeKind = previousToken.parent.kind; switch (previousToken.kind) { case SyntaxKind.CommaToken: return containingNodeKind === SyntaxKind.CallExpression // func( a, | || containingNodeKind === SyntaxKind.Constructor // constructor( a, | /* public, protected, private keywords are allowed here, so show completion */ || containingNodeKind === SyntaxKind.NewExpression // new C(a, | || containingNodeKind === SyntaxKind.ArrayLiteralExpression // [a, | - || containingNodeKind === SyntaxKind.BinaryExpression // let x = (a, | + || containingNodeKind === SyntaxKind.BinaryExpression // const x = (a, | || containingNodeKind === SyntaxKind.FunctionType; // var x: (s: string, list| case SyntaxKind.OpenParenToken: return containingNodeKind === SyntaxKind.CallExpression // func( | || containingNodeKind === SyntaxKind.Constructor // constructor( | || containingNodeKind === SyntaxKind.NewExpression // new C(a| - || containingNodeKind === SyntaxKind.ParenthesizedExpression // let x = (a| + || containingNodeKind === SyntaxKind.ParenthesizedExpression // const x = (a| || containingNodeKind === SyntaxKind.ParenthesizedType; // function F(pred: (a| /* this can become an arrow function, where 'a' is the argument */ case SyntaxKind.OpenBracketToken: return containingNodeKind === SyntaxKind.ArrayLiteralExpression // [ | || containingNodeKind === SyntaxKind.IndexSignature // [ | : string ] - || containingNodeKind === SyntaxKind.ComputedPropertyName // [ | /* this can become an index signature */ + || containingNodeKind === SyntaxKind.ComputedPropertyName; // [ | /* this can become an index signature */ case SyntaxKind.ModuleKeyword: // module | case SyntaxKind.NamespaceKeyword: // namespace | @@ -3343,7 +3342,7 @@ namespace ts { return containingNodeKind === SyntaxKind.ClassDeclaration; // class A{ | case SyntaxKind.EqualsToken: - return containingNodeKind === SyntaxKind.VariableDeclaration // let x = a| + return containingNodeKind === SyntaxKind.VariableDeclaration // const x = a| || containingNodeKind === SyntaxKind.BinaryExpression; // x = a| case SyntaxKind.TemplateHead: @@ -3375,8 +3374,8 @@ namespace ts { || contextToken.kind === SyntaxKind.StringLiteralType || contextToken.kind === SyntaxKind.RegularExpressionLiteral || isTemplateLiteralKind(contextToken.kind)) { - let start = contextToken.getStart(); - let end = contextToken.getEnd(); + const start = contextToken.getStart(); + const end = contextToken.getEnd(); // To be "in" one of these literals, the position has to be: // 1. entirely within the token text. @@ -3420,7 +3419,7 @@ namespace ts { // We are *only* completing on properties from the type being destructured. isNewIdentifierLocation = false; - let rootDeclaration = getRootDeclaration(objectLikeContainer.parent); + const rootDeclaration = getRootDeclaration(objectLikeContainer.parent); if (isVariableLike(rootDeclaration)) { // We don't want to complete using the type acquired by the shape // of the binding pattern; we are only interested in types acquired @@ -3431,7 +3430,7 @@ namespace ts { } } else { - Debug.fail("Root declaration is not variable-like.") + Debug.fail("Root declaration is not variable-like."); } } else { @@ -3442,7 +3441,7 @@ namespace ts { return false; } - let typeMembers = typeChecker.getPropertiesOfType(typeForObject); + const typeMembers = typeChecker.getPropertiesOfType(typeForObject); if (typeMembers && typeMembers.length > 0) { // Add filtered items to the completion list symbols = filterObjectMembersList(typeMembers, existingMembers); @@ -3466,11 +3465,11 @@ namespace ts { * @returns true if 'symbols' was successfully populated; false otherwise. */ function tryGetImportOrExportClauseCompletionSymbols(namedImportsOrExports: NamedImportsOrExports): boolean { - let declarationKind = namedImportsOrExports.kind === SyntaxKind.NamedImports ? + const declarationKind = namedImportsOrExports.kind === SyntaxKind.NamedImports ? SyntaxKind.ImportDeclaration : SyntaxKind.ExportDeclaration; - let importOrExportDeclaration = getAncestor(namedImportsOrExports, declarationKind); - let moduleSpecifier = importOrExportDeclaration.moduleSpecifier; + const importOrExportDeclaration = getAncestor(namedImportsOrExports, declarationKind); + const moduleSpecifier = importOrExportDeclaration.moduleSpecifier; if (!moduleSpecifier) { return false; @@ -3480,7 +3479,7 @@ namespace ts { isNewIdentifierLocation = false; let exports: Symbol[]; - let moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(importOrExportDeclaration.moduleSpecifier); + const moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(importOrExportDeclaration.moduleSpecifier); if (moduleSpecifierSymbol) { exports = typeChecker.getExportsOfModule(moduleSpecifierSymbol); } @@ -3497,9 +3496,9 @@ namespace ts { function tryGetObjectLikeCompletionContainer(contextToken: Node): ObjectLiteralExpression | BindingPattern { if (contextToken) { switch (contextToken.kind) { - case SyntaxKind.OpenBraceToken: // let x = { | - case SyntaxKind.CommaToken: // let x = { a: 0, | - let parent = contextToken.parent; + case SyntaxKind.OpenBraceToken: // const x = { | + case SyntaxKind.CommaToken: // const x = { a: 0, | + const parent = contextToken.parent; if (parent && (parent.kind === SyntaxKind.ObjectLiteralExpression || parent.kind === SyntaxKind.ObjectBindingPattern)) { return parent; } @@ -3532,8 +3531,8 @@ namespace ts { function tryGetContainingJsxElement(contextToken: Node): JsxOpeningLikeElement { if (contextToken) { - let parent = contextToken.parent; - switch(contextToken.kind) { + const parent = contextToken.parent; + switch (contextToken.kind) { case SyntaxKind.LessThanSlashToken: case SyntaxKind.SlashToken: case SyntaxKind.Identifier: @@ -3596,7 +3595,7 @@ namespace ts { * @returns true if we are certain that the currently edited location must define a new location; false otherwise. */ function isSolelyIdentifierDefinitionLocation(contextToken: Node): boolean { - let containingNodeKind = contextToken.parent.kind; + const containingNodeKind = contextToken.parent.kind; switch (contextToken.kind) { case SyntaxKind.CommaToken: return containingNodeKind === SyntaxKind.VariableDeclaration || @@ -3626,13 +3625,13 @@ namespace ts { case SyntaxKind.OpenBraceToken: return containingNodeKind === SyntaxKind.EnumDeclaration || // enum a { | containingNodeKind === SyntaxKind.InterfaceDeclaration || // interface a { | - containingNodeKind === SyntaxKind.TypeLiteral; // let x : { | + containingNodeKind === SyntaxKind.TypeLiteral; // const x : { | case SyntaxKind.SemicolonToken: return containingNodeKind === SyntaxKind.PropertySignature && contextToken.parent && contextToken.parent.parent && (contextToken.parent.parent.kind === SyntaxKind.InterfaceDeclaration || // interface a { f; | - contextToken.parent.parent.kind === SyntaxKind.TypeLiteral); // let x : { a; | + contextToken.parent.parent.kind === SyntaxKind.TypeLiteral); // const x : { a; | case SyntaxKind.LessThanToken: return containingNodeKind === SyntaxKind.ClassDeclaration || // class A< | @@ -3699,7 +3698,7 @@ namespace ts { function isDotOfNumericLiteral(contextToken: Node): boolean { if (contextToken.kind === SyntaxKind.NumericLiteral) { - let text = contextToken.getFullText(); + const text = contextToken.getFullText(); return text.charAt(text.length - 1) === "."; } @@ -3716,15 +3715,15 @@ namespace ts { * do not occur at the current position and have not otherwise been typed. */ function filterNamedImportOrExportCompletionItems(exportsOfModule: Symbol[], namedImportsOrExports: ImportOrExportSpecifier[]): Symbol[] { - let exisingImportsOrExports: Map = {}; + const exisingImportsOrExports: Map = {}; - for (let element of namedImportsOrExports) { + for (const element of namedImportsOrExports) { // If this is the current item we are editing right now, do not filter it out if (element.getStart() <= position && position <= element.getEnd()) { continue; } - let name = element.propertyName || element.name; + const name = element.propertyName || element.name; exisingImportsOrExports[name.text] = true; } @@ -3746,8 +3745,8 @@ namespace ts { return contextualMemberSymbols; } - let existingMemberNames: Map = {}; - for (let m of existingMembers) { + const existingMemberNames: Map = {}; + for (const m of existingMembers) { // Ignore omitted expressions for missing members if (m.kind !== SyntaxKind.PropertyAssignment && m.kind !== SyntaxKind.ShorthandPropertyAssignment && @@ -3766,7 +3765,7 @@ namespace ts { if (m.kind === SyntaxKind.BindingElement && (m).propertyName) { // include only identifiers in completion list if ((m).propertyName.kind === SyntaxKind.Identifier) { - existingName = ((m).propertyName).text + existingName = ((m).propertyName).text; } } else { @@ -3789,8 +3788,8 @@ namespace ts { * do not occur at the current position and have not otherwise been typed. */ function filterJsxAttributes(symbols: Symbol[], attributes: NodeArray): Symbol[] { - let seenNames: Map = {}; - for (let attr of attributes) { + const seenNames: Map = {}; + for (const attr of attributes) { // If this is the current item we are editing right now, do not filter it out if (attr.getStart() <= position && position <= attr.getEnd()) { continue; @@ -3809,21 +3808,21 @@ namespace ts { function getCompletionsAtPosition(fileName: string, position: number): CompletionInfo { synchronizeHostData(); - let completionData = getCompletionData(fileName, position); + const completionData = getCompletionData(fileName, position); if (!completionData) { return undefined; } - let { symbols, isMemberCompletion, isNewIdentifierLocation, location, isRightOfDot, isJsDocTagName } = completionData; + const { symbols, isMemberCompletion, isNewIdentifierLocation, location, isRightOfDot, isJsDocTagName } = completionData; if (isJsDocTagName) { // If the current position is a jsDoc tag name, only tag names should be provided for completion return { isMemberCompletion: false, isNewIdentifierLocation: false, entries: getAllJsDocCompletionEntries() }; } - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); - let entries: CompletionEntry[] = []; + const entries: CompletionEntry[] = []; if (isRightOfDot && isSourceFileJavaScript(sourceFile)) { const uniqueNames = getCompletionEntriesFromSymbols(symbols, entries); @@ -3845,16 +3844,16 @@ namespace ts { return { isMemberCompletion, isNewIdentifierLocation, entries }; function getJavaScriptCompletionEntries(sourceFile: SourceFile, uniqueNames: Map): CompletionEntry[] { - let entries: CompletionEntry[] = []; - let target = program.getCompilerOptions().target; + const entries: CompletionEntry[] = []; + const target = program.getCompilerOptions().target; - let nameTable = getNameTable(sourceFile); - for (let name in nameTable) { + const nameTable = getNameTable(sourceFile); + for (const name in nameTable) { if (!uniqueNames[name]) { uniqueNames[name] = name; - let displayName = getCompletionEntryDisplayName(name, target, /*performCharacterChecks:*/ true); + const displayName = getCompletionEntryDisplayName(name, target, /*performCharacterChecks*/ true); if (displayName) { - let entry = { + const entry = { name: displayName, kind: ScriptElementKind.warning, kindModifiers: "", @@ -3875,7 +3874,7 @@ namespace ts { kind: ScriptElementKind.keyword, kindModifiers: "", sortText: "0", - } + }; })); } @@ -3883,7 +3882,7 @@ namespace ts { // Try to get a valid display name for this symbol, if we could not find one, then ignore it. // We would like to only show things that can be added after a dot, so for instance numeric properties can // not be accessed with a dot (a.1 <- invalid) - let displayName = getCompletionEntryDisplayNameForSymbol(symbol, program.getCompilerOptions().target, /*performCharacterChecks:*/ true, location); + const displayName = getCompletionEntryDisplayNameForSymbol(symbol, program.getCompilerOptions().target, /*performCharacterChecks*/ true, location); if (!displayName) { return undefined; } @@ -3905,13 +3904,13 @@ namespace ts { } function getCompletionEntriesFromSymbols(symbols: Symbol[], entries: CompletionEntry[]): Map { - let start = new Date().getTime(); - let uniqueNames: Map = {}; + const start = new Date().getTime(); + const uniqueNames: Map = {}; if (symbols) { - for (let symbol of symbols) { - let entry = createCompletionEntry(symbol, location); + for (const symbol of symbols) { + const entry = createCompletionEntry(symbol, location); if (entry) { - let id = escapeIdentifier(entry.name); + const id = escapeIdentifier(entry.name); if (!lookUp(uniqueNames, id)) { entries.push(entry); uniqueNames[id] = id; @@ -3929,19 +3928,19 @@ namespace ts { synchronizeHostData(); // Compute all the completion symbols again. - let completionData = getCompletionData(fileName, position); + const completionData = getCompletionData(fileName, position); if (completionData) { - let { symbols, location } = completionData; + const { symbols, location } = completionData; // Find the symbol with the matching entry name. - let target = program.getCompilerOptions().target; + const target = program.getCompilerOptions().target; // We don't need to perform character checks here because we're only comparing the // name against 'entryName' (which is known to be good), not building a new // completion entry. - let symbol = forEach(symbols, s => getCompletionEntryDisplayNameForSymbol(s, target, /*performCharacterChecks:*/ false, location) === entryName ? s : undefined); + const symbol = forEach(symbols, s => getCompletionEntryDisplayNameForSymbol(s, target, /*performCharacterChecks*/ false, location) === entryName ? s : undefined); if (symbol) { - let { displayParts, documentation, symbolKind } = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, getValidSourceFile(fileName), location, location, SemanticMeaning.All); + const { displayParts, documentation, symbolKind } = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, getValidSourceFile(fileName), location, location, SemanticMeaning.All); return { name: entryName, kindModifiers: getSymbolModifiers(symbol), @@ -3953,7 +3952,7 @@ namespace ts { } // Didn't find a symbol with this name. See if we can find a keyword instead. - let keywordCompletion = forEach(keywordCompletions, c => c.name === entryName); + const keywordCompletion = forEach(keywordCompletions, c => c.name === entryName); if (keywordCompletion) { return { name: entryName, @@ -3969,7 +3968,7 @@ namespace ts { // TODO(drosen): use contextual SemanticMeaning. function getSymbolKind(symbol: Symbol, location: Node): string { - let flags = symbol.getFlags(); + const flags = symbol.getFlags(); if (flags & SymbolFlags.Class) return getDeclarationOfKind(symbol, SyntaxKind.ClassExpression) ? ScriptElementKind.localClassElement : ScriptElementKind.classElement; @@ -3978,7 +3977,7 @@ namespace ts { if (flags & SymbolFlags.Interface) return ScriptElementKind.interfaceElement; if (flags & SymbolFlags.TypeParameter) return ScriptElementKind.typeParameterElement; - let result = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol, flags, location); + const result = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol, flags, location); if (result === ScriptElementKind.unknown) { if (flags & SymbolFlags.TypeParameter) return ScriptElementKind.typeParameterElement; if (flags & SymbolFlags.EnumMember) return ScriptElementKind.variableElement; @@ -3990,7 +3989,7 @@ namespace ts { } function getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol: Symbol, flags: SymbolFlags, location: Node) { - let typeChecker = program.getTypeChecker(); + const typeChecker = program.getTypeChecker(); if (typeChecker.isUndefinedSymbol(symbol)) { return ScriptElementKind.variableElement; @@ -4019,8 +4018,8 @@ namespace ts { if (flags & SymbolFlags.Property) { if (flags & SymbolFlags.SyntheticProperty) { // If union property is result of union of non method (property/accessors/variables), it is labeled as property - let unionPropertyKind = forEach(typeChecker.getRootSymbols(symbol), rootSymbol => { - let rootSymbolFlags = rootSymbol.getFlags(); + const unionPropertyKind = forEach(typeChecker.getRootSymbols(symbol), rootSymbol => { + const rootSymbolFlags = rootSymbol.getFlags(); if (rootSymbolFlags & (SymbolFlags.PropertyOrAccessor | SymbolFlags.Variable)) { return ScriptElementKind.memberVariableElement; } @@ -4028,8 +4027,8 @@ namespace ts { }); if (!unionPropertyKind) { // If this was union of all methods, - //make sure it has call signatures before we can label it as method - let typeOfUnionProperty = typeChecker.getTypeOfSymbolAtLocation(symbol, location); + // make sure it has call signatures before we can label it as method + const typeOfUnionProperty = typeChecker.getTypeOfSymbolAtLocation(symbol, location); if (typeOfUnionProperty.getCallSignatures().length) { return ScriptElementKind.memberFunctionElement; } @@ -4053,11 +4052,11 @@ namespace ts { function getSymbolDisplayPartsDocumentationAndSymbolKind(symbol: Symbol, sourceFile: SourceFile, enclosingDeclaration: Node, location: Node, semanticMeaning = getMeaningFromLocation(location)) { - let typeChecker = program.getTypeChecker(); + const typeChecker = program.getTypeChecker(); - let displayParts: SymbolDisplayPart[] = []; + const displayParts: SymbolDisplayPart[] = []; let documentation: SymbolDisplayPart[]; - let symbolFlags = symbol.flags; + const symbolFlags = symbol.flags; let symbolKind = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol, symbolFlags, location); let hasAddedSymbolInfo: boolean; let type: Type; @@ -4073,7 +4072,7 @@ namespace ts { type = typeChecker.getTypeOfSymbolAtLocation(symbol, location); if (type) { if (location.parent && location.parent.kind === SyntaxKind.PropertyAccessExpression) { - let right = (location.parent).name; + const right = (location.parent).name; // Either the location is on the right of a property access, or on the left and the right is missing if (right === location || (right && right.getFullWidth() === 0)) { location = location.parent; @@ -4090,15 +4089,15 @@ namespace ts { } if (callExpression) { - let candidateSignatures: Signature[] = []; + const candidateSignatures: Signature[] = []; signature = typeChecker.getResolvedSignature(callExpression, candidateSignatures); if (!signature && candidateSignatures.length) { // Use the first candidate: signature = candidateSignatures[0]; } - let useConstructSignatures = callExpression.kind === SyntaxKind.NewExpression || callExpression.expression.kind === SyntaxKind.SuperKeyword; - let allSignatures = useConstructSignatures ? type.getConstructSignatures() : type.getCallSignatures(); + const useConstructSignatures = callExpression.kind === SyntaxKind.NewExpression || callExpression.expression.kind === SyntaxKind.SuperKeyword; + const allSignatures = useConstructSignatures ? type.getConstructSignatures() : type.getCallSignatures(); if (!contains(allSignatures, signature.target) && !contains(allSignatures, signature)) { // Get the first signature if there is one -- allSignatures may contain @@ -4156,8 +4155,8 @@ namespace ts { else if ((isNameOfFunctionDeclaration(location) && !(symbol.flags & SymbolFlags.Accessor)) || // name of function declaration (location.kind === SyntaxKind.ConstructorKeyword && location.parent.kind === SyntaxKind.Constructor)) { // At constructor keyword of constructor declaration // get the signature from the declaration and write it - let functionDeclaration = location.parent; - let allSignatures = functionDeclaration.kind === SyntaxKind.Constructor ? type.getConstructSignatures() : type.getCallSignatures(); + const functionDeclaration = location.parent; + const allSignatures = functionDeclaration.kind === SyntaxKind.Constructor ? type.getConstructSignatures() : type.getCallSignatures(); if (!typeChecker.isImplementationOfOverload(functionDeclaration)) { signature = typeChecker.getSignatureFromDeclaration(functionDeclaration); } @@ -4226,8 +4225,8 @@ namespace ts { } if (symbolFlags & SymbolFlags.Module) { addNewLineIfDisplayPartsExist(); - let declaration = getDeclarationOfKind(symbol, SyntaxKind.ModuleDeclaration); - let isNamespace = declaration && declaration.name && declaration.name.kind === SyntaxKind.Identifier; + const declaration = getDeclarationOfKind(symbol, SyntaxKind.ModuleDeclaration); + const isNamespace = declaration && declaration.name && declaration.name.kind === SyntaxKind.Identifier; displayParts.push(keywordPart(isNamespace ? SyntaxKind.NamespaceKeyword : SyntaxKind.ModuleKeyword)); displayParts.push(spacePart()); addFullSymbolName(symbol); @@ -4279,9 +4278,9 @@ namespace ts { } if (symbolFlags & SymbolFlags.EnumMember) { addPrefixForAnyFunctionOrVar(symbol, "enum member"); - let declaration = symbol.declarations[0]; + const declaration = symbol.declarations[0]; if (declaration.kind === SyntaxKind.EnumMember) { - let constantValue = typeChecker.getConstantValue(declaration); + const constantValue = typeChecker.getConstantValue(declaration); if (constantValue !== undefined) { displayParts.push(spacePart()); displayParts.push(operatorPart(SyntaxKind.EqualsToken)); @@ -4297,7 +4296,7 @@ namespace ts { addFullSymbolName(symbol); ts.forEach(symbol.declarations, declaration => { if (declaration.kind === SyntaxKind.ImportEqualsDeclaration) { - let importEqualsDeclaration = declaration; + const importEqualsDeclaration = declaration; if (isExternalModuleImportEqualsDeclaration(importEqualsDeclaration)) { displayParts.push(spacePart()); displayParts.push(operatorPart(SyntaxKind.EqualsToken)); @@ -4308,7 +4307,7 @@ namespace ts { displayParts.push(punctuationPart(SyntaxKind.CloseParenToken)); } else { - let internalAliasSymbol = typeChecker.getSymbolAtLocation(importEqualsDeclaration.moduleReference); + const internalAliasSymbol = typeChecker.getSymbolAtLocation(importEqualsDeclaration.moduleReference); if (internalAliasSymbol) { displayParts.push(spacePart()); displayParts.push(operatorPart(SyntaxKind.EqualsToken)); @@ -4332,7 +4331,7 @@ namespace ts { displayParts.push(spacePart()); // If the type is type parameter, format it specially if (type.symbol && type.symbol.flags & SymbolFlags.TypeParameter) { - let typeParameterParts = mapToDisplayParts(writer => { + const typeParameterParts = mapToDisplayParts(writer => { typeChecker.getSymbolDisplayBuilder().buildTypeParameterDisplay(type, writer, enclosingDeclaration); }); addRange(displayParts, typeParameterParts); @@ -4347,7 +4346,7 @@ namespace ts { symbolFlags & SymbolFlags.Signature || symbolFlags & SymbolFlags.Accessor || symbolKind === ScriptElementKind.memberFunctionElement) { - let allSignatures = type.getCallSignatures(); + const allSignatures = type.getCallSignatures(); addSignatureDisplayParts(allSignatures[0], allSignatures); } } @@ -4370,7 +4369,7 @@ namespace ts { } function addFullSymbolName(symbol: Symbol, enclosingDeclaration?: Node) { - let fullSymbolDisplayParts = symbolToDisplayParts(typeChecker, symbol, enclosingDeclaration || sourceFile, /*meaning*/ undefined, + const fullSymbolDisplayParts = symbolToDisplayParts(typeChecker, symbol, enclosingDeclaration || sourceFile, /*meaning*/ undefined, SymbolFormatFlags.WriteTypeParametersOrArguments | SymbolFormatFlags.UseOnlyExternalAliasing); addRange(displayParts, fullSymbolDisplayParts); } @@ -4416,7 +4415,7 @@ namespace ts { } function writeTypeParametersOfSymbol(symbol: Symbol, enclosingDeclaration: Node) { - let typeParameterParts = mapToDisplayParts(writer => { + const typeParameterParts = mapToDisplayParts(writer => { typeChecker.getSymbolDisplayBuilder().buildTypeParameterDisplayFromSymbol(symbol, writer, enclosingDeclaration); }); addRange(displayParts, typeParameterParts); @@ -4426,8 +4425,8 @@ namespace ts { function getQuickInfoAtPosition(fileName: string, position: number): QuickInfo { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); - let node = getTouchingPropertyName(sourceFile, position); + const sourceFile = getValidSourceFile(fileName); + const node = getTouchingPropertyName(sourceFile, position); if (!node) { return undefined; } @@ -4436,8 +4435,8 @@ namespace ts { return undefined; } - let typeChecker = program.getTypeChecker(); - let symbol = typeChecker.getSymbolAtLocation(node); + const typeChecker = program.getTypeChecker(); + const symbol = typeChecker.getSymbolAtLocation(node); if (!symbol) { // Try getting just type at this position and show @@ -4449,7 +4448,7 @@ namespace ts { case SyntaxKind.ThisType: case SyntaxKind.SuperKeyword: // For the identifiers/this/super etc get the type at position - let type = typeChecker.getTypeAtLocation(node); + const type = typeChecker.getTypeAtLocation(node); if (type) { return { kind: ScriptElementKind.unknown, @@ -4464,7 +4463,7 @@ namespace ts { return undefined; } - let displayPartsDocumentationsAndKind = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, sourceFile, getContainerNode(node), node); + const displayPartsDocumentationsAndKind = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, sourceFile, getContainerNode(node), node); return { kind: displayPartsDocumentationsAndKind.symbolKind, kindModifiers: getSymbolModifiers(symbol), @@ -4486,13 +4485,13 @@ namespace ts { } function getDefinitionFromSymbol(symbol: Symbol, node: Node): DefinitionInfo[] { - let typeChecker = program.getTypeChecker(); - let result: DefinitionInfo[] = []; - let declarations = symbol.getDeclarations(); - let symbolName = typeChecker.symbolToString(symbol); // Do not get scoped name, just the name of the symbol - let symbolKind = getSymbolKind(symbol, node); - let containerSymbol = symbol.parent; - let containerName = containerSymbol ? typeChecker.symbolToString(containerSymbol, node) : ""; + const typeChecker = program.getTypeChecker(); + const result: DefinitionInfo[] = []; + const declarations = symbol.getDeclarations(); + const symbolName = typeChecker.symbolToString(symbol); // Do not get scoped name, just the name of the symbol + const symbolKind = getSymbolKind(symbol, node); + const containerSymbol = symbol.parent; + const containerName = containerSymbol ? typeChecker.symbolToString(containerSymbol, node) : ""; if (!tryAddConstructSignature(symbol, node, symbolKind, symbolName, containerName, result) && !tryAddCallSignature(symbol, node, symbolKind, symbolName, containerName, result)) { @@ -4510,7 +4509,7 @@ namespace ts { if (isNewExpressionTarget(location) || location.kind === SyntaxKind.ConstructorKeyword) { if (symbol.flags & SymbolFlags.Class) { // Find the first class-like declaration and try to get the construct signature. - for (let declaration of symbol.getDeclarations()) { + for (const declaration of symbol.getDeclarations()) { if (isClassLike(declaration)) { return tryAddSignature(declaration.members, /*selectConstructors*/ true, @@ -4535,7 +4534,7 @@ namespace ts { } function tryAddSignature(signatureDeclarations: Declaration[], selectConstructors: boolean, symbolKind: string, symbolName: string, containerName: string, result: DefinitionInfo[]) { - let declarations: Declaration[] = []; + const declarations: Declaration[] = []; let definition: Declaration; forEach(signatureDeclarations, d => { @@ -4563,24 +4562,24 @@ namespace ts { function getDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[] { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); - let node = getTouchingPropertyName(sourceFile, position); + const node = getTouchingPropertyName(sourceFile, position); if (!node) { return undefined; } // Labels if (isJumpStatementTarget(node)) { - let labelName = (node).text; - let label = getTargetLabel((node.parent), (node).text); + const labelName = (node).text; + const label = getTargetLabel((node.parent), (node).text); return label ? [createDefinitionInfo(label, ScriptElementKind.label, labelName, /*containerName*/ undefined)] : undefined; } /// Triple slash reference comments - let comment = forEach(sourceFile.referencedFiles, r => (r.pos <= position && position < r.end) ? r : undefined); + const comment = forEach(sourceFile.referencedFiles, r => (r.pos <= position && position < r.end) ? r : undefined); if (comment) { - let referenceFile = tryResolveScriptReference(program, sourceFile, comment); + const referenceFile = tryResolveScriptReference(program, sourceFile, comment); if (referenceFile) { return [{ fileName: referenceFile.fileName, @@ -4594,7 +4593,7 @@ namespace ts { return undefined; } - let typeChecker = program.getTypeChecker(); + const typeChecker = program.getTypeChecker(); let symbol = typeChecker.getSymbolAtLocation(node); // Could not find a symbol e.g. node is string or number keyword, @@ -4608,7 +4607,7 @@ namespace ts { // import {A, B} from "mod"; // to jump to the implementation directly. if (symbol.flags & SymbolFlags.Alias) { - let declaration = symbol.declarations[0]; + const declaration = symbol.declarations[0]; if (node.kind === SyntaxKind.Identifier && node.parent === declaration) { symbol = typeChecker.getAliasedSymbol(symbol); } @@ -4620,15 +4619,15 @@ namespace ts { // is performed at the location of property access, we would like to go to definition of the property in the short-hand // assignment. This case and others are handled by the following code. if (node.parent.kind === SyntaxKind.ShorthandPropertyAssignment) { - let shorthandSymbol = typeChecker.getShorthandAssignmentValueSymbol(symbol.valueDeclaration); + const shorthandSymbol = typeChecker.getShorthandAssignmentValueSymbol(symbol.valueDeclaration); if (!shorthandSymbol) { return []; } - let shorthandDeclarations = shorthandSymbol.getDeclarations(); - let shorthandSymbolKind = getSymbolKind(shorthandSymbol, node); - let shorthandSymbolName = typeChecker.symbolToString(shorthandSymbol); - let shorthandContainerName = typeChecker.symbolToString(symbol.parent, node); + const shorthandDeclarations = shorthandSymbol.getDeclarations(); + const shorthandSymbolKind = getSymbolKind(shorthandSymbol, node); + const shorthandSymbolName = typeChecker.symbolToString(shorthandSymbol); + const shorthandContainerName = typeChecker.symbolToString(symbol.parent, node); return map(shorthandDeclarations, declaration => createDefinitionInfo(declaration, shorthandSymbolKind, shorthandSymbolName, shorthandContainerName)); } @@ -4640,27 +4639,27 @@ namespace ts { function getTypeDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[] { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); - let node = getTouchingPropertyName(sourceFile, position); + const node = getTouchingPropertyName(sourceFile, position); if (!node) { return undefined; } - let typeChecker = program.getTypeChecker(); + const typeChecker = program.getTypeChecker(); - let symbol = typeChecker.getSymbolAtLocation(node); + const symbol = typeChecker.getSymbolAtLocation(node); if (!symbol) { return undefined; } - let type = typeChecker.getTypeOfSymbolAtLocation(symbol, node); + const type = typeChecker.getTypeOfSymbolAtLocation(symbol, node); if (!type) { return undefined; } if (type.flags & TypeFlags.Union) { - let result: DefinitionInfo[] = []; + const result: DefinitionInfo[] = []; forEach((type).types, t => { if (t.symbol) { addRange(/*to*/ result, /*from*/ getDefinitionFromSymbol(t.symbol, node)); @@ -4680,7 +4679,7 @@ namespace ts { let results = getOccurrencesAtPositionCore(fileName, position); if (results) { - let sourceFile = getCanonicalFileName(normalizeSlashes(fileName)); + const sourceFile = getCanonicalFileName(normalizeSlashes(fileName)); // Get occurrences only supports reporting occurrences for the file queried. So // filter down to that list. @@ -4694,10 +4693,10 @@ namespace ts { synchronizeHostData(); filesToSearch = map(filesToSearch, normalizeSlashes); - let sourceFilesToSearch = filter(program.getSourceFiles(), f => contains(filesToSearch, f.fileName)); - let sourceFile = getValidSourceFile(fileName); + const sourceFilesToSearch = filter(program.getSourceFiles(), f => contains(filesToSearch, f.fileName)); + const sourceFile = getValidSourceFile(fileName); - let node = getTouchingWord(sourceFile, position); + const node = getTouchingWord(sourceFile, position); if (!node) { return undefined; } @@ -4705,8 +4704,8 @@ namespace ts { return getSemanticDocumentHighlights(node) || getSyntacticDocumentHighlights(node); function getHighlightSpanForNode(node: Node): HighlightSpan { - let start = node.getStart(); - let end = node.getEnd(); + const start = node.getStart(); + const end = node.getEnd(); return { fileName: sourceFile.fileName, @@ -4723,7 +4722,7 @@ namespace ts { isLiteralNameOfPropertyDeclarationOrIndexAccess(node) || isNameOfExternalModuleImportOrDeclaration(node)) { - let referencedSymbols = getReferencedSymbolsForNode(node, sourceFilesToSearch, /*findInStrings:*/ false, /*findInComments:*/ false); + const referencedSymbols = getReferencedSymbolsForNode(node, sourceFilesToSearch, /*findInStrings*/ false, /*findInComments*/ false); return convertReferencedSymbols(referencedSymbols); } @@ -4734,11 +4733,11 @@ namespace ts { return undefined; } - let fileNameToDocumentHighlights: Map = {}; - let result: DocumentHighlights[] = []; - for (let referencedSymbol of referencedSymbols) { - for (let referenceEntry of referencedSymbol.references) { - let fileName = referenceEntry.fileName; + const fileNameToDocumentHighlights: Map = {}; + const result: DocumentHighlights[] = []; + for (const referencedSymbol of referencedSymbols) { + for (const referenceEntry of referencedSymbol.references) { + const fileName = referenceEntry.fileName; let documentHighlights = getProperty(fileNameToDocumentHighlights, fileName); if (!documentHighlights) { documentHighlights = { fileName, highlightSpans: [] }; @@ -4759,9 +4758,9 @@ namespace ts { } function getSyntacticDocumentHighlights(node: Node): DocumentHighlights[] { - let fileName = sourceFile.fileName; + const fileName = sourceFile.fileName; - let highlightSpans = getHighlightSpans(node); + const highlightSpans = getHighlightSpans(node); if (!highlightSpans || highlightSpans.length === 0) { return undefined; } @@ -4865,7 +4864,7 @@ namespace ts { * into function boundaries and try-blocks with catch-clauses. */ function aggregateOwnedThrowStatements(node: Node): ThrowStatement[] { - let statementAccumulator: ThrowStatement[] = [] + const statementAccumulator: ThrowStatement[] = []; aggregate(node); return statementAccumulator; @@ -4874,7 +4873,7 @@ namespace ts { statementAccumulator.push(node); } else if (node.kind === SyntaxKind.TryStatement) { - let tryStatement = node; + const tryStatement = node; if (tryStatement.catchClause) { aggregate(tryStatement.catchClause); @@ -4905,7 +4904,7 @@ namespace ts { let child: Node = throwStatement; while (child.parent) { - let parent = child.parent; + const parent = child.parent; if (isFunctionBlock(parent) || parent.kind === SyntaxKind.SourceFile) { return parent; @@ -4914,7 +4913,7 @@ namespace ts { // A throw-statement is only owned by a try-statement if the try-statement has // a catch clause, and if the throw-statement occurs within the try block. if (parent.kind === SyntaxKind.TryStatement) { - let tryStatement = parent; + const tryStatement = parent; if (tryStatement.tryBlock === child && tryStatement.catchClause) { return child; @@ -4928,7 +4927,7 @@ namespace ts { } function aggregateAllBreakAndContinueStatements(node: Node): BreakOrContinueStatement[] { - let statementAccumulator: BreakOrContinueStatement[] = [] + const statementAccumulator: BreakOrContinueStatement[] = []; aggregate(node); return statementAccumulator; @@ -4944,7 +4943,7 @@ namespace ts { } function ownsBreakOrContinueStatement(owner: Node, statement: BreakOrContinueStatement): boolean { - let actualOwner = getBreakOrContinueOwner(statement); + const actualOwner = getBreakOrContinueOwner(statement); return actualOwner && actualOwner === owner; } @@ -4979,7 +4978,7 @@ namespace ts { } function getModifierOccurrences(modifier: SyntaxKind, declaration: Node): HighlightSpan[] { - let container = declaration.parent; + const container = declaration.parent; // Make sure we only highlight the keyword when it makes sense to do so. if (isAccessibilityModifier(modifier)) { @@ -5009,8 +5008,8 @@ namespace ts { return undefined; } - let keywords: Node[] = []; - let modifierFlag: NodeFlags = getFlagFromModifier(modifier); + const keywords: Node[] = []; + const modifierFlag: NodeFlags = getFlagFromModifier(modifier); let nodes: Node[]; switch (container.kind) { @@ -5035,7 +5034,7 @@ namespace ts { // If we're an accessibility modifier, we're in an instance member and should search // the constructor's parameter list for instance members as well. if (modifierFlag & NodeFlags.AccessibilityModifier) { - let constructor = forEach((container).members, member => { + const constructor = forEach((container).members, member => { return member.kind === SyntaxKind.Constructor && member; }); @@ -5048,7 +5047,7 @@ namespace ts { } break; default: - Debug.fail("Invalid container kind.") + Debug.fail("Invalid container kind."); } forEach(nodes, node => { @@ -5091,7 +5090,7 @@ namespace ts { } function getGetAndSetOccurrences(accessorDeclaration: AccessorDeclaration): HighlightSpan[] { - let keywords: Node[] = []; + const keywords: Node[] = []; tryPushAccessorKeyword(accessorDeclaration.symbol, SyntaxKind.GetAccessor); tryPushAccessorKeyword(accessorDeclaration.symbol, SyntaxKind.SetAccessor); @@ -5099,7 +5098,7 @@ namespace ts { return map(keywords, getHighlightSpanForNode); function tryPushAccessorKeyword(accessorSymbol: Symbol, accessorKind: SyntaxKind): void { - let accessor = getDeclarationOfKind(accessorSymbol, accessorKind); + const accessor = getDeclarationOfKind(accessorSymbol, accessorKind); if (accessor) { forEach(accessor.getChildren(), child => pushKeywordIf(keywords, child, SyntaxKind.GetKeyword, SyntaxKind.SetKeyword)); @@ -5108,9 +5107,9 @@ namespace ts { } function getConstructorOccurrences(constructorDeclaration: ConstructorDeclaration): HighlightSpan[] { - let declarations = constructorDeclaration.symbol.getDeclarations() + const declarations = constructorDeclaration.symbol.getDeclarations(); - let keywords: Node[] = []; + const keywords: Node[] = []; forEach(declarations, declaration => { forEach(declaration.getChildren(), token => { @@ -5122,12 +5121,12 @@ namespace ts { } function getLoopBreakContinueOccurrences(loopNode: IterationStatement): HighlightSpan[] { - let keywords: Node[] = []; + const keywords: Node[] = []; if (pushKeywordIf(keywords, loopNode.getFirstToken(), SyntaxKind.ForKeyword, SyntaxKind.WhileKeyword, SyntaxKind.DoKeyword)) { // If we succeeded and got a do-while loop, then start looking for a 'while' keyword. if (loopNode.kind === SyntaxKind.DoStatement) { - let loopTokens = loopNode.getChildren(); + const loopTokens = loopNode.getChildren(); for (let i = loopTokens.length - 1; i >= 0; i--) { if (pushKeywordIf(keywords, loopTokens[i], SyntaxKind.WhileKeyword)) { @@ -5137,7 +5136,7 @@ namespace ts { } } - let breaksAndContinues = aggregateAllBreakAndContinueStatements(loopNode.statement); + const breaksAndContinues = aggregateAllBreakAndContinueStatements(loopNode.statement); forEach(breaksAndContinues, statement => { if (ownsBreakOrContinueStatement(loopNode, statement)) { @@ -5149,7 +5148,7 @@ namespace ts { } function getBreakOrContinueStatementOccurrences(breakOrContinueStatement: BreakOrContinueStatement): HighlightSpan[] { - let owner = getBreakOrContinueOwner(breakOrContinueStatement); + const owner = getBreakOrContinueOwner(breakOrContinueStatement); if (owner) { switch (owner.kind) { @@ -5158,7 +5157,7 @@ namespace ts { case SyntaxKind.ForOfStatement: case SyntaxKind.DoStatement: case SyntaxKind.WhileStatement: - return getLoopBreakContinueOccurrences(owner) + return getLoopBreakContinueOccurrences(owner); case SyntaxKind.SwitchStatement: return getSwitchCaseDefaultOccurrences(owner); @@ -5169,7 +5168,7 @@ namespace ts { } function getSwitchCaseDefaultOccurrences(switchStatement: SwitchStatement): HighlightSpan[] { - let keywords: Node[] = []; + const keywords: Node[] = []; pushKeywordIf(keywords, switchStatement.getFirstToken(), SyntaxKind.SwitchKeyword); @@ -5177,7 +5176,7 @@ namespace ts { forEach(switchStatement.caseBlock.clauses, clause => { pushKeywordIf(keywords, clause.getFirstToken(), SyntaxKind.CaseKeyword, SyntaxKind.DefaultKeyword); - let breaksAndContinues = aggregateAllBreakAndContinueStatements(clause); + const breaksAndContinues = aggregateAllBreakAndContinueStatements(clause); forEach(breaksAndContinues, statement => { if (ownsBreakOrContinueStatement(switchStatement, statement)) { @@ -5190,7 +5189,7 @@ namespace ts { } function getTryCatchFinallyOccurrences(tryStatement: TryStatement): HighlightSpan[] { - let keywords: Node[] = []; + const keywords: Node[] = []; pushKeywordIf(keywords, tryStatement.getFirstToken(), SyntaxKind.TryKeyword); @@ -5199,7 +5198,7 @@ namespace ts { } if (tryStatement.finallyBlock) { - let finallyKeyword = findChildOfKind(tryStatement, SyntaxKind.FinallyKeyword, sourceFile); + const finallyKeyword = findChildOfKind(tryStatement, SyntaxKind.FinallyKeyword, sourceFile); pushKeywordIf(keywords, finallyKeyword, SyntaxKind.FinallyKeyword); } @@ -5207,13 +5206,13 @@ namespace ts { } function getThrowOccurrences(throwStatement: ThrowStatement): HighlightSpan[] { - let owner = getThrowStatementOwner(throwStatement); + const owner = getThrowStatementOwner(throwStatement); if (!owner) { return undefined; } - let keywords: Node[] = []; + const keywords: Node[] = []; forEach(aggregateOwnedThrowStatements(owner), throwStatement => { pushKeywordIf(keywords, throwStatement.getFirstToken(), SyntaxKind.ThrowKeyword); @@ -5231,14 +5230,14 @@ namespace ts { } function getReturnOccurrences(returnStatement: ReturnStatement): HighlightSpan[] { - let func = getContainingFunction(returnStatement); + const func = getContainingFunction(returnStatement); // If we didn't find a containing function with a block body, bail out. if (!(func && hasKind(func.body, SyntaxKind.Block))) { return undefined; } - let keywords: Node[] = [] + const keywords: Node[] = []; forEachReturnStatement(func.body, returnStatement => { pushKeywordIf(keywords, returnStatement.getFirstToken(), SyntaxKind.ReturnKeyword); }); @@ -5252,7 +5251,7 @@ namespace ts { } function getIfElseOccurrences(ifStatement: IfStatement): HighlightSpan[] { - let keywords: Node[] = []; + const keywords: Node[] = []; // Traverse upwards through all parent if-statements linked by their else-branches. while (hasKind(ifStatement.parent, SyntaxKind.IfStatement) && (ifStatement.parent).elseStatement === ifStatement) { @@ -5261,7 +5260,7 @@ namespace ts { // Now traverse back down through the else branches, aggregating if/else keywords of if-statements. while (ifStatement) { - let children = ifStatement.getChildren(); + const children = ifStatement.getChildren(); pushKeywordIf(keywords, children[0], SyntaxKind.IfKeyword); // Generally the 'else' keyword is second-to-last, so we traverse backwards. @@ -5272,20 +5271,20 @@ namespace ts { } if (!hasKind(ifStatement.elseStatement, SyntaxKind.IfStatement)) { - break + break; } ifStatement = ifStatement.elseStatement; } - let result: HighlightSpan[] = []; + const result: HighlightSpan[] = []; // We'd like to highlight else/ifs together if they are only separated by whitespace // (i.e. the keywords are separated by no comments, no newlines). for (let i = 0; i < keywords.length; i++) { if (keywords[i].kind === SyntaxKind.ElseKeyword && i < keywords.length - 1) { - let elseKeyword = keywords[i]; - let ifKeyword = keywords[i + 1]; // this *should* always be an 'if' keyword. + const elseKeyword = keywords[i]; + const ifKeyword = keywords[i + 1]; // this *should* always be an 'if' keyword. let shouldCombindElseAndIf = true; @@ -5328,9 +5327,9 @@ namespace ts { return undefined; } - let result: ReferenceEntry[] = []; - for (let entry of documentHighlights) { - for (let highlightSpan of entry.highlightSpans) { + const result: ReferenceEntry[] = []; + for (const entry of documentHighlights) { + for (const highlightSpan of entry.highlightSpans) { result.push({ fileName: entry.fileName, textSpan: highlightSpan.textSpan, @@ -5348,9 +5347,9 @@ namespace ts { return undefined; } - let referenceEntries: ReferenceEntry[] = []; + const referenceEntries: ReferenceEntry[] = []; - for (let referenceSymbol of referenceSymbols) { + for (const referenceSymbol of referenceSymbols) { addRange(referenceEntries, referenceSymbol.references); } @@ -5358,17 +5357,17 @@ namespace ts { } function findRenameLocations(fileName: string, position: number, findInStrings: boolean, findInComments: boolean): RenameLocation[] { - let referencedSymbols = findReferencedSymbols(fileName, position, findInStrings, findInComments); + const referencedSymbols = findReferencedSymbols(fileName, position, findInStrings, findInComments); return convertReferences(referencedSymbols); } function getReferencesAtPosition(fileName: string, position: number): ReferenceEntry[] { - let referencedSymbols = findReferencedSymbols(fileName, position, /*findInStrings:*/ false, /*findInComments:*/ false); + const referencedSymbols = findReferencedSymbols(fileName, position, /*findInStrings*/ false, /*findInComments*/ false); return convertReferences(referencedSymbols); } - function findReferences(fileName: string, position: number): ReferencedSymbol[]{ - let referencedSymbols = findReferencedSymbols(fileName, position, /*findInStrings:*/ false, /*findInComments:*/ false); + function findReferences(fileName: string, position: number): ReferencedSymbol[] { + const referencedSymbols = findReferencedSymbols(fileName, position, /*findInStrings*/ false, /*findInComments*/ false); // Only include referenced symbols that have a valid definition. return filter(referencedSymbols, rs => !!rs.definition); @@ -5377,17 +5376,17 @@ namespace ts { function findReferencedSymbols(fileName: string, position: number, findInStrings: boolean, findInComments: boolean): ReferencedSymbol[] { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); - let node = getTouchingPropertyName(sourceFile, position); + const node = getTouchingPropertyName(sourceFile, position); if (!node) { return undefined; } if (node.kind !== SyntaxKind.Identifier && // TODO (drosen): This should be enabled in a later release - currently breaks rename. - //node.kind !== SyntaxKind.ThisKeyword && - //node.kind !== SyntaxKind.SuperKeyword && + // node.kind !== SyntaxKind.ThisKeyword && + // node.kind !== SyntaxKind.SuperKeyword && !isLiteralNameOfPropertyDeclarationOrIndexAccess(node) && !isNameOfExternalModuleImportOrDeclaration(node)) { return undefined; @@ -5398,12 +5397,12 @@ namespace ts { } function getReferencedSymbolsForNode(node: Node, sourceFiles: SourceFile[], findInStrings: boolean, findInComments: boolean): ReferencedSymbol[] { - let typeChecker = program.getTypeChecker(); + const typeChecker = program.getTypeChecker(); // Labels if (isLabelName(node)) { if (isJumpStatementTarget(node)) { - let labelDefinition = getTargetLabel((node.parent), (node).text); + const labelDefinition = getTargetLabel((node.parent), (node).text); // if we have a label definition, look within its statement for references, if not, then // the label is undefined and we have no results.. return labelDefinition ? getLabelReferencesInNode(labelDefinition.parent, labelDefinition) : undefined; @@ -5422,7 +5421,7 @@ namespace ts { return getReferencesForSuperKeyword(node); } - let symbol = typeChecker.getSymbolAtLocation(node); + const symbol = typeChecker.getSymbolAtLocation(node); // Could not find a symbol e.g. unknown identifier if (!symbol) { @@ -5430,7 +5429,7 @@ namespace ts { return undefined; } - let declarations = symbol.declarations; + const declarations = symbol.declarations; // The symbol was an internal symbol and does not have a declaration e.g. undefined symbol if (!declarations || !declarations.length) { @@ -5440,29 +5439,29 @@ namespace ts { let result: ReferencedSymbol[]; // Compute the meaning from the location and the symbol it references - let searchMeaning = getIntersectingMeaningFromDeclarations(getMeaningFromLocation(node), declarations); + const searchMeaning = getIntersectingMeaningFromDeclarations(getMeaningFromLocation(node), declarations); // Get the text to search for. // Note: if this is an external module symbol, the name doesn't include quotes. - let declaredName = stripQuotes(getDeclaredName(typeChecker, symbol, node)); + const declaredName = stripQuotes(getDeclaredName(typeChecker, symbol, node)); // Try to get the smallest valid scope that we can limit our search to; // otherwise we'll need to search globally (i.e. include each file). - let scope = getSymbolScope(symbol); + const scope = getSymbolScope(symbol); // Maps from a symbol ID to the ReferencedSymbol entry in 'result'. - let symbolToIndex: number[] = []; + const symbolToIndex: number[] = []; if (scope) { result = []; getReferencesInNode(scope, symbol, declaredName, node, searchMeaning, findInStrings, findInComments, result, symbolToIndex); } else { - let internedName = getInternedName(symbol, node, declarations) - for (let sourceFile of sourceFiles) { + const internedName = getInternedName(symbol, node, declarations); + for (const sourceFile of sourceFiles) { cancellationToken.throwIfCancellationRequested(); - let nameTable = getNameTable(sourceFile); + const nameTable = getNameTable(sourceFile); if (lookUp(nameTable, internedName)) { result = result || []; @@ -5474,9 +5473,9 @@ namespace ts { return result; function getDefinition(symbol: Symbol): DefinitionInfo { - let info = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, node.getSourceFile(), getContainerNode(node), node); - let name = map(info.displayParts, p => p.text).join(""); - let declarations = symbol.declarations; + const info = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, node.getSourceFile(), getContainerNode(node), node); + const name = map(info.displayParts, p => p.text).join(""); + const declarations = symbol.declarations; if (!declarations || declarations.length === 0) { return undefined; } @@ -5506,7 +5505,7 @@ namespace ts { // Try to get the local symbol if we're dealing with an 'export default' // since that symbol has the "true" name. - let localExportDefaultSymbol = getLocalSymbolForExportDefault(symbol); + const localExportDefaultSymbol = getLocalSymbolForExportDefault(symbol); symbol = localExportDefaultSymbol || symbol; return stripQuotes(symbol.name); @@ -5523,14 +5522,14 @@ namespace ts { function getSymbolScope(symbol: Symbol): Node { // If this is the symbol of a named function expression or named class expression, // then named references are limited to its own scope. - let valueDeclaration = symbol.valueDeclaration; + const valueDeclaration = symbol.valueDeclaration; if (valueDeclaration && (valueDeclaration.kind === SyntaxKind.FunctionExpression || valueDeclaration.kind === SyntaxKind.ClassExpression)) { return valueDeclaration; } // If this is private property or method, the scope is the containing class if (symbol.flags & (SymbolFlags.Property | SymbolFlags.Method)) { - let privateDeclaration = forEach(symbol.getDeclarations(), d => (d.flags & NodeFlags.Private) ? d : undefined); + const privateDeclaration = forEach(symbol.getDeclarations(), d => (d.flags & NodeFlags.Private) ? d : undefined); if (privateDeclaration) { return getAncestor(privateDeclaration, SyntaxKind.ClassDeclaration); } @@ -5548,12 +5547,12 @@ namespace ts { return undefined; } - let scope: Node = undefined; + let scope: Node; - let declarations = symbol.getDeclarations(); + const declarations = symbol.getDeclarations(); if (declarations) { - for (let declaration of declarations) { - let container = getContainerNode(declaration); + for (const declaration of declarations) { + const container = getContainerNode(declaration); if (!container) { return undefined; @@ -5579,7 +5578,7 @@ namespace ts { } function getPossibleSymbolReferencePositions(sourceFile: SourceFile, symbolName: string, start: number, end: number): number[] { - let positions: number[] = []; + const positions: number[] = []; /// TODO: Cache symbol existence for files to save text search // Also, need to make this work for unicode escapes. @@ -5589,9 +5588,9 @@ namespace ts { return positions; } - let text = sourceFile.text; - let sourceLength = text.length; - let symbolNameLength = symbolName.length; + const text = sourceFile.text; + const sourceLength = text.length; + const symbolNameLength = symbolName.length; let position = text.indexOf(symbolName, start); while (position >= 0) { @@ -5602,7 +5601,7 @@ namespace ts { // We found a match. Make sure it's not part of a larger word (i.e. the char // before and after it have to be a non-identifier char). - let endPosition = position + symbolNameLength; + const endPosition = position + symbolNameLength; if ((position === 0 || !isIdentifierPart(text.charCodeAt(position - 1), ScriptTarget.Latest)) && (endPosition === sourceLength || !isIdentifierPart(text.charCodeAt(endPosition), ScriptTarget.Latest))) { @@ -5616,14 +5615,14 @@ namespace ts { } function getLabelReferencesInNode(container: Node, targetLabel: Identifier): ReferencedSymbol[] { - let references: ReferenceEntry[] = []; - let sourceFile = container.getSourceFile(); - let labelName = targetLabel.text; - let possiblePositions = getPossibleSymbolReferencePositions(sourceFile, labelName, container.getStart(), container.getEnd()); + const references: ReferenceEntry[] = []; + const sourceFile = container.getSourceFile(); + const labelName = targetLabel.text; + const possiblePositions = getPossibleSymbolReferencePositions(sourceFile, labelName, container.getStart(), container.getEnd()); forEach(possiblePositions, position => { cancellationToken.throwIfCancellationRequested(); - let node = getTouchingWord(sourceFile, position); + const node = getTouchingWord(sourceFile, position); if (!node || node.getWidth() !== labelName.length) { return; } @@ -5635,14 +5634,14 @@ namespace ts { } }); - let definition: DefinitionInfo = { + const definition: DefinitionInfo = { containerKind: "", containerName: "", fileName: targetLabel.getSourceFile().fileName, kind: ScriptElementKind.label, name: labelName, textSpan: createTextSpanFromBounds(targetLabel.getStart(), targetLabel.getEnd()) - } + }; return [{ definition, references }]; } @@ -5687,19 +5686,19 @@ namespace ts { result: ReferencedSymbol[], symbolToIndex: number[]): void { - let sourceFile = container.getSourceFile(); - let tripleSlashDirectivePrefixRegex = /^\/\/\/\s* { cancellationToken.throwIfCancellationRequested(); - let referenceLocation = getTouchingPropertyName(sourceFile, position); + const referenceLocation = getTouchingPropertyName(sourceFile, position); if (!isValidReferencePosition(referenceLocation, searchText)) { // This wasn't the start of a token. Check to see if it might be a // match in a comment or string if that's what the caller is asking @@ -5727,14 +5726,14 @@ namespace ts { return; } - let referenceSymbol = typeChecker.getSymbolAtLocation(referenceLocation); + const referenceSymbol = typeChecker.getSymbolAtLocation(referenceLocation); if (referenceSymbol) { - let referenceSymbolDeclaration = referenceSymbol.valueDeclaration; - let shorthandValueSymbol = typeChecker.getShorthandAssignmentValueSymbol(referenceSymbolDeclaration); - let relatedSymbol = getRelatedSymbol(searchSymbols, referenceSymbol, referenceLocation); + const referenceSymbolDeclaration = referenceSymbol.valueDeclaration; + const shorthandValueSymbol = typeChecker.getShorthandAssignmentValueSymbol(referenceSymbolDeclaration); + const relatedSymbol = getRelatedSymbol(searchSymbols, referenceSymbol, referenceLocation); if (relatedSymbol) { - let referencedSymbol = getReferencedSymbol(relatedSymbol); + const referencedSymbol = getReferencedSymbol(relatedSymbol); referencedSymbol.references.push(getReferenceEntryFromNode(referenceLocation)); } /* Because in short-hand property assignment, an identifier which stored as name of the short-hand property assignment @@ -5744,7 +5743,7 @@ namespace ts { * position of property accessing, the referenceEntry of such position will be handled in the first case. */ else if (!(referenceSymbol.flags & SymbolFlags.Transient) && searchSymbols.indexOf(shorthandValueSymbol) >= 0) { - let referencedSymbol = getReferencedSymbol(shorthandValueSymbol); + const referencedSymbol = getReferencedSymbol(shorthandValueSymbol); referencedSymbol.references.push(getReferenceEntryFromNode(referenceSymbolDeclaration.name)); } } @@ -5754,7 +5753,7 @@ namespace ts { return; function getReferencedSymbol(symbol: Symbol): ReferencedSymbol { - let symbolId = getSymbolId(symbol); + const symbolId = getSymbolId(symbol); let index = symbolToIndex[symbolId]; if (index === undefined) { index = result.length; @@ -5773,7 +5772,7 @@ namespace ts { return isInCommentHelper(sourceFile, position, isNonReferenceComment); function isNonReferenceComment(c: CommentRange): boolean { - let commentText = sourceFile.text.substring(c.pos, c.end); + const commentText = sourceFile.text.substring(c.pos, c.end); return !tripleSlashDirectivePrefixRegex.test(commentText); } } @@ -5802,20 +5801,20 @@ namespace ts { return undefined; } - let references: ReferenceEntry[] = []; + const references: ReferenceEntry[] = []; - let sourceFile = searchSpaceNode.getSourceFile(); - let possiblePositions = getPossibleSymbolReferencePositions(sourceFile, "super", searchSpaceNode.getStart(), searchSpaceNode.getEnd()); + const sourceFile = searchSpaceNode.getSourceFile(); + const possiblePositions = getPossibleSymbolReferencePositions(sourceFile, "super", searchSpaceNode.getStart(), searchSpaceNode.getEnd()); forEach(possiblePositions, position => { cancellationToken.throwIfCancellationRequested(); - let node = getTouchingWord(sourceFile, position); + const node = getTouchingWord(sourceFile, position); if (!node || node.kind !== SyntaxKind.SuperKeyword) { return; } - let container = getSuperContainer(node, /*includeFunctions*/ false); + const container = getSuperContainer(node, /*includeFunctions*/ false); // If we have a 'super' container, we must have an enclosing class. // Now make sure the owning class is the same as the search-space @@ -5825,7 +5824,7 @@ namespace ts { } }); - let definition = getDefinition(searchSpaceNode.symbol); + const definition = getDefinition(searchSpaceNode.symbol); return [{ definition, references }]; } @@ -5847,7 +5846,7 @@ namespace ts { case SyntaxKind.Constructor: case SyntaxKind.GetAccessor: case SyntaxKind.SetAccessor: - staticFlag &= searchSpaceNode.flags + staticFlag &= searchSpaceNode.flags; searchSpaceNode = searchSpaceNode.parent; // re-assign to be the owning class break; case SyntaxKind.SourceFile: @@ -5864,7 +5863,7 @@ namespace ts { return undefined; } - let references: ReferenceEntry[] = []; + const references: ReferenceEntry[] = []; let possiblePositions: number[]; if (searchSpaceNode.kind === SyntaxKind.SourceFile) { @@ -5874,7 +5873,7 @@ namespace ts { }); } else { - let sourceFile = searchSpaceNode.getSourceFile(); + const sourceFile = searchSpaceNode.getSourceFile(); possiblePositions = getPossibleSymbolReferencePositions(sourceFile, "this", searchSpaceNode.getStart(), searchSpaceNode.getEnd()); getThisReferencesInFile(sourceFile, searchSpaceNode, possiblePositions, references); } @@ -5895,12 +5894,12 @@ namespace ts { forEach(possiblePositions, position => { cancellationToken.throwIfCancellationRequested(); - let node = getTouchingWord(sourceFile, position); + const node = getTouchingWord(sourceFile, position); if (!node || (node.kind !== SyntaxKind.ThisKeyword && node.kind !== SyntaxKind.ThisType)) { return; } - let container = getThisContainer(node, /* includeArrowFunctions */ false); + const container = getThisContainer(node, /* includeArrowFunctions */ false); switch (searchSpaceNode.kind) { case SyntaxKind.FunctionExpression: @@ -5955,13 +5954,13 @@ namespace ts { * property name and variable declaration of the identifier. * Like in below example, when querying for all references for an identifier 'name', of the property assignment, the language service * should show both 'name' in 'obj' and 'name' in variable declaration - * let name = "Foo"; - * let obj = { name }; + * const name = "Foo"; + * const obj = { name }; * In order to do that, we will populate the search set with the value symbol of the identifier as a value of the property assignment * so that when matching with potential reference symbol, both symbols from property declaration and variable declaration * will be included correctly. */ - let shorthandValueSymbol = typeChecker.getShorthandAssignmentValueSymbol(location.parent); + const shorthandValueSymbol = typeChecker.getShorthandAssignmentValueSymbol(location.parent); if (shorthandValueSymbol) { result.push(shorthandValueSymbol); } @@ -6008,9 +6007,9 @@ namespace ts { function getPropertySymbolFromTypeReference(typeReference: ExpressionWithTypeArguments) { if (typeReference) { - let type = typeChecker.getTypeAtLocation(typeReference); + const type = typeChecker.getTypeAtLocation(typeReference); if (type) { - let propertySymbol = typeChecker.getPropertyOfType(type, propertyName); + const propertySymbol = typeChecker.getPropertyOfType(type, propertyName); if (propertySymbol) { result.push(propertySymbol); } @@ -6030,7 +6029,7 @@ namespace ts { // If the reference symbol is an alias, check if what it is aliasing is one of the search // symbols. if (isImportOrExportSpecifierImportSymbol(referenceSymbol)) { - let aliasedSymbol = typeChecker.getAliasedSymbol(referenceSymbol); + const aliasedSymbol = typeChecker.getAliasedSymbol(referenceSymbol); if (searchSymbols.indexOf(aliasedSymbol) >= 0) { return aliasedSymbol; } @@ -6056,7 +6055,7 @@ namespace ts { // Finally, try all properties with the same name in any type the containing type extended or implemented, and // see if any is in the list if (rootSymbol.parent && rootSymbol.parent.flags & (SymbolFlags.Class | SymbolFlags.Interface)) { - let result: Symbol[] = []; + const result: Symbol[] = []; getPropertySymbolsFromBaseTypes(rootSymbol.parent, rootSymbol.getName(), result); return forEach(result, s => searchSymbols.indexOf(s) >= 0 ? s : undefined); } @@ -6067,21 +6066,21 @@ namespace ts { function getPropertySymbolsFromContextualType(node: Node): Symbol[] { if (isNameOfPropertyAssignment(node)) { - let objectLiteral = node.parent.parent; - let contextualType = typeChecker.getContextualType(objectLiteral); - let name = (node).text; + const objectLiteral = node.parent.parent; + const contextualType = typeChecker.getContextualType(objectLiteral); + const name = (node).text; if (contextualType) { if (contextualType.flags & TypeFlags.Union) { // This is a union type, first see if the property we are looking for is a union property (i.e. exists in all types) // if not, search the constituent types for the property - let unionProperty = contextualType.getProperty(name) + const unionProperty = contextualType.getProperty(name); if (unionProperty) { return [unionProperty]; } else { - let result: Symbol[] = []; + const result: Symbol[] = []; forEach((contextualType).types, t => { - let symbol = t.getProperty(name); + const symbol = t.getProperty(name); if (symbol) { result.push(symbol); } @@ -6090,7 +6089,7 @@ namespace ts { } } else { - let symbol = contextualType.getProperty(name); + const symbol = contextualType.getProperty(name); if (symbol) { return [symbol]; } @@ -6119,8 +6118,8 @@ namespace ts { // Remember the last meaning lastIterationMeaning = meaning; - for (let declaration of declarations) { - let declarationMeaning = getMeaningFromDeclaration(declaration); + for (const declaration of declarations) { + const declarationMeaning = getMeaningFromDeclaration(declaration); if (declarationMeaning & meaning) { meaning |= declarationMeaning; @@ -6155,13 +6154,13 @@ namespace ts { return true; } - let parent = node.parent; + const parent = node.parent; if (parent) { if (parent.kind === SyntaxKind.PostfixUnaryExpression || parent.kind === SyntaxKind.PrefixUnaryExpression) { return true; } else if (parent.kind === SyntaxKind.BinaryExpression && (parent).left === node) { - let operator = (parent).operatorToken.kind; + const operator = (parent).operatorToken.kind; return SyntaxKind.FirstAssignment <= operator && operator <= SyntaxKind.LastAssignment; } } @@ -6183,8 +6182,8 @@ namespace ts { function getEmitOutput(fileName: string): EmitOutput { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); - let outputFiles: OutputFile[] = []; + const sourceFile = getValidSourceFile(fileName); + const outputFiles: OutputFile[] = []; function writeFile(fileName: string, data: string, writeByteOrderMark: boolean) { outputFiles.push({ @@ -6194,7 +6193,7 @@ namespace ts { }); } - let emitOutput = program.emit(sourceFile, writeFile, cancellationToken); + const emitOutput = program.emit(sourceFile, writeFile, cancellationToken); return { outputFiles, @@ -6287,7 +6286,7 @@ namespace ts { } if (!isLastClause && root.parent.kind === SyntaxKind.ExpressionWithTypeArguments && root.parent.parent.kind === SyntaxKind.HeritageClause) { - let decl = root.parent.parent.parent; + const decl = root.parent.parent.parent; return (decl.kind === SyntaxKind.ClassDeclaration && (root.parent.parent).token === SyntaxKind.ImplementsKeyword) || (decl.kind === SyntaxKind.InterfaceDeclaration && (root.parent.parent).token === SyntaxKind.ExtendsKeyword); } @@ -6359,7 +6358,7 @@ namespace ts { function getSignatureHelpItems(fileName: string, position: number): SignatureHelpItems { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); return SignatureHelp.getSignatureHelpItems(program, sourceFile, position, cancellationToken); } @@ -6370,10 +6369,10 @@ namespace ts { } function getNameOrDottedNameSpan(fileName: string, startPos: number, endPos: number): TextSpan { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); // Get node at the location - let node = getTouchingPropertyName(sourceFile, startPos); + const node = getTouchingPropertyName(sourceFile, startPos); if (!node) { return; @@ -6429,13 +6428,13 @@ namespace ts { function getBreakpointStatementAtPosition(fileName: string, position: number) { // doesn't use compiler - no need to synchronize with host - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return BreakpointResolver.spanInSourceFileAtLocation(sourceFile, position); } function getNavigationBarItems(fileName: string): NavigationBarItem[] { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return NavigationBar.getNavigationBarItems(sourceFile, host.getCompilationSettings()); } @@ -6467,11 +6466,11 @@ namespace ts { function getEncodedSemanticClassifications(fileName: string, span: TextSpan): Classifications { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); - let typeChecker = program.getTypeChecker(); + const sourceFile = getValidSourceFile(fileName); + const typeChecker = program.getTypeChecker(); - let result: number[] = []; - let classifiableNames = program.getClassifiableNames(); + const result: number[] = []; + const classifiableNames = program.getClassifiableNames(); processNode(sourceFile); return { spans: result, endOfLineState: EndOfLineState.None }; @@ -6483,7 +6482,7 @@ namespace ts { } function classifySymbol(symbol: Symbol, meaningAtPosition: SemanticMeaning): ClassificationType { - let flags = symbol.getFlags(); + const flags = symbol.getFlags(); if ((flags & SymbolFlags.Classifiable) === SymbolFlags.None) { return; } @@ -6531,19 +6530,19 @@ namespace ts { function processNode(node: Node) { // Only walk into nodes that intersect the requested span. if (node && textSpanIntersectsWith(span, node.getFullStart(), node.getFullWidth())) { - let kind = node.kind; + const kind = node.kind; checkForClassificationCancellation(kind); if (kind === SyntaxKind.Identifier && !nodeIsMissing(node)) { - let identifier = node; + const 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 (classifiableNames[identifier.text]) { - let symbol = typeChecker.getSymbolAtLocation(node); + const symbol = typeChecker.getSymbolAtLocation(node); if (symbol) { - let type = classifySymbol(symbol, getMeaningFromLocation(node)); + const type = classifySymbol(symbol, getMeaningFromLocation(node)); if (type) { pushClassification(node.getStart(), node.getWidth(), type); } @@ -6583,8 +6582,8 @@ namespace ts { function convertClassifications(classifications: Classifications): ClassifiedSpan[] { Debug.assert(classifications.spans.length % 3 === 0); - let dense = classifications.spans; - let result: ClassifiedSpan[] = []; + const dense = classifications.spans; + const result: ClassifiedSpan[] = []; for (let i = 0, n = dense.length; i < n; i += 3) { result.push({ textSpan: createTextSpan(dense[i], dense[i + 1]), @@ -6601,15 +6600,15 @@ namespace ts { function getEncodedSyntacticClassifications(fileName: string, span: TextSpan): Classifications { // doesn't use compiler - no need to synchronize with host - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); - let spanStart = span.start; - let spanLength = span.length; + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const spanStart = span.start; + const spanLength = span.length; // Make a scanner we can get trivia from. - let triviaScanner = createScanner(ScriptTarget.Latest, /*skipTrivia:*/ false, sourceFile.languageVariant, sourceFile.text); - let mergeConflictScanner = createScanner(ScriptTarget.Latest, /*skipTrivia:*/ false, sourceFile.languageVariant, sourceFile.text); + const triviaScanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false, sourceFile.languageVariant, sourceFile.text); + const mergeConflictScanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false, sourceFile.languageVariant, sourceFile.text); - let result: number[] = []; + const result: number[] = []; processElement(sourceFile); return { spans: result, endOfLineState: EndOfLineState.None }; @@ -6623,15 +6622,15 @@ namespace ts { function classifyLeadingTriviaAndGetTokenStart(token: Node): number { triviaScanner.setTextPos(token.pos); while (true) { - let start = triviaScanner.getTextPos(); + const start = triviaScanner.getTextPos(); // only bother scanning if we have something that could be trivia. if (!couldStartTrivia(sourceFile.text, start)) { return start; } - let kind = triviaScanner.scan(); - let end = triviaScanner.getTextPos(); - let width = end - start; + const kind = triviaScanner.scan(); + const end = triviaScanner.getTextPos(); + const width = end - start; // The moment we get something that isn't trivia, then stop processing. if (!isTrivia(kind)) { @@ -6655,8 +6654,8 @@ namespace ts { } if (kind === SyntaxKind.ConflictMarkerTrivia) { - let text = sourceFile.text; - let ch = text.charCodeAt(start); + const text = sourceFile.text; + const ch = text.charCodeAt(start); // for the <<<<<<< and >>>>>>> markers, we just add them in as comments // in the classification stream. @@ -6677,7 +6676,7 @@ namespace ts { if (kind === SyntaxKind.MultiLineCommentTrivia) { // See if this is a doc comment. If so, we'll classify certain portions of it // specially. - let docCommentAndDiagnostics = parseIsolatedJSDocComment(sourceFile.text, start, width); + const docCommentAndDiagnostics = parseIsolatedJSDocComment(sourceFile.text, start, width); if (docCommentAndDiagnostics && docCommentAndDiagnostics.jsDocComment) { docCommentAndDiagnostics.jsDocComment.parent = token; classifyJSDocComment(docCommentAndDiagnostics.jsDocComment); @@ -6696,7 +6695,7 @@ namespace ts { function classifyJSDocComment(docComment: JSDocComment) { let pos = docComment.pos; - for (let tag of docComment.tags) { + for (const tag of docComment.tags) { // As we walk through each tag, classify the portion of text from the end of // the last tag (or the start of the entire doc comment) as 'comment'. if (tag.pos !== pos) { @@ -6754,7 +6753,7 @@ namespace ts { } function processJSDocTemplateTag(tag: JSDocTemplateTag) { - for (let child of tag.getChildren()) { + for (const child of tag.getChildren()) { processElement(child); } } @@ -6776,11 +6775,11 @@ namespace ts { } function classifyDisabledCodeToken() { - let start = mergeConflictScanner.getTextPos(); - let tokenKind = mergeConflictScanner.scan(); - let end = mergeConflictScanner.getTextPos(); + const start = mergeConflictScanner.getTextPos(); + const tokenKind = mergeConflictScanner.scan(); + const end = mergeConflictScanner.getTextPos(); - let type = classifyTokenType(tokenKind); + const type = classifyTokenType(tokenKind); if (type) { pushClassification(start, end - start, type); } @@ -6791,12 +6790,12 @@ namespace ts { return; } - let tokenStart = classifyLeadingTriviaAndGetTokenStart(token); + const tokenStart = classifyLeadingTriviaAndGetTokenStart(token); - let tokenWidth = token.end - tokenStart; + const tokenWidth = token.end - tokenStart; Debug.assert(tokenWidth >= 0); if (tokenWidth > 0) { - let type = classifyTokenType(token.kind, token); + const type = classifyTokenType(token.kind, token); if (type) { pushClassification(tokenStart, tokenWidth, type); } @@ -6923,9 +6922,9 @@ namespace ts { if (decodedTextSpanIntersectsWith(spanStart, spanLength, element.pos, element.getFullWidth())) { checkForClassificationCancellation(element.kind); - let children = element.getChildren(sourceFile); + const children = element.getChildren(sourceFile); for (let i = 0, n = children.length; i < n; i++) { - let child = children[i]; + const child = children[i]; if (isToken(child)) { classifyToken(child); } @@ -6940,28 +6939,28 @@ namespace ts { function getOutliningSpans(fileName: string): OutliningSpan[] { // doesn't use compiler - no need to synchronize with host - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return OutliningElementsCollector.collectElements(sourceFile); } function getBraceMatchingAtPosition(fileName: string, position: number) { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); - let result: TextSpan[] = []; + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const result: TextSpan[] = []; - let token = getTouchingToken(sourceFile, position); + const token = getTouchingToken(sourceFile, position); if (token.getStart(sourceFile) === position) { - let matchKind = getMatchingTokenKind(token); + const matchKind = getMatchingTokenKind(token); // Ensure that there is a corresponding token to match ours. if (matchKind) { - let parentElement = token.parent; + const parentElement = token.parent; - let childNodes = parentElement.getChildren(sourceFile); - for (let current of childNodes) { + const childNodes = parentElement.getChildren(sourceFile); + for (const current of childNodes) { if (current.kind === matchKind) { - let range1 = createTextSpan(token.getStart(sourceFile), token.getWidth(sourceFile)); - let range2 = createTextSpan(current.getStart(sourceFile), current.getWidth(sourceFile)); + const range1 = createTextSpan(token.getStart(sourceFile), token.getWidth(sourceFile)); + const range2 = createTextSpan(current.getStart(sourceFile), current.getWidth(sourceFile)); // We want to order the braces when we return the result. if (range1.start < range2.start) { @@ -6981,11 +6980,11 @@ namespace ts { function getMatchingTokenKind(token: Node): ts.SyntaxKind { switch (token.kind) { - case ts.SyntaxKind.OpenBraceToken: return ts.SyntaxKind.CloseBraceToken + case ts.SyntaxKind.OpenBraceToken: return ts.SyntaxKind.CloseBraceToken; case ts.SyntaxKind.OpenParenToken: return ts.SyntaxKind.CloseParenToken; case ts.SyntaxKind.OpenBracketToken: return ts.SyntaxKind.CloseBracketToken; case ts.SyntaxKind.LessThanToken: return ts.SyntaxKind.GreaterThanToken; - case ts.SyntaxKind.CloseBraceToken: return ts.SyntaxKind.OpenBraceToken + case ts.SyntaxKind.CloseBraceToken: return ts.SyntaxKind.OpenBraceToken; case ts.SyntaxKind.CloseParenToken: return ts.SyntaxKind.OpenParenToken; case ts.SyntaxKind.CloseBracketToken: return ts.SyntaxKind.OpenBracketToken; case ts.SyntaxKind.GreaterThanToken: return ts.SyntaxKind.LessThanToken; @@ -6997,29 +6996,29 @@ namespace ts { function getIndentationAtPosition(fileName: string, position: number, editorOptions: EditorOptions) { let start = new Date().getTime(); - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); log("getIndentationAtPosition: getCurrentSourceFile: " + (new Date().getTime() - start)); start = new Date().getTime(); - let result = formatting.SmartIndenter.getIndentation(position, sourceFile, editorOptions); + const result = formatting.SmartIndenter.getIndentation(position, sourceFile, editorOptions); log("getIndentationAtPosition: computeIndentation : " + (new Date().getTime() - start)); return result; } function getFormattingEditsForRange(fileName: string, start: number, end: number, options: FormatCodeOptions): TextChange[] { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return formatting.formatSelection(start, end, sourceFile, getRuleProvider(options), options); } function getFormattingEditsForDocument(fileName: string, options: FormatCodeOptions): TextChange[] { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return formatting.formatDocument(sourceFile, getRuleProvider(options), options); } function getFormattingEditsAfterKeystroke(fileName: string, position: number, key: string, options: FormatCodeOptions): TextChange[] { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); if (key === "}") { return formatting.formatOnClosingCurly(position, sourceFile, getRuleProvider(options), options); @@ -7055,16 +7054,16 @@ namespace ts { * be performed. */ function getDocCommentTemplateAtPosition(fileName: string, position: number): TextInsertion { - let start = new Date().getTime(); - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const start = new Date().getTime(); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); // Check if in a context where we don't want to perform any insertion if (isInString(sourceFile, position) || isInComment(sourceFile, position) || hasDocComment(sourceFile, position)) { return undefined; } - let tokenAtPos = getTokenAtPosition(sourceFile, position); - let tokenStart = tokenAtPos.getStart() + const tokenAtPos = getTokenAtPosition(sourceFile, position); + const tokenStart = tokenAtPos.getStart(); if (!tokenAtPos || tokenStart < position) { return undefined; } @@ -7100,11 +7099,11 @@ namespace ts { return undefined; } - let parameters = getParametersForJsDocOwningNode(commentOwner); - let posLineAndChar = sourceFile.getLineAndCharacterOfPosition(position); - let lineStart = sourceFile.getLineStarts()[posLineAndChar.line]; + const parameters = getParametersForJsDocOwningNode(commentOwner); + const posLineAndChar = sourceFile.getLineAndCharacterOfPosition(position); + const lineStart = sourceFile.getLineStarts()[posLineAndChar.line]; - let indentationStr = sourceFile.text.substr(lineStart, posLineAndChar.character); + const indentationStr = sourceFile.text.substr(lineStart, posLineAndChar.character); // TODO: call a helper method instead once PR #4133 gets merged in. const newLine = host.getNewLine ? host.getNewLine() : "\r\n"; @@ -7128,7 +7127,7 @@ namespace ts { // * if the caret was directly in front of the object, then we add an extra line and indentation. const preamble = "/**" + newLine + indentationStr + " * "; - let result = + const result = preamble + newLine + docParams + indentationStr + " */" + @@ -7172,7 +7171,7 @@ namespace ts { case SyntaxKind.ArrowFunction: return (rightHandSide).parameters; case SyntaxKind.ClassExpression: - for (let member of (rightHandSide).members) { + for (const member of (rightHandSide).members) { if (member.kind === SyntaxKind.Constructor) { return (member).parameters; } @@ -7192,15 +7191,15 @@ namespace ts { // anything away. synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); cancellationToken.throwIfCancellationRequested(); - let fileContents = sourceFile.text; - let result: TodoComment[] = []; + const fileContents = sourceFile.text; + const result: TodoComment[] = []; if (descriptors.length > 0) { - let regExp = getTodoCommentsRegExp(); + const regExp = getTodoCommentsRegExp(); let matchArray: RegExpExecArray; while (matchArray = regExp.exec(fileContents)) { @@ -7223,15 +7222,15 @@ namespace ts { // // i.e. 'undefined' in position 3 above means TODO(jason) didn't match. // "hack" in position 4 means HACK did match. - let firstDescriptorCaptureIndex = 3; + const firstDescriptorCaptureIndex = 3; Debug.assert(matchArray.length === descriptors.length + firstDescriptorCaptureIndex); - let preamble = matchArray[1]; - let matchPosition = matchArray.index + preamble.length; + const preamble = matchArray[1]; + const matchPosition = matchArray.index + preamble.length; // OK, we have found a match in the file. This is only an acceptable match if // it is contained within a comment. - let token = getTokenAtPosition(sourceFile, matchPosition); + const token = getTokenAtPosition(sourceFile, matchPosition); if (!isInsideComment(sourceFile, token, matchPosition)) { continue; } @@ -7250,7 +7249,7 @@ namespace ts { continue; } - let message = matchArray[2]; + const message = matchArray[2]; result.push({ descriptor: descriptor, message: message, @@ -7281,14 +7280,14 @@ namespace ts { // // The following three regexps are used to match the start of the text up to the TODO // comment portion. - let singleLineCommentStart = /(?:\/\/+\s*)/.source; - let multiLineCommentStart = /(?:\/\*+\s*)/.source; - let anyNumberOfSpacesAndAsterixesAtStartOfLine = /(?:^(?:\s|\*)*)/.source; + const singleLineCommentStart = /(?:\/\/+\s*)/.source; + const multiLineCommentStart = /(?:\/\*+\s*)/.source; + const anyNumberOfSpacesAndAsterixesAtStartOfLine = /(?:^(?:\s|\*)*)/.source; // Match any of the above three TODO comment start regexps. // Note that the outermost group *is* a capture group. We want to capture the preamble // so that we can determine the starting position of the TODO comment match. - let preamble = "(" + anyNumberOfSpacesAndAsterixesAtStartOfLine + "|" + singleLineCommentStart + "|" + multiLineCommentStart + ")"; + const preamble = "(" + anyNumberOfSpacesAndAsterixesAtStartOfLine + "|" + singleLineCommentStart + "|" + multiLineCommentStart + ")"; // Takes the descriptors and forms a regexp that matches them as if they were literals. // For example, if the descriptors are "TODO(jason)" and "HACK", then this will be: @@ -7298,17 +7297,17 @@ namespace ts { // Note that the outermost group is *not* a capture group, but the innermost groups // *are* capture groups. By capturing the inner literals we can determine after // matching which descriptor we are dealing with. - let literals = "(?:" + map(descriptors, d => "(" + escapeRegExp(d.text) + ")").join("|") + ")"; + const literals = "(?:" + map(descriptors, d => "(" + escapeRegExp(d.text) + ")").join("|") + ")"; // After matching a descriptor literal, the following regexp matches the rest of the // text up to the end of the line (or */). - let endOfLineOrEndOfComment = /(?:$|\*\/)/.source - let messageRemainder = /(?:.*?)/.source + const endOfLineOrEndOfComment = /(?:$|\*\/)/.source; + const messageRemainder = /(?:.*?)/.source; // This is the portion of the match we'll return as part of the TODO comment result. We // match the literal portion up to the end of the line or end of comment. - let messagePortion = "(" + literals + messageRemainder + ")"; - let regExpString = preamble + messagePortion + endOfLineOrEndOfComment; + const messagePortion = "(" + literals + messageRemainder + ")"; + const regExpString = preamble + messagePortion + endOfLineOrEndOfComment; // The final regexp will look like this: // /((?:\/\/+\s*)|(?:\/\*+\s*)|(?:^(?:\s|\*)*))((?:(TODO\(jason\))|(HACK))(?:.*?))(?:$|\*\/)/gim @@ -7334,40 +7333,40 @@ namespace ts { function getRenameInfo(fileName: string, position: number): RenameInfo { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); - let typeChecker = program.getTypeChecker(); + const sourceFile = getValidSourceFile(fileName); + const typeChecker = program.getTypeChecker(); - let node = getTouchingWord(sourceFile, position); + const node = getTouchingWord(sourceFile, position); // Can only rename an identifier. if (node && node.kind === SyntaxKind.Identifier) { - let symbol = typeChecker.getSymbolAtLocation(node); + const symbol = typeChecker.getSymbolAtLocation(node); // Only allow a symbol to be renamed if it actually has at least one declaration. if (symbol) { - let declarations = symbol.getDeclarations(); + const declarations = symbol.getDeclarations(); if (declarations && declarations.length > 0) { // Disallow rename for elements that are defined in the standard TypeScript library. - let defaultLibFileName = host.getDefaultLibFileName(host.getCompilationSettings()); + const defaultLibFileName = host.getDefaultLibFileName(host.getCompilationSettings()); if (defaultLibFileName) { - for (let current of declarations) { - let sourceFile = current.getSourceFile(); - var canonicalName = getCanonicalFileName(ts.normalizePath(sourceFile.fileName)); + for (const current of declarations) { + const sourceFile = current.getSourceFile(); + const canonicalName = getCanonicalFileName(ts.normalizePath(sourceFile.fileName)); if (sourceFile && getCanonicalFileName(ts.normalizePath(sourceFile.fileName)) === getCanonicalFileName(ts.normalizePath(defaultLibFileName))) { return getRenameInfoError(getLocaleSpecificMessage(Diagnostics.You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library)); } } } - let displayName = stripQuotes(getDeclaredName(typeChecker, symbol, node)); - let kind = getSymbolKind(symbol, node); + const displayName = stripQuotes(getDeclaredName(typeChecker, symbol, node)); + const kind = getSymbolKind(symbol, node); if (kind) { return { canRename: true, - localizedErrorMessage: undefined, + kind, displayName, + localizedErrorMessage: undefined, fullDisplayName: typeChecker.getFullyQualifiedName(symbol), - kind: kind, kindModifiers: getSymbolModifiers(symbol), triggerSpan: createTextSpan(node.getStart(), node.getWidth()) }; @@ -7434,14 +7433,14 @@ namespace ts { /* @internal */ export function getNameTable(sourceFile: SourceFile): Map { if (!sourceFile.nameTable) { - initializeNameTable(sourceFile) + initializeNameTable(sourceFile); } return sourceFile.nameTable; } function initializeNameTable(sourceFile: SourceFile): void { - let nameTable: Map = {}; + const nameTable: Map = {}; walk(sourceFile); sourceFile.nameTable = nameTable; @@ -7479,13 +7478,13 @@ namespace ts { /// Classifier export function createClassifier(): Classifier { - let scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false); + const scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false); /// We do not have a full parser support to know when we should parse a regex or not /// If we consider every slash token to be a regex, we could be missing cases like "1/2/3", where /// we have a series of divide operator. this list allows us to be more accurate by ruling out /// locations where a regexp cannot exist. - let noRegexTable: boolean[] = []; + const noRegexTable: boolean[] = []; noRegexTable[SyntaxKind.Identifier] = true; noRegexTable[SyntaxKind.StringLiteral] = true; noRegexTable[SyntaxKind.NumericLiteral] = true; @@ -7519,7 +7518,7 @@ namespace ts { // // Where on the second line, you will get the 'return' keyword, // a string literal, and a template end consisting of '} } `'. - let templateStack: SyntaxKind[] = []; + const templateStack: SyntaxKind[] = []; /** Returns true if 'keyword2' can legally follow 'keyword1' in any language construct. */ function canFollow(keyword1: SyntaxKind, keyword2: SyntaxKind) { @@ -7545,18 +7544,18 @@ namespace ts { } function convertClassifications(classifications: Classifications, text: string): ClassificationResult { - let entries: ClassificationInfo[] = []; - let dense = classifications.spans; + const entries: ClassificationInfo[] = []; + const dense = classifications.spans; let lastEnd = 0; for (let i = 0, n = dense.length; i < n; i += 3) { - let start = dense[i]; - let length = dense[i + 1]; - let type = dense[i + 2]; + const start = dense[i]; + const length = dense[i + 1]; + const type = dense[i + 2]; // Make a whitespace entry between the last item and this one. if (lastEnd >= 0) { - let whitespaceLength = start - lastEnd; + const whitespaceLength = start - lastEnd; if (whitespaceLength > 0) { entries.push({ length: whitespaceLength, classification: TokenClass.Whitespace }); } @@ -7566,7 +7565,7 @@ namespace ts { lastEnd = start + length; } - let whitespaceLength = text.length - lastEnd; + const whitespaceLength = text.length - lastEnd; if (whitespaceLength > 0) { entries.push({ length: whitespaceLength, classification: TokenClass.Whitespace }); } @@ -7620,7 +7619,7 @@ namespace ts { // (and a newline). That way when we lex we'll think we're still in a multiline comment. switch (lexState) { case EndOfLineState.InDoubleQuoteStringLiteral: - text = '"\\\n' + text; + text = "\"\\\n" + text; offset = 3; break; case EndOfLineState.InSingleQuoteStringLiteral: @@ -7646,7 +7645,7 @@ namespace ts { scanner.setText(text); - let result: Classifications = { + const result: Classifications = { endOfLineState: EndOfLineState.None, spans: [] }; @@ -7728,7 +7727,7 @@ namespace ts { // If we don't have anything on the template stack, // then we aren't trying to keep track of a previously scanned template head. if (templateStack.length > 0) { - let lastTemplateStackToken = lastOrUndefined(templateStack); + const lastTemplateStackToken = lastOrUndefined(templateStack); if (lastTemplateStackToken === SyntaxKind.TemplateHead) { token = scanner.reScanTemplateToken(); @@ -7758,17 +7757,17 @@ namespace ts { return result; function processToken(): void { - let start = scanner.getTokenPos(); - let end = scanner.getTextPos(); + const start = scanner.getTokenPos(); + const end = scanner.getTextPos(); addResult(start, end, classFromKind(token)); if (end >= text.length) { if (token === SyntaxKind.StringLiteral || token === SyntaxKind.StringLiteralType) { // Check to see if we finished up on a multiline string literal. - let tokenText = scanner.getTokenText(); + const tokenText = scanner.getTokenText(); if (scanner.isUnterminated()) { - let lastCharIndex = tokenText.length - 1; + const lastCharIndex = tokenText.length - 1; let numBackslashes = 0; while (tokenText.charCodeAt(lastCharIndex - numBackslashes) === CharacterCodes.backslash) { @@ -7777,7 +7776,7 @@ namespace ts { // If we have an odd number of backslashes, then the multiline string is unclosed if (numBackslashes & 1) { - let quoteChar = tokenText.charCodeAt(0); + const quoteChar = tokenText.charCodeAt(0); result.endOfLineState = quoteChar === CharacterCodes.doubleQuote ? EndOfLineState.InDoubleQuoteStringLiteral : EndOfLineState.InSingleQuoteStringLiteral; @@ -7826,7 +7825,7 @@ namespace ts { // relative to the original text. start -= offset; end -= offset; - let length = end - start; + const length = end - start; if (length > 0) { result.spans.push(start); @@ -7941,7 +7940,7 @@ namespace ts { } /// getDefaultLibraryFilePath - declare let __dirname: string; + declare const __dirname: string; /** * Get the path of the default library files (lib.d.ts) as distributed with the typescript From c0b0bebaa79d055bf23bde9e2a4c4eb5c7c97766 Mon Sep 17 00:00:00 2001 From: Yui T Date: Mon, 14 Dec 2015 14:04:14 -0800 Subject: [PATCH 11/61] Fix linting issue --- Jakefile.js | 3 +- src/services/services.ts | 1071 +++++++++++++++++++------------------- 2 files changed, 537 insertions(+), 537 deletions(-) diff --git a/Jakefile.js b/Jakefile.js index beb16d2886f..91bd805a27b 100644 --- a/Jakefile.js +++ b/Jakefile.js @@ -924,7 +924,8 @@ function lintFileAsync(options, path, cb) { var lintTargets = compilerSources .concat(harnessCoreSources) .concat(serverCoreSources) - .concat(scriptSources); + .concat(scriptSources) + .concat([path.join(servicesDirectory,"services.ts")]); desc("Runs tslint on the compiler sources"); task("lint", ["build-rules"], function() { diff --git a/src/services/services.ts b/src/services/services.ts index 8e2e4913edd..4109a4eb345 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -12,7 +12,7 @@ namespace ts { /** The version of the language service API */ - export let servicesVersion = "0.4" + export const servicesVersion = "0.4"; export interface Node { getSourceFile(): SourceFile; @@ -48,7 +48,7 @@ namespace ts { getConstructSignatures(): Signature[]; getStringIndexType(): Type; getNumberIndexType(): Type; - getBaseTypes(): ObjectType[] + getBaseTypes(): ObjectType[]; } export interface Signature { @@ -97,7 +97,7 @@ namespace ts { dispose?(): void; } - export module ScriptSnapshot { + export namespace ScriptSnapshot { class StringScriptSnapshot implements IScriptSnapshot { constructor(private text: string) { @@ -126,12 +126,12 @@ namespace ts { referencedFiles: FileReference[]; importedFiles: FileReference[]; ambientExternalModules: string[]; - isLibFile: boolean + isLibFile: boolean; } - let scanner: Scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ true); + const scanner: Scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ true); - let emptyArray: any[] = []; + const emptyArray: any[] = []; const jsDocTagNames = [ "augments", @@ -174,7 +174,7 @@ namespace ts { let jsDocCompletionEntries: CompletionEntry[]; function createNode(kind: SyntaxKind, pos: number, end: number, flags: NodeFlags, parent?: Node): NodeObject { - let node = new NodeObject(kind, pos, end); + const node = new NodeObject(kind, pos, end); node.flags = flags; node.parent = parent; return node; @@ -235,8 +235,8 @@ namespace ts { private addSyntheticNodes(nodes: Node[], pos: number, end: number): number { scanner.setTextPos(pos); while (pos < end) { - let token = scanner.scan(); - let textPos = scanner.getTextPos(); + const token = scanner.scan(); + const textPos = scanner.getTextPos(); nodes.push(createNode(token, pos, textPos, NodeFlags.Synthetic, this)); pos = textPos; } @@ -244,13 +244,11 @@ namespace ts { } private createSyntaxList(nodes: NodeArray): Node { - let list = createNode(SyntaxKind.SyntaxList, nodes.pos, nodes.end, NodeFlags.Synthetic, this); + const list = createNode(SyntaxKind.SyntaxList, nodes.pos, nodes.end, NodeFlags.Synthetic, this); list._children = []; let pos = nodes.pos; - - - for (let node of nodes) { + for (const node of nodes) { if (pos < node.pos) { pos = this.addSyntheticNodes(list._children, pos, node.pos); } @@ -269,14 +267,14 @@ namespace ts { scanner.setText((sourceFile || this.getSourceFile()).text); children = []; let pos = this.pos; - let processNode = (node: Node) => { + const processNode = (node: Node) => { if (pos < node.pos) { pos = this.addSyntheticNodes(children, pos, node.pos); } children.push(node); pos = node.end; }; - let processNodes = (nodes: NodeArray) => { + const processNodes = (nodes: NodeArray) => { if (pos < nodes.pos) { pos = this.addSyntheticNodes(children, pos, nodes.pos); } @@ -308,20 +306,20 @@ namespace ts { } public getFirstToken(sourceFile?: SourceFile): Node { - let children = this.getChildren(sourceFile); + const children = this.getChildren(sourceFile); if (!children.length) { return undefined; } - let child = children[0]; + const child = children[0]; return child.kind < SyntaxKind.FirstNode ? child : child.getFirstToken(sourceFile); } public getLastToken(sourceFile?: SourceFile): Node { - let children = this.getChildren(sourceFile); + const children = this.getChildren(sourceFile); - let child = lastOrUndefined(children); + const child = lastOrUndefined(children); if (!child) { return undefined; } @@ -366,8 +364,8 @@ namespace ts { } function getJsDocCommentsFromDeclarations(declarations: Declaration[], name: string, canUseParsedParamTagComments: boolean) { - let documentationComment = []; - let docComments = getJsDocCommentsSeparatedByNewLines(); + const documentationComment = []; + const docComments = getJsDocCommentsSeparatedByNewLines(); ts.forEach(docComments, docComment => { if (documentationComment.length) { documentationComment.push(lineBreakPart()); @@ -378,22 +376,22 @@ namespace ts { return documentationComment; function getJsDocCommentsSeparatedByNewLines() { - let paramTag = "@param"; - let jsDocCommentParts: SymbolDisplayPart[] = []; + const paramTag = "@param"; + const jsDocCommentParts: SymbolDisplayPart[] = []; ts.forEach(declarations, (declaration, indexOfDeclaration) => { // Make sure we are collecting doc comment from declaration once, // In case of union property there might be same declaration multiple times // which only varies in type parameter - // Eg. let a: Array | Array; a.length + // Eg. const a: Array | Array; a.length // The property length will have two declarations of property length coming // from Array - Array and Array if (indexOf(declarations, declaration) === indexOfDeclaration) { - let sourceFileOfDeclaration = getSourceFileOfNode(declaration); + const sourceFileOfDeclaration = getSourceFileOfNode(declaration); // If it is parameter - try and get the jsDoc comment with @param tag from function declaration's jsDoc comments if (canUseParsedParamTagComments && declaration.kind === SyntaxKind.Parameter) { ts.forEach(getJsDocCommentTextRange(declaration.parent, sourceFileOfDeclaration), jsDocCommentTextRange => { - let cleanedParamJsDocComment = getCleanedParamJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); + const cleanedParamJsDocComment = getCleanedParamJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); if (cleanedParamJsDocComment) { addRange(jsDocCommentParts, cleanedParamJsDocComment); } @@ -413,7 +411,7 @@ namespace ts { // Get the cleaned js doc comment text from the declaration ts.forEach(getJsDocCommentTextRange( declaration.kind === SyntaxKind.VariableDeclaration ? declaration.parent.parent : declaration, sourceFileOfDeclaration), jsDocCommentTextRange => { - let cleanedJsDocComment = getCleanedJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); + const cleanedJsDocComment = getCleanedJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); if (cleanedJsDocComment) { addRange(jsDocCommentParts, cleanedJsDocComment); } @@ -439,7 +437,7 @@ namespace ts { } for (; pos < end; pos++) { - let ch = sourceFile.text.charCodeAt(pos); + const ch = sourceFile.text.charCodeAt(pos); if (!isWhiteSpace(ch) || isLineBreak(ch)) { // Either found lineBreak or non whiteSpace return pos; @@ -480,7 +478,7 @@ namespace ts { function getCleanedJsDocComment(pos: number, end: number, sourceFile: SourceFile) { let spacesToRemoveAfterAsterisk: number; - let docComments: SymbolDisplayPart[] = []; + const docComments: SymbolDisplayPart[] = []; let blankLineCount = 0; let isInParamTag = false; @@ -491,7 +489,7 @@ namespace ts { // If the comment starts with '*' consume the spaces on this line if (pos < end && sourceFile.text.charCodeAt(pos) === CharacterCodes.asterisk) { - let lineStartPos = pos + 1; + const lineStartPos = pos + 1; pos = consumeWhiteSpacesOnTheLine(pos + 1, end, sourceFile, spacesToRemoveAfterAsterisk); // Set the spaces to remove after asterisk as margin if not already set @@ -505,7 +503,7 @@ namespace ts { // Analyse text on this line while (pos < end && !isLineBreak(sourceFile.text.charCodeAt(pos))) { - let ch = sourceFile.text.charAt(pos); + const ch = sourceFile.text.charAt(pos); if (ch === "@") { // If it is @param tag if (isParamTag(pos, end, sourceFile)) { @@ -544,7 +542,7 @@ namespace ts { function getCleanedParamJsDocComment(pos: number, end: number, sourceFile: SourceFile) { let paramHelpStringMargin: number; - let paramDocComments: SymbolDisplayPart[] = []; + const paramDocComments: SymbolDisplayPart[] = []; while (pos < end) { if (isParamTag(pos, end, sourceFile)) { let blankLineCount = 0; @@ -559,7 +557,7 @@ namespace ts { if (sourceFile.text.charCodeAt(pos) === CharacterCodes.openBrace) { pos++; for (let curlies = 1; pos < end; pos++) { - let charCode = sourceFile.text.charCodeAt(pos); + const charCode = sourceFile.text.charCodeAt(pos); // { character means we need to find another } to match the found one if (charCode === CharacterCodes.openBrace) { @@ -603,9 +601,9 @@ namespace ts { } let paramHelpString = ""; - let firstLineParamHelpStringPos = pos; + const firstLineParamHelpStringPos = pos; while (pos < end) { - let ch = sourceFile.text.charCodeAt(pos); + const ch = sourceFile.text.charCodeAt(pos); // at line break, set this comment line text and go to next line if (isLineBreak(ch)) { @@ -674,15 +672,15 @@ namespace ts { } // Now consume white spaces max - let startOfLinePos = pos; + const startOfLinePos = pos; pos = consumeWhiteSpacesOnTheLine(pos, end, sourceFile, paramHelpStringMargin); if (pos >= end) { return; } - let consumedSpaces = pos - startOfLinePos; + const consumedSpaces = pos - startOfLinePos; if (consumedSpaces < paramHelpStringMargin) { - let ch = sourceFile.text.charCodeAt(pos); + const ch = sourceFile.text.charCodeAt(pos); if (ch === CharacterCodes.asterisk) { // Consume more spaces after asterisk pos = consumeWhiteSpacesOnTheLine(pos + 1, end, sourceFile, paramHelpStringMargin - consumedSpaces - 1); @@ -815,7 +813,7 @@ namespace ts { private namedDeclarations: Map; constructor(kind: SyntaxKind, pos: number, end: number) { - super(kind, pos, end) + super(kind, pos, end); } public update(newText: string, textChangeRange: TextChangeRange): SourceFile { @@ -843,16 +841,16 @@ namespace ts { } private computeNamedDeclarations(): Map { - let result: Map = {}; + const result: Map = {}; forEachChild(this, visit); return result; function addDeclaration(declaration: Declaration) { - let name = getDeclarationName(declaration); + const name = getDeclarationName(declaration); if (name) { - let declarations = getDeclarations(name); + const declarations = getDeclarations(name); declarations.push(declaration); } } @@ -863,13 +861,13 @@ namespace ts { function getDeclarationName(declaration: Declaration) { if (declaration.name) { - let result = getTextOfIdentifierOrLiteral(declaration.name); + const result = getTextOfIdentifierOrLiteral(declaration.name); if (result !== undefined) { return result; } if (declaration.name.kind === SyntaxKind.ComputedPropertyName) { - let expr = (declaration.name).expression; + const expr = (declaration.name).expression; if (expr.kind === SyntaxKind.PropertyAccessExpression) { return (expr).name.text; } @@ -899,12 +897,12 @@ namespace ts { case SyntaxKind.FunctionDeclaration: case SyntaxKind.MethodDeclaration: case SyntaxKind.MethodSignature: - let functionDeclaration = node; - let declarationName = getDeclarationName(functionDeclaration); + const functionDeclaration = node; + const declarationName = getDeclarationName(functionDeclaration); if (declarationName) { - let declarations = getDeclarations(declarationName); - let lastDeclaration = lastOrUndefined(declarations); + const declarations = getDeclarations(declarationName); + const lastDeclaration = lastOrUndefined(declarations); // Check whether this declaration belongs to an "overload group". if (lastDeclaration && functionDeclaration.parent === lastDeclaration.parent && functionDeclaration.symbol === lastDeclaration.symbol) { @@ -980,7 +978,7 @@ namespace ts { break; case SyntaxKind.ImportDeclaration: - let importClause = (node).importClause; + const importClause = (node).importClause; if (importClause) { // Handle default import case e.g.: // import d from "mod"; @@ -1113,8 +1111,8 @@ namespace ts { } export interface Classifications { - spans: number[], - endOfLineState: EndOfLineState + spans: number[]; + endOfLineState: EndOfLineState; } export interface ClassifiedSpan { @@ -1171,7 +1169,7 @@ namespace ts { highlightSpans: HighlightSpan[]; } - export module HighlightSpanKind { + export namespace HighlightSpanKind { export const none = "none"; export const definition = "definition"; export const reference = "reference"; @@ -1220,7 +1218,7 @@ namespace ts { InsertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: boolean; PlaceOpenBraceOnNewLineForFunctions: boolean; PlaceOpenBraceOnNewLineForControlBlocks: boolean; - [s: string]: boolean | number| string; + [s: string]: boolean | number | string; } export interface DefinitionInfo { @@ -1500,7 +1498,7 @@ namespace ts { } // TODO: move these to enums - export module ScriptElementKind { + export namespace ScriptElementKind { export const unknown = ""; export const warning = "warning"; @@ -1529,7 +1527,7 @@ namespace ts { export const enumElement = "enum"; // Inside module and script only - // let v = .. + // const v = .. export const variableElement = "var"; // Inside function @@ -1581,7 +1579,7 @@ namespace ts { export const letElement = "let"; } - export module ScriptElementKindModifier { + export namespace ScriptElementKindModifier { export const none = ""; export const publicMemberModifier = "public"; export const privateMemberModifier = "private"; @@ -1723,8 +1721,8 @@ namespace ts { this.fileNameToEntry = createFileMap(); // Initialize the list with the root file names - let rootFileNames = host.getScriptFileNames(); - for (let fileName of rootFileNames) { + const rootFileNames = host.getScriptFileNames(); + for (const fileName of rootFileNames) { this.createEntry(fileName, toPath(fileName, this.currentDirectory, getCanonicalFileName)); } @@ -1738,7 +1736,7 @@ namespace ts { private createEntry(fileName: string, path: Path) { let entry: HostFileInformation; - let scriptSnapshot = this.host.getScriptSnapshot(fileName); + const scriptSnapshot = this.host.getScriptSnapshot(fileName); if (scriptSnapshot) { entry = { hostFileName: fileName, @@ -1760,7 +1758,7 @@ namespace ts { } public getOrCreateEntry(fileName: string): HostFileInformation { - let path = toPath(fileName, this.currentDirectory, this.getCanonicalFileName) + const path = toPath(fileName, this.currentDirectory, this.getCanonicalFileName); if (this.contains(path)) { return this.getEntry(path); } @@ -1769,7 +1767,7 @@ namespace ts { } public getRootFileNames(): string[] { - let fileNames: string[] = []; + const fileNames: string[] = []; this.fileNameToEntry.forEachValue((path, value) => { if (value) { @@ -1781,12 +1779,12 @@ namespace ts { } public getVersion(path: Path): string { - let file = this.getEntry(path); + const file = this.getEntry(path); return file && file.version; } public getScriptSnapshot(path: Path): IScriptSnapshot { - let file = this.getEntry(path); + const file = this.getEntry(path); return file && file.scriptSnapshot; } } @@ -1803,22 +1801,22 @@ namespace ts { } public getCurrentSourceFile(fileName: string): SourceFile { - let scriptSnapshot = this.host.getScriptSnapshot(fileName); + const scriptSnapshot = this.host.getScriptSnapshot(fileName); if (!scriptSnapshot) { // The host does not know about this file. throw new Error("Could not find file: '" + fileName + "'."); } - let version = this.host.getScriptVersion(fileName); + const version = this.host.getScriptVersion(fileName); let sourceFile: SourceFile; if (this.currentFileName !== fileName) { // This is a new file, just parse it - sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, ScriptTarget.Latest, version, /*setNodeParents:*/ true); + sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, ScriptTarget.Latest, version, /*setNodeParents*/ true); } else if (this.currentFileVersion !== version) { // This is the same file, just a newer version. Incrementally parse the file. - let editRange = scriptSnapshot.getChangeRange(this.currentFileScriptSnapshot); + const editRange = scriptSnapshot.getChangeRange(this.currentFileScriptSnapshot); sourceFile = updateLanguageServiceSourceFile(this.currentSourceFile, scriptSnapshot, version, editRange); } @@ -1863,7 +1861,7 @@ namespace ts { * - noResolve = true */ export function transpileModule(input: string, transpileOptions: TranspileOptions): TranspileOutput { - let options = transpileOptions.compilerOptions ? clone(transpileOptions.compilerOptions) : getDefaultCompilerOptions(); + const options = transpileOptions.compilerOptions ? clone(transpileOptions.compilerOptions) : getDefaultCompilerOptions(); options.isolatedModules = true; @@ -1879,21 +1877,22 @@ namespace ts { options.noResolve = true; // if jsx is specified then treat file as .tsx - let inputFileName = transpileOptions.fileName || (options.jsx ? "module.tsx" : "module.ts"); - let sourceFile = createSourceFile(inputFileName, input, options.target); + const inputFileName = transpileOptions.fileName || (options.jsx ? "module.tsx" : "module.ts"); + const sourceFile = createSourceFile(inputFileName, input, options.target); if (transpileOptions.moduleName) { sourceFile.moduleName = transpileOptions.moduleName; } sourceFile.renamedDependencies = transpileOptions.renamedDependencies; - let newLine = getNewLineCharacter(options); + const newLine = getNewLineCharacter(options); // Output let outputText: string; let sourceMapText: string; + // Create a compilerHost object to allow the compiler to read and write files - let compilerHost: CompilerHost = { + const compilerHost: CompilerHost = { getSourceFile: (fileName, target) => fileName === normalizeSlashes(inputFileName) ? sourceFile : undefined, writeFile: (name, text, writeByteOrderMark) => { if (fileExtensionIs(name, ".map")) { @@ -1914,7 +1913,7 @@ namespace ts { readFile: (fileName): string => "" }; - let program = createProgram([inputFileName], options, compilerHost); + const program = createProgram([inputFileName], options, compilerHost); let diagnostics: Diagnostic[]; if (transpileOptions.reportDiagnostics) { @@ -1934,15 +1933,15 @@ namespace ts { * This is a shortcut function for transpileModule - it accepts transpileOptions as parameters and returns only outputText part of the result. */ export function transpile(input: string, compilerOptions?: CompilerOptions, fileName?: string, diagnostics?: Diagnostic[], moduleName?: string): string { - let output = transpileModule(input, { compilerOptions, fileName, reportDiagnostics: !!diagnostics, moduleName }); + const output = transpileModule(input, { compilerOptions, fileName, reportDiagnostics: !!diagnostics, moduleName }); // addRange correctly handles cases when wither 'from' or 'to' argument is missing addRange(diagnostics, output.diagnostics); return output.outputText; } export function createLanguageServiceSourceFile(fileName: string, scriptSnapshot: IScriptSnapshot, scriptTarget: ScriptTarget, version: string, setNodeParents: boolean): SourceFile { - let text = scriptSnapshot.getText(0, scriptSnapshot.getLength()); - let sourceFile = createSourceFile(fileName, text, scriptTarget, setNodeParents); + const text = scriptSnapshot.getText(0, scriptSnapshot.getLength()); + const sourceFile = createSourceFile(fileName, text, scriptTarget, setNodeParents); setSourceFileFields(sourceFile, scriptSnapshot, version); // after full parsing we can use table with interned strings as name table sourceFile.nameTable = sourceFile.identifiers; @@ -1961,12 +1960,12 @@ namespace ts { let newText: string; // grab the fragment from the beginning of the original text to the beginning of the span - let prefix = textChangeRange.span.start !== 0 + const prefix = textChangeRange.span.start !== 0 ? sourceFile.text.substr(0, textChangeRange.span.start) : ""; // grab the fragment from the end of the span till the end of the original text - let suffix = textSpanEnd(textChangeRange.span) !== sourceFile.text.length + const suffix = textSpanEnd(textChangeRange.span) !== sourceFile.text.length ? sourceFile.text.substr(textSpanEnd(textChangeRange.span)) : ""; @@ -1976,7 +1975,7 @@ namespace ts { } else { // it was actual edit, fetch the fragment of new text that correspond to new span - let changedText = scriptSnapshot.getText(textChangeRange.span.start, textChangeRange.span.start + textChangeRange.newLength); + const changedText = scriptSnapshot.getText(textChangeRange.span.start, textChangeRange.span.start + textChangeRange.newLength); // combine prefix, changed text and suffix newText = prefix && suffix ? prefix + changedText + suffix @@ -1985,7 +1984,7 @@ namespace ts { : (changedText + suffix); } - let newSourceFile = updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks); + const newSourceFile = updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks); setSourceFileFields(newSourceFile, scriptSnapshot, version); // after incremental parsing nameTable might not be up-to-date // drop it so it can be lazily recreated later @@ -2006,7 +2005,7 @@ namespace ts { } // Otherwise, just create a new source file. - return createLanguageServiceSourceFile(sourceFile.fileName, scriptSnapshot, sourceFile.languageVersion, version, /*setNodeParents:*/ true); + return createLanguageServiceSourceFile(sourceFile.fileName, scriptSnapshot, sourceFile.languageVersion, version, /*setNodeParents*/ true); } export function createGetCanonicalFileName(useCaseSensitivefileNames: boolean): (fileName: string) => string { @@ -2019,15 +2018,15 @@ namespace ts { export function createDocumentRegistry(useCaseSensitiveFileNames?: boolean, currentDirectory = ""): DocumentRegistry { // Maps from compiler setting target (ES3, ES5, etc.) to all the cached documents we have // for those settings. - let buckets: Map> = {}; - let getCanonicalFileName = createGetCanonicalFileName(!!useCaseSensitiveFileNames); + const buckets: Map> = {}; + const getCanonicalFileName = createGetCanonicalFileName(!!useCaseSensitiveFileNames); function getKeyFromCompilationSettings(settings: CompilerOptions): string { return "_" + settings.target + "|" + settings.module + "|" + settings.noResolve + "|" + settings.jsx + +"|" + settings.allowJs; } function getBucketForCompilationSettings(settings: CompilerOptions, createIfMissing: boolean): FileMap { - let key = getKeyFromCompilationSettings(settings); + const key = getKeyFromCompilationSettings(settings); let bucket = lookUp(buckets, key); if (!bucket && createIfMissing) { buckets[key] = bucket = createFileMap(); @@ -2036,9 +2035,9 @@ namespace ts { } function reportStats() { - let bucketInfoArray = Object.keys(buckets).filter(name => name && name.charAt(0) === '_').map(name => { - let entries = lookUp(buckets, name); - let sourceFiles: { name: string; refCount: number; references: string[]; }[] = []; + const bucketInfoArray = Object.keys(buckets).filter(name => name && name.charAt(0) === "_").map(name => { + const entries = lookUp(buckets, name); + const sourceFiles: { name: string; refCount: number; references: string[]; }[] = []; entries.forEachValue((key, entry) => { sourceFiles.push({ name: key, @@ -2052,15 +2051,15 @@ namespace ts { sourceFiles }; }); - return JSON.stringify(bucketInfoArray, null, 2); + return JSON.stringify(bucketInfoArray, undefined, 2); } function acquireDocument(fileName: string, compilationSettings: CompilerOptions, scriptSnapshot: IScriptSnapshot, version: string): SourceFile { - return acquireOrUpdateDocument(fileName, compilationSettings, scriptSnapshot, version, /*acquiring:*/ true); + return acquireOrUpdateDocument(fileName, compilationSettings, scriptSnapshot, version, /*acquiring*/ true); } function updateDocument(fileName: string, compilationSettings: CompilerOptions, scriptSnapshot: IScriptSnapshot, version: string): SourceFile { - return acquireOrUpdateDocument(fileName, compilationSettings, scriptSnapshot, version, /*acquiring:*/ false); + return acquireOrUpdateDocument(fileName, compilationSettings, scriptSnapshot, version, /*acquiring*/ false); } function acquireOrUpdateDocument( @@ -2070,14 +2069,14 @@ namespace ts { version: string, acquiring: boolean): SourceFile { - let bucket = getBucketForCompilationSettings(compilationSettings, /*createIfMissing*/ true); - let path = toPath(fileName, currentDirectory, getCanonicalFileName); + const bucket = getBucketForCompilationSettings(compilationSettings, /*createIfMissing*/ true); + const path = toPath(fileName, currentDirectory, getCanonicalFileName); let entry = bucket.get(path); if (!entry) { Debug.assert(acquiring, "How could we be trying to update a document that the registry doesn't have?"); // Have never seen this file with these settings. Create a new source file for it. - let sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, compilationSettings.target, version, /*setNodeParents:*/ false); + const sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, compilationSettings.target, version, /*setNodeParents*/ false); entry = { sourceFile: sourceFile, @@ -2109,12 +2108,12 @@ namespace ts { } function releaseDocument(fileName: string, compilationSettings: CompilerOptions): void { - let bucket = getBucketForCompilationSettings(compilationSettings, false); + const bucket = getBucketForCompilationSettings(compilationSettings, /*createIfMissing*/false); Debug.assert(bucket !== undefined); - let path = toPath(fileName, currentDirectory, getCanonicalFileName); + const path = toPath(fileName, currentDirectory, getCanonicalFileName); - let entry = bucket.get(path); + const entry = bucket.get(path); entry.languageServiceRefCount--; Debug.assert(entry.languageServiceRefCount >= 0); @@ -2132,19 +2131,19 @@ namespace ts { } export function preProcessFile(sourceText: string, readImportFiles = true, detectJavaScriptImports = false): PreProcessedFileInfo { - let referencedFiles: FileReference[] = []; - let importedFiles: FileReference[] = []; + const referencedFiles: FileReference[] = []; + const importedFiles: FileReference[] = []; let ambientExternalModules: string[]; let isNoDefaultLib = false; function processTripleSlashDirectives(): void { - let commentRanges = getLeadingCommentRanges(sourceText, 0); + const commentRanges = getLeadingCommentRanges(sourceText, 0); forEach(commentRanges, commentRange => { - let comment = sourceText.substring(commentRange.pos, commentRange.end); - let referencePathMatchResult = getFileReferenceFromReferencePath(comment, commentRange); + const comment = sourceText.substring(commentRange.pos, commentRange.end); + const referencePathMatchResult = getFileReferenceFromReferencePath(comment, commentRange); if (referencePathMatchResult) { isNoDefaultLib = referencePathMatchResult.isNoDefaultLib; - let fileReference = referencePathMatchResult.fileReference; + const fileReference = referencePathMatchResult.fileReference; if (fileReference) { referencedFiles.push(fileReference); } @@ -2160,8 +2159,8 @@ namespace ts { } function recordModuleName() { - let importPath = scanner.getTokenValue(); - let pos = scanner.getTokenPos(); + const importPath = scanner.getTokenValue(); + const pos = scanner.getTokenPos(); importedFiles.push({ fileName: importPath, pos: pos, @@ -2213,7 +2212,7 @@ namespace ts { } } else if (token === SyntaxKind.EqualsToken) { - if (tryConsumeRequireCall(/* skipCurrentToken */ true)) { + if (tryConsumeRequireCall(/*skipCurrentToken*/ true)) { return true; } } @@ -2311,7 +2310,7 @@ namespace ts { if (token === SyntaxKind.Identifier || isKeyword(token)) { token = scanner.scan(); if (token === SyntaxKind.EqualsToken) { - if (tryConsumeRequireCall(/* skipCurrentToken */ true)) { + if (tryConsumeRequireCall(/*skipCurrentToken*/ true)) { return true; } } @@ -2410,7 +2409,7 @@ namespace ts { if (tryConsumeDeclare() || tryConsumeImport() || tryConsumeExport() || - (detectJavaScriptImports && (tryConsumeRequireCall(/* skipCurrentToken */ false) || tryConsumeDefine()))) { + (detectJavaScriptImports && (tryConsumeRequireCall(/*skipCurrentToken*/ false) || tryConsumeDefine()))) { continue; } else { @@ -2550,8 +2549,8 @@ namespace ts { return true; } else if (position === comment.end) { - let text = sourceFile.text; - let width = comment.end - comment.pos; + const text = sourceFile.text; + const width = comment.end - comment.pos; // is single line comment or just /* if (width <= 2 || text.charCodeAt(comment.pos + 1) === CharacterCodes.slash) { return true; @@ -2583,7 +2582,7 @@ namespace ts { } // A cache of completion entries for keywords, these do not change between sessions - let keywordCompletions: CompletionEntry[] = []; + const keywordCompletions: CompletionEntry[] = []; for (let i = SyntaxKind.FirstKeyword; i <= SyntaxKind.LastKeyword; i++) { keywordCompletions.push({ name: tokenToString(i), @@ -2673,15 +2672,15 @@ namespace ts { export function createLanguageService(host: LanguageServiceHost, documentRegistry: DocumentRegistry = createDocumentRegistry(host.useCaseSensitiveFileNames && host.useCaseSensitiveFileNames(), host.getCurrentDirectory())): LanguageService { - let syntaxTreeCache: SyntaxTreeCache = new SyntaxTreeCache(host); + const syntaxTreeCache: SyntaxTreeCache = new SyntaxTreeCache(host); let ruleProvider: formatting.RulesProvider; let program: Program; let lastProjectVersion: string; - let useCaseSensitivefileNames = false; - let cancellationToken = new CancellationTokenObject(host.getCancellationToken && host.getCancellationToken()); + const useCaseSensitivefileNames = false; + const cancellationToken = new CancellationTokenObject(host.getCancellationToken && host.getCancellationToken()); - let currentDirectory = host.getCurrentDirectory(); + const currentDirectory = host.getCurrentDirectory(); // Check if the localized messages json is set, otherwise query the host for it if (!localizedDiagnosticMessages && host.getLocalizedDiagnosticMessages) { localizedDiagnosticMessages = host.getLocalizedDiagnosticMessages(); @@ -2693,10 +2692,10 @@ namespace ts { } } - let getCanonicalFileName = createGetCanonicalFileName(useCaseSensitivefileNames); + const getCanonicalFileName = createGetCanonicalFileName(useCaseSensitivefileNames); function getValidSourceFile(fileName: string): SourceFile { - let sourceFile = program.getSourceFile(fileName); + const sourceFile = program.getSourceFile(fileName); if (!sourceFile) { throw new Error("Could not find file: '" + fileName + "'."); } @@ -2716,7 +2715,7 @@ namespace ts { function synchronizeHostData(): void { // perform fast check if host supports it if (host.getProjectVersion) { - let hostProjectVersion = host.getProjectVersion(); + const hostProjectVersion = host.getProjectVersion(); if (hostProjectVersion) { if (lastProjectVersion === hostProjectVersion) { return; @@ -2740,17 +2739,17 @@ namespace ts { // the program points to old source files that have been invalidated because of // incremental parsing. - let oldSettings = program && program.getCompilerOptions(); - let newSettings = hostCache.compilationSettings(); - let changesInCompilationSettingsAffectSyntax = oldSettings && + const oldSettings = program && program.getCompilerOptions(); + const newSettings = hostCache.compilationSettings(); + const changesInCompilationSettingsAffectSyntax = oldSettings && (oldSettings.target !== newSettings.target || oldSettings.module !== newSettings.module || oldSettings.noResolve !== newSettings.noResolve || - oldSettings.jsx !== newSettings.jsx || + oldSettings.jsx !== newSettings.jsx || oldSettings.allowJs !== newSettings.allowJs); // Now create a new compiler - let compilerHost: CompilerHost = { + const compilerHost: CompilerHost = { getSourceFile: getOrCreateSourceFile, getCancellationToken: () => cancellationToken, getCanonicalFileName, @@ -2766,22 +2765,22 @@ namespace ts { }, readFile: (fileName): string => { // stub missing host functionality - let entry = hostCache.getOrCreateEntry(fileName); + const entry = hostCache.getOrCreateEntry(fileName); return entry && entry.scriptSnapshot.getText(0, entry.scriptSnapshot.getLength()); } }; if (host.resolveModuleNames) { - compilerHost.resolveModuleNames = (moduleNames, containingFile) => host.resolveModuleNames(moduleNames, containingFile) + compilerHost.resolveModuleNames = (moduleNames, containingFile) => host.resolveModuleNames(moduleNames, containingFile); } - let newProgram = createProgram(hostCache.getRootFileNames(), newSettings, compilerHost, program); + const newProgram = createProgram(hostCache.getRootFileNames(), newSettings, compilerHost, program); // Release any files we have acquired in the old program but are // not part of the new program. if (program) { - let oldSourceFiles = program.getSourceFiles(); - for (let oldSourceFile of oldSourceFiles) { + const oldSourceFiles = program.getSourceFiles(); + for (const oldSourceFile of oldSourceFiles) { if (!newProgram.getSourceFile(oldSourceFile.fileName) || changesInCompilationSettingsAffectSyntax) { documentRegistry.releaseDocument(oldSourceFile.fileName, oldSettings); } @@ -2804,7 +2803,7 @@ namespace ts { // The program is asking for this file, check first if the host can locate it. // If the host can not locate the file, then it does not exist. return undefined // to the program to allow reporting of errors for missing files. - let hostFileInformation = hostCache.getOrCreateEntry(fileName); + const hostFileInformation = hostCache.getOrCreateEntry(fileName); if (!hostFileInformation) { return undefined; } @@ -2814,7 +2813,7 @@ namespace ts { // can not be reused. we have to dump all syntax trees and create new ones. if (!changesInCompilationSettingsAffectSyntax) { // Check if the old program had this file already - let oldSourceFile = program && program.getSourceFile(fileName); + const oldSourceFile = program && program.getSourceFile(fileName); if (oldSourceFile) { // We already had a source file for this file name. Go to the registry to // ensure that we get the right up to date version of it. We need this to @@ -2851,7 +2850,7 @@ namespace ts { if (!sourceFile) { return false; } - let path = sourceFile.path || toPath(sourceFile.fileName, currentDirectory, getCanonicalFileName); + const path = sourceFile.path || toPath(sourceFile.fileName, currentDirectory, getCanonicalFileName); return sourceFile.version === hostCache.getVersion(path); } @@ -2862,13 +2861,13 @@ namespace ts { } // If number of files in the program do not match, it is not up-to-date - let rootFileNames = hostCache.getRootFileNames(); + const rootFileNames = hostCache.getRootFileNames(); if (program.getSourceFiles().length !== rootFileNames.length) { return false; } // If any file is not up-to-date, then the whole program is not up-to-date - for (let fileName of rootFileNames) { + for (const fileName of rootFileNames) { if (!sourceFileUpToDate(program.getSourceFile(fileName))) { return false; } @@ -2910,18 +2909,18 @@ namespace ts { function getSemanticDiagnostics(fileName: string): Diagnostic[] { synchronizeHostData(); - let targetSourceFile = getValidSourceFile(fileName); + const targetSourceFile = getValidSourceFile(fileName); // Only perform the action per file regardless of '-out' flag as LanguageServiceHost is expected to call this function per file. // Therefore only get diagnostics for given file. - let semanticDiagnostics = program.getSemanticDiagnostics(targetSourceFile, cancellationToken); + const semanticDiagnostics = program.getSemanticDiagnostics(targetSourceFile, cancellationToken); if (!program.getCompilerOptions().declaration) { return semanticDiagnostics; } // If '-d' is enabled, check for emitter error. One example of emitter error is export class implements non-export interface - let declarationDiagnostics = program.getDeclarationDiagnostics(targetSourceFile, cancellationToken); + const declarationDiagnostics = program.getDeclarationDiagnostics(targetSourceFile, cancellationToken); return concatenate(semanticDiagnostics, declarationDiagnostics); } @@ -2937,14 +2936,14 @@ namespace ts { * @return undefined if the name is of external module otherwise a name with striped of any quote */ function getCompletionEntryDisplayNameForSymbol(symbol: Symbol, target: ScriptTarget, performCharacterChecks: boolean, location: Node): string { - let displayName: string = getDeclaredName(program.getTypeChecker(), symbol, location); + const displayName: string = getDeclaredName(program.getTypeChecker(), symbol, location); if (displayName) { - let firstCharCode = displayName.charCodeAt(0); + const firstCharCode = displayName.charCodeAt(0); // First check of the displayName is not external module; if it is an external module, it is not valid entry if ((symbol.flags & SymbolFlags.Namespace) && (firstCharCode === CharacterCodes.singleQuote || firstCharCode === CharacterCodes.doubleQuote)) { // If the symbol is external module, don't show it in the completion list - // (i.e declare module "http" { let x; } | // <= request completion here, "http" should not be there) + // (i.e declare module "http" { const x; } | // <= request completion here, "http" should not be there) return undefined; } } @@ -2987,20 +2986,20 @@ namespace ts { } function getCompletionData(fileName: string, position: number) { - let typeChecker = program.getTypeChecker(); - let syntacticStart = new Date().getTime(); - let sourceFile = getValidSourceFile(fileName); - let isJavaScriptFile = isSourceFileJavaScript(sourceFile); + const typeChecker = program.getTypeChecker(); + const syntacticStart = new Date().getTime(); + const sourceFile = getValidSourceFile(fileName); + const isJavaScriptFile = isSourceFileJavaScript(sourceFile); let isJsDocTagName = false; let start = new Date().getTime(); - let currentToken = getTokenAtPosition(sourceFile, position); + const currentToken = getTokenAtPosition(sourceFile, position); log("getCompletionData: Get current token: " + (new Date().getTime() - start)); start = new Date().getTime(); // Completion not allowed inside comments, bail out if this is the case - let insideComment = isInsideComment(sourceFile, currentToken, position); + const insideComment = isInsideComment(sourceFile, currentToken, position); log("getCompletionData: Is inside comment: " + (new Date().getTime() - start)); if (insideComment) { @@ -3014,7 +3013,7 @@ namespace ts { // /** @type {number | string} */ // Completion should work in the brackets let insideJsDocTagExpression = false; - let tag = getJsDocTagAtPosition(sourceFile, position); + const tag = getJsDocTagAtPosition(sourceFile, position); if (tag) { if (tag.tagName.pos <= position && position <= tag.tagName.end) { isJsDocTagName = true; @@ -3024,7 +3023,7 @@ namespace ts { case SyntaxKind.JSDocTypeTag: case SyntaxKind.JSDocParameterTag: case SyntaxKind.JSDocReturnTag: - let tagWithExpression = tag; + const tagWithExpression = tag; if (tagWithExpression.typeExpression) { insideJsDocTagExpression = tagWithExpression.typeExpression.pos < position && position < tagWithExpression.typeExpression.end; } @@ -3045,7 +3044,7 @@ namespace ts { } start = new Date().getTime(); - let previousToken = findPrecedingToken(position, sourceFile); + const previousToken = findPrecedingToken(position, sourceFile); log("getCompletionData: Get previous token 1: " + (new Date().getTime() - start)); // The decision to provide completion depends on the contextToken, which is determined through the previousToken. @@ -3055,7 +3054,7 @@ namespace ts { // Check if the caret is at the end of an identifier; this is a partial identifier that we want to complete: e.g. a.toS| // Skip this partial identifier and adjust the contextToken to the token that precedes it. if (contextToken && position <= contextToken.end && isWord(contextToken.kind)) { - let start = new Date().getTime(); + const start = new Date().getTime(); contextToken = findPrecedingToken(contextToken.getFullStart(), sourceFile); log("getCompletionData: Get previous token 2: " + (new Date().getTime() - start)); } @@ -3076,7 +3075,7 @@ namespace ts { return undefined; } - let { parent, kind } = contextToken; + const { parent, kind } = contextToken; if (kind === SyntaxKind.DotToken) { if (parent.kind === SyntaxKind.PropertyAccessExpression) { node = (contextToken.parent).expression; @@ -3103,7 +3102,7 @@ namespace ts { } } - let semanticStart = new Date().getTime(); + const semanticStart = new Date().getTime(); let isMemberCompletion: boolean; let isNewIdentifierLocation: boolean; let symbols: Symbol[] = []; @@ -3112,7 +3111,7 @@ namespace ts { getTypeScriptMemberSymbols(); } else if (isRightOfOpenTag) { - let tagSymbols = typeChecker.getJsxIntrinsicTagNames(); + const tagSymbols = typeChecker.getJsxIntrinsicTagNames(); if (tryGetGlobalSymbols()) { symbols = tagSymbols.concat(symbols.filter(s => !!(s.flags & SymbolFlags.Value))); } @@ -3123,7 +3122,7 @@ namespace ts { isNewIdentifierLocation = false; } else if (isStartingCloseTag) { - let tagName = (contextToken.parent.parent).openingElement.tagName; + const tagName = (contextToken.parent.parent).openingElement.tagName; symbols = [typeChecker.getSymbolAtLocation(tagName)]; isMemberCompletion = true; @@ -3157,7 +3156,7 @@ namespace ts { if (symbol && symbol.flags & SymbolFlags.HasExports) { // Extract module or enum members - let exportedSymbols = typeChecker.getExportsOfModule(symbol); + const exportedSymbols = typeChecker.getExportsOfModule(symbol); forEach(exportedSymbols, symbol => { if (typeChecker.isValidPropertyAccess((node.parent), symbol.name)) { symbols.push(symbol); @@ -3166,14 +3165,14 @@ namespace ts { } } - let type = typeChecker.getTypeAtLocation(node); + const type = typeChecker.getTypeAtLocation(node); addTypeProperties(type); } function addTypeProperties(type: Type) { if (type) { // Filter private properties - for (let symbol of type.getApparentProperties()) { + for (const symbol of type.getApparentProperties()) { if (typeChecker.isValidPropertyAccess((node.parent), symbol.name)) { symbols.push(symbol); } @@ -3185,8 +3184,8 @@ namespace ts { // each individual type has. This is because we're going to add all identifiers // anyways. So we might as well elevate the members that were at least part // of the individual types to a higher status since we know what they are. - let unionType = type; - for (let elementType of unionType.types) { + const unionType = type; + for (const elementType of unionType.types) { addTypeProperties(elementType); } } @@ -3256,14 +3255,14 @@ namespace ts { // - 'contextToken' was adjusted to the token prior to 'previousToken' // because we were at the end of an identifier. // - 'previousToken' is defined. - let adjustedPosition = previousToken !== contextToken ? + const adjustedPosition = previousToken !== contextToken ? previousToken.getStart() : position; - let scopeNode = getScopeNode(contextToken, adjustedPosition, sourceFile) || sourceFile; + const scopeNode = getScopeNode(contextToken, adjustedPosition, sourceFile) || sourceFile; /// TODO filter meaning based on the current context - let symbolMeanings = SymbolFlags.Type | SymbolFlags.Value | SymbolFlags.Namespace | SymbolFlags.Alias; + const symbolMeanings = SymbolFlags.Type | SymbolFlags.Value | SymbolFlags.Namespace | SymbolFlags.Alias; symbols = typeChecker.getSymbolsInScope(scopeNode, symbolMeanings); return true; @@ -3282,8 +3281,8 @@ namespace ts { } function isCompletionListBlocker(contextToken: Node): boolean { - let start = new Date().getTime(); - let result = isInStringOrRegularExpressionOrTemplateLiteral(contextToken) || + const start = new Date().getTime(); + const result = isInStringOrRegularExpressionOrTemplateLiteral(contextToken) || isSolelyIdentifierDefinitionLocation(contextToken) || isDotOfNumericLiteral(contextToken) || isInJsxText(contextToken); @@ -3310,27 +3309,27 @@ namespace ts { function isNewIdentifierDefinitionLocation(previousToken: Node): boolean { if (previousToken) { - let containingNodeKind = previousToken.parent.kind; + const containingNodeKind = previousToken.parent.kind; switch (previousToken.kind) { case SyntaxKind.CommaToken: return containingNodeKind === SyntaxKind.CallExpression // func( a, | || containingNodeKind === SyntaxKind.Constructor // constructor( a, | /* public, protected, private keywords are allowed here, so show completion */ || containingNodeKind === SyntaxKind.NewExpression // new C(a, | || containingNodeKind === SyntaxKind.ArrayLiteralExpression // [a, | - || containingNodeKind === SyntaxKind.BinaryExpression // let x = (a, | + || containingNodeKind === SyntaxKind.BinaryExpression // const x = (a, | || containingNodeKind === SyntaxKind.FunctionType; // var x: (s: string, list| case SyntaxKind.OpenParenToken: return containingNodeKind === SyntaxKind.CallExpression // func( | || containingNodeKind === SyntaxKind.Constructor // constructor( | || containingNodeKind === SyntaxKind.NewExpression // new C(a| - || containingNodeKind === SyntaxKind.ParenthesizedExpression // let x = (a| + || containingNodeKind === SyntaxKind.ParenthesizedExpression // const x = (a| || containingNodeKind === SyntaxKind.ParenthesizedType; // function F(pred: (a| /* this can become an arrow function, where 'a' is the argument */ case SyntaxKind.OpenBracketToken: return containingNodeKind === SyntaxKind.ArrayLiteralExpression // [ | || containingNodeKind === SyntaxKind.IndexSignature // [ | : string ] - || containingNodeKind === SyntaxKind.ComputedPropertyName // [ | /* this can become an index signature */ + || containingNodeKind === SyntaxKind.ComputedPropertyName; // [ | /* this can become an index signature */ case SyntaxKind.ModuleKeyword: // module | case SyntaxKind.NamespaceKeyword: // namespace | @@ -3343,7 +3342,7 @@ namespace ts { return containingNodeKind === SyntaxKind.ClassDeclaration; // class A{ | case SyntaxKind.EqualsToken: - return containingNodeKind === SyntaxKind.VariableDeclaration // let x = a| + return containingNodeKind === SyntaxKind.VariableDeclaration // const x = a| || containingNodeKind === SyntaxKind.BinaryExpression; // x = a| case SyntaxKind.TemplateHead: @@ -3375,8 +3374,8 @@ namespace ts { || contextToken.kind === SyntaxKind.StringLiteralType || contextToken.kind === SyntaxKind.RegularExpressionLiteral || isTemplateLiteralKind(contextToken.kind)) { - let start = contextToken.getStart(); - let end = contextToken.getEnd(); + const start = contextToken.getStart(); + const end = contextToken.getEnd(); // To be "in" one of these literals, the position has to be: // 1. entirely within the token text. @@ -3420,7 +3419,7 @@ namespace ts { // We are *only* completing on properties from the type being destructured. isNewIdentifierLocation = false; - let rootDeclaration = getRootDeclaration(objectLikeContainer.parent); + const rootDeclaration = getRootDeclaration(objectLikeContainer.parent); if (isVariableLike(rootDeclaration)) { // We don't want to complete using the type acquired by the shape // of the binding pattern; we are only interested in types acquired @@ -3431,7 +3430,7 @@ namespace ts { } } else { - Debug.fail("Root declaration is not variable-like.") + Debug.fail("Root declaration is not variable-like."); } } else { @@ -3442,7 +3441,7 @@ namespace ts { return false; } - let typeMembers = typeChecker.getPropertiesOfType(typeForObject); + const typeMembers = typeChecker.getPropertiesOfType(typeForObject); if (typeMembers && typeMembers.length > 0) { // Add filtered items to the completion list symbols = filterObjectMembersList(typeMembers, existingMembers); @@ -3466,11 +3465,11 @@ namespace ts { * @returns true if 'symbols' was successfully populated; false otherwise. */ function tryGetImportOrExportClauseCompletionSymbols(namedImportsOrExports: NamedImportsOrExports): boolean { - let declarationKind = namedImportsOrExports.kind === SyntaxKind.NamedImports ? + const declarationKind = namedImportsOrExports.kind === SyntaxKind.NamedImports ? SyntaxKind.ImportDeclaration : SyntaxKind.ExportDeclaration; - let importOrExportDeclaration = getAncestor(namedImportsOrExports, declarationKind); - let moduleSpecifier = importOrExportDeclaration.moduleSpecifier; + const importOrExportDeclaration = getAncestor(namedImportsOrExports, declarationKind); + const moduleSpecifier = importOrExportDeclaration.moduleSpecifier; if (!moduleSpecifier) { return false; @@ -3480,7 +3479,7 @@ namespace ts { isNewIdentifierLocation = false; let exports: Symbol[]; - let moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(importOrExportDeclaration.moduleSpecifier); + const moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(importOrExportDeclaration.moduleSpecifier); if (moduleSpecifierSymbol) { exports = typeChecker.getExportsOfModule(moduleSpecifierSymbol); } @@ -3497,9 +3496,9 @@ namespace ts { function tryGetObjectLikeCompletionContainer(contextToken: Node): ObjectLiteralExpression | BindingPattern { if (contextToken) { switch (contextToken.kind) { - case SyntaxKind.OpenBraceToken: // let x = { | - case SyntaxKind.CommaToken: // let x = { a: 0, | - let parent = contextToken.parent; + case SyntaxKind.OpenBraceToken: // const x = { | + case SyntaxKind.CommaToken: // const x = { a: 0, | + const parent = contextToken.parent; if (parent && (parent.kind === SyntaxKind.ObjectLiteralExpression || parent.kind === SyntaxKind.ObjectBindingPattern)) { return parent; } @@ -3532,8 +3531,8 @@ namespace ts { function tryGetContainingJsxElement(contextToken: Node): JsxOpeningLikeElement { if (contextToken) { - let parent = contextToken.parent; - switch(contextToken.kind) { + const parent = contextToken.parent; + switch (contextToken.kind) { case SyntaxKind.LessThanSlashToken: case SyntaxKind.SlashToken: case SyntaxKind.Identifier: @@ -3596,7 +3595,7 @@ namespace ts { * @returns true if we are certain that the currently edited location must define a new location; false otherwise. */ function isSolelyIdentifierDefinitionLocation(contextToken: Node): boolean { - let containingNodeKind = contextToken.parent.kind; + const containingNodeKind = contextToken.parent.kind; switch (contextToken.kind) { case SyntaxKind.CommaToken: return containingNodeKind === SyntaxKind.VariableDeclaration || @@ -3626,13 +3625,13 @@ namespace ts { case SyntaxKind.OpenBraceToken: return containingNodeKind === SyntaxKind.EnumDeclaration || // enum a { | containingNodeKind === SyntaxKind.InterfaceDeclaration || // interface a { | - containingNodeKind === SyntaxKind.TypeLiteral; // let x : { | + containingNodeKind === SyntaxKind.TypeLiteral; // const x : { | case SyntaxKind.SemicolonToken: return containingNodeKind === SyntaxKind.PropertySignature && contextToken.parent && contextToken.parent.parent && (contextToken.parent.parent.kind === SyntaxKind.InterfaceDeclaration || // interface a { f; | - contextToken.parent.parent.kind === SyntaxKind.TypeLiteral); // let x : { a; | + contextToken.parent.parent.kind === SyntaxKind.TypeLiteral); // const x : { a; | case SyntaxKind.LessThanToken: return containingNodeKind === SyntaxKind.ClassDeclaration || // class A< | @@ -3699,7 +3698,7 @@ namespace ts { function isDotOfNumericLiteral(contextToken: Node): boolean { if (contextToken.kind === SyntaxKind.NumericLiteral) { - let text = contextToken.getFullText(); + const text = contextToken.getFullText(); return text.charAt(text.length - 1) === "."; } @@ -3716,15 +3715,15 @@ namespace ts { * do not occur at the current position and have not otherwise been typed. */ function filterNamedImportOrExportCompletionItems(exportsOfModule: Symbol[], namedImportsOrExports: ImportOrExportSpecifier[]): Symbol[] { - let exisingImportsOrExports: Map = {}; + const exisingImportsOrExports: Map = {}; - for (let element of namedImportsOrExports) { + for (const element of namedImportsOrExports) { // If this is the current item we are editing right now, do not filter it out if (element.getStart() <= position && position <= element.getEnd()) { continue; } - let name = element.propertyName || element.name; + const name = element.propertyName || element.name; exisingImportsOrExports[name.text] = true; } @@ -3746,8 +3745,8 @@ namespace ts { return contextualMemberSymbols; } - let existingMemberNames: Map = {}; - for (let m of existingMembers) { + const existingMemberNames: Map = {}; + for (const m of existingMembers) { // Ignore omitted expressions for missing members if (m.kind !== SyntaxKind.PropertyAssignment && m.kind !== SyntaxKind.ShorthandPropertyAssignment && @@ -3766,7 +3765,7 @@ namespace ts { if (m.kind === SyntaxKind.BindingElement && (m).propertyName) { // include only identifiers in completion list if ((m).propertyName.kind === SyntaxKind.Identifier) { - existingName = ((m).propertyName).text + existingName = ((m).propertyName).text; } } else { @@ -3789,8 +3788,8 @@ namespace ts { * do not occur at the current position and have not otherwise been typed. */ function filterJsxAttributes(symbols: Symbol[], attributes: NodeArray): Symbol[] { - let seenNames: Map = {}; - for (let attr of attributes) { + const seenNames: Map = {}; + for (const attr of attributes) { // If this is the current item we are editing right now, do not filter it out if (attr.getStart() <= position && position <= attr.getEnd()) { continue; @@ -3809,21 +3808,21 @@ namespace ts { function getCompletionsAtPosition(fileName: string, position: number): CompletionInfo { synchronizeHostData(); - let completionData = getCompletionData(fileName, position); + const completionData = getCompletionData(fileName, position); if (!completionData) { return undefined; } - let { symbols, isMemberCompletion, isNewIdentifierLocation, location, isRightOfDot, isJsDocTagName } = completionData; + const { symbols, isMemberCompletion, isNewIdentifierLocation, location, isRightOfDot, isJsDocTagName } = completionData; if (isJsDocTagName) { // If the current position is a jsDoc tag name, only tag names should be provided for completion return { isMemberCompletion: false, isNewIdentifierLocation: false, entries: getAllJsDocCompletionEntries() }; } - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); - let entries: CompletionEntry[] = []; + const entries: CompletionEntry[] = []; if (isRightOfDot && isSourceFileJavaScript(sourceFile)) { const uniqueNames = getCompletionEntriesFromSymbols(symbols, entries); @@ -3845,16 +3844,16 @@ namespace ts { return { isMemberCompletion, isNewIdentifierLocation, entries }; function getJavaScriptCompletionEntries(sourceFile: SourceFile, uniqueNames: Map): CompletionEntry[] { - let entries: CompletionEntry[] = []; - let target = program.getCompilerOptions().target; + const entries: CompletionEntry[] = []; + const target = program.getCompilerOptions().target; - let nameTable = getNameTable(sourceFile); - for (let name in nameTable) { + const nameTable = getNameTable(sourceFile); + for (const name in nameTable) { if (!uniqueNames[name]) { uniqueNames[name] = name; - let displayName = getCompletionEntryDisplayName(name, target, /*performCharacterChecks:*/ true); + const displayName = getCompletionEntryDisplayName(name, target, /*performCharacterChecks*/ true); if (displayName) { - let entry = { + const entry = { name: displayName, kind: ScriptElementKind.warning, kindModifiers: "", @@ -3875,7 +3874,7 @@ namespace ts { kind: ScriptElementKind.keyword, kindModifiers: "", sortText: "0", - } + }; })); } @@ -3883,7 +3882,7 @@ namespace ts { // Try to get a valid display name for this symbol, if we could not find one, then ignore it. // We would like to only show things that can be added after a dot, so for instance numeric properties can // not be accessed with a dot (a.1 <- invalid) - let displayName = getCompletionEntryDisplayNameForSymbol(symbol, program.getCompilerOptions().target, /*performCharacterChecks:*/ true, location); + const displayName = getCompletionEntryDisplayNameForSymbol(symbol, program.getCompilerOptions().target, /*performCharacterChecks*/ true, location); if (!displayName) { return undefined; } @@ -3905,13 +3904,13 @@ namespace ts { } function getCompletionEntriesFromSymbols(symbols: Symbol[], entries: CompletionEntry[]): Map { - let start = new Date().getTime(); - let uniqueNames: Map = {}; + const start = new Date().getTime(); + const uniqueNames: Map = {}; if (symbols) { - for (let symbol of symbols) { - let entry = createCompletionEntry(symbol, location); + for (const symbol of symbols) { + const entry = createCompletionEntry(symbol, location); if (entry) { - let id = escapeIdentifier(entry.name); + const id = escapeIdentifier(entry.name); if (!lookUp(uniqueNames, id)) { entries.push(entry); uniqueNames[id] = id; @@ -3929,19 +3928,19 @@ namespace ts { synchronizeHostData(); // Compute all the completion symbols again. - let completionData = getCompletionData(fileName, position); + const completionData = getCompletionData(fileName, position); if (completionData) { - let { symbols, location } = completionData; + const { symbols, location } = completionData; // Find the symbol with the matching entry name. - let target = program.getCompilerOptions().target; + const target = program.getCompilerOptions().target; // We don't need to perform character checks here because we're only comparing the // name against 'entryName' (which is known to be good), not building a new // completion entry. - let symbol = forEach(symbols, s => getCompletionEntryDisplayNameForSymbol(s, target, /*performCharacterChecks:*/ false, location) === entryName ? s : undefined); + const symbol = forEach(symbols, s => getCompletionEntryDisplayNameForSymbol(s, target, /*performCharacterChecks*/ false, location) === entryName ? s : undefined); if (symbol) { - let { displayParts, documentation, symbolKind } = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, getValidSourceFile(fileName), location, location, SemanticMeaning.All); + const { displayParts, documentation, symbolKind } = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, getValidSourceFile(fileName), location, location, SemanticMeaning.All); return { name: entryName, kindModifiers: getSymbolModifiers(symbol), @@ -3953,7 +3952,7 @@ namespace ts { } // Didn't find a symbol with this name. See if we can find a keyword instead. - let keywordCompletion = forEach(keywordCompletions, c => c.name === entryName); + const keywordCompletion = forEach(keywordCompletions, c => c.name === entryName); if (keywordCompletion) { return { name: entryName, @@ -3969,7 +3968,7 @@ namespace ts { // TODO(drosen): use contextual SemanticMeaning. function getSymbolKind(symbol: Symbol, location: Node): string { - let flags = symbol.getFlags(); + const flags = symbol.getFlags(); if (flags & SymbolFlags.Class) return getDeclarationOfKind(symbol, SyntaxKind.ClassExpression) ? ScriptElementKind.localClassElement : ScriptElementKind.classElement; @@ -3978,7 +3977,7 @@ namespace ts { if (flags & SymbolFlags.Interface) return ScriptElementKind.interfaceElement; if (flags & SymbolFlags.TypeParameter) return ScriptElementKind.typeParameterElement; - let result = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol, flags, location); + const result = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol, flags, location); if (result === ScriptElementKind.unknown) { if (flags & SymbolFlags.TypeParameter) return ScriptElementKind.typeParameterElement; if (flags & SymbolFlags.EnumMember) return ScriptElementKind.variableElement; @@ -3990,7 +3989,7 @@ namespace ts { } function getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol: Symbol, flags: SymbolFlags, location: Node) { - let typeChecker = program.getTypeChecker(); + const typeChecker = program.getTypeChecker(); if (typeChecker.isUndefinedSymbol(symbol)) { return ScriptElementKind.variableElement; @@ -4019,8 +4018,8 @@ namespace ts { if (flags & SymbolFlags.Property) { if (flags & SymbolFlags.SyntheticProperty) { // If union property is result of union of non method (property/accessors/variables), it is labeled as property - let unionPropertyKind = forEach(typeChecker.getRootSymbols(symbol), rootSymbol => { - let rootSymbolFlags = rootSymbol.getFlags(); + const unionPropertyKind = forEach(typeChecker.getRootSymbols(symbol), rootSymbol => { + const rootSymbolFlags = rootSymbol.getFlags(); if (rootSymbolFlags & (SymbolFlags.PropertyOrAccessor | SymbolFlags.Variable)) { return ScriptElementKind.memberVariableElement; } @@ -4028,8 +4027,8 @@ namespace ts { }); if (!unionPropertyKind) { // If this was union of all methods, - //make sure it has call signatures before we can label it as method - let typeOfUnionProperty = typeChecker.getTypeOfSymbolAtLocation(symbol, location); + // make sure it has call signatures before we can label it as method + const typeOfUnionProperty = typeChecker.getTypeOfSymbolAtLocation(symbol, location); if (typeOfUnionProperty.getCallSignatures().length) { return ScriptElementKind.memberFunctionElement; } @@ -4053,11 +4052,11 @@ namespace ts { function getSymbolDisplayPartsDocumentationAndSymbolKind(symbol: Symbol, sourceFile: SourceFile, enclosingDeclaration: Node, location: Node, semanticMeaning = getMeaningFromLocation(location)) { - let typeChecker = program.getTypeChecker(); + const typeChecker = program.getTypeChecker(); - let displayParts: SymbolDisplayPart[] = []; + const displayParts: SymbolDisplayPart[] = []; let documentation: SymbolDisplayPart[]; - let symbolFlags = symbol.flags; + const symbolFlags = symbol.flags; let symbolKind = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol, symbolFlags, location); let hasAddedSymbolInfo: boolean; let type: Type; @@ -4073,7 +4072,7 @@ namespace ts { type = typeChecker.getTypeOfSymbolAtLocation(symbol, location); if (type) { if (location.parent && location.parent.kind === SyntaxKind.PropertyAccessExpression) { - let right = (location.parent).name; + const right = (location.parent).name; // Either the location is on the right of a property access, or on the left and the right is missing if (right === location || (right && right.getFullWidth() === 0)) { location = location.parent; @@ -4090,15 +4089,15 @@ namespace ts { } if (callExpression) { - let candidateSignatures: Signature[] = []; + const candidateSignatures: Signature[] = []; signature = typeChecker.getResolvedSignature(callExpression, candidateSignatures); if (!signature && candidateSignatures.length) { // Use the first candidate: signature = candidateSignatures[0]; } - let useConstructSignatures = callExpression.kind === SyntaxKind.NewExpression || callExpression.expression.kind === SyntaxKind.SuperKeyword; - let allSignatures = useConstructSignatures ? type.getConstructSignatures() : type.getCallSignatures(); + const useConstructSignatures = callExpression.kind === SyntaxKind.NewExpression || callExpression.expression.kind === SyntaxKind.SuperKeyword; + const allSignatures = useConstructSignatures ? type.getConstructSignatures() : type.getCallSignatures(); if (!contains(allSignatures, signature.target) && !contains(allSignatures, signature)) { // Get the first signature if there is one -- allSignatures may contain @@ -4156,8 +4155,8 @@ namespace ts { else if ((isNameOfFunctionDeclaration(location) && !(symbol.flags & SymbolFlags.Accessor)) || // name of function declaration (location.kind === SyntaxKind.ConstructorKeyword && location.parent.kind === SyntaxKind.Constructor)) { // At constructor keyword of constructor declaration // get the signature from the declaration and write it - let functionDeclaration = location.parent; - let allSignatures = functionDeclaration.kind === SyntaxKind.Constructor ? type.getConstructSignatures() : type.getCallSignatures(); + const functionDeclaration = location.parent; + const allSignatures = functionDeclaration.kind === SyntaxKind.Constructor ? type.getConstructSignatures() : type.getCallSignatures(); if (!typeChecker.isImplementationOfOverload(functionDeclaration)) { signature = typeChecker.getSignatureFromDeclaration(functionDeclaration); } @@ -4226,8 +4225,8 @@ namespace ts { } if (symbolFlags & SymbolFlags.Module) { addNewLineIfDisplayPartsExist(); - let declaration = getDeclarationOfKind(symbol, SyntaxKind.ModuleDeclaration); - let isNamespace = declaration && declaration.name && declaration.name.kind === SyntaxKind.Identifier; + const declaration = getDeclarationOfKind(symbol, SyntaxKind.ModuleDeclaration); + const isNamespace = declaration && declaration.name && declaration.name.kind === SyntaxKind.Identifier; displayParts.push(keywordPart(isNamespace ? SyntaxKind.NamespaceKeyword : SyntaxKind.ModuleKeyword)); displayParts.push(spacePart()); addFullSymbolName(symbol); @@ -4279,9 +4278,9 @@ namespace ts { } if (symbolFlags & SymbolFlags.EnumMember) { addPrefixForAnyFunctionOrVar(symbol, "enum member"); - let declaration = symbol.declarations[0]; + const declaration = symbol.declarations[0]; if (declaration.kind === SyntaxKind.EnumMember) { - let constantValue = typeChecker.getConstantValue(declaration); + const constantValue = typeChecker.getConstantValue(declaration); if (constantValue !== undefined) { displayParts.push(spacePart()); displayParts.push(operatorPart(SyntaxKind.EqualsToken)); @@ -4297,7 +4296,7 @@ namespace ts { addFullSymbolName(symbol); ts.forEach(symbol.declarations, declaration => { if (declaration.kind === SyntaxKind.ImportEqualsDeclaration) { - let importEqualsDeclaration = declaration; + const importEqualsDeclaration = declaration; if (isExternalModuleImportEqualsDeclaration(importEqualsDeclaration)) { displayParts.push(spacePart()); displayParts.push(operatorPart(SyntaxKind.EqualsToken)); @@ -4308,7 +4307,7 @@ namespace ts { displayParts.push(punctuationPart(SyntaxKind.CloseParenToken)); } else { - let internalAliasSymbol = typeChecker.getSymbolAtLocation(importEqualsDeclaration.moduleReference); + const internalAliasSymbol = typeChecker.getSymbolAtLocation(importEqualsDeclaration.moduleReference); if (internalAliasSymbol) { displayParts.push(spacePart()); displayParts.push(operatorPart(SyntaxKind.EqualsToken)); @@ -4332,7 +4331,7 @@ namespace ts { displayParts.push(spacePart()); // If the type is type parameter, format it specially if (type.symbol && type.symbol.flags & SymbolFlags.TypeParameter) { - let typeParameterParts = mapToDisplayParts(writer => { + const typeParameterParts = mapToDisplayParts(writer => { typeChecker.getSymbolDisplayBuilder().buildTypeParameterDisplay(type, writer, enclosingDeclaration); }); addRange(displayParts, typeParameterParts); @@ -4347,7 +4346,7 @@ namespace ts { symbolFlags & SymbolFlags.Signature || symbolFlags & SymbolFlags.Accessor || symbolKind === ScriptElementKind.memberFunctionElement) { - let allSignatures = type.getCallSignatures(); + const allSignatures = type.getCallSignatures(); addSignatureDisplayParts(allSignatures[0], allSignatures); } } @@ -4370,7 +4369,7 @@ namespace ts { } function addFullSymbolName(symbol: Symbol, enclosingDeclaration?: Node) { - let fullSymbolDisplayParts = symbolToDisplayParts(typeChecker, symbol, enclosingDeclaration || sourceFile, /*meaning*/ undefined, + const fullSymbolDisplayParts = symbolToDisplayParts(typeChecker, symbol, enclosingDeclaration || sourceFile, /*meaning*/ undefined, SymbolFormatFlags.WriteTypeParametersOrArguments | SymbolFormatFlags.UseOnlyExternalAliasing); addRange(displayParts, fullSymbolDisplayParts); } @@ -4416,7 +4415,7 @@ namespace ts { } function writeTypeParametersOfSymbol(symbol: Symbol, enclosingDeclaration: Node) { - let typeParameterParts = mapToDisplayParts(writer => { + const typeParameterParts = mapToDisplayParts(writer => { typeChecker.getSymbolDisplayBuilder().buildTypeParameterDisplayFromSymbol(symbol, writer, enclosingDeclaration); }); addRange(displayParts, typeParameterParts); @@ -4426,8 +4425,8 @@ namespace ts { function getQuickInfoAtPosition(fileName: string, position: number): QuickInfo { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); - let node = getTouchingPropertyName(sourceFile, position); + const sourceFile = getValidSourceFile(fileName); + const node = getTouchingPropertyName(sourceFile, position); if (!node) { return undefined; } @@ -4436,8 +4435,8 @@ namespace ts { return undefined; } - let typeChecker = program.getTypeChecker(); - let symbol = typeChecker.getSymbolAtLocation(node); + const typeChecker = program.getTypeChecker(); + const symbol = typeChecker.getSymbolAtLocation(node); if (!symbol) { // Try getting just type at this position and show @@ -4449,7 +4448,7 @@ namespace ts { case SyntaxKind.ThisType: case SyntaxKind.SuperKeyword: // For the identifiers/this/super etc get the type at position - let type = typeChecker.getTypeAtLocation(node); + const type = typeChecker.getTypeAtLocation(node); if (type) { return { kind: ScriptElementKind.unknown, @@ -4464,7 +4463,7 @@ namespace ts { return undefined; } - let displayPartsDocumentationsAndKind = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, sourceFile, getContainerNode(node), node); + const displayPartsDocumentationsAndKind = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, sourceFile, getContainerNode(node), node); return { kind: displayPartsDocumentationsAndKind.symbolKind, kindModifiers: getSymbolModifiers(symbol), @@ -4486,13 +4485,13 @@ namespace ts { } function getDefinitionFromSymbol(symbol: Symbol, node: Node): DefinitionInfo[] { - let typeChecker = program.getTypeChecker(); - let result: DefinitionInfo[] = []; - let declarations = symbol.getDeclarations(); - let symbolName = typeChecker.symbolToString(symbol); // Do not get scoped name, just the name of the symbol - let symbolKind = getSymbolKind(symbol, node); - let containerSymbol = symbol.parent; - let containerName = containerSymbol ? typeChecker.symbolToString(containerSymbol, node) : ""; + const typeChecker = program.getTypeChecker(); + const result: DefinitionInfo[] = []; + const declarations = symbol.getDeclarations(); + const symbolName = typeChecker.symbolToString(symbol); // Do not get scoped name, just the name of the symbol + const symbolKind = getSymbolKind(symbol, node); + const containerSymbol = symbol.parent; + const containerName = containerSymbol ? typeChecker.symbolToString(containerSymbol, node) : ""; if (!tryAddConstructSignature(symbol, node, symbolKind, symbolName, containerName, result) && !tryAddCallSignature(symbol, node, symbolKind, symbolName, containerName, result)) { @@ -4510,7 +4509,7 @@ namespace ts { if (isNewExpressionTarget(location) || location.kind === SyntaxKind.ConstructorKeyword) { if (symbol.flags & SymbolFlags.Class) { // Find the first class-like declaration and try to get the construct signature. - for (let declaration of symbol.getDeclarations()) { + for (const declaration of symbol.getDeclarations()) { if (isClassLike(declaration)) { return tryAddSignature(declaration.members, /*selectConstructors*/ true, @@ -4535,7 +4534,7 @@ namespace ts { } function tryAddSignature(signatureDeclarations: Declaration[], selectConstructors: boolean, symbolKind: string, symbolName: string, containerName: string, result: DefinitionInfo[]) { - let declarations: Declaration[] = []; + const declarations: Declaration[] = []; let definition: Declaration; forEach(signatureDeclarations, d => { @@ -4563,24 +4562,24 @@ namespace ts { function getDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[] { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); - let node = getTouchingPropertyName(sourceFile, position); + const node = getTouchingPropertyName(sourceFile, position); if (!node) { return undefined; } // Labels if (isJumpStatementTarget(node)) { - let labelName = (node).text; - let label = getTargetLabel((node.parent), (node).text); + const labelName = (node).text; + const label = getTargetLabel((node.parent), (node).text); return label ? [createDefinitionInfo(label, ScriptElementKind.label, labelName, /*containerName*/ undefined)] : undefined; } /// Triple slash reference comments - let comment = forEach(sourceFile.referencedFiles, r => (r.pos <= position && position < r.end) ? r : undefined); + const comment = forEach(sourceFile.referencedFiles, r => (r.pos <= position && position < r.end) ? r : undefined); if (comment) { - let referenceFile = tryResolveScriptReference(program, sourceFile, comment); + const referenceFile = tryResolveScriptReference(program, sourceFile, comment); if (referenceFile) { return [{ fileName: referenceFile.fileName, @@ -4594,7 +4593,7 @@ namespace ts { return undefined; } - let typeChecker = program.getTypeChecker(); + const typeChecker = program.getTypeChecker(); let symbol = typeChecker.getSymbolAtLocation(node); // Could not find a symbol e.g. node is string or number keyword, @@ -4608,7 +4607,7 @@ namespace ts { // import {A, B} from "mod"; // to jump to the implementation directly. if (symbol.flags & SymbolFlags.Alias) { - let declaration = symbol.declarations[0]; + const declaration = symbol.declarations[0]; if (node.kind === SyntaxKind.Identifier && node.parent === declaration) { symbol = typeChecker.getAliasedSymbol(symbol); } @@ -4620,15 +4619,15 @@ namespace ts { // is performed at the location of property access, we would like to go to definition of the property in the short-hand // assignment. This case and others are handled by the following code. if (node.parent.kind === SyntaxKind.ShorthandPropertyAssignment) { - let shorthandSymbol = typeChecker.getShorthandAssignmentValueSymbol(symbol.valueDeclaration); + const shorthandSymbol = typeChecker.getShorthandAssignmentValueSymbol(symbol.valueDeclaration); if (!shorthandSymbol) { return []; } - let shorthandDeclarations = shorthandSymbol.getDeclarations(); - let shorthandSymbolKind = getSymbolKind(shorthandSymbol, node); - let shorthandSymbolName = typeChecker.symbolToString(shorthandSymbol); - let shorthandContainerName = typeChecker.symbolToString(symbol.parent, node); + const shorthandDeclarations = shorthandSymbol.getDeclarations(); + const shorthandSymbolKind = getSymbolKind(shorthandSymbol, node); + const shorthandSymbolName = typeChecker.symbolToString(shorthandSymbol); + const shorthandContainerName = typeChecker.symbolToString(symbol.parent, node); return map(shorthandDeclarations, declaration => createDefinitionInfo(declaration, shorthandSymbolKind, shorthandSymbolName, shorthandContainerName)); } @@ -4640,27 +4639,27 @@ namespace ts { function getTypeDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[] { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); - let node = getTouchingPropertyName(sourceFile, position); + const node = getTouchingPropertyName(sourceFile, position); if (!node) { return undefined; } - let typeChecker = program.getTypeChecker(); + const typeChecker = program.getTypeChecker(); - let symbol = typeChecker.getSymbolAtLocation(node); + const symbol = typeChecker.getSymbolAtLocation(node); if (!symbol) { return undefined; } - let type = typeChecker.getTypeOfSymbolAtLocation(symbol, node); + const type = typeChecker.getTypeOfSymbolAtLocation(symbol, node); if (!type) { return undefined; } if (type.flags & TypeFlags.Union) { - let result: DefinitionInfo[] = []; + const result: DefinitionInfo[] = []; forEach((type).types, t => { if (t.symbol) { addRange(/*to*/ result, /*from*/ getDefinitionFromSymbol(t.symbol, node)); @@ -4680,7 +4679,7 @@ namespace ts { let results = getOccurrencesAtPositionCore(fileName, position); if (results) { - let sourceFile = getCanonicalFileName(normalizeSlashes(fileName)); + const sourceFile = getCanonicalFileName(normalizeSlashes(fileName)); // Get occurrences only supports reporting occurrences for the file queried. So // filter down to that list. @@ -4694,10 +4693,10 @@ namespace ts { synchronizeHostData(); filesToSearch = map(filesToSearch, normalizeSlashes); - let sourceFilesToSearch = filter(program.getSourceFiles(), f => contains(filesToSearch, f.fileName)); - let sourceFile = getValidSourceFile(fileName); + const sourceFilesToSearch = filter(program.getSourceFiles(), f => contains(filesToSearch, f.fileName)); + const sourceFile = getValidSourceFile(fileName); - let node = getTouchingWord(sourceFile, position); + const node = getTouchingWord(sourceFile, position); if (!node) { return undefined; } @@ -4705,8 +4704,8 @@ namespace ts { return getSemanticDocumentHighlights(node) || getSyntacticDocumentHighlights(node); function getHighlightSpanForNode(node: Node): HighlightSpan { - let start = node.getStart(); - let end = node.getEnd(); + const start = node.getStart(); + const end = node.getEnd(); return { fileName: sourceFile.fileName, @@ -4723,7 +4722,7 @@ namespace ts { isLiteralNameOfPropertyDeclarationOrIndexAccess(node) || isNameOfExternalModuleImportOrDeclaration(node)) { - let referencedSymbols = getReferencedSymbolsForNode(node, sourceFilesToSearch, /*findInStrings:*/ false, /*findInComments:*/ false); + const referencedSymbols = getReferencedSymbolsForNode(node, sourceFilesToSearch, /*findInStrings*/ false, /*findInComments*/ false); return convertReferencedSymbols(referencedSymbols); } @@ -4734,11 +4733,11 @@ namespace ts { return undefined; } - let fileNameToDocumentHighlights: Map = {}; - let result: DocumentHighlights[] = []; - for (let referencedSymbol of referencedSymbols) { - for (let referenceEntry of referencedSymbol.references) { - let fileName = referenceEntry.fileName; + const fileNameToDocumentHighlights: Map = {}; + const result: DocumentHighlights[] = []; + for (const referencedSymbol of referencedSymbols) { + for (const referenceEntry of referencedSymbol.references) { + const fileName = referenceEntry.fileName; let documentHighlights = getProperty(fileNameToDocumentHighlights, fileName); if (!documentHighlights) { documentHighlights = { fileName, highlightSpans: [] }; @@ -4759,9 +4758,9 @@ namespace ts { } function getSyntacticDocumentHighlights(node: Node): DocumentHighlights[] { - let fileName = sourceFile.fileName; + const fileName = sourceFile.fileName; - let highlightSpans = getHighlightSpans(node); + const highlightSpans = getHighlightSpans(node); if (!highlightSpans || highlightSpans.length === 0) { return undefined; } @@ -4865,7 +4864,7 @@ namespace ts { * into function boundaries and try-blocks with catch-clauses. */ function aggregateOwnedThrowStatements(node: Node): ThrowStatement[] { - let statementAccumulator: ThrowStatement[] = [] + const statementAccumulator: ThrowStatement[] = []; aggregate(node); return statementAccumulator; @@ -4874,7 +4873,7 @@ namespace ts { statementAccumulator.push(node); } else if (node.kind === SyntaxKind.TryStatement) { - let tryStatement = node; + const tryStatement = node; if (tryStatement.catchClause) { aggregate(tryStatement.catchClause); @@ -4905,7 +4904,7 @@ namespace ts { let child: Node = throwStatement; while (child.parent) { - let parent = child.parent; + const parent = child.parent; if (isFunctionBlock(parent) || parent.kind === SyntaxKind.SourceFile) { return parent; @@ -4914,7 +4913,7 @@ namespace ts { // A throw-statement is only owned by a try-statement if the try-statement has // a catch clause, and if the throw-statement occurs within the try block. if (parent.kind === SyntaxKind.TryStatement) { - let tryStatement = parent; + const tryStatement = parent; if (tryStatement.tryBlock === child && tryStatement.catchClause) { return child; @@ -4928,7 +4927,7 @@ namespace ts { } function aggregateAllBreakAndContinueStatements(node: Node): BreakOrContinueStatement[] { - let statementAccumulator: BreakOrContinueStatement[] = [] + const statementAccumulator: BreakOrContinueStatement[] = []; aggregate(node); return statementAccumulator; @@ -4944,7 +4943,7 @@ namespace ts { } function ownsBreakOrContinueStatement(owner: Node, statement: BreakOrContinueStatement): boolean { - let actualOwner = getBreakOrContinueOwner(statement); + const actualOwner = getBreakOrContinueOwner(statement); return actualOwner && actualOwner === owner; } @@ -4979,7 +4978,7 @@ namespace ts { } function getModifierOccurrences(modifier: SyntaxKind, declaration: Node): HighlightSpan[] { - let container = declaration.parent; + const container = declaration.parent; // Make sure we only highlight the keyword when it makes sense to do so. if (isAccessibilityModifier(modifier)) { @@ -5009,8 +5008,8 @@ namespace ts { return undefined; } - let keywords: Node[] = []; - let modifierFlag: NodeFlags = getFlagFromModifier(modifier); + const keywords: Node[] = []; + const modifierFlag: NodeFlags = getFlagFromModifier(modifier); let nodes: Node[]; switch (container.kind) { @@ -5035,7 +5034,7 @@ namespace ts { // If we're an accessibility modifier, we're in an instance member and should search // the constructor's parameter list for instance members as well. if (modifierFlag & NodeFlags.AccessibilityModifier) { - let constructor = forEach((container).members, member => { + const constructor = forEach((container).members, member => { return member.kind === SyntaxKind.Constructor && member; }); @@ -5048,7 +5047,7 @@ namespace ts { } break; default: - Debug.fail("Invalid container kind.") + Debug.fail("Invalid container kind."); } forEach(nodes, node => { @@ -5091,7 +5090,7 @@ namespace ts { } function getGetAndSetOccurrences(accessorDeclaration: AccessorDeclaration): HighlightSpan[] { - let keywords: Node[] = []; + const keywords: Node[] = []; tryPushAccessorKeyword(accessorDeclaration.symbol, SyntaxKind.GetAccessor); tryPushAccessorKeyword(accessorDeclaration.symbol, SyntaxKind.SetAccessor); @@ -5099,7 +5098,7 @@ namespace ts { return map(keywords, getHighlightSpanForNode); function tryPushAccessorKeyword(accessorSymbol: Symbol, accessorKind: SyntaxKind): void { - let accessor = getDeclarationOfKind(accessorSymbol, accessorKind); + const accessor = getDeclarationOfKind(accessorSymbol, accessorKind); if (accessor) { forEach(accessor.getChildren(), child => pushKeywordIf(keywords, child, SyntaxKind.GetKeyword, SyntaxKind.SetKeyword)); @@ -5108,9 +5107,9 @@ namespace ts { } function getConstructorOccurrences(constructorDeclaration: ConstructorDeclaration): HighlightSpan[] { - let declarations = constructorDeclaration.symbol.getDeclarations() + const declarations = constructorDeclaration.symbol.getDeclarations(); - let keywords: Node[] = []; + const keywords: Node[] = []; forEach(declarations, declaration => { forEach(declaration.getChildren(), token => { @@ -5122,12 +5121,12 @@ namespace ts { } function getLoopBreakContinueOccurrences(loopNode: IterationStatement): HighlightSpan[] { - let keywords: Node[] = []; + const keywords: Node[] = []; if (pushKeywordIf(keywords, loopNode.getFirstToken(), SyntaxKind.ForKeyword, SyntaxKind.WhileKeyword, SyntaxKind.DoKeyword)) { // If we succeeded and got a do-while loop, then start looking for a 'while' keyword. if (loopNode.kind === SyntaxKind.DoStatement) { - let loopTokens = loopNode.getChildren(); + const loopTokens = loopNode.getChildren(); for (let i = loopTokens.length - 1; i >= 0; i--) { if (pushKeywordIf(keywords, loopTokens[i], SyntaxKind.WhileKeyword)) { @@ -5137,7 +5136,7 @@ namespace ts { } } - let breaksAndContinues = aggregateAllBreakAndContinueStatements(loopNode.statement); + const breaksAndContinues = aggregateAllBreakAndContinueStatements(loopNode.statement); forEach(breaksAndContinues, statement => { if (ownsBreakOrContinueStatement(loopNode, statement)) { @@ -5149,7 +5148,7 @@ namespace ts { } function getBreakOrContinueStatementOccurrences(breakOrContinueStatement: BreakOrContinueStatement): HighlightSpan[] { - let owner = getBreakOrContinueOwner(breakOrContinueStatement); + const owner = getBreakOrContinueOwner(breakOrContinueStatement); if (owner) { switch (owner.kind) { @@ -5158,7 +5157,7 @@ namespace ts { case SyntaxKind.ForOfStatement: case SyntaxKind.DoStatement: case SyntaxKind.WhileStatement: - return getLoopBreakContinueOccurrences(owner) + return getLoopBreakContinueOccurrences(owner); case SyntaxKind.SwitchStatement: return getSwitchCaseDefaultOccurrences(owner); @@ -5169,7 +5168,7 @@ namespace ts { } function getSwitchCaseDefaultOccurrences(switchStatement: SwitchStatement): HighlightSpan[] { - let keywords: Node[] = []; + const keywords: Node[] = []; pushKeywordIf(keywords, switchStatement.getFirstToken(), SyntaxKind.SwitchKeyword); @@ -5177,7 +5176,7 @@ namespace ts { forEach(switchStatement.caseBlock.clauses, clause => { pushKeywordIf(keywords, clause.getFirstToken(), SyntaxKind.CaseKeyword, SyntaxKind.DefaultKeyword); - let breaksAndContinues = aggregateAllBreakAndContinueStatements(clause); + const breaksAndContinues = aggregateAllBreakAndContinueStatements(clause); forEach(breaksAndContinues, statement => { if (ownsBreakOrContinueStatement(switchStatement, statement)) { @@ -5190,7 +5189,7 @@ namespace ts { } function getTryCatchFinallyOccurrences(tryStatement: TryStatement): HighlightSpan[] { - let keywords: Node[] = []; + const keywords: Node[] = []; pushKeywordIf(keywords, tryStatement.getFirstToken(), SyntaxKind.TryKeyword); @@ -5199,7 +5198,7 @@ namespace ts { } if (tryStatement.finallyBlock) { - let finallyKeyword = findChildOfKind(tryStatement, SyntaxKind.FinallyKeyword, sourceFile); + const finallyKeyword = findChildOfKind(tryStatement, SyntaxKind.FinallyKeyword, sourceFile); pushKeywordIf(keywords, finallyKeyword, SyntaxKind.FinallyKeyword); } @@ -5207,13 +5206,13 @@ namespace ts { } function getThrowOccurrences(throwStatement: ThrowStatement): HighlightSpan[] { - let owner = getThrowStatementOwner(throwStatement); + const owner = getThrowStatementOwner(throwStatement); if (!owner) { return undefined; } - let keywords: Node[] = []; + const keywords: Node[] = []; forEach(aggregateOwnedThrowStatements(owner), throwStatement => { pushKeywordIf(keywords, throwStatement.getFirstToken(), SyntaxKind.ThrowKeyword); @@ -5231,14 +5230,14 @@ namespace ts { } function getReturnOccurrences(returnStatement: ReturnStatement): HighlightSpan[] { - let func = getContainingFunction(returnStatement); + const func = getContainingFunction(returnStatement); // If we didn't find a containing function with a block body, bail out. if (!(func && hasKind(func.body, SyntaxKind.Block))) { return undefined; } - let keywords: Node[] = [] + const keywords: Node[] = []; forEachReturnStatement(func.body, returnStatement => { pushKeywordIf(keywords, returnStatement.getFirstToken(), SyntaxKind.ReturnKeyword); }); @@ -5252,7 +5251,7 @@ namespace ts { } function getIfElseOccurrences(ifStatement: IfStatement): HighlightSpan[] { - let keywords: Node[] = []; + const keywords: Node[] = []; // Traverse upwards through all parent if-statements linked by their else-branches. while (hasKind(ifStatement.parent, SyntaxKind.IfStatement) && (ifStatement.parent).elseStatement === ifStatement) { @@ -5261,7 +5260,7 @@ namespace ts { // Now traverse back down through the else branches, aggregating if/else keywords of if-statements. while (ifStatement) { - let children = ifStatement.getChildren(); + const children = ifStatement.getChildren(); pushKeywordIf(keywords, children[0], SyntaxKind.IfKeyword); // Generally the 'else' keyword is second-to-last, so we traverse backwards. @@ -5272,20 +5271,20 @@ namespace ts { } if (!hasKind(ifStatement.elseStatement, SyntaxKind.IfStatement)) { - break + break; } ifStatement = ifStatement.elseStatement; } - let result: HighlightSpan[] = []; + const result: HighlightSpan[] = []; // We'd like to highlight else/ifs together if they are only separated by whitespace // (i.e. the keywords are separated by no comments, no newlines). for (let i = 0; i < keywords.length; i++) { if (keywords[i].kind === SyntaxKind.ElseKeyword && i < keywords.length - 1) { - let elseKeyword = keywords[i]; - let ifKeyword = keywords[i + 1]; // this *should* always be an 'if' keyword. + const elseKeyword = keywords[i]; + const ifKeyword = keywords[i + 1]; // this *should* always be an 'if' keyword. let shouldCombindElseAndIf = true; @@ -5328,9 +5327,9 @@ namespace ts { return undefined; } - let result: ReferenceEntry[] = []; - for (let entry of documentHighlights) { - for (let highlightSpan of entry.highlightSpans) { + const result: ReferenceEntry[] = []; + for (const entry of documentHighlights) { + for (const highlightSpan of entry.highlightSpans) { result.push({ fileName: entry.fileName, textSpan: highlightSpan.textSpan, @@ -5348,9 +5347,9 @@ namespace ts { return undefined; } - let referenceEntries: ReferenceEntry[] = []; + const referenceEntries: ReferenceEntry[] = []; - for (let referenceSymbol of referenceSymbols) { + for (const referenceSymbol of referenceSymbols) { addRange(referenceEntries, referenceSymbol.references); } @@ -5358,17 +5357,17 @@ namespace ts { } function findRenameLocations(fileName: string, position: number, findInStrings: boolean, findInComments: boolean): RenameLocation[] { - let referencedSymbols = findReferencedSymbols(fileName, position, findInStrings, findInComments); + const referencedSymbols = findReferencedSymbols(fileName, position, findInStrings, findInComments); return convertReferences(referencedSymbols); } function getReferencesAtPosition(fileName: string, position: number): ReferenceEntry[] { - let referencedSymbols = findReferencedSymbols(fileName, position, /*findInStrings:*/ false, /*findInComments:*/ false); + const referencedSymbols = findReferencedSymbols(fileName, position, /*findInStrings*/ false, /*findInComments*/ false); return convertReferences(referencedSymbols); } - function findReferences(fileName: string, position: number): ReferencedSymbol[]{ - let referencedSymbols = findReferencedSymbols(fileName, position, /*findInStrings:*/ false, /*findInComments:*/ false); + function findReferences(fileName: string, position: number): ReferencedSymbol[] { + const referencedSymbols = findReferencedSymbols(fileName, position, /*findInStrings*/ false, /*findInComments*/ false); // Only include referenced symbols that have a valid definition. return filter(referencedSymbols, rs => !!rs.definition); @@ -5377,17 +5376,17 @@ namespace ts { function findReferencedSymbols(fileName: string, position: number, findInStrings: boolean, findInComments: boolean): ReferencedSymbol[] { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); - let node = getTouchingPropertyName(sourceFile, position); + const node = getTouchingPropertyName(sourceFile, position); if (!node) { return undefined; } if (node.kind !== SyntaxKind.Identifier && // TODO (drosen): This should be enabled in a later release - currently breaks rename. - //node.kind !== SyntaxKind.ThisKeyword && - //node.kind !== SyntaxKind.SuperKeyword && + // node.kind !== SyntaxKind.ThisKeyword && + // node.kind !== SyntaxKind.SuperKeyword && !isLiteralNameOfPropertyDeclarationOrIndexAccess(node) && !isNameOfExternalModuleImportOrDeclaration(node)) { return undefined; @@ -5398,12 +5397,12 @@ namespace ts { } function getReferencedSymbolsForNode(node: Node, sourceFiles: SourceFile[], findInStrings: boolean, findInComments: boolean): ReferencedSymbol[] { - let typeChecker = program.getTypeChecker(); + const typeChecker = program.getTypeChecker(); // Labels if (isLabelName(node)) { if (isJumpStatementTarget(node)) { - let labelDefinition = getTargetLabel((node.parent), (node).text); + const labelDefinition = getTargetLabel((node.parent), (node).text); // if we have a label definition, look within its statement for references, if not, then // the label is undefined and we have no results.. return labelDefinition ? getLabelReferencesInNode(labelDefinition.parent, labelDefinition) : undefined; @@ -5422,7 +5421,7 @@ namespace ts { return getReferencesForSuperKeyword(node); } - let symbol = typeChecker.getSymbolAtLocation(node); + const symbol = typeChecker.getSymbolAtLocation(node); // Could not find a symbol e.g. unknown identifier if (!symbol) { @@ -5430,7 +5429,7 @@ namespace ts { return undefined; } - let declarations = symbol.declarations; + const declarations = symbol.declarations; // The symbol was an internal symbol and does not have a declaration e.g. undefined symbol if (!declarations || !declarations.length) { @@ -5440,29 +5439,29 @@ namespace ts { let result: ReferencedSymbol[]; // Compute the meaning from the location and the symbol it references - let searchMeaning = getIntersectingMeaningFromDeclarations(getMeaningFromLocation(node), declarations); + const searchMeaning = getIntersectingMeaningFromDeclarations(getMeaningFromLocation(node), declarations); // Get the text to search for. // Note: if this is an external module symbol, the name doesn't include quotes. - let declaredName = stripQuotes(getDeclaredName(typeChecker, symbol, node)); + const declaredName = stripQuotes(getDeclaredName(typeChecker, symbol, node)); // Try to get the smallest valid scope that we can limit our search to; // otherwise we'll need to search globally (i.e. include each file). - let scope = getSymbolScope(symbol); + const scope = getSymbolScope(symbol); // Maps from a symbol ID to the ReferencedSymbol entry in 'result'. - let symbolToIndex: number[] = []; + const symbolToIndex: number[] = []; if (scope) { result = []; getReferencesInNode(scope, symbol, declaredName, node, searchMeaning, findInStrings, findInComments, result, symbolToIndex); } else { - let internedName = getInternedName(symbol, node, declarations) - for (let sourceFile of sourceFiles) { + const internedName = getInternedName(symbol, node, declarations); + for (const sourceFile of sourceFiles) { cancellationToken.throwIfCancellationRequested(); - let nameTable = getNameTable(sourceFile); + const nameTable = getNameTable(sourceFile); if (lookUp(nameTable, internedName)) { result = result || []; @@ -5474,9 +5473,9 @@ namespace ts { return result; function getDefinition(symbol: Symbol): DefinitionInfo { - let info = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, node.getSourceFile(), getContainerNode(node), node); - let name = map(info.displayParts, p => p.text).join(""); - let declarations = symbol.declarations; + const info = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, node.getSourceFile(), getContainerNode(node), node); + const name = map(info.displayParts, p => p.text).join(""); + const declarations = symbol.declarations; if (!declarations || declarations.length === 0) { return undefined; } @@ -5506,7 +5505,7 @@ namespace ts { // Try to get the local symbol if we're dealing with an 'export default' // since that symbol has the "true" name. - let localExportDefaultSymbol = getLocalSymbolForExportDefault(symbol); + const localExportDefaultSymbol = getLocalSymbolForExportDefault(symbol); symbol = localExportDefaultSymbol || symbol; return stripQuotes(symbol.name); @@ -5523,14 +5522,14 @@ namespace ts { function getSymbolScope(symbol: Symbol): Node { // If this is the symbol of a named function expression or named class expression, // then named references are limited to its own scope. - let valueDeclaration = symbol.valueDeclaration; + const valueDeclaration = symbol.valueDeclaration; if (valueDeclaration && (valueDeclaration.kind === SyntaxKind.FunctionExpression || valueDeclaration.kind === SyntaxKind.ClassExpression)) { return valueDeclaration; } // If this is private property or method, the scope is the containing class if (symbol.flags & (SymbolFlags.Property | SymbolFlags.Method)) { - let privateDeclaration = forEach(symbol.getDeclarations(), d => (d.flags & NodeFlags.Private) ? d : undefined); + const privateDeclaration = forEach(symbol.getDeclarations(), d => (d.flags & NodeFlags.Private) ? d : undefined); if (privateDeclaration) { return getAncestor(privateDeclaration, SyntaxKind.ClassDeclaration); } @@ -5548,12 +5547,12 @@ namespace ts { return undefined; } - let scope: Node = undefined; + let scope: Node; - let declarations = symbol.getDeclarations(); + const declarations = symbol.getDeclarations(); if (declarations) { - for (let declaration of declarations) { - let container = getContainerNode(declaration); + for (const declaration of declarations) { + const container = getContainerNode(declaration); if (!container) { return undefined; @@ -5579,7 +5578,7 @@ namespace ts { } function getPossibleSymbolReferencePositions(sourceFile: SourceFile, symbolName: string, start: number, end: number): number[] { - let positions: number[] = []; + const positions: number[] = []; /// TODO: Cache symbol existence for files to save text search // Also, need to make this work for unicode escapes. @@ -5589,9 +5588,9 @@ namespace ts { return positions; } - let text = sourceFile.text; - let sourceLength = text.length; - let symbolNameLength = symbolName.length; + const text = sourceFile.text; + const sourceLength = text.length; + const symbolNameLength = symbolName.length; let position = text.indexOf(symbolName, start); while (position >= 0) { @@ -5602,7 +5601,7 @@ namespace ts { // We found a match. Make sure it's not part of a larger word (i.e. the char // before and after it have to be a non-identifier char). - let endPosition = position + symbolNameLength; + const endPosition = position + symbolNameLength; if ((position === 0 || !isIdentifierPart(text.charCodeAt(position - 1), ScriptTarget.Latest)) && (endPosition === sourceLength || !isIdentifierPart(text.charCodeAt(endPosition), ScriptTarget.Latest))) { @@ -5616,14 +5615,14 @@ namespace ts { } function getLabelReferencesInNode(container: Node, targetLabel: Identifier): ReferencedSymbol[] { - let references: ReferenceEntry[] = []; - let sourceFile = container.getSourceFile(); - let labelName = targetLabel.text; - let possiblePositions = getPossibleSymbolReferencePositions(sourceFile, labelName, container.getStart(), container.getEnd()); + const references: ReferenceEntry[] = []; + const sourceFile = container.getSourceFile(); + const labelName = targetLabel.text; + const possiblePositions = getPossibleSymbolReferencePositions(sourceFile, labelName, container.getStart(), container.getEnd()); forEach(possiblePositions, position => { cancellationToken.throwIfCancellationRequested(); - let node = getTouchingWord(sourceFile, position); + const node = getTouchingWord(sourceFile, position); if (!node || node.getWidth() !== labelName.length) { return; } @@ -5635,14 +5634,14 @@ namespace ts { } }); - let definition: DefinitionInfo = { + const definition: DefinitionInfo = { containerKind: "", containerName: "", fileName: targetLabel.getSourceFile().fileName, kind: ScriptElementKind.label, name: labelName, textSpan: createTextSpanFromBounds(targetLabel.getStart(), targetLabel.getEnd()) - } + }; return [{ definition, references }]; } @@ -5687,19 +5686,19 @@ namespace ts { result: ReferencedSymbol[], symbolToIndex: number[]): void { - let sourceFile = container.getSourceFile(); - let tripleSlashDirectivePrefixRegex = /^\/\/\/\s* { cancellationToken.throwIfCancellationRequested(); - let referenceLocation = getTouchingPropertyName(sourceFile, position); + const referenceLocation = getTouchingPropertyName(sourceFile, position); if (!isValidReferencePosition(referenceLocation, searchText)) { // This wasn't the start of a token. Check to see if it might be a // match in a comment or string if that's what the caller is asking @@ -5727,14 +5726,14 @@ namespace ts { return; } - let referenceSymbol = typeChecker.getSymbolAtLocation(referenceLocation); + const referenceSymbol = typeChecker.getSymbolAtLocation(referenceLocation); if (referenceSymbol) { - let referenceSymbolDeclaration = referenceSymbol.valueDeclaration; - let shorthandValueSymbol = typeChecker.getShorthandAssignmentValueSymbol(referenceSymbolDeclaration); - let relatedSymbol = getRelatedSymbol(searchSymbols, referenceSymbol, referenceLocation); + const referenceSymbolDeclaration = referenceSymbol.valueDeclaration; + const shorthandValueSymbol = typeChecker.getShorthandAssignmentValueSymbol(referenceSymbolDeclaration); + const relatedSymbol = getRelatedSymbol(searchSymbols, referenceSymbol, referenceLocation); if (relatedSymbol) { - let referencedSymbol = getReferencedSymbol(relatedSymbol); + const referencedSymbol = getReferencedSymbol(relatedSymbol); referencedSymbol.references.push(getReferenceEntryFromNode(referenceLocation)); } /* Because in short-hand property assignment, an identifier which stored as name of the short-hand property assignment @@ -5744,7 +5743,7 @@ namespace ts { * position of property accessing, the referenceEntry of such position will be handled in the first case. */ else if (!(referenceSymbol.flags & SymbolFlags.Transient) && searchSymbols.indexOf(shorthandValueSymbol) >= 0) { - let referencedSymbol = getReferencedSymbol(shorthandValueSymbol); + const referencedSymbol = getReferencedSymbol(shorthandValueSymbol); referencedSymbol.references.push(getReferenceEntryFromNode(referenceSymbolDeclaration.name)); } } @@ -5754,7 +5753,7 @@ namespace ts { return; function getReferencedSymbol(symbol: Symbol): ReferencedSymbol { - let symbolId = getSymbolId(symbol); + const symbolId = getSymbolId(symbol); let index = symbolToIndex[symbolId]; if (index === undefined) { index = result.length; @@ -5773,7 +5772,7 @@ namespace ts { return isInCommentHelper(sourceFile, position, isNonReferenceComment); function isNonReferenceComment(c: CommentRange): boolean { - let commentText = sourceFile.text.substring(c.pos, c.end); + const commentText = sourceFile.text.substring(c.pos, c.end); return !tripleSlashDirectivePrefixRegex.test(commentText); } } @@ -5802,20 +5801,20 @@ namespace ts { return undefined; } - let references: ReferenceEntry[] = []; + const references: ReferenceEntry[] = []; - let sourceFile = searchSpaceNode.getSourceFile(); - let possiblePositions = getPossibleSymbolReferencePositions(sourceFile, "super", searchSpaceNode.getStart(), searchSpaceNode.getEnd()); + const sourceFile = searchSpaceNode.getSourceFile(); + const possiblePositions = getPossibleSymbolReferencePositions(sourceFile, "super", searchSpaceNode.getStart(), searchSpaceNode.getEnd()); forEach(possiblePositions, position => { cancellationToken.throwIfCancellationRequested(); - let node = getTouchingWord(sourceFile, position); + const node = getTouchingWord(sourceFile, position); if (!node || node.kind !== SyntaxKind.SuperKeyword) { return; } - let container = getSuperContainer(node, /*includeFunctions*/ false); + const container = getSuperContainer(node, /*includeFunctions*/ false); // If we have a 'super' container, we must have an enclosing class. // Now make sure the owning class is the same as the search-space @@ -5825,7 +5824,7 @@ namespace ts { } }); - let definition = getDefinition(searchSpaceNode.symbol); + const definition = getDefinition(searchSpaceNode.symbol); return [{ definition, references }]; } @@ -5847,7 +5846,7 @@ namespace ts { case SyntaxKind.Constructor: case SyntaxKind.GetAccessor: case SyntaxKind.SetAccessor: - staticFlag &= searchSpaceNode.flags + staticFlag &= searchSpaceNode.flags; searchSpaceNode = searchSpaceNode.parent; // re-assign to be the owning class break; case SyntaxKind.SourceFile: @@ -5864,7 +5863,7 @@ namespace ts { return undefined; } - let references: ReferenceEntry[] = []; + const references: ReferenceEntry[] = []; let possiblePositions: number[]; if (searchSpaceNode.kind === SyntaxKind.SourceFile) { @@ -5874,7 +5873,7 @@ namespace ts { }); } else { - let sourceFile = searchSpaceNode.getSourceFile(); + const sourceFile = searchSpaceNode.getSourceFile(); possiblePositions = getPossibleSymbolReferencePositions(sourceFile, "this", searchSpaceNode.getStart(), searchSpaceNode.getEnd()); getThisReferencesInFile(sourceFile, searchSpaceNode, possiblePositions, references); } @@ -5895,12 +5894,12 @@ namespace ts { forEach(possiblePositions, position => { cancellationToken.throwIfCancellationRequested(); - let node = getTouchingWord(sourceFile, position); + const node = getTouchingWord(sourceFile, position); if (!node || (node.kind !== SyntaxKind.ThisKeyword && node.kind !== SyntaxKind.ThisType)) { return; } - let container = getThisContainer(node, /* includeArrowFunctions */ false); + const container = getThisContainer(node, /* includeArrowFunctions */ false); switch (searchSpaceNode.kind) { case SyntaxKind.FunctionExpression: @@ -5955,13 +5954,13 @@ namespace ts { * property name and variable declaration of the identifier. * Like in below example, when querying for all references for an identifier 'name', of the property assignment, the language service * should show both 'name' in 'obj' and 'name' in variable declaration - * let name = "Foo"; - * let obj = { name }; + * const name = "Foo"; + * const obj = { name }; * In order to do that, we will populate the search set with the value symbol of the identifier as a value of the property assignment * so that when matching with potential reference symbol, both symbols from property declaration and variable declaration * will be included correctly. */ - let shorthandValueSymbol = typeChecker.getShorthandAssignmentValueSymbol(location.parent); + const shorthandValueSymbol = typeChecker.getShorthandAssignmentValueSymbol(location.parent); if (shorthandValueSymbol) { result.push(shorthandValueSymbol); } @@ -6008,9 +6007,9 @@ namespace ts { function getPropertySymbolFromTypeReference(typeReference: ExpressionWithTypeArguments) { if (typeReference) { - let type = typeChecker.getTypeAtLocation(typeReference); + const type = typeChecker.getTypeAtLocation(typeReference); if (type) { - let propertySymbol = typeChecker.getPropertyOfType(type, propertyName); + const propertySymbol = typeChecker.getPropertyOfType(type, propertyName); if (propertySymbol) { result.push(propertySymbol); } @@ -6030,7 +6029,7 @@ namespace ts { // If the reference symbol is an alias, check if what it is aliasing is one of the search // symbols. if (isImportOrExportSpecifierImportSymbol(referenceSymbol)) { - let aliasedSymbol = typeChecker.getAliasedSymbol(referenceSymbol); + const aliasedSymbol = typeChecker.getAliasedSymbol(referenceSymbol); if (searchSymbols.indexOf(aliasedSymbol) >= 0) { return aliasedSymbol; } @@ -6056,7 +6055,7 @@ namespace ts { // Finally, try all properties with the same name in any type the containing type extended or implemented, and // see if any is in the list if (rootSymbol.parent && rootSymbol.parent.flags & (SymbolFlags.Class | SymbolFlags.Interface)) { - let result: Symbol[] = []; + const result: Symbol[] = []; getPropertySymbolsFromBaseTypes(rootSymbol.parent, rootSymbol.getName(), result); return forEach(result, s => searchSymbols.indexOf(s) >= 0 ? s : undefined); } @@ -6067,21 +6066,21 @@ namespace ts { function getPropertySymbolsFromContextualType(node: Node): Symbol[] { if (isNameOfPropertyAssignment(node)) { - let objectLiteral = node.parent.parent; - let contextualType = typeChecker.getContextualType(objectLiteral); - let name = (node).text; + const objectLiteral = node.parent.parent; + const contextualType = typeChecker.getContextualType(objectLiteral); + const name = (node).text; if (contextualType) { if (contextualType.flags & TypeFlags.Union) { // This is a union type, first see if the property we are looking for is a union property (i.e. exists in all types) // if not, search the constituent types for the property - let unionProperty = contextualType.getProperty(name) + const unionProperty = contextualType.getProperty(name); if (unionProperty) { return [unionProperty]; } else { - let result: Symbol[] = []; + const result: Symbol[] = []; forEach((contextualType).types, t => { - let symbol = t.getProperty(name); + const symbol = t.getProperty(name); if (symbol) { result.push(symbol); } @@ -6090,7 +6089,7 @@ namespace ts { } } else { - let symbol = contextualType.getProperty(name); + const symbol = contextualType.getProperty(name); if (symbol) { return [symbol]; } @@ -6119,8 +6118,8 @@ namespace ts { // Remember the last meaning lastIterationMeaning = meaning; - for (let declaration of declarations) { - let declarationMeaning = getMeaningFromDeclaration(declaration); + for (const declaration of declarations) { + const declarationMeaning = getMeaningFromDeclaration(declaration); if (declarationMeaning & meaning) { meaning |= declarationMeaning; @@ -6155,13 +6154,13 @@ namespace ts { return true; } - let parent = node.parent; + const parent = node.parent; if (parent) { if (parent.kind === SyntaxKind.PostfixUnaryExpression || parent.kind === SyntaxKind.PrefixUnaryExpression) { return true; } else if (parent.kind === SyntaxKind.BinaryExpression && (parent).left === node) { - let operator = (parent).operatorToken.kind; + const operator = (parent).operatorToken.kind; return SyntaxKind.FirstAssignment <= operator && operator <= SyntaxKind.LastAssignment; } } @@ -6183,8 +6182,8 @@ namespace ts { function getEmitOutput(fileName: string): EmitOutput { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); - let outputFiles: OutputFile[] = []; + const sourceFile = getValidSourceFile(fileName); + const outputFiles: OutputFile[] = []; function writeFile(fileName: string, data: string, writeByteOrderMark: boolean) { outputFiles.push({ @@ -6194,7 +6193,7 @@ namespace ts { }); } - let emitOutput = program.emit(sourceFile, writeFile, cancellationToken); + const emitOutput = program.emit(sourceFile, writeFile, cancellationToken); return { outputFiles, @@ -6287,7 +6286,7 @@ namespace ts { } if (!isLastClause && root.parent.kind === SyntaxKind.ExpressionWithTypeArguments && root.parent.parent.kind === SyntaxKind.HeritageClause) { - let decl = root.parent.parent.parent; + const decl = root.parent.parent.parent; return (decl.kind === SyntaxKind.ClassDeclaration && (root.parent.parent).token === SyntaxKind.ImplementsKeyword) || (decl.kind === SyntaxKind.InterfaceDeclaration && (root.parent.parent).token === SyntaxKind.ExtendsKeyword); } @@ -6359,7 +6358,7 @@ namespace ts { function getSignatureHelpItems(fileName: string, position: number): SignatureHelpItems { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); return SignatureHelp.getSignatureHelpItems(program, sourceFile, position, cancellationToken); } @@ -6370,10 +6369,10 @@ namespace ts { } function getNameOrDottedNameSpan(fileName: string, startPos: number, endPos: number): TextSpan { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); // Get node at the location - let node = getTouchingPropertyName(sourceFile, startPos); + const node = getTouchingPropertyName(sourceFile, startPos); if (!node) { return; @@ -6429,13 +6428,13 @@ namespace ts { function getBreakpointStatementAtPosition(fileName: string, position: number) { // doesn't use compiler - no need to synchronize with host - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return BreakpointResolver.spanInSourceFileAtLocation(sourceFile, position); } function getNavigationBarItems(fileName: string): NavigationBarItem[] { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return NavigationBar.getNavigationBarItems(sourceFile, host.getCompilationSettings()); } @@ -6467,11 +6466,11 @@ namespace ts { function getEncodedSemanticClassifications(fileName: string, span: TextSpan): Classifications { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); - let typeChecker = program.getTypeChecker(); + const sourceFile = getValidSourceFile(fileName); + const typeChecker = program.getTypeChecker(); - let result: number[] = []; - let classifiableNames = program.getClassifiableNames(); + const result: number[] = []; + const classifiableNames = program.getClassifiableNames(); processNode(sourceFile); return { spans: result, endOfLineState: EndOfLineState.None }; @@ -6483,7 +6482,7 @@ namespace ts { } function classifySymbol(symbol: Symbol, meaningAtPosition: SemanticMeaning): ClassificationType { - let flags = symbol.getFlags(); + const flags = symbol.getFlags(); if ((flags & SymbolFlags.Classifiable) === SymbolFlags.None) { return; } @@ -6531,19 +6530,19 @@ namespace ts { function processNode(node: Node) { // Only walk into nodes that intersect the requested span. if (node && textSpanIntersectsWith(span, node.getFullStart(), node.getFullWidth())) { - let kind = node.kind; + const kind = node.kind; checkForClassificationCancellation(kind); if (kind === SyntaxKind.Identifier && !nodeIsMissing(node)) { - let identifier = node; + const 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 (classifiableNames[identifier.text]) { - let symbol = typeChecker.getSymbolAtLocation(node); + const symbol = typeChecker.getSymbolAtLocation(node); if (symbol) { - let type = classifySymbol(symbol, getMeaningFromLocation(node)); + const type = classifySymbol(symbol, getMeaningFromLocation(node)); if (type) { pushClassification(node.getStart(), node.getWidth(), type); } @@ -6583,8 +6582,8 @@ namespace ts { function convertClassifications(classifications: Classifications): ClassifiedSpan[] { Debug.assert(classifications.spans.length % 3 === 0); - let dense = classifications.spans; - let result: ClassifiedSpan[] = []; + const dense = classifications.spans; + const result: ClassifiedSpan[] = []; for (let i = 0, n = dense.length; i < n; i += 3) { result.push({ textSpan: createTextSpan(dense[i], dense[i + 1]), @@ -6601,15 +6600,15 @@ namespace ts { function getEncodedSyntacticClassifications(fileName: string, span: TextSpan): Classifications { // doesn't use compiler - no need to synchronize with host - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); - let spanStart = span.start; - let spanLength = span.length; + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const spanStart = span.start; + const spanLength = span.length; // Make a scanner we can get trivia from. - let triviaScanner = createScanner(ScriptTarget.Latest, /*skipTrivia:*/ false, sourceFile.languageVariant, sourceFile.text); - let mergeConflictScanner = createScanner(ScriptTarget.Latest, /*skipTrivia:*/ false, sourceFile.languageVariant, sourceFile.text); + const triviaScanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false, sourceFile.languageVariant, sourceFile.text); + const mergeConflictScanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false, sourceFile.languageVariant, sourceFile.text); - let result: number[] = []; + const result: number[] = []; processElement(sourceFile); return { spans: result, endOfLineState: EndOfLineState.None }; @@ -6623,15 +6622,15 @@ namespace ts { function classifyLeadingTriviaAndGetTokenStart(token: Node): number { triviaScanner.setTextPos(token.pos); while (true) { - let start = triviaScanner.getTextPos(); + const start = triviaScanner.getTextPos(); // only bother scanning if we have something that could be trivia. if (!couldStartTrivia(sourceFile.text, start)) { return start; } - let kind = triviaScanner.scan(); - let end = triviaScanner.getTextPos(); - let width = end - start; + const kind = triviaScanner.scan(); + const end = triviaScanner.getTextPos(); + const width = end - start; // The moment we get something that isn't trivia, then stop processing. if (!isTrivia(kind)) { @@ -6655,8 +6654,8 @@ namespace ts { } if (kind === SyntaxKind.ConflictMarkerTrivia) { - let text = sourceFile.text; - let ch = text.charCodeAt(start); + const text = sourceFile.text; + const ch = text.charCodeAt(start); // for the <<<<<<< and >>>>>>> markers, we just add them in as comments // in the classification stream. @@ -6677,7 +6676,7 @@ namespace ts { if (kind === SyntaxKind.MultiLineCommentTrivia) { // See if this is a doc comment. If so, we'll classify certain portions of it // specially. - let docCommentAndDiagnostics = parseIsolatedJSDocComment(sourceFile.text, start, width); + const docCommentAndDiagnostics = parseIsolatedJSDocComment(sourceFile.text, start, width); if (docCommentAndDiagnostics && docCommentAndDiagnostics.jsDocComment) { docCommentAndDiagnostics.jsDocComment.parent = token; classifyJSDocComment(docCommentAndDiagnostics.jsDocComment); @@ -6696,7 +6695,7 @@ namespace ts { function classifyJSDocComment(docComment: JSDocComment) { let pos = docComment.pos; - for (let tag of docComment.tags) { + for (const tag of docComment.tags) { // As we walk through each tag, classify the portion of text from the end of // the last tag (or the start of the entire doc comment) as 'comment'. if (tag.pos !== pos) { @@ -6754,7 +6753,7 @@ namespace ts { } function processJSDocTemplateTag(tag: JSDocTemplateTag) { - for (let child of tag.getChildren()) { + for (const child of tag.getChildren()) { processElement(child); } } @@ -6776,11 +6775,11 @@ namespace ts { } function classifyDisabledCodeToken() { - let start = mergeConflictScanner.getTextPos(); - let tokenKind = mergeConflictScanner.scan(); - let end = mergeConflictScanner.getTextPos(); + const start = mergeConflictScanner.getTextPos(); + const tokenKind = mergeConflictScanner.scan(); + const end = mergeConflictScanner.getTextPos(); - let type = classifyTokenType(tokenKind); + const type = classifyTokenType(tokenKind); if (type) { pushClassification(start, end - start, type); } @@ -6791,12 +6790,12 @@ namespace ts { return; } - let tokenStart = classifyLeadingTriviaAndGetTokenStart(token); + const tokenStart = classifyLeadingTriviaAndGetTokenStart(token); - let tokenWidth = token.end - tokenStart; + const tokenWidth = token.end - tokenStart; Debug.assert(tokenWidth >= 0); if (tokenWidth > 0) { - let type = classifyTokenType(token.kind, token); + const type = classifyTokenType(token.kind, token); if (type) { pushClassification(tokenStart, tokenWidth, type); } @@ -6923,9 +6922,9 @@ namespace ts { if (decodedTextSpanIntersectsWith(spanStart, spanLength, element.pos, element.getFullWidth())) { checkForClassificationCancellation(element.kind); - let children = element.getChildren(sourceFile); + const children = element.getChildren(sourceFile); for (let i = 0, n = children.length; i < n; i++) { - let child = children[i]; + const child = children[i]; if (isToken(child)) { classifyToken(child); } @@ -6940,28 +6939,28 @@ namespace ts { function getOutliningSpans(fileName: string): OutliningSpan[] { // doesn't use compiler - no need to synchronize with host - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return OutliningElementsCollector.collectElements(sourceFile); } function getBraceMatchingAtPosition(fileName: string, position: number) { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); - let result: TextSpan[] = []; + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const result: TextSpan[] = []; - let token = getTouchingToken(sourceFile, position); + const token = getTouchingToken(sourceFile, position); if (token.getStart(sourceFile) === position) { - let matchKind = getMatchingTokenKind(token); + const matchKind = getMatchingTokenKind(token); // Ensure that there is a corresponding token to match ours. if (matchKind) { - let parentElement = token.parent; + const parentElement = token.parent; - let childNodes = parentElement.getChildren(sourceFile); - for (let current of childNodes) { + const childNodes = parentElement.getChildren(sourceFile); + for (const current of childNodes) { if (current.kind === matchKind) { - let range1 = createTextSpan(token.getStart(sourceFile), token.getWidth(sourceFile)); - let range2 = createTextSpan(current.getStart(sourceFile), current.getWidth(sourceFile)); + const range1 = createTextSpan(token.getStart(sourceFile), token.getWidth(sourceFile)); + const range2 = createTextSpan(current.getStart(sourceFile), current.getWidth(sourceFile)); // We want to order the braces when we return the result. if (range1.start < range2.start) { @@ -6981,11 +6980,11 @@ namespace ts { function getMatchingTokenKind(token: Node): ts.SyntaxKind { switch (token.kind) { - case ts.SyntaxKind.OpenBraceToken: return ts.SyntaxKind.CloseBraceToken + case ts.SyntaxKind.OpenBraceToken: return ts.SyntaxKind.CloseBraceToken; case ts.SyntaxKind.OpenParenToken: return ts.SyntaxKind.CloseParenToken; case ts.SyntaxKind.OpenBracketToken: return ts.SyntaxKind.CloseBracketToken; case ts.SyntaxKind.LessThanToken: return ts.SyntaxKind.GreaterThanToken; - case ts.SyntaxKind.CloseBraceToken: return ts.SyntaxKind.OpenBraceToken + case ts.SyntaxKind.CloseBraceToken: return ts.SyntaxKind.OpenBraceToken; case ts.SyntaxKind.CloseParenToken: return ts.SyntaxKind.OpenParenToken; case ts.SyntaxKind.CloseBracketToken: return ts.SyntaxKind.OpenBracketToken; case ts.SyntaxKind.GreaterThanToken: return ts.SyntaxKind.LessThanToken; @@ -6997,29 +6996,29 @@ namespace ts { function getIndentationAtPosition(fileName: string, position: number, editorOptions: EditorOptions) { let start = new Date().getTime(); - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); log("getIndentationAtPosition: getCurrentSourceFile: " + (new Date().getTime() - start)); start = new Date().getTime(); - let result = formatting.SmartIndenter.getIndentation(position, sourceFile, editorOptions); + const result = formatting.SmartIndenter.getIndentation(position, sourceFile, editorOptions); log("getIndentationAtPosition: computeIndentation : " + (new Date().getTime() - start)); return result; } function getFormattingEditsForRange(fileName: string, start: number, end: number, options: FormatCodeOptions): TextChange[] { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return formatting.formatSelection(start, end, sourceFile, getRuleProvider(options), options); } function getFormattingEditsForDocument(fileName: string, options: FormatCodeOptions): TextChange[] { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return formatting.formatDocument(sourceFile, getRuleProvider(options), options); } function getFormattingEditsAfterKeystroke(fileName: string, position: number, key: string, options: FormatCodeOptions): TextChange[] { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); if (key === "}") { return formatting.formatOnClosingCurly(position, sourceFile, getRuleProvider(options), options); @@ -7055,16 +7054,16 @@ namespace ts { * be performed. */ function getDocCommentTemplateAtPosition(fileName: string, position: number): TextInsertion { - let start = new Date().getTime(); - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const start = new Date().getTime(); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); // Check if in a context where we don't want to perform any insertion if (isInString(sourceFile, position) || isInComment(sourceFile, position) || hasDocComment(sourceFile, position)) { return undefined; } - let tokenAtPos = getTokenAtPosition(sourceFile, position); - let tokenStart = tokenAtPos.getStart() + const tokenAtPos = getTokenAtPosition(sourceFile, position); + const tokenStart = tokenAtPos.getStart(); if (!tokenAtPos || tokenStart < position) { return undefined; } @@ -7100,11 +7099,11 @@ namespace ts { return undefined; } - let parameters = getParametersForJsDocOwningNode(commentOwner); - let posLineAndChar = sourceFile.getLineAndCharacterOfPosition(position); - let lineStart = sourceFile.getLineStarts()[posLineAndChar.line]; + const parameters = getParametersForJsDocOwningNode(commentOwner); + const posLineAndChar = sourceFile.getLineAndCharacterOfPosition(position); + const lineStart = sourceFile.getLineStarts()[posLineAndChar.line]; - let indentationStr = sourceFile.text.substr(lineStart, posLineAndChar.character); + const indentationStr = sourceFile.text.substr(lineStart, posLineAndChar.character); // TODO: call a helper method instead once PR #4133 gets merged in. const newLine = host.getNewLine ? host.getNewLine() : "\r\n"; @@ -7128,7 +7127,7 @@ namespace ts { // * if the caret was directly in front of the object, then we add an extra line and indentation. const preamble = "/**" + newLine + indentationStr + " * "; - let result = + const result = preamble + newLine + docParams + indentationStr + " */" + @@ -7172,7 +7171,7 @@ namespace ts { case SyntaxKind.ArrowFunction: return (rightHandSide).parameters; case SyntaxKind.ClassExpression: - for (let member of (rightHandSide).members) { + for (const member of (rightHandSide).members) { if (member.kind === SyntaxKind.Constructor) { return (member).parameters; } @@ -7192,15 +7191,15 @@ namespace ts { // anything away. synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); cancellationToken.throwIfCancellationRequested(); - let fileContents = sourceFile.text; - let result: TodoComment[] = []; + const fileContents = sourceFile.text; + const result: TodoComment[] = []; if (descriptors.length > 0) { - let regExp = getTodoCommentsRegExp(); + const regExp = getTodoCommentsRegExp(); let matchArray: RegExpExecArray; while (matchArray = regExp.exec(fileContents)) { @@ -7223,15 +7222,15 @@ namespace ts { // // i.e. 'undefined' in position 3 above means TODO(jason) didn't match. // "hack" in position 4 means HACK did match. - let firstDescriptorCaptureIndex = 3; + const firstDescriptorCaptureIndex = 3; Debug.assert(matchArray.length === descriptors.length + firstDescriptorCaptureIndex); - let preamble = matchArray[1]; - let matchPosition = matchArray.index + preamble.length; + const preamble = matchArray[1]; + const matchPosition = matchArray.index + preamble.length; // OK, we have found a match in the file. This is only an acceptable match if // it is contained within a comment. - let token = getTokenAtPosition(sourceFile, matchPosition); + const token = getTokenAtPosition(sourceFile, matchPosition); if (!isInsideComment(sourceFile, token, matchPosition)) { continue; } @@ -7250,7 +7249,7 @@ namespace ts { continue; } - let message = matchArray[2]; + const message = matchArray[2]; result.push({ descriptor: descriptor, message: message, @@ -7281,14 +7280,14 @@ namespace ts { // // The following three regexps are used to match the start of the text up to the TODO // comment portion. - let singleLineCommentStart = /(?:\/\/+\s*)/.source; - let multiLineCommentStart = /(?:\/\*+\s*)/.source; - let anyNumberOfSpacesAndAsterixesAtStartOfLine = /(?:^(?:\s|\*)*)/.source; + const singleLineCommentStart = /(?:\/\/+\s*)/.source; + const multiLineCommentStart = /(?:\/\*+\s*)/.source; + const anyNumberOfSpacesAndAsterixesAtStartOfLine = /(?:^(?:\s|\*)*)/.source; // Match any of the above three TODO comment start regexps. // Note that the outermost group *is* a capture group. We want to capture the preamble // so that we can determine the starting position of the TODO comment match. - let preamble = "(" + anyNumberOfSpacesAndAsterixesAtStartOfLine + "|" + singleLineCommentStart + "|" + multiLineCommentStart + ")"; + const preamble = "(" + anyNumberOfSpacesAndAsterixesAtStartOfLine + "|" + singleLineCommentStart + "|" + multiLineCommentStart + ")"; // Takes the descriptors and forms a regexp that matches them as if they were literals. // For example, if the descriptors are "TODO(jason)" and "HACK", then this will be: @@ -7298,17 +7297,17 @@ namespace ts { // Note that the outermost group is *not* a capture group, but the innermost groups // *are* capture groups. By capturing the inner literals we can determine after // matching which descriptor we are dealing with. - let literals = "(?:" + map(descriptors, d => "(" + escapeRegExp(d.text) + ")").join("|") + ")"; + const literals = "(?:" + map(descriptors, d => "(" + escapeRegExp(d.text) + ")").join("|") + ")"; // After matching a descriptor literal, the following regexp matches the rest of the // text up to the end of the line (or */). - let endOfLineOrEndOfComment = /(?:$|\*\/)/.source - let messageRemainder = /(?:.*?)/.source + const endOfLineOrEndOfComment = /(?:$|\*\/)/.source; + const messageRemainder = /(?:.*?)/.source; // This is the portion of the match we'll return as part of the TODO comment result. We // match the literal portion up to the end of the line or end of comment. - let messagePortion = "(" + literals + messageRemainder + ")"; - let regExpString = preamble + messagePortion + endOfLineOrEndOfComment; + const messagePortion = "(" + literals + messageRemainder + ")"; + const regExpString = preamble + messagePortion + endOfLineOrEndOfComment; // The final regexp will look like this: // /((?:\/\/+\s*)|(?:\/\*+\s*)|(?:^(?:\s|\*)*))((?:(TODO\(jason\))|(HACK))(?:.*?))(?:$|\*\/)/gim @@ -7334,40 +7333,40 @@ namespace ts { function getRenameInfo(fileName: string, position: number): RenameInfo { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); - let typeChecker = program.getTypeChecker(); + const sourceFile = getValidSourceFile(fileName); + const typeChecker = program.getTypeChecker(); - let node = getTouchingWord(sourceFile, position); + const node = getTouchingWord(sourceFile, position); // Can only rename an identifier. if (node && node.kind === SyntaxKind.Identifier) { - let symbol = typeChecker.getSymbolAtLocation(node); + const symbol = typeChecker.getSymbolAtLocation(node); // Only allow a symbol to be renamed if it actually has at least one declaration. if (symbol) { - let declarations = symbol.getDeclarations(); + const declarations = symbol.getDeclarations(); if (declarations && declarations.length > 0) { // Disallow rename for elements that are defined in the standard TypeScript library. - let defaultLibFileName = host.getDefaultLibFileName(host.getCompilationSettings()); + const defaultLibFileName = host.getDefaultLibFileName(host.getCompilationSettings()); if (defaultLibFileName) { - for (let current of declarations) { - let sourceFile = current.getSourceFile(); - var canonicalName = getCanonicalFileName(ts.normalizePath(sourceFile.fileName)); + for (const current of declarations) { + const sourceFile = current.getSourceFile(); + const canonicalName = getCanonicalFileName(ts.normalizePath(sourceFile.fileName)); if (sourceFile && getCanonicalFileName(ts.normalizePath(sourceFile.fileName)) === getCanonicalFileName(ts.normalizePath(defaultLibFileName))) { return getRenameInfoError(getLocaleSpecificMessage(Diagnostics.You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library)); } } } - let displayName = stripQuotes(getDeclaredName(typeChecker, symbol, node)); - let kind = getSymbolKind(symbol, node); + const displayName = stripQuotes(getDeclaredName(typeChecker, symbol, node)); + const kind = getSymbolKind(symbol, node); if (kind) { return { canRename: true, - localizedErrorMessage: undefined, + kind, displayName, + localizedErrorMessage: undefined, fullDisplayName: typeChecker.getFullyQualifiedName(symbol), - kind: kind, kindModifiers: getSymbolModifiers(symbol), triggerSpan: createTextSpan(node.getStart(), node.getWidth()) }; @@ -7434,14 +7433,14 @@ namespace ts { /* @internal */ export function getNameTable(sourceFile: SourceFile): Map { if (!sourceFile.nameTable) { - initializeNameTable(sourceFile) + initializeNameTable(sourceFile); } return sourceFile.nameTable; } function initializeNameTable(sourceFile: SourceFile): void { - let nameTable: Map = {}; + const nameTable: Map = {}; walk(sourceFile); sourceFile.nameTable = nameTable; @@ -7479,13 +7478,13 @@ namespace ts { /// Classifier export function createClassifier(): Classifier { - let scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false); + const scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false); /// We do not have a full parser support to know when we should parse a regex or not /// If we consider every slash token to be a regex, we could be missing cases like "1/2/3", where /// we have a series of divide operator. this list allows us to be more accurate by ruling out /// locations where a regexp cannot exist. - let noRegexTable: boolean[] = []; + const noRegexTable: boolean[] = []; noRegexTable[SyntaxKind.Identifier] = true; noRegexTable[SyntaxKind.StringLiteral] = true; noRegexTable[SyntaxKind.NumericLiteral] = true; @@ -7519,7 +7518,7 @@ namespace ts { // // Where on the second line, you will get the 'return' keyword, // a string literal, and a template end consisting of '} } `'. - let templateStack: SyntaxKind[] = []; + const templateStack: SyntaxKind[] = []; /** Returns true if 'keyword2' can legally follow 'keyword1' in any language construct. */ function canFollow(keyword1: SyntaxKind, keyword2: SyntaxKind) { @@ -7545,18 +7544,18 @@ namespace ts { } function convertClassifications(classifications: Classifications, text: string): ClassificationResult { - let entries: ClassificationInfo[] = []; - let dense = classifications.spans; + const entries: ClassificationInfo[] = []; + const dense = classifications.spans; let lastEnd = 0; for (let i = 0, n = dense.length; i < n; i += 3) { - let start = dense[i]; - let length = dense[i + 1]; - let type = dense[i + 2]; + const start = dense[i]; + const length = dense[i + 1]; + const type = dense[i + 2]; // Make a whitespace entry between the last item and this one. if (lastEnd >= 0) { - let whitespaceLength = start - lastEnd; + const whitespaceLength = start - lastEnd; if (whitespaceLength > 0) { entries.push({ length: whitespaceLength, classification: TokenClass.Whitespace }); } @@ -7566,7 +7565,7 @@ namespace ts { lastEnd = start + length; } - let whitespaceLength = text.length - lastEnd; + const whitespaceLength = text.length - lastEnd; if (whitespaceLength > 0) { entries.push({ length: whitespaceLength, classification: TokenClass.Whitespace }); } @@ -7620,7 +7619,7 @@ namespace ts { // (and a newline). That way when we lex we'll think we're still in a multiline comment. switch (lexState) { case EndOfLineState.InDoubleQuoteStringLiteral: - text = '"\\\n' + text; + text = "\"\\\n" + text; offset = 3; break; case EndOfLineState.InSingleQuoteStringLiteral: @@ -7646,7 +7645,7 @@ namespace ts { scanner.setText(text); - let result: Classifications = { + const result: Classifications = { endOfLineState: EndOfLineState.None, spans: [] }; @@ -7728,7 +7727,7 @@ namespace ts { // If we don't have anything on the template stack, // then we aren't trying to keep track of a previously scanned template head. if (templateStack.length > 0) { - let lastTemplateStackToken = lastOrUndefined(templateStack); + const lastTemplateStackToken = lastOrUndefined(templateStack); if (lastTemplateStackToken === SyntaxKind.TemplateHead) { token = scanner.reScanTemplateToken(); @@ -7758,17 +7757,17 @@ namespace ts { return result; function processToken(): void { - let start = scanner.getTokenPos(); - let end = scanner.getTextPos(); + const start = scanner.getTokenPos(); + const end = scanner.getTextPos(); addResult(start, end, classFromKind(token)); if (end >= text.length) { if (token === SyntaxKind.StringLiteral || token === SyntaxKind.StringLiteralType) { // Check to see if we finished up on a multiline string literal. - let tokenText = scanner.getTokenText(); + const tokenText = scanner.getTokenText(); if (scanner.isUnterminated()) { - let lastCharIndex = tokenText.length - 1; + const lastCharIndex = tokenText.length - 1; let numBackslashes = 0; while (tokenText.charCodeAt(lastCharIndex - numBackslashes) === CharacterCodes.backslash) { @@ -7777,7 +7776,7 @@ namespace ts { // If we have an odd number of backslashes, then the multiline string is unclosed if (numBackslashes & 1) { - let quoteChar = tokenText.charCodeAt(0); + const quoteChar = tokenText.charCodeAt(0); result.endOfLineState = quoteChar === CharacterCodes.doubleQuote ? EndOfLineState.InDoubleQuoteStringLiteral : EndOfLineState.InSingleQuoteStringLiteral; @@ -7826,7 +7825,7 @@ namespace ts { // relative to the original text. start -= offset; end -= offset; - let length = end - start; + const length = end - start; if (length > 0) { result.spans.push(start); @@ -7941,7 +7940,7 @@ namespace ts { } /// getDefaultLibraryFilePath - declare let __dirname: string; + declare const __dirname: string; /** * Get the path of the default library files (lib.d.ts) as distributed with the typescript From c0ff7f77a250e41a744dc56f7133c5808af1875e Mon Sep 17 00:00:00 2001 From: Yui T Date: Mon, 14 Dec 2015 14:35:27 -0800 Subject: [PATCH 12/61] Fix build error --- 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 092f987eb5a..4109a4eb345 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -1948,7 +1948,7 @@ namespace ts { return sourceFile; } - export const disableIncrementalParsing = false; + export let disableIncrementalParsing = false; export function updateLanguageServiceSourceFile(sourceFile: SourceFile, scriptSnapshot: IScriptSnapshot, version: string, textChangeRange: TextChangeRange, aggressiveChecks?: boolean): SourceFile { // If we were given a text change range, and our version or open-ness changed, then From 023e375835886c77278328663c79bf010f8f836e Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Mon, 14 Dec 2015 16:44:26 -0800 Subject: [PATCH 13/61] Properly handle multiply-declared optional properties in JSX attr. type Fixes #6029 --- src/compiler/checker.ts | 15 +++++-- src/compiler/diagnosticMessages.json | 2 +- .../tsxAttributeResolution11.errors.txt | 33 +++++++++++++++ .../reference/tsxAttributeResolution11.js | 41 +++++++++++++++++++ .../jsx/tsxAttributeResolution11.tsx | 29 +++++++++++++ 5 files changed, 115 insertions(+), 5 deletions(-) create mode 100644 tests/baselines/reference/tsxAttributeResolution11.errors.txt create mode 100644 tests/baselines/reference/tsxAttributeResolution11.js create mode 100644 tests/cases/conformance/jsx/tsxAttributeResolution11.tsx diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 78a7ccffbdd..09760b6b1e5 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -3766,11 +3766,13 @@ namespace ts { function createUnionOrIntersectionProperty(containingType: UnionOrIntersectionType, name: string): Symbol { const types = containingType.types; let props: Symbol[]; + let isOptional = !!(containingType.flags & TypeFlags.Intersection); for (const current of types) { const type = getApparentType(current); if (type !== unknownType) { const prop = getPropertyOfType(type, name); if (prop && !(getDeclarationFlagsFromSymbol(prop) & (NodeFlags.Private | NodeFlags.Protected))) { + isOptional = isOptional && !!(prop.flags & SymbolFlags.Optional); if (!props) { props = [prop]; } @@ -3798,7 +3800,12 @@ namespace ts { } propTypes.push(getTypeOfSymbol(prop)); } - const result = createSymbol(SymbolFlags.Property | SymbolFlags.Transient | SymbolFlags.SyntheticProperty, name); + const result = createSymbol( + SymbolFlags.Property | + SymbolFlags.Transient | + SymbolFlags.SyntheticProperty | + (isOptional ? SymbolFlags.Optional : SymbolFlags.None), + name); result.containingType = containingType; result.declarations = declarations; result.type = containingType.flags & TypeFlags.Union ? getUnionType(propTypes) : getIntersectionType(propTypes); @@ -8232,9 +8239,9 @@ namespace ts { // Props is of type 'any' or unknown return links.resolvedJsxType = attributesType; } - else if (!(attributesType.flags & TypeFlags.ObjectType)) { - // Props is not an object type - error(node.tagName, Diagnostics.JSX_element_attributes_type_0_must_be_an_object_type, typeToString(attributesType)); + else if (attributesType.flags & TypeFlags.Union) { + // Props cannot be a union type + error(node.tagName, Diagnostics.JSX_element_attributes_type_0_may_not_be_a_union_type, typeToString(attributesType)); return links.resolvedJsxType = anyType; } else { diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 54123808932..1a2575e9da6 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1691,7 +1691,7 @@ "category": "Error", "code": 2528 }, - "JSX element attributes type '{0}' must be an object type.": { + "JSX element attributes type '{0}' may not be a union type.": { "category": "Error", "code": 2600 }, diff --git a/tests/baselines/reference/tsxAttributeResolution11.errors.txt b/tests/baselines/reference/tsxAttributeResolution11.errors.txt new file mode 100644 index 00000000000..b043897d50d --- /dev/null +++ b/tests/baselines/reference/tsxAttributeResolution11.errors.txt @@ -0,0 +1,33 @@ +tests/cases/conformance/jsx/file.tsx(11,22): error TS2339: Property 'bar' does not exist on type 'IntrinsicAttributes & { ref?: string; }'. + + +==== tests/cases/conformance/jsx/react.d.ts (0 errors) ==== + + declare module JSX { + interface Element { } + interface IntrinsicElements { + } + interface ElementAttributesProperty { + props; + } + interface IntrinsicAttributes { + ref?: string; + } + } + +==== tests/cases/conformance/jsx/file.tsx (1 errors) ==== + class MyComponent { + render() { + } + + props: { + ref?: string; + } + } + + // Should be an OK + var x = ; + ~~~ +!!! error TS2339: Property 'bar' does not exist on type 'IntrinsicAttributes & { ref?: string; }'. + + \ No newline at end of file diff --git a/tests/baselines/reference/tsxAttributeResolution11.js b/tests/baselines/reference/tsxAttributeResolution11.js new file mode 100644 index 00000000000..03b843c209a --- /dev/null +++ b/tests/baselines/reference/tsxAttributeResolution11.js @@ -0,0 +1,41 @@ +//// [tests/cases/conformance/jsx/tsxAttributeResolution11.tsx] //// + +//// [react.d.ts] + +declare module JSX { + interface Element { } + interface IntrinsicElements { + } + interface ElementAttributesProperty { + props; + } + interface IntrinsicAttributes { + ref?: string; + } +} + +//// [file.tsx] +class MyComponent { + render() { + } + + props: { + ref?: string; + } +} + +// Should be an OK +var x = ; + + + +//// [file.jsx] +var MyComponent = (function () { + function MyComponent() { + } + MyComponent.prototype.render = function () { + }; + return MyComponent; +}()); +// Should be an OK +var x = ; diff --git a/tests/cases/conformance/jsx/tsxAttributeResolution11.tsx b/tests/cases/conformance/jsx/tsxAttributeResolution11.tsx new file mode 100644 index 00000000000..fdff3c36fc7 --- /dev/null +++ b/tests/cases/conformance/jsx/tsxAttributeResolution11.tsx @@ -0,0 +1,29 @@ +//@jsx: preserve +//@module: amd + +//@filename: react.d.ts +declare module JSX { + interface Element { } + interface IntrinsicElements { + } + interface ElementAttributesProperty { + props; + } + interface IntrinsicAttributes { + ref?: string; + } +} + +//@filename: file.tsx +class MyComponent { + render() { + } + + props: { + ref?: string; + } +} + +// Should be an OK +var x = ; + From ec95f9955af6507bba7b572ce913e48fd9639c94 Mon Sep 17 00:00:00 2001 From: Yui T Date: Tue, 15 Dec 2015 10:04:30 -0800 Subject: [PATCH 14/61] Fix linting issue --- Jakefile.js | 3 +- src/services/services.ts | 1073 +++++++++++++++++++------------------- 2 files changed, 538 insertions(+), 538 deletions(-) diff --git a/Jakefile.js b/Jakefile.js index beb16d2886f..91bd805a27b 100644 --- a/Jakefile.js +++ b/Jakefile.js @@ -924,7 +924,8 @@ function lintFileAsync(options, path, cb) { var lintTargets = compilerSources .concat(harnessCoreSources) .concat(serverCoreSources) - .concat(scriptSources); + .concat(scriptSources) + .concat([path.join(servicesDirectory,"services.ts")]); desc("Runs tslint on the compiler sources"); task("lint", ["build-rules"], function() { diff --git a/src/services/services.ts b/src/services/services.ts index a9dda549ead..8f9028486aa 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -12,7 +12,7 @@ namespace ts { /** The version of the language service API */ - export let servicesVersion = "0.4" + export const servicesVersion = "0.4"; export interface Node { getSourceFile(): SourceFile; @@ -48,7 +48,7 @@ namespace ts { getConstructSignatures(): Signature[]; getStringIndexType(): Type; getNumberIndexType(): Type; - getBaseTypes(): ObjectType[] + getBaseTypes(): ObjectType[]; } export interface Signature { @@ -97,7 +97,7 @@ namespace ts { dispose?(): void; } - export module ScriptSnapshot { + export namespace ScriptSnapshot { class StringScriptSnapshot implements IScriptSnapshot { constructor(private text: string) { @@ -126,12 +126,12 @@ namespace ts { referencedFiles: FileReference[]; importedFiles: FileReference[]; ambientExternalModules: string[]; - isLibFile: boolean + isLibFile: boolean; } - let scanner: Scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ true); + const scanner: Scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ true); - let emptyArray: any[] = []; + const emptyArray: any[] = []; const jsDocTagNames = [ "augments", @@ -174,7 +174,7 @@ namespace ts { let jsDocCompletionEntries: CompletionEntry[]; function createNode(kind: SyntaxKind, pos: number, end: number, flags: NodeFlags, parent?: Node): NodeObject { - let node = new NodeObject(kind, pos, end); + const node = new NodeObject(kind, pos, end); node.flags = flags; node.parent = parent; return node; @@ -235,8 +235,8 @@ namespace ts { private addSyntheticNodes(nodes: Node[], pos: number, end: number): number { scanner.setTextPos(pos); while (pos < end) { - let token = scanner.scan(); - let textPos = scanner.getTextPos(); + const token = scanner.scan(); + const textPos = scanner.getTextPos(); nodes.push(createNode(token, pos, textPos, NodeFlags.Synthetic, this)); pos = textPos; } @@ -244,13 +244,11 @@ namespace ts { } private createSyntaxList(nodes: NodeArray): Node { - let list = createNode(SyntaxKind.SyntaxList, nodes.pos, nodes.end, NodeFlags.Synthetic, this); + const list = createNode(SyntaxKind.SyntaxList, nodes.pos, nodes.end, NodeFlags.Synthetic, this); list._children = []; let pos = nodes.pos; - - - for (let node of nodes) { + for (const node of nodes) { if (pos < node.pos) { pos = this.addSyntheticNodes(list._children, pos, node.pos); } @@ -269,14 +267,14 @@ namespace ts { scanner.setText((sourceFile || this.getSourceFile()).text); children = []; let pos = this.pos; - let processNode = (node: Node) => { + const processNode = (node: Node) => { if (pos < node.pos) { pos = this.addSyntheticNodes(children, pos, node.pos); } children.push(node); pos = node.end; }; - let processNodes = (nodes: NodeArray) => { + const processNodes = (nodes: NodeArray) => { if (pos < nodes.pos) { pos = this.addSyntheticNodes(children, pos, nodes.pos); } @@ -308,20 +306,20 @@ namespace ts { } public getFirstToken(sourceFile?: SourceFile): Node { - let children = this.getChildren(sourceFile); + const children = this.getChildren(sourceFile); if (!children.length) { return undefined; } - let child = children[0]; + const child = children[0]; return child.kind < SyntaxKind.FirstNode ? child : child.getFirstToken(sourceFile); } public getLastToken(sourceFile?: SourceFile): Node { - let children = this.getChildren(sourceFile); + const children = this.getChildren(sourceFile); - let child = lastOrUndefined(children); + const child = lastOrUndefined(children); if (!child) { return undefined; } @@ -366,8 +364,8 @@ namespace ts { } function getJsDocCommentsFromDeclarations(declarations: Declaration[], name: string, canUseParsedParamTagComments: boolean) { - let documentationComment = []; - let docComments = getJsDocCommentsSeparatedByNewLines(); + const documentationComment = []; + const docComments = getJsDocCommentsSeparatedByNewLines(); ts.forEach(docComments, docComment => { if (documentationComment.length) { documentationComment.push(lineBreakPart()); @@ -378,22 +376,22 @@ namespace ts { return documentationComment; function getJsDocCommentsSeparatedByNewLines() { - let paramTag = "@param"; - let jsDocCommentParts: SymbolDisplayPart[] = []; + const paramTag = "@param"; + const jsDocCommentParts: SymbolDisplayPart[] = []; ts.forEach(declarations, (declaration, indexOfDeclaration) => { // Make sure we are collecting doc comment from declaration once, // In case of union property there might be same declaration multiple times // which only varies in type parameter - // Eg. let a: Array | Array; a.length + // Eg. const a: Array | Array; a.length // The property length will have two declarations of property length coming // from Array - Array and Array if (indexOf(declarations, declaration) === indexOfDeclaration) { - let sourceFileOfDeclaration = getSourceFileOfNode(declaration); + const sourceFileOfDeclaration = getSourceFileOfNode(declaration); // If it is parameter - try and get the jsDoc comment with @param tag from function declaration's jsDoc comments if (canUseParsedParamTagComments && declaration.kind === SyntaxKind.Parameter) { ts.forEach(getJsDocCommentTextRange(declaration.parent, sourceFileOfDeclaration), jsDocCommentTextRange => { - let cleanedParamJsDocComment = getCleanedParamJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); + const cleanedParamJsDocComment = getCleanedParamJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); if (cleanedParamJsDocComment) { addRange(jsDocCommentParts, cleanedParamJsDocComment); } @@ -413,7 +411,7 @@ namespace ts { // Get the cleaned js doc comment text from the declaration ts.forEach(getJsDocCommentTextRange( declaration.kind === SyntaxKind.VariableDeclaration ? declaration.parent.parent : declaration, sourceFileOfDeclaration), jsDocCommentTextRange => { - let cleanedJsDocComment = getCleanedJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); + const cleanedJsDocComment = getCleanedJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); if (cleanedJsDocComment) { addRange(jsDocCommentParts, cleanedJsDocComment); } @@ -439,7 +437,7 @@ namespace ts { } for (; pos < end; pos++) { - let ch = sourceFile.text.charCodeAt(pos); + const ch = sourceFile.text.charCodeAt(pos); if (!isWhiteSpace(ch) || isLineBreak(ch)) { // Either found lineBreak or non whiteSpace return pos; @@ -480,7 +478,7 @@ namespace ts { function getCleanedJsDocComment(pos: number, end: number, sourceFile: SourceFile) { let spacesToRemoveAfterAsterisk: number; - let docComments: SymbolDisplayPart[] = []; + const docComments: SymbolDisplayPart[] = []; let blankLineCount = 0; let isInParamTag = false; @@ -491,7 +489,7 @@ namespace ts { // If the comment starts with '*' consume the spaces on this line if (pos < end && sourceFile.text.charCodeAt(pos) === CharacterCodes.asterisk) { - let lineStartPos = pos + 1; + const lineStartPos = pos + 1; pos = consumeWhiteSpacesOnTheLine(pos + 1, end, sourceFile, spacesToRemoveAfterAsterisk); // Set the spaces to remove after asterisk as margin if not already set @@ -505,7 +503,7 @@ namespace ts { // Analyse text on this line while (pos < end && !isLineBreak(sourceFile.text.charCodeAt(pos))) { - let ch = sourceFile.text.charAt(pos); + const ch = sourceFile.text.charAt(pos); if (ch === "@") { // If it is @param tag if (isParamTag(pos, end, sourceFile)) { @@ -544,7 +542,7 @@ namespace ts { function getCleanedParamJsDocComment(pos: number, end: number, sourceFile: SourceFile) { let paramHelpStringMargin: number; - let paramDocComments: SymbolDisplayPart[] = []; + const paramDocComments: SymbolDisplayPart[] = []; while (pos < end) { if (isParamTag(pos, end, sourceFile)) { let blankLineCount = 0; @@ -559,7 +557,7 @@ namespace ts { if (sourceFile.text.charCodeAt(pos) === CharacterCodes.openBrace) { pos++; for (let curlies = 1; pos < end; pos++) { - let charCode = sourceFile.text.charCodeAt(pos); + const charCode = sourceFile.text.charCodeAt(pos); // { character means we need to find another } to match the found one if (charCode === CharacterCodes.openBrace) { @@ -603,9 +601,9 @@ namespace ts { } let paramHelpString = ""; - let firstLineParamHelpStringPos = pos; + const firstLineParamHelpStringPos = pos; while (pos < end) { - let ch = sourceFile.text.charCodeAt(pos); + const ch = sourceFile.text.charCodeAt(pos); // at line break, set this comment line text and go to next line if (isLineBreak(ch)) { @@ -674,15 +672,15 @@ namespace ts { } // Now consume white spaces max - let startOfLinePos = pos; + const startOfLinePos = pos; pos = consumeWhiteSpacesOnTheLine(pos, end, sourceFile, paramHelpStringMargin); if (pos >= end) { return; } - let consumedSpaces = pos - startOfLinePos; + const consumedSpaces = pos - startOfLinePos; if (consumedSpaces < paramHelpStringMargin) { - let ch = sourceFile.text.charCodeAt(pos); + const ch = sourceFile.text.charCodeAt(pos); if (ch === CharacterCodes.asterisk) { // Consume more spaces after asterisk pos = consumeWhiteSpacesOnTheLine(pos + 1, end, sourceFile, paramHelpStringMargin - consumedSpaces - 1); @@ -815,7 +813,7 @@ namespace ts { private namedDeclarations: Map; constructor(kind: SyntaxKind, pos: number, end: number) { - super(kind, pos, end) + super(kind, pos, end); } public update(newText: string, textChangeRange: TextChangeRange): SourceFile { @@ -843,16 +841,16 @@ namespace ts { } private computeNamedDeclarations(): Map { - let result: Map = {}; + const result: Map = {}; forEachChild(this, visit); return result; function addDeclaration(declaration: Declaration) { - let name = getDeclarationName(declaration); + const name = getDeclarationName(declaration); if (name) { - let declarations = getDeclarations(name); + const declarations = getDeclarations(name); declarations.push(declaration); } } @@ -863,13 +861,13 @@ namespace ts { function getDeclarationName(declaration: Declaration) { if (declaration.name) { - let result = getTextOfIdentifierOrLiteral(declaration.name); + const result = getTextOfIdentifierOrLiteral(declaration.name); if (result !== undefined) { return result; } if (declaration.name.kind === SyntaxKind.ComputedPropertyName) { - let expr = (declaration.name).expression; + const expr = (declaration.name).expression; if (expr.kind === SyntaxKind.PropertyAccessExpression) { return (expr).name.text; } @@ -899,12 +897,12 @@ namespace ts { case SyntaxKind.FunctionDeclaration: case SyntaxKind.MethodDeclaration: case SyntaxKind.MethodSignature: - let functionDeclaration = node; - let declarationName = getDeclarationName(functionDeclaration); + const functionDeclaration = node; + const declarationName = getDeclarationName(functionDeclaration); if (declarationName) { - let declarations = getDeclarations(declarationName); - let lastDeclaration = lastOrUndefined(declarations); + const declarations = getDeclarations(declarationName); + const lastDeclaration = lastOrUndefined(declarations); // Check whether this declaration belongs to an "overload group". if (lastDeclaration && functionDeclaration.parent === lastDeclaration.parent && functionDeclaration.symbol === lastDeclaration.symbol) { @@ -980,7 +978,7 @@ namespace ts { break; case SyntaxKind.ImportDeclaration: - let importClause = (node).importClause; + const importClause = (node).importClause; if (importClause) { // Handle default import case e.g.: // import d from "mod"; @@ -1113,8 +1111,8 @@ namespace ts { } export interface Classifications { - spans: number[], - endOfLineState: EndOfLineState + spans: number[]; + endOfLineState: EndOfLineState; } export interface ClassifiedSpan { @@ -1171,7 +1169,7 @@ namespace ts { highlightSpans: HighlightSpan[]; } - export module HighlightSpanKind { + export namespace HighlightSpanKind { export const none = "none"; export const definition = "definition"; export const reference = "reference"; @@ -1220,7 +1218,7 @@ namespace ts { InsertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: boolean; PlaceOpenBraceOnNewLineForFunctions: boolean; PlaceOpenBraceOnNewLineForControlBlocks: boolean; - [s: string]: boolean | number| string; + [s: string]: boolean | number | string; } export interface DefinitionInfo { @@ -1500,7 +1498,7 @@ namespace ts { } // TODO: move these to enums - export module ScriptElementKind { + export namespace ScriptElementKind { export const unknown = ""; export const warning = "warning"; @@ -1529,7 +1527,7 @@ namespace ts { export const enumElement = "enum"; // Inside module and script only - // let v = .. + // const v = .. export const variableElement = "var"; // Inside function @@ -1581,7 +1579,7 @@ namespace ts { export const letElement = "let"; } - export module ScriptElementKindModifier { + export namespace ScriptElementKindModifier { export const none = ""; export const publicMemberModifier = "public"; export const privateMemberModifier = "private"; @@ -1723,8 +1721,8 @@ namespace ts { this.fileNameToEntry = createFileMap(); // Initialize the list with the root file names - let rootFileNames = host.getScriptFileNames(); - for (let fileName of rootFileNames) { + const rootFileNames = host.getScriptFileNames(); + for (const fileName of rootFileNames) { this.createEntry(fileName, toPath(fileName, this.currentDirectory, getCanonicalFileName)); } @@ -1738,7 +1736,7 @@ namespace ts { private createEntry(fileName: string, path: Path) { let entry: HostFileInformation; - let scriptSnapshot = this.host.getScriptSnapshot(fileName); + const scriptSnapshot = this.host.getScriptSnapshot(fileName); if (scriptSnapshot) { entry = { hostFileName: fileName, @@ -1760,7 +1758,7 @@ namespace ts { } public getOrCreateEntry(fileName: string): HostFileInformation { - let path = toPath(fileName, this.currentDirectory, this.getCanonicalFileName) + const path = toPath(fileName, this.currentDirectory, this.getCanonicalFileName); if (this.contains(path)) { return this.getEntry(path); } @@ -1769,7 +1767,7 @@ namespace ts { } public getRootFileNames(): string[] { - let fileNames: string[] = []; + const fileNames: string[] = []; this.fileNameToEntry.forEachValue((path, value) => { if (value) { @@ -1781,12 +1779,12 @@ namespace ts { } public getVersion(path: Path): string { - let file = this.getEntry(path); + const file = this.getEntry(path); return file && file.version; } public getScriptSnapshot(path: Path): IScriptSnapshot { - let file = this.getEntry(path); + const file = this.getEntry(path); return file && file.scriptSnapshot; } } @@ -1803,22 +1801,22 @@ namespace ts { } public getCurrentSourceFile(fileName: string): SourceFile { - let scriptSnapshot = this.host.getScriptSnapshot(fileName); + const scriptSnapshot = this.host.getScriptSnapshot(fileName); if (!scriptSnapshot) { // The host does not know about this file. throw new Error("Could not find file: '" + fileName + "'."); } - let version = this.host.getScriptVersion(fileName); + const version = this.host.getScriptVersion(fileName); let sourceFile: SourceFile; if (this.currentFileName !== fileName) { // This is a new file, just parse it - sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, ScriptTarget.Latest, version, /*setNodeParents:*/ true); + sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, ScriptTarget.Latest, version, /*setNodeParents*/ true); } else if (this.currentFileVersion !== version) { // This is the same file, just a newer version. Incrementally parse the file. - let editRange = scriptSnapshot.getChangeRange(this.currentFileScriptSnapshot); + const editRange = scriptSnapshot.getChangeRange(this.currentFileScriptSnapshot); sourceFile = updateLanguageServiceSourceFile(this.currentSourceFile, scriptSnapshot, version, editRange); } @@ -1863,7 +1861,7 @@ namespace ts { * - noResolve = true */ export function transpileModule(input: string, transpileOptions: TranspileOptions): TranspileOutput { - let options = transpileOptions.compilerOptions ? clone(transpileOptions.compilerOptions) : getDefaultCompilerOptions(); + const options = transpileOptions.compilerOptions ? clone(transpileOptions.compilerOptions) : getDefaultCompilerOptions(); options.isolatedModules = true; @@ -1879,21 +1877,22 @@ namespace ts { options.noResolve = true; // if jsx is specified then treat file as .tsx - let inputFileName = transpileOptions.fileName || (options.jsx ? "module.tsx" : "module.ts"); - let sourceFile = createSourceFile(inputFileName, input, options.target); + const inputFileName = transpileOptions.fileName || (options.jsx ? "module.tsx" : "module.ts"); + const sourceFile = createSourceFile(inputFileName, input, options.target); if (transpileOptions.moduleName) { sourceFile.moduleName = transpileOptions.moduleName; } sourceFile.renamedDependencies = transpileOptions.renamedDependencies; - let newLine = getNewLineCharacter(options); + const newLine = getNewLineCharacter(options); // Output let outputText: string; let sourceMapText: string; + // Create a compilerHost object to allow the compiler to read and write files - let compilerHost: CompilerHost = { + const compilerHost: CompilerHost = { getSourceFile: (fileName, target) => fileName === normalizeSlashes(inputFileName) ? sourceFile : undefined, writeFile: (name, text, writeByteOrderMark) => { if (fileExtensionIs(name, ".map")) { @@ -1914,7 +1913,7 @@ namespace ts { readFile: (fileName): string => "" }; - let program = createProgram([inputFileName], options, compilerHost); + const program = createProgram([inputFileName], options, compilerHost); let diagnostics: Diagnostic[]; if (transpileOptions.reportDiagnostics) { @@ -1934,15 +1933,15 @@ namespace ts { * This is a shortcut function for transpileModule - it accepts transpileOptions as parameters and returns only outputText part of the result. */ export function transpile(input: string, compilerOptions?: CompilerOptions, fileName?: string, diagnostics?: Diagnostic[], moduleName?: string): string { - let output = transpileModule(input, { compilerOptions, fileName, reportDiagnostics: !!diagnostics, moduleName }); + const output = transpileModule(input, { compilerOptions, fileName, reportDiagnostics: !!diagnostics, moduleName }); // addRange correctly handles cases when wither 'from' or 'to' argument is missing addRange(diagnostics, output.diagnostics); return output.outputText; } export function createLanguageServiceSourceFile(fileName: string, scriptSnapshot: IScriptSnapshot, scriptTarget: ScriptTarget, version: string, setNodeParents: boolean): SourceFile { - let text = scriptSnapshot.getText(0, scriptSnapshot.getLength()); - let sourceFile = createSourceFile(fileName, text, scriptTarget, setNodeParents); + const text = scriptSnapshot.getText(0, scriptSnapshot.getLength()); + const sourceFile = createSourceFile(fileName, text, scriptTarget, setNodeParents); setSourceFileFields(sourceFile, scriptSnapshot, version); // after full parsing we can use table with interned strings as name table sourceFile.nameTable = sourceFile.identifiers; @@ -1961,12 +1960,12 @@ namespace ts { let newText: string; // grab the fragment from the beginning of the original text to the beginning of the span - let prefix = textChangeRange.span.start !== 0 + const prefix = textChangeRange.span.start !== 0 ? sourceFile.text.substr(0, textChangeRange.span.start) : ""; // grab the fragment from the end of the span till the end of the original text - let suffix = textSpanEnd(textChangeRange.span) !== sourceFile.text.length + const suffix = textSpanEnd(textChangeRange.span) !== sourceFile.text.length ? sourceFile.text.substr(textSpanEnd(textChangeRange.span)) : ""; @@ -1976,7 +1975,7 @@ namespace ts { } else { // it was actual edit, fetch the fragment of new text that correspond to new span - let changedText = scriptSnapshot.getText(textChangeRange.span.start, textChangeRange.span.start + textChangeRange.newLength); + const changedText = scriptSnapshot.getText(textChangeRange.span.start, textChangeRange.span.start + textChangeRange.newLength); // combine prefix, changed text and suffix newText = prefix && suffix ? prefix + changedText + suffix @@ -1985,7 +1984,7 @@ namespace ts { : (changedText + suffix); } - let newSourceFile = updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks); + const newSourceFile = updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks); setSourceFileFields(newSourceFile, scriptSnapshot, version); // after incremental parsing nameTable might not be up-to-date // drop it so it can be lazily recreated later @@ -2006,7 +2005,7 @@ namespace ts { } // Otherwise, just create a new source file. - return createLanguageServiceSourceFile(sourceFile.fileName, scriptSnapshot, sourceFile.languageVersion, version, /*setNodeParents:*/ true); + return createLanguageServiceSourceFile(sourceFile.fileName, scriptSnapshot, sourceFile.languageVersion, version, /*setNodeParents*/ true); } export function createGetCanonicalFileName(useCaseSensitivefileNames: boolean): (fileName: string) => string { @@ -2019,15 +2018,15 @@ namespace ts { export function createDocumentRegistry(useCaseSensitiveFileNames?: boolean, currentDirectory = ""): DocumentRegistry { // Maps from compiler setting target (ES3, ES5, etc.) to all the cached documents we have // for those settings. - let buckets: Map> = {}; - let getCanonicalFileName = createGetCanonicalFileName(!!useCaseSensitiveFileNames); + const buckets: Map> = {}; + const getCanonicalFileName = createGetCanonicalFileName(!!useCaseSensitiveFileNames); function getKeyFromCompilationSettings(settings: CompilerOptions): string { return "_" + settings.target + "|" + settings.module + "|" + settings.noResolve + "|" + settings.jsx + +"|" + settings.allowJs; } function getBucketForCompilationSettings(settings: CompilerOptions, createIfMissing: boolean): FileMap { - let key = getKeyFromCompilationSettings(settings); + const key = getKeyFromCompilationSettings(settings); let bucket = lookUp(buckets, key); if (!bucket && createIfMissing) { buckets[key] = bucket = createFileMap(); @@ -2036,9 +2035,9 @@ namespace ts { } function reportStats() { - let bucketInfoArray = Object.keys(buckets).filter(name => name && name.charAt(0) === '_').map(name => { - let entries = lookUp(buckets, name); - let sourceFiles: { name: string; refCount: number; references: string[]; }[] = []; + const bucketInfoArray = Object.keys(buckets).filter(name => name && name.charAt(0) === "_").map(name => { + const entries = lookUp(buckets, name); + const sourceFiles: { name: string; refCount: number; references: string[]; }[] = []; entries.forEachValue((key, entry) => { sourceFiles.push({ name: key, @@ -2052,15 +2051,15 @@ namespace ts { sourceFiles }; }); - return JSON.stringify(bucketInfoArray, null, 2); + return JSON.stringify(bucketInfoArray, undefined, 2); } function acquireDocument(fileName: string, compilationSettings: CompilerOptions, scriptSnapshot: IScriptSnapshot, version: string): SourceFile { - return acquireOrUpdateDocument(fileName, compilationSettings, scriptSnapshot, version, /*acquiring:*/ true); + return acquireOrUpdateDocument(fileName, compilationSettings, scriptSnapshot, version, /*acquiring*/ true); } function updateDocument(fileName: string, compilationSettings: CompilerOptions, scriptSnapshot: IScriptSnapshot, version: string): SourceFile { - return acquireOrUpdateDocument(fileName, compilationSettings, scriptSnapshot, version, /*acquiring:*/ false); + return acquireOrUpdateDocument(fileName, compilationSettings, scriptSnapshot, version, /*acquiring*/ false); } function acquireOrUpdateDocument( @@ -2070,14 +2069,14 @@ namespace ts { version: string, acquiring: boolean): SourceFile { - let bucket = getBucketForCompilationSettings(compilationSettings, /*createIfMissing*/ true); - let path = toPath(fileName, currentDirectory, getCanonicalFileName); + const bucket = getBucketForCompilationSettings(compilationSettings, /*createIfMissing*/ true); + const path = toPath(fileName, currentDirectory, getCanonicalFileName); let entry = bucket.get(path); if (!entry) { Debug.assert(acquiring, "How could we be trying to update a document that the registry doesn't have?"); // Have never seen this file with these settings. Create a new source file for it. - let sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, compilationSettings.target, version, /*setNodeParents:*/ false); + const sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, compilationSettings.target, version, /*setNodeParents*/ false); entry = { sourceFile: sourceFile, @@ -2109,12 +2108,12 @@ namespace ts { } function releaseDocument(fileName: string, compilationSettings: CompilerOptions): void { - let bucket = getBucketForCompilationSettings(compilationSettings, false); + const bucket = getBucketForCompilationSettings(compilationSettings, /*createIfMissing*/false); Debug.assert(bucket !== undefined); - let path = toPath(fileName, currentDirectory, getCanonicalFileName); + const path = toPath(fileName, currentDirectory, getCanonicalFileName); - let entry = bucket.get(path); + const entry = bucket.get(path); entry.languageServiceRefCount--; Debug.assert(entry.languageServiceRefCount >= 0); @@ -2132,19 +2131,19 @@ namespace ts { } export function preProcessFile(sourceText: string, readImportFiles = true, detectJavaScriptImports = false): PreProcessedFileInfo { - let referencedFiles: FileReference[] = []; - let importedFiles: FileReference[] = []; + const referencedFiles: FileReference[] = []; + const importedFiles: FileReference[] = []; let ambientExternalModules: string[]; let isNoDefaultLib = false; function processTripleSlashDirectives(): void { - let commentRanges = getLeadingCommentRanges(sourceText, 0); + const commentRanges = getLeadingCommentRanges(sourceText, 0); forEach(commentRanges, commentRange => { - let comment = sourceText.substring(commentRange.pos, commentRange.end); - let referencePathMatchResult = getFileReferenceFromReferencePath(comment, commentRange); + const comment = sourceText.substring(commentRange.pos, commentRange.end); + const referencePathMatchResult = getFileReferenceFromReferencePath(comment, commentRange); if (referencePathMatchResult) { isNoDefaultLib = referencePathMatchResult.isNoDefaultLib; - let fileReference = referencePathMatchResult.fileReference; + const fileReference = referencePathMatchResult.fileReference; if (fileReference) { referencedFiles.push(fileReference); } @@ -2160,8 +2159,8 @@ namespace ts { } function recordModuleName() { - let importPath = scanner.getTokenValue(); - let pos = scanner.getTokenPos(); + const importPath = scanner.getTokenValue(); + const pos = scanner.getTokenPos(); importedFiles.push({ fileName: importPath, pos: pos, @@ -2213,7 +2212,7 @@ namespace ts { } } else if (token === SyntaxKind.EqualsToken) { - if (tryConsumeRequireCall(/* skipCurrentToken */ true)) { + if (tryConsumeRequireCall(/*skipCurrentToken*/ true)) { return true; } } @@ -2311,7 +2310,7 @@ namespace ts { if (token === SyntaxKind.Identifier || isKeyword(token)) { token = scanner.scan(); if (token === SyntaxKind.EqualsToken) { - if (tryConsumeRequireCall(/* skipCurrentToken */ true)) { + if (tryConsumeRequireCall(/*skipCurrentToken*/ true)) { return true; } } @@ -2410,7 +2409,7 @@ namespace ts { if (tryConsumeDeclare() || tryConsumeImport() || tryConsumeExport() || - (detectJavaScriptImports && (tryConsumeRequireCall(/* skipCurrentToken */ false) || tryConsumeDefine()))) { + (detectJavaScriptImports && (tryConsumeRequireCall(/*skipCurrentToken*/ false) || tryConsumeDefine()))) { continue; } else { @@ -2550,8 +2549,8 @@ namespace ts { return true; } else if (position === comment.end) { - let text = sourceFile.text; - let width = comment.end - comment.pos; + const text = sourceFile.text; + const width = comment.end - comment.pos; // is single line comment or just /* if (width <= 2 || text.charCodeAt(comment.pos + 1) === CharacterCodes.slash) { return true; @@ -2583,7 +2582,7 @@ namespace ts { } // A cache of completion entries for keywords, these do not change between sessions - let keywordCompletions: CompletionEntry[] = []; + const keywordCompletions: CompletionEntry[] = []; for (let i = SyntaxKind.FirstKeyword; i <= SyntaxKind.LastKeyword; i++) { keywordCompletions.push({ name: tokenToString(i), @@ -2673,15 +2672,15 @@ namespace ts { export function createLanguageService(host: LanguageServiceHost, documentRegistry: DocumentRegistry = createDocumentRegistry(host.useCaseSensitiveFileNames && host.useCaseSensitiveFileNames(), host.getCurrentDirectory())): LanguageService { - let syntaxTreeCache: SyntaxTreeCache = new SyntaxTreeCache(host); + const syntaxTreeCache: SyntaxTreeCache = new SyntaxTreeCache(host); let ruleProvider: formatting.RulesProvider; let program: Program; let lastProjectVersion: string; - let useCaseSensitivefileNames = false; - let cancellationToken = new CancellationTokenObject(host.getCancellationToken && host.getCancellationToken()); + const useCaseSensitivefileNames = false; + const cancellationToken = new CancellationTokenObject(host.getCancellationToken && host.getCancellationToken()); - let currentDirectory = host.getCurrentDirectory(); + const currentDirectory = host.getCurrentDirectory(); // Check if the localized messages json is set, otherwise query the host for it if (!localizedDiagnosticMessages && host.getLocalizedDiagnosticMessages) { localizedDiagnosticMessages = host.getLocalizedDiagnosticMessages(); @@ -2693,10 +2692,10 @@ namespace ts { } } - let getCanonicalFileName = createGetCanonicalFileName(useCaseSensitivefileNames); + const getCanonicalFileName = createGetCanonicalFileName(useCaseSensitivefileNames); function getValidSourceFile(fileName: string): SourceFile { - let sourceFile = program.getSourceFile(fileName); + const sourceFile = program.getSourceFile(fileName); if (!sourceFile) { throw new Error("Could not find file: '" + fileName + "'."); } @@ -2716,7 +2715,7 @@ namespace ts { function synchronizeHostData(): void { // perform fast check if host supports it if (host.getProjectVersion) { - let hostProjectVersion = host.getProjectVersion(); + const hostProjectVersion = host.getProjectVersion(); if (hostProjectVersion) { if (lastProjectVersion === hostProjectVersion) { return; @@ -2740,17 +2739,17 @@ namespace ts { // the program points to old source files that have been invalidated because of // incremental parsing. - let oldSettings = program && program.getCompilerOptions(); - let newSettings = hostCache.compilationSettings(); - let changesInCompilationSettingsAffectSyntax = oldSettings && + const oldSettings = program && program.getCompilerOptions(); + const newSettings = hostCache.compilationSettings(); + const changesInCompilationSettingsAffectSyntax = oldSettings && (oldSettings.target !== newSettings.target || oldSettings.module !== newSettings.module || oldSettings.noResolve !== newSettings.noResolve || - oldSettings.jsx !== newSettings.jsx || + oldSettings.jsx !== newSettings.jsx || oldSettings.allowJs !== newSettings.allowJs); // Now create a new compiler - let compilerHost: CompilerHost = { + const compilerHost: CompilerHost = { getSourceFile: getOrCreateSourceFile, getCancellationToken: () => cancellationToken, getCanonicalFileName, @@ -2766,22 +2765,22 @@ namespace ts { }, readFile: (fileName): string => { // stub missing host functionality - let entry = hostCache.getOrCreateEntry(fileName); + const entry = hostCache.getOrCreateEntry(fileName); return entry && entry.scriptSnapshot.getText(0, entry.scriptSnapshot.getLength()); } }; if (host.resolveModuleNames) { - compilerHost.resolveModuleNames = (moduleNames, containingFile) => host.resolveModuleNames(moduleNames, containingFile) + compilerHost.resolveModuleNames = (moduleNames, containingFile) => host.resolveModuleNames(moduleNames, containingFile); } - let newProgram = createProgram(hostCache.getRootFileNames(), newSettings, compilerHost, program); + const newProgram = createProgram(hostCache.getRootFileNames(), newSettings, compilerHost, program); // Release any files we have acquired in the old program but are // not part of the new program. if (program) { - let oldSourceFiles = program.getSourceFiles(); - for (let oldSourceFile of oldSourceFiles) { + const oldSourceFiles = program.getSourceFiles(); + for (const oldSourceFile of oldSourceFiles) { if (!newProgram.getSourceFile(oldSourceFile.fileName) || changesInCompilationSettingsAffectSyntax) { documentRegistry.releaseDocument(oldSourceFile.fileName, oldSettings); } @@ -2804,7 +2803,7 @@ namespace ts { // The program is asking for this file, check first if the host can locate it. // If the host can not locate the file, then it does not exist. return undefined // to the program to allow reporting of errors for missing files. - let hostFileInformation = hostCache.getOrCreateEntry(fileName); + const hostFileInformation = hostCache.getOrCreateEntry(fileName); if (!hostFileInformation) { return undefined; } @@ -2814,7 +2813,7 @@ namespace ts { // can not be reused. we have to dump all syntax trees and create new ones. if (!changesInCompilationSettingsAffectSyntax) { // Check if the old program had this file already - let oldSourceFile = program && program.getSourceFile(fileName); + const oldSourceFile = program && program.getSourceFile(fileName); if (oldSourceFile) { // We already had a source file for this file name. Go to the registry to // ensure that we get the right up to date version of it. We need this to @@ -2851,7 +2850,7 @@ namespace ts { if (!sourceFile) { return false; } - let path = sourceFile.path || toPath(sourceFile.fileName, currentDirectory, getCanonicalFileName); + const path = sourceFile.path || toPath(sourceFile.fileName, currentDirectory, getCanonicalFileName); return sourceFile.version === hostCache.getVersion(path); } @@ -2862,13 +2861,13 @@ namespace ts { } // If number of files in the program do not match, it is not up-to-date - let rootFileNames = hostCache.getRootFileNames(); + const rootFileNames = hostCache.getRootFileNames(); if (program.getSourceFiles().length !== rootFileNames.length) { return false; } // If any file is not up-to-date, then the whole program is not up-to-date - for (let fileName of rootFileNames) { + for (const fileName of rootFileNames) { if (!sourceFileUpToDate(program.getSourceFile(fileName))) { return false; } @@ -2910,18 +2909,18 @@ namespace ts { function getSemanticDiagnostics(fileName: string): Diagnostic[] { synchronizeHostData(); - let targetSourceFile = getValidSourceFile(fileName); + const targetSourceFile = getValidSourceFile(fileName); // Only perform the action per file regardless of '-out' flag as LanguageServiceHost is expected to call this function per file. // Therefore only get diagnostics for given file. - let semanticDiagnostics = program.getSemanticDiagnostics(targetSourceFile, cancellationToken); + const semanticDiagnostics = program.getSemanticDiagnostics(targetSourceFile, cancellationToken); if (!program.getCompilerOptions().declaration) { return semanticDiagnostics; } // If '-d' is enabled, check for emitter error. One example of emitter error is export class implements non-export interface - let declarationDiagnostics = program.getDeclarationDiagnostics(targetSourceFile, cancellationToken); + const declarationDiagnostics = program.getDeclarationDiagnostics(targetSourceFile, cancellationToken); return concatenate(semanticDiagnostics, declarationDiagnostics); } @@ -2937,14 +2936,14 @@ namespace ts { * @return undefined if the name is of external module otherwise a name with striped of any quote */ function getCompletionEntryDisplayNameForSymbol(symbol: Symbol, target: ScriptTarget, performCharacterChecks: boolean, location: Node): string { - let displayName: string = getDeclaredName(program.getTypeChecker(), symbol, location); + const displayName: string = getDeclaredName(program.getTypeChecker(), symbol, location); if (displayName) { - let firstCharCode = displayName.charCodeAt(0); + const firstCharCode = displayName.charCodeAt(0); // First check of the displayName is not external module; if it is an external module, it is not valid entry if ((symbol.flags & SymbolFlags.Namespace) && (firstCharCode === CharacterCodes.singleQuote || firstCharCode === CharacterCodes.doubleQuote)) { // If the symbol is external module, don't show it in the completion list - // (i.e declare module "http" { let x; } | // <= request completion here, "http" should not be there) + // (i.e declare module "http" { const x; } | // <= request completion here, "http" should not be there) return undefined; } } @@ -2987,20 +2986,20 @@ namespace ts { } function getCompletionData(fileName: string, position: number) { - let typeChecker = program.getTypeChecker(); - let syntacticStart = new Date().getTime(); - let sourceFile = getValidSourceFile(fileName); - let isJavaScriptFile = isSourceFileJavaScript(sourceFile); + const typeChecker = program.getTypeChecker(); + const syntacticStart = new Date().getTime(); + const sourceFile = getValidSourceFile(fileName); + const isJavaScriptFile = isSourceFileJavaScript(sourceFile); let isJsDocTagName = false; let start = new Date().getTime(); - let currentToken = getTokenAtPosition(sourceFile, position); + const currentToken = getTokenAtPosition(sourceFile, position); log("getCompletionData: Get current token: " + (new Date().getTime() - start)); start = new Date().getTime(); // Completion not allowed inside comments, bail out if this is the case - let insideComment = isInsideComment(sourceFile, currentToken, position); + const insideComment = isInsideComment(sourceFile, currentToken, position); log("getCompletionData: Is inside comment: " + (new Date().getTime() - start)); if (insideComment) { @@ -3014,7 +3013,7 @@ namespace ts { // /** @type {number | string} */ // Completion should work in the brackets let insideJsDocTagExpression = false; - let tag = getJsDocTagAtPosition(sourceFile, position); + const tag = getJsDocTagAtPosition(sourceFile, position); if (tag) { if (tag.tagName.pos <= position && position <= tag.tagName.end) { isJsDocTagName = true; @@ -3024,7 +3023,7 @@ namespace ts { case SyntaxKind.JSDocTypeTag: case SyntaxKind.JSDocParameterTag: case SyntaxKind.JSDocReturnTag: - let tagWithExpression = tag; + const tagWithExpression = tag; if (tagWithExpression.typeExpression) { insideJsDocTagExpression = tagWithExpression.typeExpression.pos < position && position < tagWithExpression.typeExpression.end; } @@ -3045,7 +3044,7 @@ namespace ts { } start = new Date().getTime(); - let previousToken = findPrecedingToken(position, sourceFile); + const previousToken = findPrecedingToken(position, sourceFile); log("getCompletionData: Get previous token 1: " + (new Date().getTime() - start)); // The decision to provide completion depends on the contextToken, which is determined through the previousToken. @@ -3055,7 +3054,7 @@ namespace ts { // Check if the caret is at the end of an identifier; this is a partial identifier that we want to complete: e.g. a.toS| // Skip this partial identifier and adjust the contextToken to the token that precedes it. if (contextToken && position <= contextToken.end && isWord(contextToken.kind)) { - let start = new Date().getTime(); + const start = new Date().getTime(); contextToken = findPrecedingToken(contextToken.getFullStart(), sourceFile); log("getCompletionData: Get previous token 2: " + (new Date().getTime() - start)); } @@ -3076,7 +3075,7 @@ namespace ts { return undefined; } - let { parent, kind } = contextToken; + const { parent, kind } = contextToken; if (kind === SyntaxKind.DotToken) { if (parent.kind === SyntaxKind.PropertyAccessExpression) { node = (contextToken.parent).expression; @@ -3103,7 +3102,7 @@ namespace ts { } } - let semanticStart = new Date().getTime(); + const semanticStart = new Date().getTime(); let isMemberCompletion: boolean; let isNewIdentifierLocation: boolean; let symbols: Symbol[] = []; @@ -3112,7 +3111,7 @@ namespace ts { getTypeScriptMemberSymbols(); } else if (isRightOfOpenTag) { - let tagSymbols = typeChecker.getJsxIntrinsicTagNames(); + const tagSymbols = typeChecker.getJsxIntrinsicTagNames(); if (tryGetGlobalSymbols()) { symbols = tagSymbols.concat(symbols.filter(s => !!(s.flags & SymbolFlags.Value))); } @@ -3123,7 +3122,7 @@ namespace ts { isNewIdentifierLocation = false; } else if (isStartingCloseTag) { - let tagName = (contextToken.parent.parent).openingElement.tagName; + const tagName = (contextToken.parent.parent).openingElement.tagName; symbols = [typeChecker.getSymbolAtLocation(tagName)]; isMemberCompletion = true; @@ -3157,7 +3156,7 @@ namespace ts { if (symbol && symbol.flags & SymbolFlags.HasExports) { // Extract module or enum members - let exportedSymbols = typeChecker.getExportsOfModule(symbol); + const exportedSymbols = typeChecker.getExportsOfModule(symbol); forEach(exportedSymbols, symbol => { if (typeChecker.isValidPropertyAccess((node.parent), symbol.name)) { symbols.push(symbol); @@ -3166,14 +3165,14 @@ namespace ts { } } - let type = typeChecker.getTypeAtLocation(node); + const type = typeChecker.getTypeAtLocation(node); addTypeProperties(type); } function addTypeProperties(type: Type) { if (type) { // Filter private properties - for (let symbol of type.getApparentProperties()) { + for (const symbol of type.getApparentProperties()) { if (typeChecker.isValidPropertyAccess((node.parent), symbol.name)) { symbols.push(symbol); } @@ -3185,8 +3184,8 @@ namespace ts { // each individual type has. This is because we're going to add all identifiers // anyways. So we might as well elevate the members that were at least part // of the individual types to a higher status since we know what they are. - let unionType = type; - for (let elementType of unionType.types) { + const unionType = type; + for (const elementType of unionType.types) { addTypeProperties(elementType); } } @@ -3256,14 +3255,14 @@ namespace ts { // - 'contextToken' was adjusted to the token prior to 'previousToken' // because we were at the end of an identifier. // - 'previousToken' is defined. - let adjustedPosition = previousToken !== contextToken ? + const adjustedPosition = previousToken !== contextToken ? previousToken.getStart() : position; - let scopeNode = getScopeNode(contextToken, adjustedPosition, sourceFile) || sourceFile; + const scopeNode = getScopeNode(contextToken, adjustedPosition, sourceFile) || sourceFile; /// TODO filter meaning based on the current context - let symbolMeanings = SymbolFlags.Type | SymbolFlags.Value | SymbolFlags.Namespace | SymbolFlags.Alias; + const symbolMeanings = SymbolFlags.Type | SymbolFlags.Value | SymbolFlags.Namespace | SymbolFlags.Alias; symbols = typeChecker.getSymbolsInScope(scopeNode, symbolMeanings); return true; @@ -3282,8 +3281,8 @@ namespace ts { } function isCompletionListBlocker(contextToken: Node): boolean { - let start = new Date().getTime(); - let result = isInStringOrRegularExpressionOrTemplateLiteral(contextToken) || + const start = new Date().getTime(); + const result = isInStringOrRegularExpressionOrTemplateLiteral(contextToken) || isSolelyIdentifierDefinitionLocation(contextToken) || isDotOfNumericLiteral(contextToken) || isInJsxText(contextToken); @@ -3310,27 +3309,27 @@ namespace ts { function isNewIdentifierDefinitionLocation(previousToken: Node): boolean { if (previousToken) { - let containingNodeKind = previousToken.parent.kind; + const containingNodeKind = previousToken.parent.kind; switch (previousToken.kind) { case SyntaxKind.CommaToken: return containingNodeKind === SyntaxKind.CallExpression // func( a, | || containingNodeKind === SyntaxKind.Constructor // constructor( a, | /* public, protected, private keywords are allowed here, so show completion */ || containingNodeKind === SyntaxKind.NewExpression // new C(a, | || containingNodeKind === SyntaxKind.ArrayLiteralExpression // [a, | - || containingNodeKind === SyntaxKind.BinaryExpression // let x = (a, | + || containingNodeKind === SyntaxKind.BinaryExpression // const x = (a, | || containingNodeKind === SyntaxKind.FunctionType; // var x: (s: string, list| case SyntaxKind.OpenParenToken: return containingNodeKind === SyntaxKind.CallExpression // func( | || containingNodeKind === SyntaxKind.Constructor // constructor( | || containingNodeKind === SyntaxKind.NewExpression // new C(a| - || containingNodeKind === SyntaxKind.ParenthesizedExpression // let x = (a| + || containingNodeKind === SyntaxKind.ParenthesizedExpression // const x = (a| || containingNodeKind === SyntaxKind.ParenthesizedType; // function F(pred: (a| /* this can become an arrow function, where 'a' is the argument */ case SyntaxKind.OpenBracketToken: return containingNodeKind === SyntaxKind.ArrayLiteralExpression // [ | || containingNodeKind === SyntaxKind.IndexSignature // [ | : string ] - || containingNodeKind === SyntaxKind.ComputedPropertyName // [ | /* this can become an index signature */ + || containingNodeKind === SyntaxKind.ComputedPropertyName; // [ | /* this can become an index signature */ case SyntaxKind.ModuleKeyword: // module | case SyntaxKind.NamespaceKeyword: // namespace | @@ -3343,7 +3342,7 @@ namespace ts { return containingNodeKind === SyntaxKind.ClassDeclaration; // class A{ | case SyntaxKind.EqualsToken: - return containingNodeKind === SyntaxKind.VariableDeclaration // let x = a| + return containingNodeKind === SyntaxKind.VariableDeclaration // const x = a| || containingNodeKind === SyntaxKind.BinaryExpression; // x = a| case SyntaxKind.TemplateHead: @@ -3375,8 +3374,8 @@ namespace ts { || contextToken.kind === SyntaxKind.StringLiteralType || contextToken.kind === SyntaxKind.RegularExpressionLiteral || isTemplateLiteralKind(contextToken.kind)) { - let start = contextToken.getStart(); - let end = contextToken.getEnd(); + const start = contextToken.getStart(); + const end = contextToken.getEnd(); // To be "in" one of these literals, the position has to be: // 1. entirely within the token text. @@ -3420,7 +3419,7 @@ namespace ts { // We are *only* completing on properties from the type being destructured. isNewIdentifierLocation = false; - let rootDeclaration = getRootDeclaration(objectLikeContainer.parent); + const rootDeclaration = getRootDeclaration(objectLikeContainer.parent); if (isVariableLike(rootDeclaration)) { // We don't want to complete using the type acquired by the shape // of the binding pattern; we are only interested in types acquired @@ -3431,7 +3430,7 @@ namespace ts { } } else { - Debug.fail("Root declaration is not variable-like.") + Debug.fail("Root declaration is not variable-like."); } } else { @@ -3442,7 +3441,7 @@ namespace ts { return false; } - let typeMembers = typeChecker.getPropertiesOfType(typeForObject); + const typeMembers = typeChecker.getPropertiesOfType(typeForObject); if (typeMembers && typeMembers.length > 0) { // Add filtered items to the completion list symbols = filterObjectMembersList(typeMembers, existingMembers); @@ -3466,11 +3465,11 @@ namespace ts { * @returns true if 'symbols' was successfully populated; false otherwise. */ function tryGetImportOrExportClauseCompletionSymbols(namedImportsOrExports: NamedImportsOrExports): boolean { - let declarationKind = namedImportsOrExports.kind === SyntaxKind.NamedImports ? + const declarationKind = namedImportsOrExports.kind === SyntaxKind.NamedImports ? SyntaxKind.ImportDeclaration : SyntaxKind.ExportDeclaration; - let importOrExportDeclaration = getAncestor(namedImportsOrExports, declarationKind); - let moduleSpecifier = importOrExportDeclaration.moduleSpecifier; + const importOrExportDeclaration = getAncestor(namedImportsOrExports, declarationKind); + const moduleSpecifier = importOrExportDeclaration.moduleSpecifier; if (!moduleSpecifier) { return false; @@ -3480,7 +3479,7 @@ namespace ts { isNewIdentifierLocation = false; let exports: Symbol[]; - let moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(importOrExportDeclaration.moduleSpecifier); + const moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(importOrExportDeclaration.moduleSpecifier); if (moduleSpecifierSymbol) { exports = typeChecker.getExportsOfModule(moduleSpecifierSymbol); } @@ -3497,9 +3496,9 @@ namespace ts { function tryGetObjectLikeCompletionContainer(contextToken: Node): ObjectLiteralExpression | BindingPattern { if (contextToken) { switch (contextToken.kind) { - case SyntaxKind.OpenBraceToken: // let x = { | - case SyntaxKind.CommaToken: // let x = { a: 0, | - let parent = contextToken.parent; + case SyntaxKind.OpenBraceToken: // const x = { | + case SyntaxKind.CommaToken: // const x = { a: 0, | + const parent = contextToken.parent; if (parent && (parent.kind === SyntaxKind.ObjectLiteralExpression || parent.kind === SyntaxKind.ObjectBindingPattern)) { return parent; } @@ -3532,8 +3531,8 @@ namespace ts { function tryGetContainingJsxElement(contextToken: Node): JsxOpeningLikeElement { if (contextToken) { - let parent = contextToken.parent; - switch(contextToken.kind) { + const parent = contextToken.parent; + switch (contextToken.kind) { case SyntaxKind.LessThanSlashToken: case SyntaxKind.SlashToken: case SyntaxKind.Identifier: @@ -3596,7 +3595,7 @@ namespace ts { * @returns true if we are certain that the currently edited location must define a new location; false otherwise. */ function isSolelyIdentifierDefinitionLocation(contextToken: Node): boolean { - let containingNodeKind = contextToken.parent.kind; + const containingNodeKind = contextToken.parent.kind; switch (contextToken.kind) { case SyntaxKind.CommaToken: return containingNodeKind === SyntaxKind.VariableDeclaration || @@ -3626,13 +3625,13 @@ namespace ts { case SyntaxKind.OpenBraceToken: return containingNodeKind === SyntaxKind.EnumDeclaration || // enum a { | containingNodeKind === SyntaxKind.InterfaceDeclaration || // interface a { | - containingNodeKind === SyntaxKind.TypeLiteral; // let x : { | + containingNodeKind === SyntaxKind.TypeLiteral; // const x : { | case SyntaxKind.SemicolonToken: return containingNodeKind === SyntaxKind.PropertySignature && contextToken.parent && contextToken.parent.parent && (contextToken.parent.parent.kind === SyntaxKind.InterfaceDeclaration || // interface a { f; | - contextToken.parent.parent.kind === SyntaxKind.TypeLiteral); // let x : { a; | + contextToken.parent.parent.kind === SyntaxKind.TypeLiteral); // const x : { a; | case SyntaxKind.LessThanToken: return containingNodeKind === SyntaxKind.ClassDeclaration || // class A< | @@ -3699,7 +3698,7 @@ namespace ts { function isDotOfNumericLiteral(contextToken: Node): boolean { if (contextToken.kind === SyntaxKind.NumericLiteral) { - let text = contextToken.getFullText(); + const text = contextToken.getFullText(); return text.charAt(text.length - 1) === "."; } @@ -3716,15 +3715,15 @@ namespace ts { * do not occur at the current position and have not otherwise been typed. */ function filterNamedImportOrExportCompletionItems(exportsOfModule: Symbol[], namedImportsOrExports: ImportOrExportSpecifier[]): Symbol[] { - let exisingImportsOrExports: Map = {}; + const exisingImportsOrExports: Map = {}; - for (let element of namedImportsOrExports) { + for (const element of namedImportsOrExports) { // If this is the current item we are editing right now, do not filter it out if (element.getStart() <= position && position <= element.getEnd()) { continue; } - let name = element.propertyName || element.name; + const name = element.propertyName || element.name; exisingImportsOrExports[name.text] = true; } @@ -3746,8 +3745,8 @@ namespace ts { return contextualMemberSymbols; } - let existingMemberNames: Map = {}; - for (let m of existingMembers) { + const existingMemberNames: Map = {}; + for (const m of existingMembers) { // Ignore omitted expressions for missing members if (m.kind !== SyntaxKind.PropertyAssignment && m.kind !== SyntaxKind.ShorthandPropertyAssignment && @@ -3766,7 +3765,7 @@ namespace ts { if (m.kind === SyntaxKind.BindingElement && (m).propertyName) { // include only identifiers in completion list if ((m).propertyName.kind === SyntaxKind.Identifier) { - existingName = ((m).propertyName).text + existingName = ((m).propertyName).text; } } else { @@ -3789,8 +3788,8 @@ namespace ts { * do not occur at the current position and have not otherwise been typed. */ function filterJsxAttributes(symbols: Symbol[], attributes: NodeArray): Symbol[] { - let seenNames: Map = {}; - for (let attr of attributes) { + const seenNames: Map = {}; + for (const attr of attributes) { // If this is the current item we are editing right now, do not filter it out if (attr.getStart() <= position && position <= attr.getEnd()) { continue; @@ -3809,21 +3808,21 @@ namespace ts { function getCompletionsAtPosition(fileName: string, position: number): CompletionInfo { synchronizeHostData(); - let completionData = getCompletionData(fileName, position); + const completionData = getCompletionData(fileName, position); if (!completionData) { return undefined; } - let { symbols, isMemberCompletion, isNewIdentifierLocation, location, isRightOfDot, isJsDocTagName } = completionData; + const { symbols, isMemberCompletion, isNewIdentifierLocation, location, isRightOfDot, isJsDocTagName } = completionData; if (isJsDocTagName) { // If the current position is a jsDoc tag name, only tag names should be provided for completion return { isMemberCompletion: false, isNewIdentifierLocation: false, entries: getAllJsDocCompletionEntries() }; } - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); - let entries: CompletionEntry[] = []; + const entries: CompletionEntry[] = []; if (isRightOfDot && isSourceFileJavaScript(sourceFile)) { const uniqueNames = getCompletionEntriesFromSymbols(symbols, entries); @@ -3845,16 +3844,16 @@ namespace ts { return { isMemberCompletion, isNewIdentifierLocation, entries }; function getJavaScriptCompletionEntries(sourceFile: SourceFile, uniqueNames: Map): CompletionEntry[] { - let entries: CompletionEntry[] = []; - let target = program.getCompilerOptions().target; + const entries: CompletionEntry[] = []; + const target = program.getCompilerOptions().target; - let nameTable = getNameTable(sourceFile); - for (let name in nameTable) { + const nameTable = getNameTable(sourceFile); + for (const name in nameTable) { if (!uniqueNames[name]) { uniqueNames[name] = name; - let displayName = getCompletionEntryDisplayName(name, target, /*performCharacterChecks:*/ true); + const displayName = getCompletionEntryDisplayName(name, target, /*performCharacterChecks*/ true); if (displayName) { - let entry = { + const entry = { name: displayName, kind: ScriptElementKind.warning, kindModifiers: "", @@ -3875,7 +3874,7 @@ namespace ts { kind: ScriptElementKind.keyword, kindModifiers: "", sortText: "0", - } + }; })); } @@ -3883,7 +3882,7 @@ namespace ts { // Try to get a valid display name for this symbol, if we could not find one, then ignore it. // We would like to only show things that can be added after a dot, so for instance numeric properties can // not be accessed with a dot (a.1 <- invalid) - let displayName = getCompletionEntryDisplayNameForSymbol(symbol, program.getCompilerOptions().target, /*performCharacterChecks:*/ true, location); + const displayName = getCompletionEntryDisplayNameForSymbol(symbol, program.getCompilerOptions().target, /*performCharacterChecks*/ true, location); if (!displayName) { return undefined; } @@ -3905,13 +3904,13 @@ namespace ts { } function getCompletionEntriesFromSymbols(symbols: Symbol[], entries: CompletionEntry[]): Map { - let start = new Date().getTime(); - let uniqueNames: Map = {}; + const start = new Date().getTime(); + const uniqueNames: Map = {}; if (symbols) { - for (let symbol of symbols) { - let entry = createCompletionEntry(symbol, location); + for (const symbol of symbols) { + const entry = createCompletionEntry(symbol, location); if (entry) { - let id = escapeIdentifier(entry.name); + const id = escapeIdentifier(entry.name); if (!lookUp(uniqueNames, id)) { entries.push(entry); uniqueNames[id] = id; @@ -3929,19 +3928,19 @@ namespace ts { synchronizeHostData(); // Compute all the completion symbols again. - let completionData = getCompletionData(fileName, position); + const completionData = getCompletionData(fileName, position); if (completionData) { - let { symbols, location } = completionData; + const { symbols, location } = completionData; // Find the symbol with the matching entry name. - let target = program.getCompilerOptions().target; + const target = program.getCompilerOptions().target; // We don't need to perform character checks here because we're only comparing the // name against 'entryName' (which is known to be good), not building a new // completion entry. - let symbol = forEach(symbols, s => getCompletionEntryDisplayNameForSymbol(s, target, /*performCharacterChecks:*/ false, location) === entryName ? s : undefined); + const symbol = forEach(symbols, s => getCompletionEntryDisplayNameForSymbol(s, target, /*performCharacterChecks*/ false, location) === entryName ? s : undefined); if (symbol) { - let { displayParts, documentation, symbolKind } = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, getValidSourceFile(fileName), location, location, SemanticMeaning.All); + const { displayParts, documentation, symbolKind } = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, getValidSourceFile(fileName), location, location, SemanticMeaning.All); return { name: entryName, kindModifiers: getSymbolModifiers(symbol), @@ -3953,7 +3952,7 @@ namespace ts { } // Didn't find a symbol with this name. See if we can find a keyword instead. - let keywordCompletion = forEach(keywordCompletions, c => c.name === entryName); + const keywordCompletion = forEach(keywordCompletions, c => c.name === entryName); if (keywordCompletion) { return { name: entryName, @@ -3969,7 +3968,7 @@ namespace ts { // TODO(drosen): use contextual SemanticMeaning. function getSymbolKind(symbol: Symbol, location: Node): string { - let flags = symbol.getFlags(); + const flags = symbol.getFlags(); if (flags & SymbolFlags.Class) return getDeclarationOfKind(symbol, SyntaxKind.ClassExpression) ? ScriptElementKind.localClassElement : ScriptElementKind.classElement; @@ -3978,7 +3977,7 @@ namespace ts { if (flags & SymbolFlags.Interface) return ScriptElementKind.interfaceElement; if (flags & SymbolFlags.TypeParameter) return ScriptElementKind.typeParameterElement; - let result = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol, flags, location); + const result = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol, flags, location); if (result === ScriptElementKind.unknown) { if (flags & SymbolFlags.TypeParameter) return ScriptElementKind.typeParameterElement; if (flags & SymbolFlags.EnumMember) return ScriptElementKind.variableElement; @@ -3990,7 +3989,7 @@ namespace ts { } function getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol: Symbol, flags: SymbolFlags, location: Node) { - let typeChecker = program.getTypeChecker(); + const typeChecker = program.getTypeChecker(); if (typeChecker.isUndefinedSymbol(symbol)) { return ScriptElementKind.variableElement; @@ -4019,8 +4018,8 @@ namespace ts { if (flags & SymbolFlags.Property) { if (flags & SymbolFlags.SyntheticProperty) { // If union property is result of union of non method (property/accessors/variables), it is labeled as property - let unionPropertyKind = forEach(typeChecker.getRootSymbols(symbol), rootSymbol => { - let rootSymbolFlags = rootSymbol.getFlags(); + const unionPropertyKind = forEach(typeChecker.getRootSymbols(symbol), rootSymbol => { + const rootSymbolFlags = rootSymbol.getFlags(); if (rootSymbolFlags & (SymbolFlags.PropertyOrAccessor | SymbolFlags.Variable)) { return ScriptElementKind.memberVariableElement; } @@ -4028,8 +4027,8 @@ namespace ts { }); if (!unionPropertyKind) { // If this was union of all methods, - //make sure it has call signatures before we can label it as method - let typeOfUnionProperty = typeChecker.getTypeOfSymbolAtLocation(symbol, location); + // make sure it has call signatures before we can label it as method + const typeOfUnionProperty = typeChecker.getTypeOfSymbolAtLocation(symbol, location); if (typeOfUnionProperty.getCallSignatures().length) { return ScriptElementKind.memberFunctionElement; } @@ -4053,11 +4052,11 @@ namespace ts { function getSymbolDisplayPartsDocumentationAndSymbolKind(symbol: Symbol, sourceFile: SourceFile, enclosingDeclaration: Node, location: Node, semanticMeaning = getMeaningFromLocation(location)) { - let typeChecker = program.getTypeChecker(); + const typeChecker = program.getTypeChecker(); - let displayParts: SymbolDisplayPart[] = []; + const displayParts: SymbolDisplayPart[] = []; let documentation: SymbolDisplayPart[]; - let symbolFlags = symbol.flags; + const symbolFlags = symbol.flags; let symbolKind = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol, symbolFlags, location); let hasAddedSymbolInfo: boolean; let type: Type; @@ -4073,7 +4072,7 @@ namespace ts { type = typeChecker.getTypeOfSymbolAtLocation(symbol, location); if (type) { if (location.parent && location.parent.kind === SyntaxKind.PropertyAccessExpression) { - let right = (location.parent).name; + const right = (location.parent).name; // Either the location is on the right of a property access, or on the left and the right is missing if (right === location || (right && right.getFullWidth() === 0)) { location = location.parent; @@ -4090,15 +4089,15 @@ namespace ts { } if (callExpression) { - let candidateSignatures: Signature[] = []; + const candidateSignatures: Signature[] = []; signature = typeChecker.getResolvedSignature(callExpression, candidateSignatures); if (!signature && candidateSignatures.length) { // Use the first candidate: signature = candidateSignatures[0]; } - let useConstructSignatures = callExpression.kind === SyntaxKind.NewExpression || callExpression.expression.kind === SyntaxKind.SuperKeyword; - let allSignatures = useConstructSignatures ? type.getConstructSignatures() : type.getCallSignatures(); + const useConstructSignatures = callExpression.kind === SyntaxKind.NewExpression || callExpression.expression.kind === SyntaxKind.SuperKeyword; + const allSignatures = useConstructSignatures ? type.getConstructSignatures() : type.getCallSignatures(); if (!contains(allSignatures, signature.target) && !contains(allSignatures, signature)) { // Get the first signature if there is one -- allSignatures may contain @@ -4156,8 +4155,8 @@ namespace ts { else if ((isNameOfFunctionDeclaration(location) && !(symbol.flags & SymbolFlags.Accessor)) || // name of function declaration (location.kind === SyntaxKind.ConstructorKeyword && location.parent.kind === SyntaxKind.Constructor)) { // At constructor keyword of constructor declaration // get the signature from the declaration and write it - let functionDeclaration = location.parent; - let allSignatures = functionDeclaration.kind === SyntaxKind.Constructor ? type.getConstructSignatures() : type.getCallSignatures(); + const functionDeclaration = location.parent; + const allSignatures = functionDeclaration.kind === SyntaxKind.Constructor ? type.getConstructSignatures() : type.getCallSignatures(); if (!typeChecker.isImplementationOfOverload(functionDeclaration)) { signature = typeChecker.getSignatureFromDeclaration(functionDeclaration); } @@ -4226,8 +4225,8 @@ namespace ts { } if (symbolFlags & SymbolFlags.Module) { addNewLineIfDisplayPartsExist(); - let declaration = getDeclarationOfKind(symbol, SyntaxKind.ModuleDeclaration); - let isNamespace = declaration && declaration.name && declaration.name.kind === SyntaxKind.Identifier; + const declaration = getDeclarationOfKind(symbol, SyntaxKind.ModuleDeclaration); + const isNamespace = declaration && declaration.name && declaration.name.kind === SyntaxKind.Identifier; displayParts.push(keywordPart(isNamespace ? SyntaxKind.NamespaceKeyword : SyntaxKind.ModuleKeyword)); displayParts.push(spacePart()); addFullSymbolName(symbol); @@ -4279,9 +4278,9 @@ namespace ts { } if (symbolFlags & SymbolFlags.EnumMember) { addPrefixForAnyFunctionOrVar(symbol, "enum member"); - let declaration = symbol.declarations[0]; + const declaration = symbol.declarations[0]; if (declaration.kind === SyntaxKind.EnumMember) { - let constantValue = typeChecker.getConstantValue(declaration); + const constantValue = typeChecker.getConstantValue(declaration); if (constantValue !== undefined) { displayParts.push(spacePart()); displayParts.push(operatorPart(SyntaxKind.EqualsToken)); @@ -4297,7 +4296,7 @@ namespace ts { addFullSymbolName(symbol); ts.forEach(symbol.declarations, declaration => { if (declaration.kind === SyntaxKind.ImportEqualsDeclaration) { - let importEqualsDeclaration = declaration; + const importEqualsDeclaration = declaration; if (isExternalModuleImportEqualsDeclaration(importEqualsDeclaration)) { displayParts.push(spacePart()); displayParts.push(operatorPart(SyntaxKind.EqualsToken)); @@ -4308,7 +4307,7 @@ namespace ts { displayParts.push(punctuationPart(SyntaxKind.CloseParenToken)); } else { - let internalAliasSymbol = typeChecker.getSymbolAtLocation(importEqualsDeclaration.moduleReference); + const internalAliasSymbol = typeChecker.getSymbolAtLocation(importEqualsDeclaration.moduleReference); if (internalAliasSymbol) { displayParts.push(spacePart()); displayParts.push(operatorPart(SyntaxKind.EqualsToken)); @@ -4332,7 +4331,7 @@ namespace ts { displayParts.push(spacePart()); // If the type is type parameter, format it specially if (type.symbol && type.symbol.flags & SymbolFlags.TypeParameter) { - let typeParameterParts = mapToDisplayParts(writer => { + const typeParameterParts = mapToDisplayParts(writer => { typeChecker.getSymbolDisplayBuilder().buildTypeParameterDisplay(type, writer, enclosingDeclaration); }); addRange(displayParts, typeParameterParts); @@ -4347,7 +4346,7 @@ namespace ts { symbolFlags & SymbolFlags.Signature || symbolFlags & SymbolFlags.Accessor || symbolKind === ScriptElementKind.memberFunctionElement) { - let allSignatures = type.getCallSignatures(); + const allSignatures = type.getCallSignatures(); addSignatureDisplayParts(allSignatures[0], allSignatures); } } @@ -4370,7 +4369,7 @@ namespace ts { } function addFullSymbolName(symbol: Symbol, enclosingDeclaration?: Node) { - let fullSymbolDisplayParts = symbolToDisplayParts(typeChecker, symbol, enclosingDeclaration || sourceFile, /*meaning*/ undefined, + const fullSymbolDisplayParts = symbolToDisplayParts(typeChecker, symbol, enclosingDeclaration || sourceFile, /*meaning*/ undefined, SymbolFormatFlags.WriteTypeParametersOrArguments | SymbolFormatFlags.UseOnlyExternalAliasing); addRange(displayParts, fullSymbolDisplayParts); } @@ -4416,7 +4415,7 @@ namespace ts { } function writeTypeParametersOfSymbol(symbol: Symbol, enclosingDeclaration: Node) { - let typeParameterParts = mapToDisplayParts(writer => { + const typeParameterParts = mapToDisplayParts(writer => { typeChecker.getSymbolDisplayBuilder().buildTypeParameterDisplayFromSymbol(symbol, writer, enclosingDeclaration); }); addRange(displayParts, typeParameterParts); @@ -4426,8 +4425,8 @@ namespace ts { function getQuickInfoAtPosition(fileName: string, position: number): QuickInfo { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); - let node = getTouchingPropertyName(sourceFile, position); + const sourceFile = getValidSourceFile(fileName); + const node = getTouchingPropertyName(sourceFile, position); if (!node) { return undefined; } @@ -4436,8 +4435,8 @@ namespace ts { return undefined; } - let typeChecker = program.getTypeChecker(); - let symbol = typeChecker.getSymbolAtLocation(node); + const typeChecker = program.getTypeChecker(); + const symbol = typeChecker.getSymbolAtLocation(node); if (!symbol) { // Try getting just type at this position and show @@ -4449,7 +4448,7 @@ namespace ts { case SyntaxKind.ThisType: case SyntaxKind.SuperKeyword: // For the identifiers/this/super etc get the type at position - let type = typeChecker.getTypeAtLocation(node); + const type = typeChecker.getTypeAtLocation(node); if (type) { return { kind: ScriptElementKind.unknown, @@ -4464,7 +4463,7 @@ namespace ts { return undefined; } - let displayPartsDocumentationsAndKind = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, sourceFile, getContainerNode(node), node); + const displayPartsDocumentationsAndKind = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, sourceFile, getContainerNode(node), node); return { kind: displayPartsDocumentationsAndKind.symbolKind, kindModifiers: getSymbolModifiers(symbol), @@ -4486,13 +4485,13 @@ namespace ts { } function getDefinitionFromSymbol(symbol: Symbol, node: Node): DefinitionInfo[] { - let typeChecker = program.getTypeChecker(); - let result: DefinitionInfo[] = []; - let declarations = symbol.getDeclarations(); - let symbolName = typeChecker.symbolToString(symbol); // Do not get scoped name, just the name of the symbol - let symbolKind = getSymbolKind(symbol, node); - let containerSymbol = symbol.parent; - let containerName = containerSymbol ? typeChecker.symbolToString(containerSymbol, node) : ""; + const typeChecker = program.getTypeChecker(); + const result: DefinitionInfo[] = []; + const declarations = symbol.getDeclarations(); + const symbolName = typeChecker.symbolToString(symbol); // Do not get scoped name, just the name of the symbol + const symbolKind = getSymbolKind(symbol, node); + const containerSymbol = symbol.parent; + const containerName = containerSymbol ? typeChecker.symbolToString(containerSymbol, node) : ""; if (!tryAddConstructSignature(symbol, node, symbolKind, symbolName, containerName, result) && !tryAddCallSignature(symbol, node, symbolKind, symbolName, containerName, result)) { @@ -4510,7 +4509,7 @@ namespace ts { if (isNewExpressionTarget(location) || location.kind === SyntaxKind.ConstructorKeyword) { if (symbol.flags & SymbolFlags.Class) { // Find the first class-like declaration and try to get the construct signature. - for (let declaration of symbol.getDeclarations()) { + for (const declaration of symbol.getDeclarations()) { if (isClassLike(declaration)) { return tryAddSignature(declaration.members, /*selectConstructors*/ true, @@ -4535,7 +4534,7 @@ namespace ts { } function tryAddSignature(signatureDeclarations: Declaration[], selectConstructors: boolean, symbolKind: string, symbolName: string, containerName: string, result: DefinitionInfo[]) { - let declarations: Declaration[] = []; + const declarations: Declaration[] = []; let definition: Declaration; forEach(signatureDeclarations, d => { @@ -4563,24 +4562,24 @@ namespace ts { function getDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[] { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); - let node = getTouchingPropertyName(sourceFile, position); + const node = getTouchingPropertyName(sourceFile, position); if (!node) { return undefined; } // Labels if (isJumpStatementTarget(node)) { - let labelName = (node).text; - let label = getTargetLabel((node.parent), (node).text); + const labelName = (node).text; + const label = getTargetLabel((node.parent), (node).text); return label ? [createDefinitionInfo(label, ScriptElementKind.label, labelName, /*containerName*/ undefined)] : undefined; } /// Triple slash reference comments - let comment = forEach(sourceFile.referencedFiles, r => (r.pos <= position && position < r.end) ? r : undefined); + const comment = forEach(sourceFile.referencedFiles, r => (r.pos <= position && position < r.end) ? r : undefined); if (comment) { - let referenceFile = tryResolveScriptReference(program, sourceFile, comment); + const referenceFile = tryResolveScriptReference(program, sourceFile, comment); if (referenceFile) { return [{ fileName: referenceFile.fileName, @@ -4594,7 +4593,7 @@ namespace ts { return undefined; } - let typeChecker = program.getTypeChecker(); + const typeChecker = program.getTypeChecker(); let symbol = typeChecker.getSymbolAtLocation(node); // Could not find a symbol e.g. node is string or number keyword, @@ -4608,7 +4607,7 @@ namespace ts { // import {A, B} from "mod"; // to jump to the implementation directly. if (symbol.flags & SymbolFlags.Alias) { - let declaration = symbol.declarations[0]; + const declaration = symbol.declarations[0]; if (node.kind === SyntaxKind.Identifier && node.parent === declaration) { symbol = typeChecker.getAliasedSymbol(symbol); } @@ -4620,15 +4619,15 @@ namespace ts { // is performed at the location of property access, we would like to go to definition of the property in the short-hand // assignment. This case and others are handled by the following code. if (node.parent.kind === SyntaxKind.ShorthandPropertyAssignment) { - let shorthandSymbol = typeChecker.getShorthandAssignmentValueSymbol(symbol.valueDeclaration); + const shorthandSymbol = typeChecker.getShorthandAssignmentValueSymbol(symbol.valueDeclaration); if (!shorthandSymbol) { return []; } - let shorthandDeclarations = shorthandSymbol.getDeclarations(); - let shorthandSymbolKind = getSymbolKind(shorthandSymbol, node); - let shorthandSymbolName = typeChecker.symbolToString(shorthandSymbol); - let shorthandContainerName = typeChecker.symbolToString(symbol.parent, node); + const shorthandDeclarations = shorthandSymbol.getDeclarations(); + const shorthandSymbolKind = getSymbolKind(shorthandSymbol, node); + const shorthandSymbolName = typeChecker.symbolToString(shorthandSymbol); + const shorthandContainerName = typeChecker.symbolToString(symbol.parent, node); return map(shorthandDeclarations, declaration => createDefinitionInfo(declaration, shorthandSymbolKind, shorthandSymbolName, shorthandContainerName)); } @@ -4640,27 +4639,27 @@ namespace ts { function getTypeDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[] { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); - let node = getTouchingPropertyName(sourceFile, position); + const node = getTouchingPropertyName(sourceFile, position); if (!node) { return undefined; } - let typeChecker = program.getTypeChecker(); + const typeChecker = program.getTypeChecker(); - let symbol = typeChecker.getSymbolAtLocation(node); + const symbol = typeChecker.getSymbolAtLocation(node); if (!symbol) { return undefined; } - let type = typeChecker.getTypeOfSymbolAtLocation(symbol, node); + const type = typeChecker.getTypeOfSymbolAtLocation(symbol, node); if (!type) { return undefined; } if (type.flags & TypeFlags.Union) { - let result: DefinitionInfo[] = []; + const result: DefinitionInfo[] = []; forEach((type).types, t => { if (t.symbol) { addRange(/*to*/ result, /*from*/ getDefinitionFromSymbol(t.symbol, node)); @@ -4680,7 +4679,7 @@ namespace ts { let results = getOccurrencesAtPositionCore(fileName, position); if (results) { - let sourceFile = getCanonicalFileName(normalizeSlashes(fileName)); + const sourceFile = getCanonicalFileName(normalizeSlashes(fileName)); // Get occurrences only supports reporting occurrences for the file queried. So // filter down to that list. @@ -4694,10 +4693,10 @@ namespace ts { synchronizeHostData(); filesToSearch = map(filesToSearch, normalizeSlashes); - let sourceFilesToSearch = filter(program.getSourceFiles(), f => contains(filesToSearch, f.fileName)); - let sourceFile = getValidSourceFile(fileName); + const sourceFilesToSearch = filter(program.getSourceFiles(), f => contains(filesToSearch, f.fileName)); + const sourceFile = getValidSourceFile(fileName); - let node = getTouchingWord(sourceFile, position); + const node = getTouchingWord(sourceFile, position); if (!node) { return undefined; } @@ -4705,8 +4704,8 @@ namespace ts { return getSemanticDocumentHighlights(node) || getSyntacticDocumentHighlights(node); function getHighlightSpanForNode(node: Node): HighlightSpan { - let start = node.getStart(); - let end = node.getEnd(); + const start = node.getStart(); + const end = node.getEnd(); return { fileName: sourceFile.fileName, @@ -4723,7 +4722,7 @@ namespace ts { isLiteralNameOfPropertyDeclarationOrIndexAccess(node) || isNameOfExternalModuleImportOrDeclaration(node)) { - let referencedSymbols = getReferencedSymbolsForNode(node, sourceFilesToSearch, /*findInStrings:*/ false, /*findInComments:*/ false); + const referencedSymbols = getReferencedSymbolsForNode(node, sourceFilesToSearch, /*findInStrings*/ false, /*findInComments*/ false); return convertReferencedSymbols(referencedSymbols); } @@ -4734,11 +4733,11 @@ namespace ts { return undefined; } - let fileNameToDocumentHighlights: Map = {}; - let result: DocumentHighlights[] = []; - for (let referencedSymbol of referencedSymbols) { - for (let referenceEntry of referencedSymbol.references) { - let fileName = referenceEntry.fileName; + const fileNameToDocumentHighlights: Map = {}; + const result: DocumentHighlights[] = []; + for (const referencedSymbol of referencedSymbols) { + for (const referenceEntry of referencedSymbol.references) { + const fileName = referenceEntry.fileName; let documentHighlights = getProperty(fileNameToDocumentHighlights, fileName); if (!documentHighlights) { documentHighlights = { fileName, highlightSpans: [] }; @@ -4759,9 +4758,9 @@ namespace ts { } function getSyntacticDocumentHighlights(node: Node): DocumentHighlights[] { - let fileName = sourceFile.fileName; + const fileName = sourceFile.fileName; - let highlightSpans = getHighlightSpans(node); + const highlightSpans = getHighlightSpans(node); if (!highlightSpans || highlightSpans.length === 0) { return undefined; } @@ -4865,7 +4864,7 @@ namespace ts { * into function boundaries and try-blocks with catch-clauses. */ function aggregateOwnedThrowStatements(node: Node): ThrowStatement[] { - let statementAccumulator: ThrowStatement[] = [] + const statementAccumulator: ThrowStatement[] = []; aggregate(node); return statementAccumulator; @@ -4874,7 +4873,7 @@ namespace ts { statementAccumulator.push(node); } else if (node.kind === SyntaxKind.TryStatement) { - let tryStatement = node; + const tryStatement = node; if (tryStatement.catchClause) { aggregate(tryStatement.catchClause); @@ -4905,7 +4904,7 @@ namespace ts { let child: Node = throwStatement; while (child.parent) { - let parent = child.parent; + const parent = child.parent; if (isFunctionBlock(parent) || parent.kind === SyntaxKind.SourceFile) { return parent; @@ -4914,7 +4913,7 @@ namespace ts { // A throw-statement is only owned by a try-statement if the try-statement has // a catch clause, and if the throw-statement occurs within the try block. if (parent.kind === SyntaxKind.TryStatement) { - let tryStatement = parent; + const tryStatement = parent; if (tryStatement.tryBlock === child && tryStatement.catchClause) { return child; @@ -4928,7 +4927,7 @@ namespace ts { } function aggregateAllBreakAndContinueStatements(node: Node): BreakOrContinueStatement[] { - let statementAccumulator: BreakOrContinueStatement[] = [] + const statementAccumulator: BreakOrContinueStatement[] = []; aggregate(node); return statementAccumulator; @@ -4944,7 +4943,7 @@ namespace ts { } function ownsBreakOrContinueStatement(owner: Node, statement: BreakOrContinueStatement): boolean { - let actualOwner = getBreakOrContinueOwner(statement); + const actualOwner = getBreakOrContinueOwner(statement); return actualOwner && actualOwner === owner; } @@ -4979,7 +4978,7 @@ namespace ts { } function getModifierOccurrences(modifier: SyntaxKind, declaration: Node): HighlightSpan[] { - let container = declaration.parent; + const container = declaration.parent; // Make sure we only highlight the keyword when it makes sense to do so. if (isAccessibilityModifier(modifier)) { @@ -5009,8 +5008,8 @@ namespace ts { return undefined; } - let keywords: Node[] = []; - let modifierFlag: NodeFlags = getFlagFromModifier(modifier); + const keywords: Node[] = []; + const modifierFlag: NodeFlags = getFlagFromModifier(modifier); let nodes: Node[]; switch (container.kind) { @@ -5035,7 +5034,7 @@ namespace ts { // If we're an accessibility modifier, we're in an instance member and should search // the constructor's parameter list for instance members as well. if (modifierFlag & NodeFlags.AccessibilityModifier) { - let constructor = forEach((container).members, member => { + const constructor = forEach((container).members, member => { return member.kind === SyntaxKind.Constructor && member; }); @@ -5048,7 +5047,7 @@ namespace ts { } break; default: - Debug.fail("Invalid container kind.") + Debug.fail("Invalid container kind."); } forEach(nodes, node => { @@ -5091,7 +5090,7 @@ namespace ts { } function getGetAndSetOccurrences(accessorDeclaration: AccessorDeclaration): HighlightSpan[] { - let keywords: Node[] = []; + const keywords: Node[] = []; tryPushAccessorKeyword(accessorDeclaration.symbol, SyntaxKind.GetAccessor); tryPushAccessorKeyword(accessorDeclaration.symbol, SyntaxKind.SetAccessor); @@ -5099,7 +5098,7 @@ namespace ts { return map(keywords, getHighlightSpanForNode); function tryPushAccessorKeyword(accessorSymbol: Symbol, accessorKind: SyntaxKind): void { - let accessor = getDeclarationOfKind(accessorSymbol, accessorKind); + const accessor = getDeclarationOfKind(accessorSymbol, accessorKind); if (accessor) { forEach(accessor.getChildren(), child => pushKeywordIf(keywords, child, SyntaxKind.GetKeyword, SyntaxKind.SetKeyword)); @@ -5108,9 +5107,9 @@ namespace ts { } function getConstructorOccurrences(constructorDeclaration: ConstructorDeclaration): HighlightSpan[] { - let declarations = constructorDeclaration.symbol.getDeclarations() + const declarations = constructorDeclaration.symbol.getDeclarations(); - let keywords: Node[] = []; + const keywords: Node[] = []; forEach(declarations, declaration => { forEach(declaration.getChildren(), token => { @@ -5122,12 +5121,12 @@ namespace ts { } function getLoopBreakContinueOccurrences(loopNode: IterationStatement): HighlightSpan[] { - let keywords: Node[] = []; + const keywords: Node[] = []; if (pushKeywordIf(keywords, loopNode.getFirstToken(), SyntaxKind.ForKeyword, SyntaxKind.WhileKeyword, SyntaxKind.DoKeyword)) { // If we succeeded and got a do-while loop, then start looking for a 'while' keyword. if (loopNode.kind === SyntaxKind.DoStatement) { - let loopTokens = loopNode.getChildren(); + const loopTokens = loopNode.getChildren(); for (let i = loopTokens.length - 1; i >= 0; i--) { if (pushKeywordIf(keywords, loopTokens[i], SyntaxKind.WhileKeyword)) { @@ -5137,7 +5136,7 @@ namespace ts { } } - let breaksAndContinues = aggregateAllBreakAndContinueStatements(loopNode.statement); + const breaksAndContinues = aggregateAllBreakAndContinueStatements(loopNode.statement); forEach(breaksAndContinues, statement => { if (ownsBreakOrContinueStatement(loopNode, statement)) { @@ -5149,7 +5148,7 @@ namespace ts { } function getBreakOrContinueStatementOccurrences(breakOrContinueStatement: BreakOrContinueStatement): HighlightSpan[] { - let owner = getBreakOrContinueOwner(breakOrContinueStatement); + const owner = getBreakOrContinueOwner(breakOrContinueStatement); if (owner) { switch (owner.kind) { @@ -5158,7 +5157,7 @@ namespace ts { case SyntaxKind.ForOfStatement: case SyntaxKind.DoStatement: case SyntaxKind.WhileStatement: - return getLoopBreakContinueOccurrences(owner) + return getLoopBreakContinueOccurrences(owner); case SyntaxKind.SwitchStatement: return getSwitchCaseDefaultOccurrences(owner); @@ -5169,7 +5168,7 @@ namespace ts { } function getSwitchCaseDefaultOccurrences(switchStatement: SwitchStatement): HighlightSpan[] { - let keywords: Node[] = []; + const keywords: Node[] = []; pushKeywordIf(keywords, switchStatement.getFirstToken(), SyntaxKind.SwitchKeyword); @@ -5177,7 +5176,7 @@ namespace ts { forEach(switchStatement.caseBlock.clauses, clause => { pushKeywordIf(keywords, clause.getFirstToken(), SyntaxKind.CaseKeyword, SyntaxKind.DefaultKeyword); - let breaksAndContinues = aggregateAllBreakAndContinueStatements(clause); + const breaksAndContinues = aggregateAllBreakAndContinueStatements(clause); forEach(breaksAndContinues, statement => { if (ownsBreakOrContinueStatement(switchStatement, statement)) { @@ -5190,7 +5189,7 @@ namespace ts { } function getTryCatchFinallyOccurrences(tryStatement: TryStatement): HighlightSpan[] { - let keywords: Node[] = []; + const keywords: Node[] = []; pushKeywordIf(keywords, tryStatement.getFirstToken(), SyntaxKind.TryKeyword); @@ -5199,7 +5198,7 @@ namespace ts { } if (tryStatement.finallyBlock) { - let finallyKeyword = findChildOfKind(tryStatement, SyntaxKind.FinallyKeyword, sourceFile); + const finallyKeyword = findChildOfKind(tryStatement, SyntaxKind.FinallyKeyword, sourceFile); pushKeywordIf(keywords, finallyKeyword, SyntaxKind.FinallyKeyword); } @@ -5207,13 +5206,13 @@ namespace ts { } function getThrowOccurrences(throwStatement: ThrowStatement): HighlightSpan[] { - let owner = getThrowStatementOwner(throwStatement); + const owner = getThrowStatementOwner(throwStatement); if (!owner) { return undefined; } - let keywords: Node[] = []; + const keywords: Node[] = []; forEach(aggregateOwnedThrowStatements(owner), throwStatement => { pushKeywordIf(keywords, throwStatement.getFirstToken(), SyntaxKind.ThrowKeyword); @@ -5231,14 +5230,14 @@ namespace ts { } function getReturnOccurrences(returnStatement: ReturnStatement): HighlightSpan[] { - let func = getContainingFunction(returnStatement); + const func = getContainingFunction(returnStatement); // If we didn't find a containing function with a block body, bail out. if (!(func && hasKind(func.body, SyntaxKind.Block))) { return undefined; } - let keywords: Node[] = [] + const keywords: Node[] = []; forEachReturnStatement(func.body, returnStatement => { pushKeywordIf(keywords, returnStatement.getFirstToken(), SyntaxKind.ReturnKeyword); }); @@ -5252,7 +5251,7 @@ namespace ts { } function getIfElseOccurrences(ifStatement: IfStatement): HighlightSpan[] { - let keywords: Node[] = []; + const keywords: Node[] = []; // Traverse upwards through all parent if-statements linked by their else-branches. while (hasKind(ifStatement.parent, SyntaxKind.IfStatement) && (ifStatement.parent).elseStatement === ifStatement) { @@ -5261,7 +5260,7 @@ namespace ts { // Now traverse back down through the else branches, aggregating if/else keywords of if-statements. while (ifStatement) { - let children = ifStatement.getChildren(); + const children = ifStatement.getChildren(); pushKeywordIf(keywords, children[0], SyntaxKind.IfKeyword); // Generally the 'else' keyword is second-to-last, so we traverse backwards. @@ -5272,20 +5271,20 @@ namespace ts { } if (!hasKind(ifStatement.elseStatement, SyntaxKind.IfStatement)) { - break + break; } ifStatement = ifStatement.elseStatement; } - let result: HighlightSpan[] = []; + const result: HighlightSpan[] = []; // We'd like to highlight else/ifs together if they are only separated by whitespace // (i.e. the keywords are separated by no comments, no newlines). for (let i = 0; i < keywords.length; i++) { if (keywords[i].kind === SyntaxKind.ElseKeyword && i < keywords.length - 1) { - let elseKeyword = keywords[i]; - let ifKeyword = keywords[i + 1]; // this *should* always be an 'if' keyword. + const elseKeyword = keywords[i]; + const ifKeyword = keywords[i + 1]; // this *should* always be an 'if' keyword. let shouldCombindElseAndIf = true; @@ -5328,9 +5327,9 @@ namespace ts { return undefined; } - let result: ReferenceEntry[] = []; - for (let entry of documentHighlights) { - for (let highlightSpan of entry.highlightSpans) { + const result: ReferenceEntry[] = []; + for (const entry of documentHighlights) { + for (const highlightSpan of entry.highlightSpans) { result.push({ fileName: entry.fileName, textSpan: highlightSpan.textSpan, @@ -5348,9 +5347,9 @@ namespace ts { return undefined; } - let referenceEntries: ReferenceEntry[] = []; + const referenceEntries: ReferenceEntry[] = []; - for (let referenceSymbol of referenceSymbols) { + for (const referenceSymbol of referenceSymbols) { addRange(referenceEntries, referenceSymbol.references); } @@ -5358,17 +5357,17 @@ namespace ts { } function findRenameLocations(fileName: string, position: number, findInStrings: boolean, findInComments: boolean): RenameLocation[] { - let referencedSymbols = findReferencedSymbols(fileName, position, findInStrings, findInComments); + const referencedSymbols = findReferencedSymbols(fileName, position, findInStrings, findInComments); return convertReferences(referencedSymbols); } function getReferencesAtPosition(fileName: string, position: number): ReferenceEntry[] { - let referencedSymbols = findReferencedSymbols(fileName, position, /*findInStrings:*/ false, /*findInComments:*/ false); + const referencedSymbols = findReferencedSymbols(fileName, position, /*findInStrings*/ false, /*findInComments*/ false); return convertReferences(referencedSymbols); } - function findReferences(fileName: string, position: number): ReferencedSymbol[]{ - let referencedSymbols = findReferencedSymbols(fileName, position, /*findInStrings:*/ false, /*findInComments:*/ false); + function findReferences(fileName: string, position: number): ReferencedSymbol[] { + const referencedSymbols = findReferencedSymbols(fileName, position, /*findInStrings*/ false, /*findInComments*/ false); // Only include referenced symbols that have a valid definition. return filter(referencedSymbols, rs => !!rs.definition); @@ -5377,17 +5376,17 @@ namespace ts { function findReferencedSymbols(fileName: string, position: number, findInStrings: boolean, findInComments: boolean): ReferencedSymbol[] { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); - let node = getTouchingPropertyName(sourceFile, position); + const node = getTouchingPropertyName(sourceFile, position); if (!node) { return undefined; } if (node.kind !== SyntaxKind.Identifier && // TODO (drosen): This should be enabled in a later release - currently breaks rename. - //node.kind !== SyntaxKind.ThisKeyword && - //node.kind !== SyntaxKind.SuperKeyword && + // node.kind !== SyntaxKind.ThisKeyword && + // node.kind !== SyntaxKind.SuperKeyword && !isLiteralNameOfPropertyDeclarationOrIndexAccess(node) && !isNameOfExternalModuleImportOrDeclaration(node)) { return undefined; @@ -5398,12 +5397,12 @@ namespace ts { } function getReferencedSymbolsForNode(node: Node, sourceFiles: SourceFile[], findInStrings: boolean, findInComments: boolean): ReferencedSymbol[] { - let typeChecker = program.getTypeChecker(); + const typeChecker = program.getTypeChecker(); // Labels if (isLabelName(node)) { if (isJumpStatementTarget(node)) { - let labelDefinition = getTargetLabel((node.parent), (node).text); + const labelDefinition = getTargetLabel((node.parent), (node).text); // if we have a label definition, look within its statement for references, if not, then // the label is undefined and we have no results.. return labelDefinition ? getLabelReferencesInNode(labelDefinition.parent, labelDefinition) : undefined; @@ -5422,7 +5421,7 @@ namespace ts { return getReferencesForSuperKeyword(node); } - let symbol = typeChecker.getSymbolAtLocation(node); + const symbol = typeChecker.getSymbolAtLocation(node); // Could not find a symbol e.g. unknown identifier if (!symbol) { @@ -5430,7 +5429,7 @@ namespace ts { return undefined; } - let declarations = symbol.declarations; + const declarations = symbol.declarations; // The symbol was an internal symbol and does not have a declaration e.g. undefined symbol if (!declarations || !declarations.length) { @@ -5440,29 +5439,29 @@ namespace ts { let result: ReferencedSymbol[]; // Compute the meaning from the location and the symbol it references - let searchMeaning = getIntersectingMeaningFromDeclarations(getMeaningFromLocation(node), declarations); + const searchMeaning = getIntersectingMeaningFromDeclarations(getMeaningFromLocation(node), declarations); // Get the text to search for. // Note: if this is an external module symbol, the name doesn't include quotes. - let declaredName = stripQuotes(getDeclaredName(typeChecker, symbol, node)); + const declaredName = stripQuotes(getDeclaredName(typeChecker, symbol, node)); // Try to get the smallest valid scope that we can limit our search to; // otherwise we'll need to search globally (i.e. include each file). - let scope = getSymbolScope(symbol); + const scope = getSymbolScope(symbol); // Maps from a symbol ID to the ReferencedSymbol entry in 'result'. - let symbolToIndex: number[] = []; + const symbolToIndex: number[] = []; if (scope) { result = []; getReferencesInNode(scope, symbol, declaredName, node, searchMeaning, findInStrings, findInComments, result, symbolToIndex); } else { - let internedName = getInternedName(symbol, node, declarations) - for (let sourceFile of sourceFiles) { + const internedName = getInternedName(symbol, node, declarations); + for (const sourceFile of sourceFiles) { cancellationToken.throwIfCancellationRequested(); - let nameTable = getNameTable(sourceFile); + const nameTable = getNameTable(sourceFile); if (lookUp(nameTable, internedName)) { result = result || []; @@ -5474,9 +5473,9 @@ namespace ts { return result; function getDefinition(symbol: Symbol): DefinitionInfo { - let info = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, node.getSourceFile(), getContainerNode(node), node); - let name = map(info.displayParts, p => p.text).join(""); - let declarations = symbol.declarations; + const info = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, node.getSourceFile(), getContainerNode(node), node); + const name = map(info.displayParts, p => p.text).join(""); + const declarations = symbol.declarations; if (!declarations || declarations.length === 0) { return undefined; } @@ -5506,7 +5505,7 @@ namespace ts { // Try to get the local symbol if we're dealing with an 'export default' // since that symbol has the "true" name. - let localExportDefaultSymbol = getLocalSymbolForExportDefault(symbol); + const localExportDefaultSymbol = getLocalSymbolForExportDefault(symbol); symbol = localExportDefaultSymbol || symbol; return stripQuotes(symbol.name); @@ -5523,14 +5522,14 @@ namespace ts { function getSymbolScope(symbol: Symbol): Node { // If this is the symbol of a named function expression or named class expression, // then named references are limited to its own scope. - let valueDeclaration = symbol.valueDeclaration; + const valueDeclaration = symbol.valueDeclaration; if (valueDeclaration && (valueDeclaration.kind === SyntaxKind.FunctionExpression || valueDeclaration.kind === SyntaxKind.ClassExpression)) { return valueDeclaration; } // If this is private property or method, the scope is the containing class if (symbol.flags & (SymbolFlags.Property | SymbolFlags.Method)) { - let privateDeclaration = forEach(symbol.getDeclarations(), d => (d.flags & NodeFlags.Private) ? d : undefined); + const privateDeclaration = forEach(symbol.getDeclarations(), d => (d.flags & NodeFlags.Private) ? d : undefined); if (privateDeclaration) { return getAncestor(privateDeclaration, SyntaxKind.ClassDeclaration); } @@ -5548,12 +5547,12 @@ namespace ts { return undefined; } - let scope: Node = undefined; + let scope: Node; - let declarations = symbol.getDeclarations(); + const declarations = symbol.getDeclarations(); if (declarations) { - for (let declaration of declarations) { - let container = getContainerNode(declaration); + for (const declaration of declarations) { + const container = getContainerNode(declaration); if (!container) { return undefined; @@ -5579,7 +5578,7 @@ namespace ts { } function getPossibleSymbolReferencePositions(sourceFile: SourceFile, symbolName: string, start: number, end: number): number[] { - let positions: number[] = []; + const positions: number[] = []; /// TODO: Cache symbol existence for files to save text search // Also, need to make this work for unicode escapes. @@ -5589,9 +5588,9 @@ namespace ts { return positions; } - let text = sourceFile.text; - let sourceLength = text.length; - let symbolNameLength = symbolName.length; + const text = sourceFile.text; + const sourceLength = text.length; + const symbolNameLength = symbolName.length; let position = text.indexOf(symbolName, start); while (position >= 0) { @@ -5602,7 +5601,7 @@ namespace ts { // We found a match. Make sure it's not part of a larger word (i.e. the char // before and after it have to be a non-identifier char). - let endPosition = position + symbolNameLength; + const endPosition = position + symbolNameLength; if ((position === 0 || !isIdentifierPart(text.charCodeAt(position - 1), ScriptTarget.Latest)) && (endPosition === sourceLength || !isIdentifierPart(text.charCodeAt(endPosition), ScriptTarget.Latest))) { @@ -5616,14 +5615,14 @@ namespace ts { } function getLabelReferencesInNode(container: Node, targetLabel: Identifier): ReferencedSymbol[] { - let references: ReferenceEntry[] = []; - let sourceFile = container.getSourceFile(); - let labelName = targetLabel.text; - let possiblePositions = getPossibleSymbolReferencePositions(sourceFile, labelName, container.getStart(), container.getEnd()); + const references: ReferenceEntry[] = []; + const sourceFile = container.getSourceFile(); + const labelName = targetLabel.text; + const possiblePositions = getPossibleSymbolReferencePositions(sourceFile, labelName, container.getStart(), container.getEnd()); forEach(possiblePositions, position => { cancellationToken.throwIfCancellationRequested(); - let node = getTouchingWord(sourceFile, position); + const node = getTouchingWord(sourceFile, position); if (!node || node.getWidth() !== labelName.length) { return; } @@ -5635,14 +5634,14 @@ namespace ts { } }); - let definition: DefinitionInfo = { + const definition: DefinitionInfo = { containerKind: "", containerName: "", fileName: targetLabel.getSourceFile().fileName, kind: ScriptElementKind.label, name: labelName, textSpan: createTextSpanFromBounds(targetLabel.getStart(), targetLabel.getEnd()) - } + }; return [{ definition, references }]; } @@ -5687,19 +5686,19 @@ namespace ts { result: ReferencedSymbol[], symbolToIndex: number[]): void { - let sourceFile = container.getSourceFile(); - let tripleSlashDirectivePrefixRegex = /^\/\/\/\s* { cancellationToken.throwIfCancellationRequested(); - let referenceLocation = getTouchingPropertyName(sourceFile, position); + const referenceLocation = getTouchingPropertyName(sourceFile, position); if (!isValidReferencePosition(referenceLocation, searchText)) { // This wasn't the start of a token. Check to see if it might be a // match in a comment or string if that's what the caller is asking @@ -5727,14 +5726,14 @@ namespace ts { return; } - let referenceSymbol = typeChecker.getSymbolAtLocation(referenceLocation); + const referenceSymbol = typeChecker.getSymbolAtLocation(referenceLocation); if (referenceSymbol) { - let referenceSymbolDeclaration = referenceSymbol.valueDeclaration; - let shorthandValueSymbol = typeChecker.getShorthandAssignmentValueSymbol(referenceSymbolDeclaration); - let relatedSymbol = getRelatedSymbol(searchSymbols, referenceSymbol, referenceLocation); + const referenceSymbolDeclaration = referenceSymbol.valueDeclaration; + const shorthandValueSymbol = typeChecker.getShorthandAssignmentValueSymbol(referenceSymbolDeclaration); + const relatedSymbol = getRelatedSymbol(searchSymbols, referenceSymbol, referenceLocation); if (relatedSymbol) { - let referencedSymbol = getReferencedSymbol(relatedSymbol); + const referencedSymbol = getReferencedSymbol(relatedSymbol); referencedSymbol.references.push(getReferenceEntryFromNode(referenceLocation)); } /* Because in short-hand property assignment, an identifier which stored as name of the short-hand property assignment @@ -5744,7 +5743,7 @@ namespace ts { * position of property accessing, the referenceEntry of such position will be handled in the first case. */ else if (!(referenceSymbol.flags & SymbolFlags.Transient) && searchSymbols.indexOf(shorthandValueSymbol) >= 0) { - let referencedSymbol = getReferencedSymbol(shorthandValueSymbol); + const referencedSymbol = getReferencedSymbol(shorthandValueSymbol); referencedSymbol.references.push(getReferenceEntryFromNode(referenceSymbolDeclaration.name)); } } @@ -5754,7 +5753,7 @@ namespace ts { return; function getReferencedSymbol(symbol: Symbol): ReferencedSymbol { - let symbolId = getSymbolId(symbol); + const symbolId = getSymbolId(symbol); let index = symbolToIndex[symbolId]; if (index === undefined) { index = result.length; @@ -5773,7 +5772,7 @@ namespace ts { return isInCommentHelper(sourceFile, position, isNonReferenceComment); function isNonReferenceComment(c: CommentRange): boolean { - let commentText = sourceFile.text.substring(c.pos, c.end); + const commentText = sourceFile.text.substring(c.pos, c.end); return !tripleSlashDirectivePrefixRegex.test(commentText); } } @@ -5802,20 +5801,20 @@ namespace ts { return undefined; } - let references: ReferenceEntry[] = []; + const references: ReferenceEntry[] = []; - let sourceFile = searchSpaceNode.getSourceFile(); - let possiblePositions = getPossibleSymbolReferencePositions(sourceFile, "super", searchSpaceNode.getStart(), searchSpaceNode.getEnd()); + const sourceFile = searchSpaceNode.getSourceFile(); + const possiblePositions = getPossibleSymbolReferencePositions(sourceFile, "super", searchSpaceNode.getStart(), searchSpaceNode.getEnd()); forEach(possiblePositions, position => { cancellationToken.throwIfCancellationRequested(); - let node = getTouchingWord(sourceFile, position); + const node = getTouchingWord(sourceFile, position); if (!node || node.kind !== SyntaxKind.SuperKeyword) { return; } - let container = getSuperContainer(node, /*includeFunctions*/ false); + const container = getSuperContainer(node, /*includeFunctions*/ false); // If we have a 'super' container, we must have an enclosing class. // Now make sure the owning class is the same as the search-space @@ -5825,7 +5824,7 @@ namespace ts { } }); - let definition = getDefinition(searchSpaceNode.symbol); + const definition = getDefinition(searchSpaceNode.symbol); return [{ definition, references }]; } @@ -5847,7 +5846,7 @@ namespace ts { case SyntaxKind.Constructor: case SyntaxKind.GetAccessor: case SyntaxKind.SetAccessor: - staticFlag &= searchSpaceNode.flags + staticFlag &= searchSpaceNode.flags; searchSpaceNode = searchSpaceNode.parent; // re-assign to be the owning class break; case SyntaxKind.SourceFile: @@ -5864,7 +5863,7 @@ namespace ts { return undefined; } - let references: ReferenceEntry[] = []; + const references: ReferenceEntry[] = []; let possiblePositions: number[]; if (searchSpaceNode.kind === SyntaxKind.SourceFile) { @@ -5874,7 +5873,7 @@ namespace ts { }); } else { - let sourceFile = searchSpaceNode.getSourceFile(); + const sourceFile = searchSpaceNode.getSourceFile(); possiblePositions = getPossibleSymbolReferencePositions(sourceFile, "this", searchSpaceNode.getStart(), searchSpaceNode.getEnd()); getThisReferencesInFile(sourceFile, searchSpaceNode, possiblePositions, references); } @@ -5895,12 +5894,12 @@ namespace ts { forEach(possiblePositions, position => { cancellationToken.throwIfCancellationRequested(); - let node = getTouchingWord(sourceFile, position); + const node = getTouchingWord(sourceFile, position); if (!node || (node.kind !== SyntaxKind.ThisKeyword && node.kind !== SyntaxKind.ThisType)) { return; } - let container = getThisContainer(node, /* includeArrowFunctions */ false); + const container = getThisContainer(node, /* includeArrowFunctions */ false); switch (searchSpaceNode.kind) { case SyntaxKind.FunctionExpression: @@ -5935,7 +5934,7 @@ namespace ts { function populateSearchSymbolSet(symbol: Symbol, location: Node): Symbol[] { // The search set contains at least the current symbol - let result = [symbol]; + const result = [symbol]; // If the symbol is an alias, add what it alaises to the list if (isImportOrExportSpecifierImportSymbol(symbol)) { @@ -5955,13 +5954,13 @@ namespace ts { * property name and variable declaration of the identifier. * Like in below example, when querying for all references for an identifier 'name', of the property assignment, the language service * should show both 'name' in 'obj' and 'name' in variable declaration - * let name = "Foo"; - * let obj = { name }; + * const name = "Foo"; + * const obj = { name }; * In order to do that, we will populate the search set with the value symbol of the identifier as a value of the property assignment * so that when matching with potential reference symbol, both symbols from property declaration and variable declaration * will be included correctly. */ - let shorthandValueSymbol = typeChecker.getShorthandAssignmentValueSymbol(location.parent); + const shorthandValueSymbol = typeChecker.getShorthandAssignmentValueSymbol(location.parent); if (shorthandValueSymbol) { result.push(shorthandValueSymbol); } @@ -5999,9 +5998,9 @@ namespace ts { function getPropertySymbolFromTypeReference(typeReference: ExpressionWithTypeArguments) { if (typeReference) { - let type = typeChecker.getTypeAtLocation(typeReference); + const type = typeChecker.getTypeAtLocation(typeReference); if (type) { - let propertySymbol = typeChecker.getPropertyOfType(type, propertyName); + const propertySymbol = typeChecker.getPropertyOfType(type, propertyName); if (propertySymbol) { result.push(propertySymbol); } @@ -6021,7 +6020,7 @@ namespace ts { // If the reference symbol is an alias, check if what it is aliasing is one of the search // symbols. if (isImportOrExportSpecifierImportSymbol(referenceSymbol)) { - let aliasedSymbol = typeChecker.getAliasedSymbol(referenceSymbol); + const aliasedSymbol = typeChecker.getAliasedSymbol(referenceSymbol); if (searchSymbols.indexOf(aliasedSymbol) >= 0) { return aliasedSymbol; } @@ -6047,7 +6046,7 @@ namespace ts { // Finally, try all properties with the same name in any type the containing type extended or implemented, and // see if any is in the list if (rootSymbol.parent && rootSymbol.parent.flags & (SymbolFlags.Class | SymbolFlags.Interface)) { - let result: Symbol[] = []; + const result: Symbol[] = []; getPropertySymbolsFromBaseTypes(rootSymbol.parent, rootSymbol.getName(), result); return forEach(result, s => searchSymbols.indexOf(s) >= 0 ? s : undefined); } @@ -6058,21 +6057,21 @@ namespace ts { function getPropertySymbolsFromContextualType(node: Node): Symbol[] { if (isNameOfPropertyAssignment(node)) { - let objectLiteral = node.parent.parent; - let contextualType = typeChecker.getContextualType(objectLiteral); - let name = (node).text; + const objectLiteral = node.parent.parent; + const contextualType = typeChecker.getContextualType(objectLiteral); + const name = (node).text; if (contextualType) { if (contextualType.flags & TypeFlags.Union) { // This is a union type, first see if the property we are looking for is a union property (i.e. exists in all types) // if not, search the constituent types for the property - let unionProperty = contextualType.getProperty(name) + const unionProperty = contextualType.getProperty(name); if (unionProperty) { return [unionProperty]; } else { - let result: Symbol[] = []; + const result: Symbol[] = []; forEach((contextualType).types, t => { - let symbol = t.getProperty(name); + const symbol = t.getProperty(name); if (symbol) { result.push(symbol); } @@ -6081,7 +6080,7 @@ namespace ts { } } else { - let symbol = contextualType.getProperty(name); + const symbol = contextualType.getProperty(name); if (symbol) { return [symbol]; } @@ -6110,8 +6109,8 @@ namespace ts { // Remember the last meaning lastIterationMeaning = meaning; - for (let declaration of declarations) { - let declarationMeaning = getMeaningFromDeclaration(declaration); + for (const declaration of declarations) { + const declarationMeaning = getMeaningFromDeclaration(declaration); if (declarationMeaning & meaning) { meaning |= declarationMeaning; @@ -6146,13 +6145,13 @@ namespace ts { return true; } - let parent = node.parent; + const parent = node.parent; if (parent) { if (parent.kind === SyntaxKind.PostfixUnaryExpression || parent.kind === SyntaxKind.PrefixUnaryExpression) { return true; } else if (parent.kind === SyntaxKind.BinaryExpression && (parent).left === node) { - let operator = (parent).operatorToken.kind; + const operator = (parent).operatorToken.kind; return SyntaxKind.FirstAssignment <= operator && operator <= SyntaxKind.LastAssignment; } } @@ -6174,8 +6173,8 @@ namespace ts { function getEmitOutput(fileName: string): EmitOutput { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); - let outputFiles: OutputFile[] = []; + const sourceFile = getValidSourceFile(fileName); + const outputFiles: OutputFile[] = []; function writeFile(fileName: string, data: string, writeByteOrderMark: boolean) { outputFiles.push({ @@ -6185,7 +6184,7 @@ namespace ts { }); } - let emitOutput = program.emit(sourceFile, writeFile, cancellationToken); + const emitOutput = program.emit(sourceFile, writeFile, cancellationToken); return { outputFiles, @@ -6278,7 +6277,7 @@ namespace ts { } if (!isLastClause && root.parent.kind === SyntaxKind.ExpressionWithTypeArguments && root.parent.parent.kind === SyntaxKind.HeritageClause) { - let decl = root.parent.parent.parent; + const decl = root.parent.parent.parent; return (decl.kind === SyntaxKind.ClassDeclaration && (root.parent.parent).token === SyntaxKind.ImplementsKeyword) || (decl.kind === SyntaxKind.InterfaceDeclaration && (root.parent.parent).token === SyntaxKind.ExtendsKeyword); } @@ -6350,7 +6349,7 @@ namespace ts { function getSignatureHelpItems(fileName: string, position: number): SignatureHelpItems { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); return SignatureHelp.getSignatureHelpItems(program, sourceFile, position, cancellationToken); } @@ -6361,10 +6360,10 @@ namespace ts { } function getNameOrDottedNameSpan(fileName: string, startPos: number, endPos: number): TextSpan { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); // Get node at the location - let node = getTouchingPropertyName(sourceFile, startPos); + const node = getTouchingPropertyName(sourceFile, startPos); if (!node) { return; @@ -6420,13 +6419,13 @@ namespace ts { function getBreakpointStatementAtPosition(fileName: string, position: number) { // doesn't use compiler - no need to synchronize with host - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return BreakpointResolver.spanInSourceFileAtLocation(sourceFile, position); } function getNavigationBarItems(fileName: string): NavigationBarItem[] { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return NavigationBar.getNavigationBarItems(sourceFile, host.getCompilationSettings()); } @@ -6458,11 +6457,11 @@ namespace ts { function getEncodedSemanticClassifications(fileName: string, span: TextSpan): Classifications { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); - let typeChecker = program.getTypeChecker(); + const sourceFile = getValidSourceFile(fileName); + const typeChecker = program.getTypeChecker(); - let result: number[] = []; - let classifiableNames = program.getClassifiableNames(); + const result: number[] = []; + const classifiableNames = program.getClassifiableNames(); processNode(sourceFile); return { spans: result, endOfLineState: EndOfLineState.None }; @@ -6474,7 +6473,7 @@ namespace ts { } function classifySymbol(symbol: Symbol, meaningAtPosition: SemanticMeaning): ClassificationType { - let flags = symbol.getFlags(); + const flags = symbol.getFlags(); if ((flags & SymbolFlags.Classifiable) === SymbolFlags.None) { return; } @@ -6522,19 +6521,19 @@ namespace ts { function processNode(node: Node) { // Only walk into nodes that intersect the requested span. if (node && textSpanIntersectsWith(span, node.getFullStart(), node.getFullWidth())) { - let kind = node.kind; + const kind = node.kind; checkForClassificationCancellation(kind); if (kind === SyntaxKind.Identifier && !nodeIsMissing(node)) { - let identifier = node; + const 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 (classifiableNames[identifier.text]) { - let symbol = typeChecker.getSymbolAtLocation(node); + const symbol = typeChecker.getSymbolAtLocation(node); if (symbol) { - let type = classifySymbol(symbol, getMeaningFromLocation(node)); + const type = classifySymbol(symbol, getMeaningFromLocation(node)); if (type) { pushClassification(node.getStart(), node.getWidth(), type); } @@ -6574,8 +6573,8 @@ namespace ts { function convertClassifications(classifications: Classifications): ClassifiedSpan[] { Debug.assert(classifications.spans.length % 3 === 0); - let dense = classifications.spans; - let result: ClassifiedSpan[] = []; + const dense = classifications.spans; + const result: ClassifiedSpan[] = []; for (let i = 0, n = dense.length; i < n; i += 3) { result.push({ textSpan: createTextSpan(dense[i], dense[i + 1]), @@ -6592,15 +6591,15 @@ namespace ts { function getEncodedSyntacticClassifications(fileName: string, span: TextSpan): Classifications { // doesn't use compiler - no need to synchronize with host - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); - let spanStart = span.start; - let spanLength = span.length; + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const spanStart = span.start; + const spanLength = span.length; // Make a scanner we can get trivia from. - let triviaScanner = createScanner(ScriptTarget.Latest, /*skipTrivia:*/ false, sourceFile.languageVariant, sourceFile.text); - let mergeConflictScanner = createScanner(ScriptTarget.Latest, /*skipTrivia:*/ false, sourceFile.languageVariant, sourceFile.text); + const triviaScanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false, sourceFile.languageVariant, sourceFile.text); + const mergeConflictScanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false, sourceFile.languageVariant, sourceFile.text); - let result: number[] = []; + const result: number[] = []; processElement(sourceFile); return { spans: result, endOfLineState: EndOfLineState.None }; @@ -6614,15 +6613,15 @@ namespace ts { function classifyLeadingTriviaAndGetTokenStart(token: Node): number { triviaScanner.setTextPos(token.pos); while (true) { - let start = triviaScanner.getTextPos(); + const start = triviaScanner.getTextPos(); // only bother scanning if we have something that could be trivia. if (!couldStartTrivia(sourceFile.text, start)) { return start; } - let kind = triviaScanner.scan(); - let end = triviaScanner.getTextPos(); - let width = end - start; + const kind = triviaScanner.scan(); + const end = triviaScanner.getTextPos(); + const width = end - start; // The moment we get something that isn't trivia, then stop processing. if (!isTrivia(kind)) { @@ -6646,8 +6645,8 @@ namespace ts { } if (kind === SyntaxKind.ConflictMarkerTrivia) { - let text = sourceFile.text; - let ch = text.charCodeAt(start); + const text = sourceFile.text; + const ch = text.charCodeAt(start); // for the <<<<<<< and >>>>>>> markers, we just add them in as comments // in the classification stream. @@ -6668,7 +6667,7 @@ namespace ts { if (kind === SyntaxKind.MultiLineCommentTrivia) { // See if this is a doc comment. If so, we'll classify certain portions of it // specially. - let docCommentAndDiagnostics = parseIsolatedJSDocComment(sourceFile.text, start, width); + const docCommentAndDiagnostics = parseIsolatedJSDocComment(sourceFile.text, start, width); if (docCommentAndDiagnostics && docCommentAndDiagnostics.jsDocComment) { docCommentAndDiagnostics.jsDocComment.parent = token; classifyJSDocComment(docCommentAndDiagnostics.jsDocComment); @@ -6687,7 +6686,7 @@ namespace ts { function classifyJSDocComment(docComment: JSDocComment) { let pos = docComment.pos; - for (let tag of docComment.tags) { + for (const tag of docComment.tags) { // As we walk through each tag, classify the portion of text from the end of // the last tag (or the start of the entire doc comment) as 'comment'. if (tag.pos !== pos) { @@ -6745,7 +6744,7 @@ namespace ts { } function processJSDocTemplateTag(tag: JSDocTemplateTag) { - for (let child of tag.getChildren()) { + for (const child of tag.getChildren()) { processElement(child); } } @@ -6767,11 +6766,11 @@ namespace ts { } function classifyDisabledCodeToken() { - let start = mergeConflictScanner.getTextPos(); - let tokenKind = mergeConflictScanner.scan(); - let end = mergeConflictScanner.getTextPos(); + const start = mergeConflictScanner.getTextPos(); + const tokenKind = mergeConflictScanner.scan(); + const end = mergeConflictScanner.getTextPos(); - let type = classifyTokenType(tokenKind); + const type = classifyTokenType(tokenKind); if (type) { pushClassification(start, end - start, type); } @@ -6782,12 +6781,12 @@ namespace ts { return; } - let tokenStart = classifyLeadingTriviaAndGetTokenStart(token); + const tokenStart = classifyLeadingTriviaAndGetTokenStart(token); - let tokenWidth = token.end - tokenStart; + const tokenWidth = token.end - tokenStart; Debug.assert(tokenWidth >= 0); if (tokenWidth > 0) { - let type = classifyTokenType(token.kind, token); + const type = classifyTokenType(token.kind, token); if (type) { pushClassification(tokenStart, tokenWidth, type); } @@ -6914,9 +6913,9 @@ namespace ts { if (decodedTextSpanIntersectsWith(spanStart, spanLength, element.pos, element.getFullWidth())) { checkForClassificationCancellation(element.kind); - let children = element.getChildren(sourceFile); + const children = element.getChildren(sourceFile); for (let i = 0, n = children.length; i < n; i++) { - let child = children[i]; + const child = children[i]; if (isToken(child)) { classifyToken(child); } @@ -6931,28 +6930,28 @@ namespace ts { function getOutliningSpans(fileName: string): OutliningSpan[] { // doesn't use compiler - no need to synchronize with host - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return OutliningElementsCollector.collectElements(sourceFile); } function getBraceMatchingAtPosition(fileName: string, position: number) { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); - let result: TextSpan[] = []; + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const result: TextSpan[] = []; - let token = getTouchingToken(sourceFile, position); + const token = getTouchingToken(sourceFile, position); if (token.getStart(sourceFile) === position) { - let matchKind = getMatchingTokenKind(token); + const matchKind = getMatchingTokenKind(token); // Ensure that there is a corresponding token to match ours. if (matchKind) { - let parentElement = token.parent; + const parentElement = token.parent; - let childNodes = parentElement.getChildren(sourceFile); - for (let current of childNodes) { + const childNodes = parentElement.getChildren(sourceFile); + for (const current of childNodes) { if (current.kind === matchKind) { - let range1 = createTextSpan(token.getStart(sourceFile), token.getWidth(sourceFile)); - let range2 = createTextSpan(current.getStart(sourceFile), current.getWidth(sourceFile)); + const range1 = createTextSpan(token.getStart(sourceFile), token.getWidth(sourceFile)); + const range2 = createTextSpan(current.getStart(sourceFile), current.getWidth(sourceFile)); // We want to order the braces when we return the result. if (range1.start < range2.start) { @@ -6972,11 +6971,11 @@ namespace ts { function getMatchingTokenKind(token: Node): ts.SyntaxKind { switch (token.kind) { - case ts.SyntaxKind.OpenBraceToken: return ts.SyntaxKind.CloseBraceToken + case ts.SyntaxKind.OpenBraceToken: return ts.SyntaxKind.CloseBraceToken; case ts.SyntaxKind.OpenParenToken: return ts.SyntaxKind.CloseParenToken; case ts.SyntaxKind.OpenBracketToken: return ts.SyntaxKind.CloseBracketToken; case ts.SyntaxKind.LessThanToken: return ts.SyntaxKind.GreaterThanToken; - case ts.SyntaxKind.CloseBraceToken: return ts.SyntaxKind.OpenBraceToken + case ts.SyntaxKind.CloseBraceToken: return ts.SyntaxKind.OpenBraceToken; case ts.SyntaxKind.CloseParenToken: return ts.SyntaxKind.OpenParenToken; case ts.SyntaxKind.CloseBracketToken: return ts.SyntaxKind.OpenBracketToken; case ts.SyntaxKind.GreaterThanToken: return ts.SyntaxKind.LessThanToken; @@ -6988,29 +6987,29 @@ namespace ts { function getIndentationAtPosition(fileName: string, position: number, editorOptions: EditorOptions) { let start = new Date().getTime(); - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); log("getIndentationAtPosition: getCurrentSourceFile: " + (new Date().getTime() - start)); start = new Date().getTime(); - let result = formatting.SmartIndenter.getIndentation(position, sourceFile, editorOptions); + const result = formatting.SmartIndenter.getIndentation(position, sourceFile, editorOptions); log("getIndentationAtPosition: computeIndentation : " + (new Date().getTime() - start)); return result; } function getFormattingEditsForRange(fileName: string, start: number, end: number, options: FormatCodeOptions): TextChange[] { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return formatting.formatSelection(start, end, sourceFile, getRuleProvider(options), options); } function getFormattingEditsForDocument(fileName: string, options: FormatCodeOptions): TextChange[] { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return formatting.formatDocument(sourceFile, getRuleProvider(options), options); } function getFormattingEditsAfterKeystroke(fileName: string, position: number, key: string, options: FormatCodeOptions): TextChange[] { - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); if (key === "}") { return formatting.formatOnClosingCurly(position, sourceFile, getRuleProvider(options), options); @@ -7046,16 +7045,16 @@ namespace ts { * be performed. */ function getDocCommentTemplateAtPosition(fileName: string, position: number): TextInsertion { - let start = new Date().getTime(); - let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + const start = new Date().getTime(); + const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); // Check if in a context where we don't want to perform any insertion if (isInString(sourceFile, position) || isInComment(sourceFile, position) || hasDocComment(sourceFile, position)) { return undefined; } - let tokenAtPos = getTokenAtPosition(sourceFile, position); - let tokenStart = tokenAtPos.getStart() + const tokenAtPos = getTokenAtPosition(sourceFile, position); + const tokenStart = tokenAtPos.getStart(); if (!tokenAtPos || tokenStart < position) { return undefined; } @@ -7091,11 +7090,11 @@ namespace ts { return undefined; } - let parameters = getParametersForJsDocOwningNode(commentOwner); - let posLineAndChar = sourceFile.getLineAndCharacterOfPosition(position); - let lineStart = sourceFile.getLineStarts()[posLineAndChar.line]; + const parameters = getParametersForJsDocOwningNode(commentOwner); + const posLineAndChar = sourceFile.getLineAndCharacterOfPosition(position); + const lineStart = sourceFile.getLineStarts()[posLineAndChar.line]; - let indentationStr = sourceFile.text.substr(lineStart, posLineAndChar.character); + const indentationStr = sourceFile.text.substr(lineStart, posLineAndChar.character); // TODO: call a helper method instead once PR #4133 gets merged in. const newLine = host.getNewLine ? host.getNewLine() : "\r\n"; @@ -7119,7 +7118,7 @@ namespace ts { // * if the caret was directly in front of the object, then we add an extra line and indentation. const preamble = "/**" + newLine + indentationStr + " * "; - let result = + const result = preamble + newLine + docParams + indentationStr + " */" + @@ -7163,7 +7162,7 @@ namespace ts { case SyntaxKind.ArrowFunction: return (rightHandSide).parameters; case SyntaxKind.ClassExpression: - for (let member of (rightHandSide).members) { + for (const member of (rightHandSide).members) { if (member.kind === SyntaxKind.Constructor) { return (member).parameters; } @@ -7183,15 +7182,15 @@ namespace ts { // anything away. synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); + const sourceFile = getValidSourceFile(fileName); cancellationToken.throwIfCancellationRequested(); - let fileContents = sourceFile.text; - let result: TodoComment[] = []; + const fileContents = sourceFile.text; + const result: TodoComment[] = []; if (descriptors.length > 0) { - let regExp = getTodoCommentsRegExp(); + const regExp = getTodoCommentsRegExp(); let matchArray: RegExpExecArray; while (matchArray = regExp.exec(fileContents)) { @@ -7214,15 +7213,15 @@ namespace ts { // // i.e. 'undefined' in position 3 above means TODO(jason) didn't match. // "hack" in position 4 means HACK did match. - let firstDescriptorCaptureIndex = 3; + const firstDescriptorCaptureIndex = 3; Debug.assert(matchArray.length === descriptors.length + firstDescriptorCaptureIndex); - let preamble = matchArray[1]; - let matchPosition = matchArray.index + preamble.length; + const preamble = matchArray[1]; + const matchPosition = matchArray.index + preamble.length; // OK, we have found a match in the file. This is only an acceptable match if // it is contained within a comment. - let token = getTokenAtPosition(sourceFile, matchPosition); + const token = getTokenAtPosition(sourceFile, matchPosition); if (!isInsideComment(sourceFile, token, matchPosition)) { continue; } @@ -7241,7 +7240,7 @@ namespace ts { continue; } - let message = matchArray[2]; + const message = matchArray[2]; result.push({ descriptor: descriptor, message: message, @@ -7272,14 +7271,14 @@ namespace ts { // // The following three regexps are used to match the start of the text up to the TODO // comment portion. - let singleLineCommentStart = /(?:\/\/+\s*)/.source; - let multiLineCommentStart = /(?:\/\*+\s*)/.source; - let anyNumberOfSpacesAndAsterixesAtStartOfLine = /(?:^(?:\s|\*)*)/.source; + const singleLineCommentStart = /(?:\/\/+\s*)/.source; + const multiLineCommentStart = /(?:\/\*+\s*)/.source; + const anyNumberOfSpacesAndAsterixesAtStartOfLine = /(?:^(?:\s|\*)*)/.source; // Match any of the above three TODO comment start regexps. // Note that the outermost group *is* a capture group. We want to capture the preamble // so that we can determine the starting position of the TODO comment match. - let preamble = "(" + anyNumberOfSpacesAndAsterixesAtStartOfLine + "|" + singleLineCommentStart + "|" + multiLineCommentStart + ")"; + const preamble = "(" + anyNumberOfSpacesAndAsterixesAtStartOfLine + "|" + singleLineCommentStart + "|" + multiLineCommentStart + ")"; // Takes the descriptors and forms a regexp that matches them as if they were literals. // For example, if the descriptors are "TODO(jason)" and "HACK", then this will be: @@ -7289,17 +7288,17 @@ namespace ts { // Note that the outermost group is *not* a capture group, but the innermost groups // *are* capture groups. By capturing the inner literals we can determine after // matching which descriptor we are dealing with. - let literals = "(?:" + map(descriptors, d => "(" + escapeRegExp(d.text) + ")").join("|") + ")"; + const literals = "(?:" + map(descriptors, d => "(" + escapeRegExp(d.text) + ")").join("|") + ")"; // After matching a descriptor literal, the following regexp matches the rest of the // text up to the end of the line (or */). - let endOfLineOrEndOfComment = /(?:$|\*\/)/.source - let messageRemainder = /(?:.*?)/.source + const endOfLineOrEndOfComment = /(?:$|\*\/)/.source; + const messageRemainder = /(?:.*?)/.source; // This is the portion of the match we'll return as part of the TODO comment result. We // match the literal portion up to the end of the line or end of comment. - let messagePortion = "(" + literals + messageRemainder + ")"; - let regExpString = preamble + messagePortion + endOfLineOrEndOfComment; + const messagePortion = "(" + literals + messageRemainder + ")"; + const regExpString = preamble + messagePortion + endOfLineOrEndOfComment; // The final regexp will look like this: // /((?:\/\/+\s*)|(?:\/\*+\s*)|(?:^(?:\s|\*)*))((?:(TODO\(jason\))|(HACK))(?:.*?))(?:$|\*\/)/gim @@ -7325,40 +7324,40 @@ namespace ts { function getRenameInfo(fileName: string, position: number): RenameInfo { synchronizeHostData(); - let sourceFile = getValidSourceFile(fileName); - let typeChecker = program.getTypeChecker(); + const sourceFile = getValidSourceFile(fileName); + const typeChecker = program.getTypeChecker(); - let node = getTouchingWord(sourceFile, position); + const node = getTouchingWord(sourceFile, position); // Can only rename an identifier. if (node && node.kind === SyntaxKind.Identifier) { - let symbol = typeChecker.getSymbolAtLocation(node); + const symbol = typeChecker.getSymbolAtLocation(node); // Only allow a symbol to be renamed if it actually has at least one declaration. if (symbol) { - let declarations = symbol.getDeclarations(); + const declarations = symbol.getDeclarations(); if (declarations && declarations.length > 0) { // Disallow rename for elements that are defined in the standard TypeScript library. - let defaultLibFileName = host.getDefaultLibFileName(host.getCompilationSettings()); + const defaultLibFileName = host.getDefaultLibFileName(host.getCompilationSettings()); if (defaultLibFileName) { - for (let current of declarations) { - let sourceFile = current.getSourceFile(); - var canonicalName = getCanonicalFileName(ts.normalizePath(sourceFile.fileName)); + for (const current of declarations) { + const sourceFile = current.getSourceFile(); + const canonicalName = getCanonicalFileName(ts.normalizePath(sourceFile.fileName)); if (sourceFile && getCanonicalFileName(ts.normalizePath(sourceFile.fileName)) === getCanonicalFileName(ts.normalizePath(defaultLibFileName))) { return getRenameInfoError(getLocaleSpecificMessage(Diagnostics.You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library)); } } } - let displayName = stripQuotes(getDeclaredName(typeChecker, symbol, node)); - let kind = getSymbolKind(symbol, node); + const displayName = stripQuotes(getDeclaredName(typeChecker, symbol, node)); + const kind = getSymbolKind(symbol, node); if (kind) { return { canRename: true, - localizedErrorMessage: undefined, + kind, displayName, + localizedErrorMessage: undefined, fullDisplayName: typeChecker.getFullyQualifiedName(symbol), - kind: kind, kindModifiers: getSymbolModifiers(symbol), triggerSpan: createTextSpan(node.getStart(), node.getWidth()) }; @@ -7425,14 +7424,14 @@ namespace ts { /* @internal */ export function getNameTable(sourceFile: SourceFile): Map { if (!sourceFile.nameTable) { - initializeNameTable(sourceFile) + initializeNameTable(sourceFile); } return sourceFile.nameTable; } function initializeNameTable(sourceFile: SourceFile): void { - let nameTable: Map = {}; + const nameTable: Map = {}; walk(sourceFile); sourceFile.nameTable = nameTable; @@ -7470,13 +7469,13 @@ namespace ts { /// Classifier export function createClassifier(): Classifier { - let scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false); + const scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false); /// We do not have a full parser support to know when we should parse a regex or not /// If we consider every slash token to be a regex, we could be missing cases like "1/2/3", where /// we have a series of divide operator. this list allows us to be more accurate by ruling out /// locations where a regexp cannot exist. - let noRegexTable: boolean[] = []; + const noRegexTable: boolean[] = []; noRegexTable[SyntaxKind.Identifier] = true; noRegexTable[SyntaxKind.StringLiteral] = true; noRegexTable[SyntaxKind.NumericLiteral] = true; @@ -7510,7 +7509,7 @@ namespace ts { // // Where on the second line, you will get the 'return' keyword, // a string literal, and a template end consisting of '} } `'. - let templateStack: SyntaxKind[] = []; + const templateStack: SyntaxKind[] = []; /** Returns true if 'keyword2' can legally follow 'keyword1' in any language construct. */ function canFollow(keyword1: SyntaxKind, keyword2: SyntaxKind) { @@ -7536,18 +7535,18 @@ namespace ts { } function convertClassifications(classifications: Classifications, text: string): ClassificationResult { - let entries: ClassificationInfo[] = []; - let dense = classifications.spans; + const entries: ClassificationInfo[] = []; + const dense = classifications.spans; let lastEnd = 0; for (let i = 0, n = dense.length; i < n; i += 3) { - let start = dense[i]; - let length = dense[i + 1]; - let type = dense[i + 2]; + const start = dense[i]; + const length = dense[i + 1]; + const type = dense[i + 2]; // Make a whitespace entry between the last item and this one. if (lastEnd >= 0) { - let whitespaceLength = start - lastEnd; + const whitespaceLength = start - lastEnd; if (whitespaceLength > 0) { entries.push({ length: whitespaceLength, classification: TokenClass.Whitespace }); } @@ -7557,7 +7556,7 @@ namespace ts { lastEnd = start + length; } - let whitespaceLength = text.length - lastEnd; + const whitespaceLength = text.length - lastEnd; if (whitespaceLength > 0) { entries.push({ length: whitespaceLength, classification: TokenClass.Whitespace }); } @@ -7611,7 +7610,7 @@ namespace ts { // (and a newline). That way when we lex we'll think we're still in a multiline comment. switch (lexState) { case EndOfLineState.InDoubleQuoteStringLiteral: - text = '"\\\n' + text; + text = "\"\\\n" + text; offset = 3; break; case EndOfLineState.InSingleQuoteStringLiteral: @@ -7637,7 +7636,7 @@ namespace ts { scanner.setText(text); - let result: Classifications = { + const result: Classifications = { endOfLineState: EndOfLineState.None, spans: [] }; @@ -7719,7 +7718,7 @@ namespace ts { // If we don't have anything on the template stack, // then we aren't trying to keep track of a previously scanned template head. if (templateStack.length > 0) { - let lastTemplateStackToken = lastOrUndefined(templateStack); + const lastTemplateStackToken = lastOrUndefined(templateStack); if (lastTemplateStackToken === SyntaxKind.TemplateHead) { token = scanner.reScanTemplateToken(); @@ -7749,17 +7748,17 @@ namespace ts { return result; function processToken(): void { - let start = scanner.getTokenPos(); - let end = scanner.getTextPos(); + const start = scanner.getTokenPos(); + const end = scanner.getTextPos(); addResult(start, end, classFromKind(token)); if (end >= text.length) { if (token === SyntaxKind.StringLiteral || token === SyntaxKind.StringLiteralType) { // Check to see if we finished up on a multiline string literal. - let tokenText = scanner.getTokenText(); + const tokenText = scanner.getTokenText(); if (scanner.isUnterminated()) { - let lastCharIndex = tokenText.length - 1; + const lastCharIndex = tokenText.length - 1; let numBackslashes = 0; while (tokenText.charCodeAt(lastCharIndex - numBackslashes) === CharacterCodes.backslash) { @@ -7768,7 +7767,7 @@ namespace ts { // If we have an odd number of backslashes, then the multiline string is unclosed if (numBackslashes & 1) { - let quoteChar = tokenText.charCodeAt(0); + const quoteChar = tokenText.charCodeAt(0); result.endOfLineState = quoteChar === CharacterCodes.doubleQuote ? EndOfLineState.InDoubleQuoteStringLiteral : EndOfLineState.InSingleQuoteStringLiteral; @@ -7817,7 +7816,7 @@ namespace ts { // relative to the original text. start -= offset; end -= offset; - let length = end - start; + const length = end - start; if (length > 0) { result.spans.push(start); @@ -7932,7 +7931,7 @@ namespace ts { } /// getDefaultLibraryFilePath - declare let __dirname: string; + declare const __dirname: string; /** * Get the path of the default library files (lib.d.ts) as distributed with the typescript From e3075bab784a6577e354cb96e84f8d061e15a91b Mon Sep 17 00:00:00 2001 From: Yui T Date: Tue, 15 Dec 2015 10:57:56 -0800 Subject: [PATCH 15/61] Revert linting services --- Jakefile.js | 3 +- src/services/services.ts | 1071 +++++++++++++++++++------------------- 2 files changed, 537 insertions(+), 537 deletions(-) diff --git a/Jakefile.js b/Jakefile.js index 91bd805a27b..beb16d2886f 100644 --- a/Jakefile.js +++ b/Jakefile.js @@ -924,8 +924,7 @@ function lintFileAsync(options, path, cb) { var lintTargets = compilerSources .concat(harnessCoreSources) .concat(serverCoreSources) - .concat(scriptSources) - .concat([path.join(servicesDirectory,"services.ts")]); + .concat(scriptSources); desc("Runs tslint on the compiler sources"); task("lint", ["build-rules"], function() { diff --git a/src/services/services.ts b/src/services/services.ts index 4109a4eb345..8e2e4913edd 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -12,7 +12,7 @@ namespace ts { /** The version of the language service API */ - export const servicesVersion = "0.4"; + export let servicesVersion = "0.4" export interface Node { getSourceFile(): SourceFile; @@ -48,7 +48,7 @@ namespace ts { getConstructSignatures(): Signature[]; getStringIndexType(): Type; getNumberIndexType(): Type; - getBaseTypes(): ObjectType[]; + getBaseTypes(): ObjectType[] } export interface Signature { @@ -97,7 +97,7 @@ namespace ts { dispose?(): void; } - export namespace ScriptSnapshot { + export module ScriptSnapshot { class StringScriptSnapshot implements IScriptSnapshot { constructor(private text: string) { @@ -126,12 +126,12 @@ namespace ts { referencedFiles: FileReference[]; importedFiles: FileReference[]; ambientExternalModules: string[]; - isLibFile: boolean; + isLibFile: boolean } - const scanner: Scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ true); + let scanner: Scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ true); - const emptyArray: any[] = []; + let emptyArray: any[] = []; const jsDocTagNames = [ "augments", @@ -174,7 +174,7 @@ namespace ts { let jsDocCompletionEntries: CompletionEntry[]; function createNode(kind: SyntaxKind, pos: number, end: number, flags: NodeFlags, parent?: Node): NodeObject { - const node = new NodeObject(kind, pos, end); + let node = new NodeObject(kind, pos, end); node.flags = flags; node.parent = parent; return node; @@ -235,8 +235,8 @@ namespace ts { private addSyntheticNodes(nodes: Node[], pos: number, end: number): number { scanner.setTextPos(pos); while (pos < end) { - const token = scanner.scan(); - const textPos = scanner.getTextPos(); + let token = scanner.scan(); + let textPos = scanner.getTextPos(); nodes.push(createNode(token, pos, textPos, NodeFlags.Synthetic, this)); pos = textPos; } @@ -244,11 +244,13 @@ namespace ts { } private createSyntaxList(nodes: NodeArray): Node { - const list = createNode(SyntaxKind.SyntaxList, nodes.pos, nodes.end, NodeFlags.Synthetic, this); + let list = createNode(SyntaxKind.SyntaxList, nodes.pos, nodes.end, NodeFlags.Synthetic, this); list._children = []; let pos = nodes.pos; - for (const node of nodes) { + + + for (let node of nodes) { if (pos < node.pos) { pos = this.addSyntheticNodes(list._children, pos, node.pos); } @@ -267,14 +269,14 @@ namespace ts { scanner.setText((sourceFile || this.getSourceFile()).text); children = []; let pos = this.pos; - const processNode = (node: Node) => { + let processNode = (node: Node) => { if (pos < node.pos) { pos = this.addSyntheticNodes(children, pos, node.pos); } children.push(node); pos = node.end; }; - const processNodes = (nodes: NodeArray) => { + let processNodes = (nodes: NodeArray) => { if (pos < nodes.pos) { pos = this.addSyntheticNodes(children, pos, nodes.pos); } @@ -306,20 +308,20 @@ namespace ts { } public getFirstToken(sourceFile?: SourceFile): Node { - const children = this.getChildren(sourceFile); + let children = this.getChildren(sourceFile); if (!children.length) { return undefined; } - const child = children[0]; + let child = children[0]; return child.kind < SyntaxKind.FirstNode ? child : child.getFirstToken(sourceFile); } public getLastToken(sourceFile?: SourceFile): Node { - const children = this.getChildren(sourceFile); + let children = this.getChildren(sourceFile); - const child = lastOrUndefined(children); + let child = lastOrUndefined(children); if (!child) { return undefined; } @@ -364,8 +366,8 @@ namespace ts { } function getJsDocCommentsFromDeclarations(declarations: Declaration[], name: string, canUseParsedParamTagComments: boolean) { - const documentationComment = []; - const docComments = getJsDocCommentsSeparatedByNewLines(); + let documentationComment = []; + let docComments = getJsDocCommentsSeparatedByNewLines(); ts.forEach(docComments, docComment => { if (documentationComment.length) { documentationComment.push(lineBreakPart()); @@ -376,22 +378,22 @@ namespace ts { return documentationComment; function getJsDocCommentsSeparatedByNewLines() { - const paramTag = "@param"; - const jsDocCommentParts: SymbolDisplayPart[] = []; + let paramTag = "@param"; + let jsDocCommentParts: SymbolDisplayPart[] = []; ts.forEach(declarations, (declaration, indexOfDeclaration) => { // Make sure we are collecting doc comment from declaration once, // In case of union property there might be same declaration multiple times // which only varies in type parameter - // Eg. const a: Array | Array; a.length + // Eg. let a: Array | Array; a.length // The property length will have two declarations of property length coming // from Array - Array and Array if (indexOf(declarations, declaration) === indexOfDeclaration) { - const sourceFileOfDeclaration = getSourceFileOfNode(declaration); + let sourceFileOfDeclaration = getSourceFileOfNode(declaration); // If it is parameter - try and get the jsDoc comment with @param tag from function declaration's jsDoc comments if (canUseParsedParamTagComments && declaration.kind === SyntaxKind.Parameter) { ts.forEach(getJsDocCommentTextRange(declaration.parent, sourceFileOfDeclaration), jsDocCommentTextRange => { - const cleanedParamJsDocComment = getCleanedParamJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); + let cleanedParamJsDocComment = getCleanedParamJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); if (cleanedParamJsDocComment) { addRange(jsDocCommentParts, cleanedParamJsDocComment); } @@ -411,7 +413,7 @@ namespace ts { // Get the cleaned js doc comment text from the declaration ts.forEach(getJsDocCommentTextRange( declaration.kind === SyntaxKind.VariableDeclaration ? declaration.parent.parent : declaration, sourceFileOfDeclaration), jsDocCommentTextRange => { - const cleanedJsDocComment = getCleanedJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); + let cleanedJsDocComment = getCleanedJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); if (cleanedJsDocComment) { addRange(jsDocCommentParts, cleanedJsDocComment); } @@ -437,7 +439,7 @@ namespace ts { } for (; pos < end; pos++) { - const ch = sourceFile.text.charCodeAt(pos); + let ch = sourceFile.text.charCodeAt(pos); if (!isWhiteSpace(ch) || isLineBreak(ch)) { // Either found lineBreak or non whiteSpace return pos; @@ -478,7 +480,7 @@ namespace ts { function getCleanedJsDocComment(pos: number, end: number, sourceFile: SourceFile) { let spacesToRemoveAfterAsterisk: number; - const docComments: SymbolDisplayPart[] = []; + let docComments: SymbolDisplayPart[] = []; let blankLineCount = 0; let isInParamTag = false; @@ -489,7 +491,7 @@ namespace ts { // If the comment starts with '*' consume the spaces on this line if (pos < end && sourceFile.text.charCodeAt(pos) === CharacterCodes.asterisk) { - const lineStartPos = pos + 1; + let lineStartPos = pos + 1; pos = consumeWhiteSpacesOnTheLine(pos + 1, end, sourceFile, spacesToRemoveAfterAsterisk); // Set the spaces to remove after asterisk as margin if not already set @@ -503,7 +505,7 @@ namespace ts { // Analyse text on this line while (pos < end && !isLineBreak(sourceFile.text.charCodeAt(pos))) { - const ch = sourceFile.text.charAt(pos); + let ch = sourceFile.text.charAt(pos); if (ch === "@") { // If it is @param tag if (isParamTag(pos, end, sourceFile)) { @@ -542,7 +544,7 @@ namespace ts { function getCleanedParamJsDocComment(pos: number, end: number, sourceFile: SourceFile) { let paramHelpStringMargin: number; - const paramDocComments: SymbolDisplayPart[] = []; + let paramDocComments: SymbolDisplayPart[] = []; while (pos < end) { if (isParamTag(pos, end, sourceFile)) { let blankLineCount = 0; @@ -557,7 +559,7 @@ namespace ts { if (sourceFile.text.charCodeAt(pos) === CharacterCodes.openBrace) { pos++; for (let curlies = 1; pos < end; pos++) { - const charCode = sourceFile.text.charCodeAt(pos); + let charCode = sourceFile.text.charCodeAt(pos); // { character means we need to find another } to match the found one if (charCode === CharacterCodes.openBrace) { @@ -601,9 +603,9 @@ namespace ts { } let paramHelpString = ""; - const firstLineParamHelpStringPos = pos; + let firstLineParamHelpStringPos = pos; while (pos < end) { - const ch = sourceFile.text.charCodeAt(pos); + let ch = sourceFile.text.charCodeAt(pos); // at line break, set this comment line text and go to next line if (isLineBreak(ch)) { @@ -672,15 +674,15 @@ namespace ts { } // Now consume white spaces max - const startOfLinePos = pos; + let startOfLinePos = pos; pos = consumeWhiteSpacesOnTheLine(pos, end, sourceFile, paramHelpStringMargin); if (pos >= end) { return; } - const consumedSpaces = pos - startOfLinePos; + let consumedSpaces = pos - startOfLinePos; if (consumedSpaces < paramHelpStringMargin) { - const ch = sourceFile.text.charCodeAt(pos); + let ch = sourceFile.text.charCodeAt(pos); if (ch === CharacterCodes.asterisk) { // Consume more spaces after asterisk pos = consumeWhiteSpacesOnTheLine(pos + 1, end, sourceFile, paramHelpStringMargin - consumedSpaces - 1); @@ -813,7 +815,7 @@ namespace ts { private namedDeclarations: Map; constructor(kind: SyntaxKind, pos: number, end: number) { - super(kind, pos, end); + super(kind, pos, end) } public update(newText: string, textChangeRange: TextChangeRange): SourceFile { @@ -841,16 +843,16 @@ namespace ts { } private computeNamedDeclarations(): Map { - const result: Map = {}; + let result: Map = {}; forEachChild(this, visit); return result; function addDeclaration(declaration: Declaration) { - const name = getDeclarationName(declaration); + let name = getDeclarationName(declaration); if (name) { - const declarations = getDeclarations(name); + let declarations = getDeclarations(name); declarations.push(declaration); } } @@ -861,13 +863,13 @@ namespace ts { function getDeclarationName(declaration: Declaration) { if (declaration.name) { - const result = getTextOfIdentifierOrLiteral(declaration.name); + let result = getTextOfIdentifierOrLiteral(declaration.name); if (result !== undefined) { return result; } if (declaration.name.kind === SyntaxKind.ComputedPropertyName) { - const expr = (declaration.name).expression; + let expr = (declaration.name).expression; if (expr.kind === SyntaxKind.PropertyAccessExpression) { return (expr).name.text; } @@ -897,12 +899,12 @@ namespace ts { case SyntaxKind.FunctionDeclaration: case SyntaxKind.MethodDeclaration: case SyntaxKind.MethodSignature: - const functionDeclaration = node; - const declarationName = getDeclarationName(functionDeclaration); + let functionDeclaration = node; + let declarationName = getDeclarationName(functionDeclaration); if (declarationName) { - const declarations = getDeclarations(declarationName); - const lastDeclaration = lastOrUndefined(declarations); + let declarations = getDeclarations(declarationName); + let lastDeclaration = lastOrUndefined(declarations); // Check whether this declaration belongs to an "overload group". if (lastDeclaration && functionDeclaration.parent === lastDeclaration.parent && functionDeclaration.symbol === lastDeclaration.symbol) { @@ -978,7 +980,7 @@ namespace ts { break; case SyntaxKind.ImportDeclaration: - const importClause = (node).importClause; + let importClause = (node).importClause; if (importClause) { // Handle default import case e.g.: // import d from "mod"; @@ -1111,8 +1113,8 @@ namespace ts { } export interface Classifications { - spans: number[]; - endOfLineState: EndOfLineState; + spans: number[], + endOfLineState: EndOfLineState } export interface ClassifiedSpan { @@ -1169,7 +1171,7 @@ namespace ts { highlightSpans: HighlightSpan[]; } - export namespace HighlightSpanKind { + export module HighlightSpanKind { export const none = "none"; export const definition = "definition"; export const reference = "reference"; @@ -1218,7 +1220,7 @@ namespace ts { InsertSpaceAfterOpeningAndBeforeClosingNonemptyBrackets: boolean; PlaceOpenBraceOnNewLineForFunctions: boolean; PlaceOpenBraceOnNewLineForControlBlocks: boolean; - [s: string]: boolean | number | string; + [s: string]: boolean | number| string; } export interface DefinitionInfo { @@ -1498,7 +1500,7 @@ namespace ts { } // TODO: move these to enums - export namespace ScriptElementKind { + export module ScriptElementKind { export const unknown = ""; export const warning = "warning"; @@ -1527,7 +1529,7 @@ namespace ts { export const enumElement = "enum"; // Inside module and script only - // const v = .. + // let v = .. export const variableElement = "var"; // Inside function @@ -1579,7 +1581,7 @@ namespace ts { export const letElement = "let"; } - export namespace ScriptElementKindModifier { + export module ScriptElementKindModifier { export const none = ""; export const publicMemberModifier = "public"; export const privateMemberModifier = "private"; @@ -1721,8 +1723,8 @@ namespace ts { this.fileNameToEntry = createFileMap(); // Initialize the list with the root file names - const rootFileNames = host.getScriptFileNames(); - for (const fileName of rootFileNames) { + let rootFileNames = host.getScriptFileNames(); + for (let fileName of rootFileNames) { this.createEntry(fileName, toPath(fileName, this.currentDirectory, getCanonicalFileName)); } @@ -1736,7 +1738,7 @@ namespace ts { private createEntry(fileName: string, path: Path) { let entry: HostFileInformation; - const scriptSnapshot = this.host.getScriptSnapshot(fileName); + let scriptSnapshot = this.host.getScriptSnapshot(fileName); if (scriptSnapshot) { entry = { hostFileName: fileName, @@ -1758,7 +1760,7 @@ namespace ts { } public getOrCreateEntry(fileName: string): HostFileInformation { - const path = toPath(fileName, this.currentDirectory, this.getCanonicalFileName); + let path = toPath(fileName, this.currentDirectory, this.getCanonicalFileName) if (this.contains(path)) { return this.getEntry(path); } @@ -1767,7 +1769,7 @@ namespace ts { } public getRootFileNames(): string[] { - const fileNames: string[] = []; + let fileNames: string[] = []; this.fileNameToEntry.forEachValue((path, value) => { if (value) { @@ -1779,12 +1781,12 @@ namespace ts { } public getVersion(path: Path): string { - const file = this.getEntry(path); + let file = this.getEntry(path); return file && file.version; } public getScriptSnapshot(path: Path): IScriptSnapshot { - const file = this.getEntry(path); + let file = this.getEntry(path); return file && file.scriptSnapshot; } } @@ -1801,22 +1803,22 @@ namespace ts { } public getCurrentSourceFile(fileName: string): SourceFile { - const scriptSnapshot = this.host.getScriptSnapshot(fileName); + let scriptSnapshot = this.host.getScriptSnapshot(fileName); if (!scriptSnapshot) { // The host does not know about this file. throw new Error("Could not find file: '" + fileName + "'."); } - const version = this.host.getScriptVersion(fileName); + let version = this.host.getScriptVersion(fileName); let sourceFile: SourceFile; if (this.currentFileName !== fileName) { // This is a new file, just parse it - sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, ScriptTarget.Latest, version, /*setNodeParents*/ true); + sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, ScriptTarget.Latest, version, /*setNodeParents:*/ true); } else if (this.currentFileVersion !== version) { // This is the same file, just a newer version. Incrementally parse the file. - const editRange = scriptSnapshot.getChangeRange(this.currentFileScriptSnapshot); + let editRange = scriptSnapshot.getChangeRange(this.currentFileScriptSnapshot); sourceFile = updateLanguageServiceSourceFile(this.currentSourceFile, scriptSnapshot, version, editRange); } @@ -1861,7 +1863,7 @@ namespace ts { * - noResolve = true */ export function transpileModule(input: string, transpileOptions: TranspileOptions): TranspileOutput { - const options = transpileOptions.compilerOptions ? clone(transpileOptions.compilerOptions) : getDefaultCompilerOptions(); + let options = transpileOptions.compilerOptions ? clone(transpileOptions.compilerOptions) : getDefaultCompilerOptions(); options.isolatedModules = true; @@ -1877,22 +1879,21 @@ namespace ts { options.noResolve = true; // if jsx is specified then treat file as .tsx - const inputFileName = transpileOptions.fileName || (options.jsx ? "module.tsx" : "module.ts"); - const sourceFile = createSourceFile(inputFileName, input, options.target); + let inputFileName = transpileOptions.fileName || (options.jsx ? "module.tsx" : "module.ts"); + let sourceFile = createSourceFile(inputFileName, input, options.target); if (transpileOptions.moduleName) { sourceFile.moduleName = transpileOptions.moduleName; } sourceFile.renamedDependencies = transpileOptions.renamedDependencies; - const newLine = getNewLineCharacter(options); + let newLine = getNewLineCharacter(options); // Output let outputText: string; let sourceMapText: string; - // Create a compilerHost object to allow the compiler to read and write files - const compilerHost: CompilerHost = { + let compilerHost: CompilerHost = { getSourceFile: (fileName, target) => fileName === normalizeSlashes(inputFileName) ? sourceFile : undefined, writeFile: (name, text, writeByteOrderMark) => { if (fileExtensionIs(name, ".map")) { @@ -1913,7 +1914,7 @@ namespace ts { readFile: (fileName): string => "" }; - const program = createProgram([inputFileName], options, compilerHost); + let program = createProgram([inputFileName], options, compilerHost); let diagnostics: Diagnostic[]; if (transpileOptions.reportDiagnostics) { @@ -1933,15 +1934,15 @@ namespace ts { * This is a shortcut function for transpileModule - it accepts transpileOptions as parameters and returns only outputText part of the result. */ export function transpile(input: string, compilerOptions?: CompilerOptions, fileName?: string, diagnostics?: Diagnostic[], moduleName?: string): string { - const output = transpileModule(input, { compilerOptions, fileName, reportDiagnostics: !!diagnostics, moduleName }); + let output = transpileModule(input, { compilerOptions, fileName, reportDiagnostics: !!diagnostics, moduleName }); // addRange correctly handles cases when wither 'from' or 'to' argument is missing addRange(diagnostics, output.diagnostics); return output.outputText; } export function createLanguageServiceSourceFile(fileName: string, scriptSnapshot: IScriptSnapshot, scriptTarget: ScriptTarget, version: string, setNodeParents: boolean): SourceFile { - const text = scriptSnapshot.getText(0, scriptSnapshot.getLength()); - const sourceFile = createSourceFile(fileName, text, scriptTarget, setNodeParents); + let text = scriptSnapshot.getText(0, scriptSnapshot.getLength()); + let sourceFile = createSourceFile(fileName, text, scriptTarget, setNodeParents); setSourceFileFields(sourceFile, scriptSnapshot, version); // after full parsing we can use table with interned strings as name table sourceFile.nameTable = sourceFile.identifiers; @@ -1960,12 +1961,12 @@ namespace ts { let newText: string; // grab the fragment from the beginning of the original text to the beginning of the span - const prefix = textChangeRange.span.start !== 0 + let prefix = textChangeRange.span.start !== 0 ? sourceFile.text.substr(0, textChangeRange.span.start) : ""; // grab the fragment from the end of the span till the end of the original text - const suffix = textSpanEnd(textChangeRange.span) !== sourceFile.text.length + let suffix = textSpanEnd(textChangeRange.span) !== sourceFile.text.length ? sourceFile.text.substr(textSpanEnd(textChangeRange.span)) : ""; @@ -1975,7 +1976,7 @@ namespace ts { } else { // it was actual edit, fetch the fragment of new text that correspond to new span - const changedText = scriptSnapshot.getText(textChangeRange.span.start, textChangeRange.span.start + textChangeRange.newLength); + let changedText = scriptSnapshot.getText(textChangeRange.span.start, textChangeRange.span.start + textChangeRange.newLength); // combine prefix, changed text and suffix newText = prefix && suffix ? prefix + changedText + suffix @@ -1984,7 +1985,7 @@ namespace ts { : (changedText + suffix); } - const newSourceFile = updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks); + let newSourceFile = updateSourceFile(sourceFile, newText, textChangeRange, aggressiveChecks); setSourceFileFields(newSourceFile, scriptSnapshot, version); // after incremental parsing nameTable might not be up-to-date // drop it so it can be lazily recreated later @@ -2005,7 +2006,7 @@ namespace ts { } // Otherwise, just create a new source file. - return createLanguageServiceSourceFile(sourceFile.fileName, scriptSnapshot, sourceFile.languageVersion, version, /*setNodeParents*/ true); + return createLanguageServiceSourceFile(sourceFile.fileName, scriptSnapshot, sourceFile.languageVersion, version, /*setNodeParents:*/ true); } export function createGetCanonicalFileName(useCaseSensitivefileNames: boolean): (fileName: string) => string { @@ -2018,15 +2019,15 @@ namespace ts { export function createDocumentRegistry(useCaseSensitiveFileNames?: boolean, currentDirectory = ""): DocumentRegistry { // Maps from compiler setting target (ES3, ES5, etc.) to all the cached documents we have // for those settings. - const buckets: Map> = {}; - const getCanonicalFileName = createGetCanonicalFileName(!!useCaseSensitiveFileNames); + let buckets: Map> = {}; + let getCanonicalFileName = createGetCanonicalFileName(!!useCaseSensitiveFileNames); function getKeyFromCompilationSettings(settings: CompilerOptions): string { return "_" + settings.target + "|" + settings.module + "|" + settings.noResolve + "|" + settings.jsx + +"|" + settings.allowJs; } function getBucketForCompilationSettings(settings: CompilerOptions, createIfMissing: boolean): FileMap { - const key = getKeyFromCompilationSettings(settings); + let key = getKeyFromCompilationSettings(settings); let bucket = lookUp(buckets, key); if (!bucket && createIfMissing) { buckets[key] = bucket = createFileMap(); @@ -2035,9 +2036,9 @@ namespace ts { } function reportStats() { - const bucketInfoArray = Object.keys(buckets).filter(name => name && name.charAt(0) === "_").map(name => { - const entries = lookUp(buckets, name); - const sourceFiles: { name: string; refCount: number; references: string[]; }[] = []; + let bucketInfoArray = Object.keys(buckets).filter(name => name && name.charAt(0) === '_').map(name => { + let entries = lookUp(buckets, name); + let sourceFiles: { name: string; refCount: number; references: string[]; }[] = []; entries.forEachValue((key, entry) => { sourceFiles.push({ name: key, @@ -2051,15 +2052,15 @@ namespace ts { sourceFiles }; }); - return JSON.stringify(bucketInfoArray, undefined, 2); + return JSON.stringify(bucketInfoArray, null, 2); } function acquireDocument(fileName: string, compilationSettings: CompilerOptions, scriptSnapshot: IScriptSnapshot, version: string): SourceFile { - return acquireOrUpdateDocument(fileName, compilationSettings, scriptSnapshot, version, /*acquiring*/ true); + return acquireOrUpdateDocument(fileName, compilationSettings, scriptSnapshot, version, /*acquiring:*/ true); } function updateDocument(fileName: string, compilationSettings: CompilerOptions, scriptSnapshot: IScriptSnapshot, version: string): SourceFile { - return acquireOrUpdateDocument(fileName, compilationSettings, scriptSnapshot, version, /*acquiring*/ false); + return acquireOrUpdateDocument(fileName, compilationSettings, scriptSnapshot, version, /*acquiring:*/ false); } function acquireOrUpdateDocument( @@ -2069,14 +2070,14 @@ namespace ts { version: string, acquiring: boolean): SourceFile { - const bucket = getBucketForCompilationSettings(compilationSettings, /*createIfMissing*/ true); - const path = toPath(fileName, currentDirectory, getCanonicalFileName); + let bucket = getBucketForCompilationSettings(compilationSettings, /*createIfMissing*/ true); + let path = toPath(fileName, currentDirectory, getCanonicalFileName); let entry = bucket.get(path); if (!entry) { Debug.assert(acquiring, "How could we be trying to update a document that the registry doesn't have?"); // Have never seen this file with these settings. Create a new source file for it. - const sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, compilationSettings.target, version, /*setNodeParents*/ false); + let sourceFile = createLanguageServiceSourceFile(fileName, scriptSnapshot, compilationSettings.target, version, /*setNodeParents:*/ false); entry = { sourceFile: sourceFile, @@ -2108,12 +2109,12 @@ namespace ts { } function releaseDocument(fileName: string, compilationSettings: CompilerOptions): void { - const bucket = getBucketForCompilationSettings(compilationSettings, /*createIfMissing*/false); + let bucket = getBucketForCompilationSettings(compilationSettings, false); Debug.assert(bucket !== undefined); - const path = toPath(fileName, currentDirectory, getCanonicalFileName); + let path = toPath(fileName, currentDirectory, getCanonicalFileName); - const entry = bucket.get(path); + let entry = bucket.get(path); entry.languageServiceRefCount--; Debug.assert(entry.languageServiceRefCount >= 0); @@ -2131,19 +2132,19 @@ namespace ts { } export function preProcessFile(sourceText: string, readImportFiles = true, detectJavaScriptImports = false): PreProcessedFileInfo { - const referencedFiles: FileReference[] = []; - const importedFiles: FileReference[] = []; + let referencedFiles: FileReference[] = []; + let importedFiles: FileReference[] = []; let ambientExternalModules: string[]; let isNoDefaultLib = false; function processTripleSlashDirectives(): void { - const commentRanges = getLeadingCommentRanges(sourceText, 0); + let commentRanges = getLeadingCommentRanges(sourceText, 0); forEach(commentRanges, commentRange => { - const comment = sourceText.substring(commentRange.pos, commentRange.end); - const referencePathMatchResult = getFileReferenceFromReferencePath(comment, commentRange); + let comment = sourceText.substring(commentRange.pos, commentRange.end); + let referencePathMatchResult = getFileReferenceFromReferencePath(comment, commentRange); if (referencePathMatchResult) { isNoDefaultLib = referencePathMatchResult.isNoDefaultLib; - const fileReference = referencePathMatchResult.fileReference; + let fileReference = referencePathMatchResult.fileReference; if (fileReference) { referencedFiles.push(fileReference); } @@ -2159,8 +2160,8 @@ namespace ts { } function recordModuleName() { - const importPath = scanner.getTokenValue(); - const pos = scanner.getTokenPos(); + let importPath = scanner.getTokenValue(); + let pos = scanner.getTokenPos(); importedFiles.push({ fileName: importPath, pos: pos, @@ -2212,7 +2213,7 @@ namespace ts { } } else if (token === SyntaxKind.EqualsToken) { - if (tryConsumeRequireCall(/*skipCurrentToken*/ true)) { + if (tryConsumeRequireCall(/* skipCurrentToken */ true)) { return true; } } @@ -2310,7 +2311,7 @@ namespace ts { if (token === SyntaxKind.Identifier || isKeyword(token)) { token = scanner.scan(); if (token === SyntaxKind.EqualsToken) { - if (tryConsumeRequireCall(/*skipCurrentToken*/ true)) { + if (tryConsumeRequireCall(/* skipCurrentToken */ true)) { return true; } } @@ -2409,7 +2410,7 @@ namespace ts { if (tryConsumeDeclare() || tryConsumeImport() || tryConsumeExport() || - (detectJavaScriptImports && (tryConsumeRequireCall(/*skipCurrentToken*/ false) || tryConsumeDefine()))) { + (detectJavaScriptImports && (tryConsumeRequireCall(/* skipCurrentToken */ false) || tryConsumeDefine()))) { continue; } else { @@ -2549,8 +2550,8 @@ namespace ts { return true; } else if (position === comment.end) { - const text = sourceFile.text; - const width = comment.end - comment.pos; + let text = sourceFile.text; + let width = comment.end - comment.pos; // is single line comment or just /* if (width <= 2 || text.charCodeAt(comment.pos + 1) === CharacterCodes.slash) { return true; @@ -2582,7 +2583,7 @@ namespace ts { } // A cache of completion entries for keywords, these do not change between sessions - const keywordCompletions: CompletionEntry[] = []; + let keywordCompletions: CompletionEntry[] = []; for (let i = SyntaxKind.FirstKeyword; i <= SyntaxKind.LastKeyword; i++) { keywordCompletions.push({ name: tokenToString(i), @@ -2672,15 +2673,15 @@ namespace ts { export function createLanguageService(host: LanguageServiceHost, documentRegistry: DocumentRegistry = createDocumentRegistry(host.useCaseSensitiveFileNames && host.useCaseSensitiveFileNames(), host.getCurrentDirectory())): LanguageService { - const syntaxTreeCache: SyntaxTreeCache = new SyntaxTreeCache(host); + let syntaxTreeCache: SyntaxTreeCache = new SyntaxTreeCache(host); let ruleProvider: formatting.RulesProvider; let program: Program; let lastProjectVersion: string; - const useCaseSensitivefileNames = false; - const cancellationToken = new CancellationTokenObject(host.getCancellationToken && host.getCancellationToken()); + let useCaseSensitivefileNames = false; + let cancellationToken = new CancellationTokenObject(host.getCancellationToken && host.getCancellationToken()); - const currentDirectory = host.getCurrentDirectory(); + let currentDirectory = host.getCurrentDirectory(); // Check if the localized messages json is set, otherwise query the host for it if (!localizedDiagnosticMessages && host.getLocalizedDiagnosticMessages) { localizedDiagnosticMessages = host.getLocalizedDiagnosticMessages(); @@ -2692,10 +2693,10 @@ namespace ts { } } - const getCanonicalFileName = createGetCanonicalFileName(useCaseSensitivefileNames); + let getCanonicalFileName = createGetCanonicalFileName(useCaseSensitivefileNames); function getValidSourceFile(fileName: string): SourceFile { - const sourceFile = program.getSourceFile(fileName); + let sourceFile = program.getSourceFile(fileName); if (!sourceFile) { throw new Error("Could not find file: '" + fileName + "'."); } @@ -2715,7 +2716,7 @@ namespace ts { function synchronizeHostData(): void { // perform fast check if host supports it if (host.getProjectVersion) { - const hostProjectVersion = host.getProjectVersion(); + let hostProjectVersion = host.getProjectVersion(); if (hostProjectVersion) { if (lastProjectVersion === hostProjectVersion) { return; @@ -2739,17 +2740,17 @@ namespace ts { // the program points to old source files that have been invalidated because of // incremental parsing. - const oldSettings = program && program.getCompilerOptions(); - const newSettings = hostCache.compilationSettings(); - const changesInCompilationSettingsAffectSyntax = oldSettings && + let oldSettings = program && program.getCompilerOptions(); + let newSettings = hostCache.compilationSettings(); + let changesInCompilationSettingsAffectSyntax = oldSettings && (oldSettings.target !== newSettings.target || oldSettings.module !== newSettings.module || oldSettings.noResolve !== newSettings.noResolve || - oldSettings.jsx !== newSettings.jsx || + oldSettings.jsx !== newSettings.jsx || oldSettings.allowJs !== newSettings.allowJs); // Now create a new compiler - const compilerHost: CompilerHost = { + let compilerHost: CompilerHost = { getSourceFile: getOrCreateSourceFile, getCancellationToken: () => cancellationToken, getCanonicalFileName, @@ -2765,22 +2766,22 @@ namespace ts { }, readFile: (fileName): string => { // stub missing host functionality - const entry = hostCache.getOrCreateEntry(fileName); + let entry = hostCache.getOrCreateEntry(fileName); return entry && entry.scriptSnapshot.getText(0, entry.scriptSnapshot.getLength()); } }; if (host.resolveModuleNames) { - compilerHost.resolveModuleNames = (moduleNames, containingFile) => host.resolveModuleNames(moduleNames, containingFile); + compilerHost.resolveModuleNames = (moduleNames, containingFile) => host.resolveModuleNames(moduleNames, containingFile) } - const newProgram = createProgram(hostCache.getRootFileNames(), newSettings, compilerHost, program); + let newProgram = createProgram(hostCache.getRootFileNames(), newSettings, compilerHost, program); // Release any files we have acquired in the old program but are // not part of the new program. if (program) { - const oldSourceFiles = program.getSourceFiles(); - for (const oldSourceFile of oldSourceFiles) { + let oldSourceFiles = program.getSourceFiles(); + for (let oldSourceFile of oldSourceFiles) { if (!newProgram.getSourceFile(oldSourceFile.fileName) || changesInCompilationSettingsAffectSyntax) { documentRegistry.releaseDocument(oldSourceFile.fileName, oldSettings); } @@ -2803,7 +2804,7 @@ namespace ts { // The program is asking for this file, check first if the host can locate it. // If the host can not locate the file, then it does not exist. return undefined // to the program to allow reporting of errors for missing files. - const hostFileInformation = hostCache.getOrCreateEntry(fileName); + let hostFileInformation = hostCache.getOrCreateEntry(fileName); if (!hostFileInformation) { return undefined; } @@ -2813,7 +2814,7 @@ namespace ts { // can not be reused. we have to dump all syntax trees and create new ones. if (!changesInCompilationSettingsAffectSyntax) { // Check if the old program had this file already - const oldSourceFile = program && program.getSourceFile(fileName); + let oldSourceFile = program && program.getSourceFile(fileName); if (oldSourceFile) { // We already had a source file for this file name. Go to the registry to // ensure that we get the right up to date version of it. We need this to @@ -2850,7 +2851,7 @@ namespace ts { if (!sourceFile) { return false; } - const path = sourceFile.path || toPath(sourceFile.fileName, currentDirectory, getCanonicalFileName); + let path = sourceFile.path || toPath(sourceFile.fileName, currentDirectory, getCanonicalFileName); return sourceFile.version === hostCache.getVersion(path); } @@ -2861,13 +2862,13 @@ namespace ts { } // If number of files in the program do not match, it is not up-to-date - const rootFileNames = hostCache.getRootFileNames(); + let rootFileNames = hostCache.getRootFileNames(); if (program.getSourceFiles().length !== rootFileNames.length) { return false; } // If any file is not up-to-date, then the whole program is not up-to-date - for (const fileName of rootFileNames) { + for (let fileName of rootFileNames) { if (!sourceFileUpToDate(program.getSourceFile(fileName))) { return false; } @@ -2909,18 +2910,18 @@ namespace ts { function getSemanticDiagnostics(fileName: string): Diagnostic[] { synchronizeHostData(); - const targetSourceFile = getValidSourceFile(fileName); + let targetSourceFile = getValidSourceFile(fileName); // Only perform the action per file regardless of '-out' flag as LanguageServiceHost is expected to call this function per file. // Therefore only get diagnostics for given file. - const semanticDiagnostics = program.getSemanticDiagnostics(targetSourceFile, cancellationToken); + let semanticDiagnostics = program.getSemanticDiagnostics(targetSourceFile, cancellationToken); if (!program.getCompilerOptions().declaration) { return semanticDiagnostics; } // If '-d' is enabled, check for emitter error. One example of emitter error is export class implements non-export interface - const declarationDiagnostics = program.getDeclarationDiagnostics(targetSourceFile, cancellationToken); + let declarationDiagnostics = program.getDeclarationDiagnostics(targetSourceFile, cancellationToken); return concatenate(semanticDiagnostics, declarationDiagnostics); } @@ -2936,14 +2937,14 @@ namespace ts { * @return undefined if the name is of external module otherwise a name with striped of any quote */ function getCompletionEntryDisplayNameForSymbol(symbol: Symbol, target: ScriptTarget, performCharacterChecks: boolean, location: Node): string { - const displayName: string = getDeclaredName(program.getTypeChecker(), symbol, location); + let displayName: string = getDeclaredName(program.getTypeChecker(), symbol, location); if (displayName) { - const firstCharCode = displayName.charCodeAt(0); + let firstCharCode = displayName.charCodeAt(0); // First check of the displayName is not external module; if it is an external module, it is not valid entry if ((symbol.flags & SymbolFlags.Namespace) && (firstCharCode === CharacterCodes.singleQuote || firstCharCode === CharacterCodes.doubleQuote)) { // If the symbol is external module, don't show it in the completion list - // (i.e declare module "http" { const x; } | // <= request completion here, "http" should not be there) + // (i.e declare module "http" { let x; } | // <= request completion here, "http" should not be there) return undefined; } } @@ -2986,20 +2987,20 @@ namespace ts { } function getCompletionData(fileName: string, position: number) { - const typeChecker = program.getTypeChecker(); - const syntacticStart = new Date().getTime(); - const sourceFile = getValidSourceFile(fileName); - const isJavaScriptFile = isSourceFileJavaScript(sourceFile); + let typeChecker = program.getTypeChecker(); + let syntacticStart = new Date().getTime(); + let sourceFile = getValidSourceFile(fileName); + let isJavaScriptFile = isSourceFileJavaScript(sourceFile); let isJsDocTagName = false; let start = new Date().getTime(); - const currentToken = getTokenAtPosition(sourceFile, position); + let currentToken = getTokenAtPosition(sourceFile, position); log("getCompletionData: Get current token: " + (new Date().getTime() - start)); start = new Date().getTime(); // Completion not allowed inside comments, bail out if this is the case - const insideComment = isInsideComment(sourceFile, currentToken, position); + let insideComment = isInsideComment(sourceFile, currentToken, position); log("getCompletionData: Is inside comment: " + (new Date().getTime() - start)); if (insideComment) { @@ -3013,7 +3014,7 @@ namespace ts { // /** @type {number | string} */ // Completion should work in the brackets let insideJsDocTagExpression = false; - const tag = getJsDocTagAtPosition(sourceFile, position); + let tag = getJsDocTagAtPosition(sourceFile, position); if (tag) { if (tag.tagName.pos <= position && position <= tag.tagName.end) { isJsDocTagName = true; @@ -3023,7 +3024,7 @@ namespace ts { case SyntaxKind.JSDocTypeTag: case SyntaxKind.JSDocParameterTag: case SyntaxKind.JSDocReturnTag: - const tagWithExpression = tag; + let tagWithExpression = tag; if (tagWithExpression.typeExpression) { insideJsDocTagExpression = tagWithExpression.typeExpression.pos < position && position < tagWithExpression.typeExpression.end; } @@ -3044,7 +3045,7 @@ namespace ts { } start = new Date().getTime(); - const previousToken = findPrecedingToken(position, sourceFile); + let previousToken = findPrecedingToken(position, sourceFile); log("getCompletionData: Get previous token 1: " + (new Date().getTime() - start)); // The decision to provide completion depends on the contextToken, which is determined through the previousToken. @@ -3054,7 +3055,7 @@ namespace ts { // Check if the caret is at the end of an identifier; this is a partial identifier that we want to complete: e.g. a.toS| // Skip this partial identifier and adjust the contextToken to the token that precedes it. if (contextToken && position <= contextToken.end && isWord(contextToken.kind)) { - const start = new Date().getTime(); + let start = new Date().getTime(); contextToken = findPrecedingToken(contextToken.getFullStart(), sourceFile); log("getCompletionData: Get previous token 2: " + (new Date().getTime() - start)); } @@ -3075,7 +3076,7 @@ namespace ts { return undefined; } - const { parent, kind } = contextToken; + let { parent, kind } = contextToken; if (kind === SyntaxKind.DotToken) { if (parent.kind === SyntaxKind.PropertyAccessExpression) { node = (contextToken.parent).expression; @@ -3102,7 +3103,7 @@ namespace ts { } } - const semanticStart = new Date().getTime(); + let semanticStart = new Date().getTime(); let isMemberCompletion: boolean; let isNewIdentifierLocation: boolean; let symbols: Symbol[] = []; @@ -3111,7 +3112,7 @@ namespace ts { getTypeScriptMemberSymbols(); } else if (isRightOfOpenTag) { - const tagSymbols = typeChecker.getJsxIntrinsicTagNames(); + let tagSymbols = typeChecker.getJsxIntrinsicTagNames(); if (tryGetGlobalSymbols()) { symbols = tagSymbols.concat(symbols.filter(s => !!(s.flags & SymbolFlags.Value))); } @@ -3122,7 +3123,7 @@ namespace ts { isNewIdentifierLocation = false; } else if (isStartingCloseTag) { - const tagName = (contextToken.parent.parent).openingElement.tagName; + let tagName = (contextToken.parent.parent).openingElement.tagName; symbols = [typeChecker.getSymbolAtLocation(tagName)]; isMemberCompletion = true; @@ -3156,7 +3157,7 @@ namespace ts { if (symbol && symbol.flags & SymbolFlags.HasExports) { // Extract module or enum members - const exportedSymbols = typeChecker.getExportsOfModule(symbol); + let exportedSymbols = typeChecker.getExportsOfModule(symbol); forEach(exportedSymbols, symbol => { if (typeChecker.isValidPropertyAccess((node.parent), symbol.name)) { symbols.push(symbol); @@ -3165,14 +3166,14 @@ namespace ts { } } - const type = typeChecker.getTypeAtLocation(node); + let type = typeChecker.getTypeAtLocation(node); addTypeProperties(type); } function addTypeProperties(type: Type) { if (type) { // Filter private properties - for (const symbol of type.getApparentProperties()) { + for (let symbol of type.getApparentProperties()) { if (typeChecker.isValidPropertyAccess((node.parent), symbol.name)) { symbols.push(symbol); } @@ -3184,8 +3185,8 @@ namespace ts { // each individual type has. This is because we're going to add all identifiers // anyways. So we might as well elevate the members that were at least part // of the individual types to a higher status since we know what they are. - const unionType = type; - for (const elementType of unionType.types) { + let unionType = type; + for (let elementType of unionType.types) { addTypeProperties(elementType); } } @@ -3255,14 +3256,14 @@ namespace ts { // - 'contextToken' was adjusted to the token prior to 'previousToken' // because we were at the end of an identifier. // - 'previousToken' is defined. - const adjustedPosition = previousToken !== contextToken ? + let adjustedPosition = previousToken !== contextToken ? previousToken.getStart() : position; - const scopeNode = getScopeNode(contextToken, adjustedPosition, sourceFile) || sourceFile; + let scopeNode = getScopeNode(contextToken, adjustedPosition, sourceFile) || sourceFile; /// TODO filter meaning based on the current context - const symbolMeanings = SymbolFlags.Type | SymbolFlags.Value | SymbolFlags.Namespace | SymbolFlags.Alias; + let symbolMeanings = SymbolFlags.Type | SymbolFlags.Value | SymbolFlags.Namespace | SymbolFlags.Alias; symbols = typeChecker.getSymbolsInScope(scopeNode, symbolMeanings); return true; @@ -3281,8 +3282,8 @@ namespace ts { } function isCompletionListBlocker(contextToken: Node): boolean { - const start = new Date().getTime(); - const result = isInStringOrRegularExpressionOrTemplateLiteral(contextToken) || + let start = new Date().getTime(); + let result = isInStringOrRegularExpressionOrTemplateLiteral(contextToken) || isSolelyIdentifierDefinitionLocation(contextToken) || isDotOfNumericLiteral(contextToken) || isInJsxText(contextToken); @@ -3309,27 +3310,27 @@ namespace ts { function isNewIdentifierDefinitionLocation(previousToken: Node): boolean { if (previousToken) { - const containingNodeKind = previousToken.parent.kind; + let containingNodeKind = previousToken.parent.kind; switch (previousToken.kind) { case SyntaxKind.CommaToken: return containingNodeKind === SyntaxKind.CallExpression // func( a, | || containingNodeKind === SyntaxKind.Constructor // constructor( a, | /* public, protected, private keywords are allowed here, so show completion */ || containingNodeKind === SyntaxKind.NewExpression // new C(a, | || containingNodeKind === SyntaxKind.ArrayLiteralExpression // [a, | - || containingNodeKind === SyntaxKind.BinaryExpression // const x = (a, | + || containingNodeKind === SyntaxKind.BinaryExpression // let x = (a, | || containingNodeKind === SyntaxKind.FunctionType; // var x: (s: string, list| case SyntaxKind.OpenParenToken: return containingNodeKind === SyntaxKind.CallExpression // func( | || containingNodeKind === SyntaxKind.Constructor // constructor( | || containingNodeKind === SyntaxKind.NewExpression // new C(a| - || containingNodeKind === SyntaxKind.ParenthesizedExpression // const x = (a| + || containingNodeKind === SyntaxKind.ParenthesizedExpression // let x = (a| || containingNodeKind === SyntaxKind.ParenthesizedType; // function F(pred: (a| /* this can become an arrow function, where 'a' is the argument */ case SyntaxKind.OpenBracketToken: return containingNodeKind === SyntaxKind.ArrayLiteralExpression // [ | || containingNodeKind === SyntaxKind.IndexSignature // [ | : string ] - || containingNodeKind === SyntaxKind.ComputedPropertyName; // [ | /* this can become an index signature */ + || containingNodeKind === SyntaxKind.ComputedPropertyName // [ | /* this can become an index signature */ case SyntaxKind.ModuleKeyword: // module | case SyntaxKind.NamespaceKeyword: // namespace | @@ -3342,7 +3343,7 @@ namespace ts { return containingNodeKind === SyntaxKind.ClassDeclaration; // class A{ | case SyntaxKind.EqualsToken: - return containingNodeKind === SyntaxKind.VariableDeclaration // const x = a| + return containingNodeKind === SyntaxKind.VariableDeclaration // let x = a| || containingNodeKind === SyntaxKind.BinaryExpression; // x = a| case SyntaxKind.TemplateHead: @@ -3374,8 +3375,8 @@ namespace ts { || contextToken.kind === SyntaxKind.StringLiteralType || contextToken.kind === SyntaxKind.RegularExpressionLiteral || isTemplateLiteralKind(contextToken.kind)) { - const start = contextToken.getStart(); - const end = contextToken.getEnd(); + let start = contextToken.getStart(); + let end = contextToken.getEnd(); // To be "in" one of these literals, the position has to be: // 1. entirely within the token text. @@ -3419,7 +3420,7 @@ namespace ts { // We are *only* completing on properties from the type being destructured. isNewIdentifierLocation = false; - const rootDeclaration = getRootDeclaration(objectLikeContainer.parent); + let rootDeclaration = getRootDeclaration(objectLikeContainer.parent); if (isVariableLike(rootDeclaration)) { // We don't want to complete using the type acquired by the shape // of the binding pattern; we are only interested in types acquired @@ -3430,7 +3431,7 @@ namespace ts { } } else { - Debug.fail("Root declaration is not variable-like."); + Debug.fail("Root declaration is not variable-like.") } } else { @@ -3441,7 +3442,7 @@ namespace ts { return false; } - const typeMembers = typeChecker.getPropertiesOfType(typeForObject); + let typeMembers = typeChecker.getPropertiesOfType(typeForObject); if (typeMembers && typeMembers.length > 0) { // Add filtered items to the completion list symbols = filterObjectMembersList(typeMembers, existingMembers); @@ -3465,11 +3466,11 @@ namespace ts { * @returns true if 'symbols' was successfully populated; false otherwise. */ function tryGetImportOrExportClauseCompletionSymbols(namedImportsOrExports: NamedImportsOrExports): boolean { - const declarationKind = namedImportsOrExports.kind === SyntaxKind.NamedImports ? + let declarationKind = namedImportsOrExports.kind === SyntaxKind.NamedImports ? SyntaxKind.ImportDeclaration : SyntaxKind.ExportDeclaration; - const importOrExportDeclaration = getAncestor(namedImportsOrExports, declarationKind); - const moduleSpecifier = importOrExportDeclaration.moduleSpecifier; + let importOrExportDeclaration = getAncestor(namedImportsOrExports, declarationKind); + let moduleSpecifier = importOrExportDeclaration.moduleSpecifier; if (!moduleSpecifier) { return false; @@ -3479,7 +3480,7 @@ namespace ts { isNewIdentifierLocation = false; let exports: Symbol[]; - const moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(importOrExportDeclaration.moduleSpecifier); + let moduleSpecifierSymbol = typeChecker.getSymbolAtLocation(importOrExportDeclaration.moduleSpecifier); if (moduleSpecifierSymbol) { exports = typeChecker.getExportsOfModule(moduleSpecifierSymbol); } @@ -3496,9 +3497,9 @@ namespace ts { function tryGetObjectLikeCompletionContainer(contextToken: Node): ObjectLiteralExpression | BindingPattern { if (contextToken) { switch (contextToken.kind) { - case SyntaxKind.OpenBraceToken: // const x = { | - case SyntaxKind.CommaToken: // const x = { a: 0, | - const parent = contextToken.parent; + case SyntaxKind.OpenBraceToken: // let x = { | + case SyntaxKind.CommaToken: // let x = { a: 0, | + let parent = contextToken.parent; if (parent && (parent.kind === SyntaxKind.ObjectLiteralExpression || parent.kind === SyntaxKind.ObjectBindingPattern)) { return parent; } @@ -3531,8 +3532,8 @@ namespace ts { function tryGetContainingJsxElement(contextToken: Node): JsxOpeningLikeElement { if (contextToken) { - const parent = contextToken.parent; - switch (contextToken.kind) { + let parent = contextToken.parent; + switch(contextToken.kind) { case SyntaxKind.LessThanSlashToken: case SyntaxKind.SlashToken: case SyntaxKind.Identifier: @@ -3595,7 +3596,7 @@ namespace ts { * @returns true if we are certain that the currently edited location must define a new location; false otherwise. */ function isSolelyIdentifierDefinitionLocation(contextToken: Node): boolean { - const containingNodeKind = contextToken.parent.kind; + let containingNodeKind = contextToken.parent.kind; switch (contextToken.kind) { case SyntaxKind.CommaToken: return containingNodeKind === SyntaxKind.VariableDeclaration || @@ -3625,13 +3626,13 @@ namespace ts { case SyntaxKind.OpenBraceToken: return containingNodeKind === SyntaxKind.EnumDeclaration || // enum a { | containingNodeKind === SyntaxKind.InterfaceDeclaration || // interface a { | - containingNodeKind === SyntaxKind.TypeLiteral; // const x : { | + containingNodeKind === SyntaxKind.TypeLiteral; // let x : { | case SyntaxKind.SemicolonToken: return containingNodeKind === SyntaxKind.PropertySignature && contextToken.parent && contextToken.parent.parent && (contextToken.parent.parent.kind === SyntaxKind.InterfaceDeclaration || // interface a { f; | - contextToken.parent.parent.kind === SyntaxKind.TypeLiteral); // const x : { a; | + contextToken.parent.parent.kind === SyntaxKind.TypeLiteral); // let x : { a; | case SyntaxKind.LessThanToken: return containingNodeKind === SyntaxKind.ClassDeclaration || // class A< | @@ -3698,7 +3699,7 @@ namespace ts { function isDotOfNumericLiteral(contextToken: Node): boolean { if (contextToken.kind === SyntaxKind.NumericLiteral) { - const text = contextToken.getFullText(); + let text = contextToken.getFullText(); return text.charAt(text.length - 1) === "."; } @@ -3715,15 +3716,15 @@ namespace ts { * do not occur at the current position and have not otherwise been typed. */ function filterNamedImportOrExportCompletionItems(exportsOfModule: Symbol[], namedImportsOrExports: ImportOrExportSpecifier[]): Symbol[] { - const exisingImportsOrExports: Map = {}; + let exisingImportsOrExports: Map = {}; - for (const element of namedImportsOrExports) { + for (let element of namedImportsOrExports) { // If this is the current item we are editing right now, do not filter it out if (element.getStart() <= position && position <= element.getEnd()) { continue; } - const name = element.propertyName || element.name; + let name = element.propertyName || element.name; exisingImportsOrExports[name.text] = true; } @@ -3745,8 +3746,8 @@ namespace ts { return contextualMemberSymbols; } - const existingMemberNames: Map = {}; - for (const m of existingMembers) { + let existingMemberNames: Map = {}; + for (let m of existingMembers) { // Ignore omitted expressions for missing members if (m.kind !== SyntaxKind.PropertyAssignment && m.kind !== SyntaxKind.ShorthandPropertyAssignment && @@ -3765,7 +3766,7 @@ namespace ts { if (m.kind === SyntaxKind.BindingElement && (m).propertyName) { // include only identifiers in completion list if ((m).propertyName.kind === SyntaxKind.Identifier) { - existingName = ((m).propertyName).text; + existingName = ((m).propertyName).text } } else { @@ -3788,8 +3789,8 @@ namespace ts { * do not occur at the current position and have not otherwise been typed. */ function filterJsxAttributes(symbols: Symbol[], attributes: NodeArray): Symbol[] { - const seenNames: Map = {}; - for (const attr of attributes) { + let seenNames: Map = {}; + for (let attr of attributes) { // If this is the current item we are editing right now, do not filter it out if (attr.getStart() <= position && position <= attr.getEnd()) { continue; @@ -3808,21 +3809,21 @@ namespace ts { function getCompletionsAtPosition(fileName: string, position: number): CompletionInfo { synchronizeHostData(); - const completionData = getCompletionData(fileName, position); + let completionData = getCompletionData(fileName, position); if (!completionData) { return undefined; } - const { symbols, isMemberCompletion, isNewIdentifierLocation, location, isRightOfDot, isJsDocTagName } = completionData; + let { symbols, isMemberCompletion, isNewIdentifierLocation, location, isRightOfDot, isJsDocTagName } = completionData; if (isJsDocTagName) { // If the current position is a jsDoc tag name, only tag names should be provided for completion return { isMemberCompletion: false, isNewIdentifierLocation: false, entries: getAllJsDocCompletionEntries() }; } - const sourceFile = getValidSourceFile(fileName); + let sourceFile = getValidSourceFile(fileName); - const entries: CompletionEntry[] = []; + let entries: CompletionEntry[] = []; if (isRightOfDot && isSourceFileJavaScript(sourceFile)) { const uniqueNames = getCompletionEntriesFromSymbols(symbols, entries); @@ -3844,16 +3845,16 @@ namespace ts { return { isMemberCompletion, isNewIdentifierLocation, entries }; function getJavaScriptCompletionEntries(sourceFile: SourceFile, uniqueNames: Map): CompletionEntry[] { - const entries: CompletionEntry[] = []; - const target = program.getCompilerOptions().target; + let entries: CompletionEntry[] = []; + let target = program.getCompilerOptions().target; - const nameTable = getNameTable(sourceFile); - for (const name in nameTable) { + let nameTable = getNameTable(sourceFile); + for (let name in nameTable) { if (!uniqueNames[name]) { uniqueNames[name] = name; - const displayName = getCompletionEntryDisplayName(name, target, /*performCharacterChecks*/ true); + let displayName = getCompletionEntryDisplayName(name, target, /*performCharacterChecks:*/ true); if (displayName) { - const entry = { + let entry = { name: displayName, kind: ScriptElementKind.warning, kindModifiers: "", @@ -3874,7 +3875,7 @@ namespace ts { kind: ScriptElementKind.keyword, kindModifiers: "", sortText: "0", - }; + } })); } @@ -3882,7 +3883,7 @@ namespace ts { // Try to get a valid display name for this symbol, if we could not find one, then ignore it. // We would like to only show things that can be added after a dot, so for instance numeric properties can // not be accessed with a dot (a.1 <- invalid) - const displayName = getCompletionEntryDisplayNameForSymbol(symbol, program.getCompilerOptions().target, /*performCharacterChecks*/ true, location); + let displayName = getCompletionEntryDisplayNameForSymbol(symbol, program.getCompilerOptions().target, /*performCharacterChecks:*/ true, location); if (!displayName) { return undefined; } @@ -3904,13 +3905,13 @@ namespace ts { } function getCompletionEntriesFromSymbols(symbols: Symbol[], entries: CompletionEntry[]): Map { - const start = new Date().getTime(); - const uniqueNames: Map = {}; + let start = new Date().getTime(); + let uniqueNames: Map = {}; if (symbols) { - for (const symbol of symbols) { - const entry = createCompletionEntry(symbol, location); + for (let symbol of symbols) { + let entry = createCompletionEntry(symbol, location); if (entry) { - const id = escapeIdentifier(entry.name); + let id = escapeIdentifier(entry.name); if (!lookUp(uniqueNames, id)) { entries.push(entry); uniqueNames[id] = id; @@ -3928,19 +3929,19 @@ namespace ts { synchronizeHostData(); // Compute all the completion symbols again. - const completionData = getCompletionData(fileName, position); + let completionData = getCompletionData(fileName, position); if (completionData) { - const { symbols, location } = completionData; + let { symbols, location } = completionData; // Find the symbol with the matching entry name. - const target = program.getCompilerOptions().target; + let target = program.getCompilerOptions().target; // We don't need to perform character checks here because we're only comparing the // name against 'entryName' (which is known to be good), not building a new // completion entry. - const symbol = forEach(symbols, s => getCompletionEntryDisplayNameForSymbol(s, target, /*performCharacterChecks*/ false, location) === entryName ? s : undefined); + let symbol = forEach(symbols, s => getCompletionEntryDisplayNameForSymbol(s, target, /*performCharacterChecks:*/ false, location) === entryName ? s : undefined); if (symbol) { - const { displayParts, documentation, symbolKind } = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, getValidSourceFile(fileName), location, location, SemanticMeaning.All); + let { displayParts, documentation, symbolKind } = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, getValidSourceFile(fileName), location, location, SemanticMeaning.All); return { name: entryName, kindModifiers: getSymbolModifiers(symbol), @@ -3952,7 +3953,7 @@ namespace ts { } // Didn't find a symbol with this name. See if we can find a keyword instead. - const keywordCompletion = forEach(keywordCompletions, c => c.name === entryName); + let keywordCompletion = forEach(keywordCompletions, c => c.name === entryName); if (keywordCompletion) { return { name: entryName, @@ -3968,7 +3969,7 @@ namespace ts { // TODO(drosen): use contextual SemanticMeaning. function getSymbolKind(symbol: Symbol, location: Node): string { - const flags = symbol.getFlags(); + let flags = symbol.getFlags(); if (flags & SymbolFlags.Class) return getDeclarationOfKind(symbol, SyntaxKind.ClassExpression) ? ScriptElementKind.localClassElement : ScriptElementKind.classElement; @@ -3977,7 +3978,7 @@ namespace ts { if (flags & SymbolFlags.Interface) return ScriptElementKind.interfaceElement; if (flags & SymbolFlags.TypeParameter) return ScriptElementKind.typeParameterElement; - const result = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol, flags, location); + let result = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol, flags, location); if (result === ScriptElementKind.unknown) { if (flags & SymbolFlags.TypeParameter) return ScriptElementKind.typeParameterElement; if (flags & SymbolFlags.EnumMember) return ScriptElementKind.variableElement; @@ -3989,7 +3990,7 @@ namespace ts { } function getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol: Symbol, flags: SymbolFlags, location: Node) { - const typeChecker = program.getTypeChecker(); + let typeChecker = program.getTypeChecker(); if (typeChecker.isUndefinedSymbol(symbol)) { return ScriptElementKind.variableElement; @@ -4018,8 +4019,8 @@ namespace ts { if (flags & SymbolFlags.Property) { if (flags & SymbolFlags.SyntheticProperty) { // If union property is result of union of non method (property/accessors/variables), it is labeled as property - const unionPropertyKind = forEach(typeChecker.getRootSymbols(symbol), rootSymbol => { - const rootSymbolFlags = rootSymbol.getFlags(); + let unionPropertyKind = forEach(typeChecker.getRootSymbols(symbol), rootSymbol => { + let rootSymbolFlags = rootSymbol.getFlags(); if (rootSymbolFlags & (SymbolFlags.PropertyOrAccessor | SymbolFlags.Variable)) { return ScriptElementKind.memberVariableElement; } @@ -4027,8 +4028,8 @@ namespace ts { }); if (!unionPropertyKind) { // If this was union of all methods, - // make sure it has call signatures before we can label it as method - const typeOfUnionProperty = typeChecker.getTypeOfSymbolAtLocation(symbol, location); + //make sure it has call signatures before we can label it as method + let typeOfUnionProperty = typeChecker.getTypeOfSymbolAtLocation(symbol, location); if (typeOfUnionProperty.getCallSignatures().length) { return ScriptElementKind.memberFunctionElement; } @@ -4052,11 +4053,11 @@ namespace ts { function getSymbolDisplayPartsDocumentationAndSymbolKind(symbol: Symbol, sourceFile: SourceFile, enclosingDeclaration: Node, location: Node, semanticMeaning = getMeaningFromLocation(location)) { - const typeChecker = program.getTypeChecker(); + let typeChecker = program.getTypeChecker(); - const displayParts: SymbolDisplayPart[] = []; + let displayParts: SymbolDisplayPart[] = []; let documentation: SymbolDisplayPart[]; - const symbolFlags = symbol.flags; + let symbolFlags = symbol.flags; let symbolKind = getSymbolKindOfConstructorPropertyMethodAccessorFunctionOrVar(symbol, symbolFlags, location); let hasAddedSymbolInfo: boolean; let type: Type; @@ -4072,7 +4073,7 @@ namespace ts { type = typeChecker.getTypeOfSymbolAtLocation(symbol, location); if (type) { if (location.parent && location.parent.kind === SyntaxKind.PropertyAccessExpression) { - const right = (location.parent).name; + let right = (location.parent).name; // Either the location is on the right of a property access, or on the left and the right is missing if (right === location || (right && right.getFullWidth() === 0)) { location = location.parent; @@ -4089,15 +4090,15 @@ namespace ts { } if (callExpression) { - const candidateSignatures: Signature[] = []; + let candidateSignatures: Signature[] = []; signature = typeChecker.getResolvedSignature(callExpression, candidateSignatures); if (!signature && candidateSignatures.length) { // Use the first candidate: signature = candidateSignatures[0]; } - const useConstructSignatures = callExpression.kind === SyntaxKind.NewExpression || callExpression.expression.kind === SyntaxKind.SuperKeyword; - const allSignatures = useConstructSignatures ? type.getConstructSignatures() : type.getCallSignatures(); + let useConstructSignatures = callExpression.kind === SyntaxKind.NewExpression || callExpression.expression.kind === SyntaxKind.SuperKeyword; + let allSignatures = useConstructSignatures ? type.getConstructSignatures() : type.getCallSignatures(); if (!contains(allSignatures, signature.target) && !contains(allSignatures, signature)) { // Get the first signature if there is one -- allSignatures may contain @@ -4155,8 +4156,8 @@ namespace ts { else if ((isNameOfFunctionDeclaration(location) && !(symbol.flags & SymbolFlags.Accessor)) || // name of function declaration (location.kind === SyntaxKind.ConstructorKeyword && location.parent.kind === SyntaxKind.Constructor)) { // At constructor keyword of constructor declaration // get the signature from the declaration and write it - const functionDeclaration = location.parent; - const allSignatures = functionDeclaration.kind === SyntaxKind.Constructor ? type.getConstructSignatures() : type.getCallSignatures(); + let functionDeclaration = location.parent; + let allSignatures = functionDeclaration.kind === SyntaxKind.Constructor ? type.getConstructSignatures() : type.getCallSignatures(); if (!typeChecker.isImplementationOfOverload(functionDeclaration)) { signature = typeChecker.getSignatureFromDeclaration(functionDeclaration); } @@ -4225,8 +4226,8 @@ namespace ts { } if (symbolFlags & SymbolFlags.Module) { addNewLineIfDisplayPartsExist(); - const declaration = getDeclarationOfKind(symbol, SyntaxKind.ModuleDeclaration); - const isNamespace = declaration && declaration.name && declaration.name.kind === SyntaxKind.Identifier; + let declaration = getDeclarationOfKind(symbol, SyntaxKind.ModuleDeclaration); + let isNamespace = declaration && declaration.name && declaration.name.kind === SyntaxKind.Identifier; displayParts.push(keywordPart(isNamespace ? SyntaxKind.NamespaceKeyword : SyntaxKind.ModuleKeyword)); displayParts.push(spacePart()); addFullSymbolName(symbol); @@ -4278,9 +4279,9 @@ namespace ts { } if (symbolFlags & SymbolFlags.EnumMember) { addPrefixForAnyFunctionOrVar(symbol, "enum member"); - const declaration = symbol.declarations[0]; + let declaration = symbol.declarations[0]; if (declaration.kind === SyntaxKind.EnumMember) { - const constantValue = typeChecker.getConstantValue(declaration); + let constantValue = typeChecker.getConstantValue(declaration); if (constantValue !== undefined) { displayParts.push(spacePart()); displayParts.push(operatorPart(SyntaxKind.EqualsToken)); @@ -4296,7 +4297,7 @@ namespace ts { addFullSymbolName(symbol); ts.forEach(symbol.declarations, declaration => { if (declaration.kind === SyntaxKind.ImportEqualsDeclaration) { - const importEqualsDeclaration = declaration; + let importEqualsDeclaration = declaration; if (isExternalModuleImportEqualsDeclaration(importEqualsDeclaration)) { displayParts.push(spacePart()); displayParts.push(operatorPart(SyntaxKind.EqualsToken)); @@ -4307,7 +4308,7 @@ namespace ts { displayParts.push(punctuationPart(SyntaxKind.CloseParenToken)); } else { - const internalAliasSymbol = typeChecker.getSymbolAtLocation(importEqualsDeclaration.moduleReference); + let internalAliasSymbol = typeChecker.getSymbolAtLocation(importEqualsDeclaration.moduleReference); if (internalAliasSymbol) { displayParts.push(spacePart()); displayParts.push(operatorPart(SyntaxKind.EqualsToken)); @@ -4331,7 +4332,7 @@ namespace ts { displayParts.push(spacePart()); // If the type is type parameter, format it specially if (type.symbol && type.symbol.flags & SymbolFlags.TypeParameter) { - const typeParameterParts = mapToDisplayParts(writer => { + let typeParameterParts = mapToDisplayParts(writer => { typeChecker.getSymbolDisplayBuilder().buildTypeParameterDisplay(type, writer, enclosingDeclaration); }); addRange(displayParts, typeParameterParts); @@ -4346,7 +4347,7 @@ namespace ts { symbolFlags & SymbolFlags.Signature || symbolFlags & SymbolFlags.Accessor || symbolKind === ScriptElementKind.memberFunctionElement) { - const allSignatures = type.getCallSignatures(); + let allSignatures = type.getCallSignatures(); addSignatureDisplayParts(allSignatures[0], allSignatures); } } @@ -4369,7 +4370,7 @@ namespace ts { } function addFullSymbolName(symbol: Symbol, enclosingDeclaration?: Node) { - const fullSymbolDisplayParts = symbolToDisplayParts(typeChecker, symbol, enclosingDeclaration || sourceFile, /*meaning*/ undefined, + let fullSymbolDisplayParts = symbolToDisplayParts(typeChecker, symbol, enclosingDeclaration || sourceFile, /*meaning*/ undefined, SymbolFormatFlags.WriteTypeParametersOrArguments | SymbolFormatFlags.UseOnlyExternalAliasing); addRange(displayParts, fullSymbolDisplayParts); } @@ -4415,7 +4416,7 @@ namespace ts { } function writeTypeParametersOfSymbol(symbol: Symbol, enclosingDeclaration: Node) { - const typeParameterParts = mapToDisplayParts(writer => { + let typeParameterParts = mapToDisplayParts(writer => { typeChecker.getSymbolDisplayBuilder().buildTypeParameterDisplayFromSymbol(symbol, writer, enclosingDeclaration); }); addRange(displayParts, typeParameterParts); @@ -4425,8 +4426,8 @@ namespace ts { function getQuickInfoAtPosition(fileName: string, position: number): QuickInfo { synchronizeHostData(); - const sourceFile = getValidSourceFile(fileName); - const node = getTouchingPropertyName(sourceFile, position); + let sourceFile = getValidSourceFile(fileName); + let node = getTouchingPropertyName(sourceFile, position); if (!node) { return undefined; } @@ -4435,8 +4436,8 @@ namespace ts { return undefined; } - const typeChecker = program.getTypeChecker(); - const symbol = typeChecker.getSymbolAtLocation(node); + let typeChecker = program.getTypeChecker(); + let symbol = typeChecker.getSymbolAtLocation(node); if (!symbol) { // Try getting just type at this position and show @@ -4448,7 +4449,7 @@ namespace ts { case SyntaxKind.ThisType: case SyntaxKind.SuperKeyword: // For the identifiers/this/super etc get the type at position - const type = typeChecker.getTypeAtLocation(node); + let type = typeChecker.getTypeAtLocation(node); if (type) { return { kind: ScriptElementKind.unknown, @@ -4463,7 +4464,7 @@ namespace ts { return undefined; } - const displayPartsDocumentationsAndKind = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, sourceFile, getContainerNode(node), node); + let displayPartsDocumentationsAndKind = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, sourceFile, getContainerNode(node), node); return { kind: displayPartsDocumentationsAndKind.symbolKind, kindModifiers: getSymbolModifiers(symbol), @@ -4485,13 +4486,13 @@ namespace ts { } function getDefinitionFromSymbol(symbol: Symbol, node: Node): DefinitionInfo[] { - const typeChecker = program.getTypeChecker(); - const result: DefinitionInfo[] = []; - const declarations = symbol.getDeclarations(); - const symbolName = typeChecker.symbolToString(symbol); // Do not get scoped name, just the name of the symbol - const symbolKind = getSymbolKind(symbol, node); - const containerSymbol = symbol.parent; - const containerName = containerSymbol ? typeChecker.symbolToString(containerSymbol, node) : ""; + let typeChecker = program.getTypeChecker(); + let result: DefinitionInfo[] = []; + let declarations = symbol.getDeclarations(); + let symbolName = typeChecker.symbolToString(symbol); // Do not get scoped name, just the name of the symbol + let symbolKind = getSymbolKind(symbol, node); + let containerSymbol = symbol.parent; + let containerName = containerSymbol ? typeChecker.symbolToString(containerSymbol, node) : ""; if (!tryAddConstructSignature(symbol, node, symbolKind, symbolName, containerName, result) && !tryAddCallSignature(symbol, node, symbolKind, symbolName, containerName, result)) { @@ -4509,7 +4510,7 @@ namespace ts { if (isNewExpressionTarget(location) || location.kind === SyntaxKind.ConstructorKeyword) { if (symbol.flags & SymbolFlags.Class) { // Find the first class-like declaration and try to get the construct signature. - for (const declaration of symbol.getDeclarations()) { + for (let declaration of symbol.getDeclarations()) { if (isClassLike(declaration)) { return tryAddSignature(declaration.members, /*selectConstructors*/ true, @@ -4534,7 +4535,7 @@ namespace ts { } function tryAddSignature(signatureDeclarations: Declaration[], selectConstructors: boolean, symbolKind: string, symbolName: string, containerName: string, result: DefinitionInfo[]) { - const declarations: Declaration[] = []; + let declarations: Declaration[] = []; let definition: Declaration; forEach(signatureDeclarations, d => { @@ -4562,24 +4563,24 @@ namespace ts { function getDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[] { synchronizeHostData(); - const sourceFile = getValidSourceFile(fileName); + let sourceFile = getValidSourceFile(fileName); - const node = getTouchingPropertyName(sourceFile, position); + let node = getTouchingPropertyName(sourceFile, position); if (!node) { return undefined; } // Labels if (isJumpStatementTarget(node)) { - const labelName = (node).text; - const label = getTargetLabel((node.parent), (node).text); + let labelName = (node).text; + let label = getTargetLabel((node.parent), (node).text); return label ? [createDefinitionInfo(label, ScriptElementKind.label, labelName, /*containerName*/ undefined)] : undefined; } /// Triple slash reference comments - const comment = forEach(sourceFile.referencedFiles, r => (r.pos <= position && position < r.end) ? r : undefined); + let comment = forEach(sourceFile.referencedFiles, r => (r.pos <= position && position < r.end) ? r : undefined); if (comment) { - const referenceFile = tryResolveScriptReference(program, sourceFile, comment); + let referenceFile = tryResolveScriptReference(program, sourceFile, comment); if (referenceFile) { return [{ fileName: referenceFile.fileName, @@ -4593,7 +4594,7 @@ namespace ts { return undefined; } - const typeChecker = program.getTypeChecker(); + let typeChecker = program.getTypeChecker(); let symbol = typeChecker.getSymbolAtLocation(node); // Could not find a symbol e.g. node is string or number keyword, @@ -4607,7 +4608,7 @@ namespace ts { // import {A, B} from "mod"; // to jump to the implementation directly. if (symbol.flags & SymbolFlags.Alias) { - const declaration = symbol.declarations[0]; + let declaration = symbol.declarations[0]; if (node.kind === SyntaxKind.Identifier && node.parent === declaration) { symbol = typeChecker.getAliasedSymbol(symbol); } @@ -4619,15 +4620,15 @@ namespace ts { // is performed at the location of property access, we would like to go to definition of the property in the short-hand // assignment. This case and others are handled by the following code. if (node.parent.kind === SyntaxKind.ShorthandPropertyAssignment) { - const shorthandSymbol = typeChecker.getShorthandAssignmentValueSymbol(symbol.valueDeclaration); + let shorthandSymbol = typeChecker.getShorthandAssignmentValueSymbol(symbol.valueDeclaration); if (!shorthandSymbol) { return []; } - const shorthandDeclarations = shorthandSymbol.getDeclarations(); - const shorthandSymbolKind = getSymbolKind(shorthandSymbol, node); - const shorthandSymbolName = typeChecker.symbolToString(shorthandSymbol); - const shorthandContainerName = typeChecker.symbolToString(symbol.parent, node); + let shorthandDeclarations = shorthandSymbol.getDeclarations(); + let shorthandSymbolKind = getSymbolKind(shorthandSymbol, node); + let shorthandSymbolName = typeChecker.symbolToString(shorthandSymbol); + let shorthandContainerName = typeChecker.symbolToString(symbol.parent, node); return map(shorthandDeclarations, declaration => createDefinitionInfo(declaration, shorthandSymbolKind, shorthandSymbolName, shorthandContainerName)); } @@ -4639,27 +4640,27 @@ namespace ts { function getTypeDefinitionAtPosition(fileName: string, position: number): DefinitionInfo[] { synchronizeHostData(); - const sourceFile = getValidSourceFile(fileName); + let sourceFile = getValidSourceFile(fileName); - const node = getTouchingPropertyName(sourceFile, position); + let node = getTouchingPropertyName(sourceFile, position); if (!node) { return undefined; } - const typeChecker = program.getTypeChecker(); + let typeChecker = program.getTypeChecker(); - const symbol = typeChecker.getSymbolAtLocation(node); + let symbol = typeChecker.getSymbolAtLocation(node); if (!symbol) { return undefined; } - const type = typeChecker.getTypeOfSymbolAtLocation(symbol, node); + let type = typeChecker.getTypeOfSymbolAtLocation(symbol, node); if (!type) { return undefined; } if (type.flags & TypeFlags.Union) { - const result: DefinitionInfo[] = []; + let result: DefinitionInfo[] = []; forEach((type).types, t => { if (t.symbol) { addRange(/*to*/ result, /*from*/ getDefinitionFromSymbol(t.symbol, node)); @@ -4679,7 +4680,7 @@ namespace ts { let results = getOccurrencesAtPositionCore(fileName, position); if (results) { - const sourceFile = getCanonicalFileName(normalizeSlashes(fileName)); + let sourceFile = getCanonicalFileName(normalizeSlashes(fileName)); // Get occurrences only supports reporting occurrences for the file queried. So // filter down to that list. @@ -4693,10 +4694,10 @@ namespace ts { synchronizeHostData(); filesToSearch = map(filesToSearch, normalizeSlashes); - const sourceFilesToSearch = filter(program.getSourceFiles(), f => contains(filesToSearch, f.fileName)); - const sourceFile = getValidSourceFile(fileName); + let sourceFilesToSearch = filter(program.getSourceFiles(), f => contains(filesToSearch, f.fileName)); + let sourceFile = getValidSourceFile(fileName); - const node = getTouchingWord(sourceFile, position); + let node = getTouchingWord(sourceFile, position); if (!node) { return undefined; } @@ -4704,8 +4705,8 @@ namespace ts { return getSemanticDocumentHighlights(node) || getSyntacticDocumentHighlights(node); function getHighlightSpanForNode(node: Node): HighlightSpan { - const start = node.getStart(); - const end = node.getEnd(); + let start = node.getStart(); + let end = node.getEnd(); return { fileName: sourceFile.fileName, @@ -4722,7 +4723,7 @@ namespace ts { isLiteralNameOfPropertyDeclarationOrIndexAccess(node) || isNameOfExternalModuleImportOrDeclaration(node)) { - const referencedSymbols = getReferencedSymbolsForNode(node, sourceFilesToSearch, /*findInStrings*/ false, /*findInComments*/ false); + let referencedSymbols = getReferencedSymbolsForNode(node, sourceFilesToSearch, /*findInStrings:*/ false, /*findInComments:*/ false); return convertReferencedSymbols(referencedSymbols); } @@ -4733,11 +4734,11 @@ namespace ts { return undefined; } - const fileNameToDocumentHighlights: Map = {}; - const result: DocumentHighlights[] = []; - for (const referencedSymbol of referencedSymbols) { - for (const referenceEntry of referencedSymbol.references) { - const fileName = referenceEntry.fileName; + let fileNameToDocumentHighlights: Map = {}; + let result: DocumentHighlights[] = []; + for (let referencedSymbol of referencedSymbols) { + for (let referenceEntry of referencedSymbol.references) { + let fileName = referenceEntry.fileName; let documentHighlights = getProperty(fileNameToDocumentHighlights, fileName); if (!documentHighlights) { documentHighlights = { fileName, highlightSpans: [] }; @@ -4758,9 +4759,9 @@ namespace ts { } function getSyntacticDocumentHighlights(node: Node): DocumentHighlights[] { - const fileName = sourceFile.fileName; + let fileName = sourceFile.fileName; - const highlightSpans = getHighlightSpans(node); + let highlightSpans = getHighlightSpans(node); if (!highlightSpans || highlightSpans.length === 0) { return undefined; } @@ -4864,7 +4865,7 @@ namespace ts { * into function boundaries and try-blocks with catch-clauses. */ function aggregateOwnedThrowStatements(node: Node): ThrowStatement[] { - const statementAccumulator: ThrowStatement[] = []; + let statementAccumulator: ThrowStatement[] = [] aggregate(node); return statementAccumulator; @@ -4873,7 +4874,7 @@ namespace ts { statementAccumulator.push(node); } else if (node.kind === SyntaxKind.TryStatement) { - const tryStatement = node; + let tryStatement = node; if (tryStatement.catchClause) { aggregate(tryStatement.catchClause); @@ -4904,7 +4905,7 @@ namespace ts { let child: Node = throwStatement; while (child.parent) { - const parent = child.parent; + let parent = child.parent; if (isFunctionBlock(parent) || parent.kind === SyntaxKind.SourceFile) { return parent; @@ -4913,7 +4914,7 @@ namespace ts { // A throw-statement is only owned by a try-statement if the try-statement has // a catch clause, and if the throw-statement occurs within the try block. if (parent.kind === SyntaxKind.TryStatement) { - const tryStatement = parent; + let tryStatement = parent; if (tryStatement.tryBlock === child && tryStatement.catchClause) { return child; @@ -4927,7 +4928,7 @@ namespace ts { } function aggregateAllBreakAndContinueStatements(node: Node): BreakOrContinueStatement[] { - const statementAccumulator: BreakOrContinueStatement[] = []; + let statementAccumulator: BreakOrContinueStatement[] = [] aggregate(node); return statementAccumulator; @@ -4943,7 +4944,7 @@ namespace ts { } function ownsBreakOrContinueStatement(owner: Node, statement: BreakOrContinueStatement): boolean { - const actualOwner = getBreakOrContinueOwner(statement); + let actualOwner = getBreakOrContinueOwner(statement); return actualOwner && actualOwner === owner; } @@ -4978,7 +4979,7 @@ namespace ts { } function getModifierOccurrences(modifier: SyntaxKind, declaration: Node): HighlightSpan[] { - const container = declaration.parent; + let container = declaration.parent; // Make sure we only highlight the keyword when it makes sense to do so. if (isAccessibilityModifier(modifier)) { @@ -5008,8 +5009,8 @@ namespace ts { return undefined; } - const keywords: Node[] = []; - const modifierFlag: NodeFlags = getFlagFromModifier(modifier); + let keywords: Node[] = []; + let modifierFlag: NodeFlags = getFlagFromModifier(modifier); let nodes: Node[]; switch (container.kind) { @@ -5034,7 +5035,7 @@ namespace ts { // If we're an accessibility modifier, we're in an instance member and should search // the constructor's parameter list for instance members as well. if (modifierFlag & NodeFlags.AccessibilityModifier) { - const constructor = forEach((container).members, member => { + let constructor = forEach((container).members, member => { return member.kind === SyntaxKind.Constructor && member; }); @@ -5047,7 +5048,7 @@ namespace ts { } break; default: - Debug.fail("Invalid container kind."); + Debug.fail("Invalid container kind.") } forEach(nodes, node => { @@ -5090,7 +5091,7 @@ namespace ts { } function getGetAndSetOccurrences(accessorDeclaration: AccessorDeclaration): HighlightSpan[] { - const keywords: Node[] = []; + let keywords: Node[] = []; tryPushAccessorKeyword(accessorDeclaration.symbol, SyntaxKind.GetAccessor); tryPushAccessorKeyword(accessorDeclaration.symbol, SyntaxKind.SetAccessor); @@ -5098,7 +5099,7 @@ namespace ts { return map(keywords, getHighlightSpanForNode); function tryPushAccessorKeyword(accessorSymbol: Symbol, accessorKind: SyntaxKind): void { - const accessor = getDeclarationOfKind(accessorSymbol, accessorKind); + let accessor = getDeclarationOfKind(accessorSymbol, accessorKind); if (accessor) { forEach(accessor.getChildren(), child => pushKeywordIf(keywords, child, SyntaxKind.GetKeyword, SyntaxKind.SetKeyword)); @@ -5107,9 +5108,9 @@ namespace ts { } function getConstructorOccurrences(constructorDeclaration: ConstructorDeclaration): HighlightSpan[] { - const declarations = constructorDeclaration.symbol.getDeclarations(); + let declarations = constructorDeclaration.symbol.getDeclarations() - const keywords: Node[] = []; + let keywords: Node[] = []; forEach(declarations, declaration => { forEach(declaration.getChildren(), token => { @@ -5121,12 +5122,12 @@ namespace ts { } function getLoopBreakContinueOccurrences(loopNode: IterationStatement): HighlightSpan[] { - const keywords: Node[] = []; + let keywords: Node[] = []; if (pushKeywordIf(keywords, loopNode.getFirstToken(), SyntaxKind.ForKeyword, SyntaxKind.WhileKeyword, SyntaxKind.DoKeyword)) { // If we succeeded and got a do-while loop, then start looking for a 'while' keyword. if (loopNode.kind === SyntaxKind.DoStatement) { - const loopTokens = loopNode.getChildren(); + let loopTokens = loopNode.getChildren(); for (let i = loopTokens.length - 1; i >= 0; i--) { if (pushKeywordIf(keywords, loopTokens[i], SyntaxKind.WhileKeyword)) { @@ -5136,7 +5137,7 @@ namespace ts { } } - const breaksAndContinues = aggregateAllBreakAndContinueStatements(loopNode.statement); + let breaksAndContinues = aggregateAllBreakAndContinueStatements(loopNode.statement); forEach(breaksAndContinues, statement => { if (ownsBreakOrContinueStatement(loopNode, statement)) { @@ -5148,7 +5149,7 @@ namespace ts { } function getBreakOrContinueStatementOccurrences(breakOrContinueStatement: BreakOrContinueStatement): HighlightSpan[] { - const owner = getBreakOrContinueOwner(breakOrContinueStatement); + let owner = getBreakOrContinueOwner(breakOrContinueStatement); if (owner) { switch (owner.kind) { @@ -5157,7 +5158,7 @@ namespace ts { case SyntaxKind.ForOfStatement: case SyntaxKind.DoStatement: case SyntaxKind.WhileStatement: - return getLoopBreakContinueOccurrences(owner); + return getLoopBreakContinueOccurrences(owner) case SyntaxKind.SwitchStatement: return getSwitchCaseDefaultOccurrences(owner); @@ -5168,7 +5169,7 @@ namespace ts { } function getSwitchCaseDefaultOccurrences(switchStatement: SwitchStatement): HighlightSpan[] { - const keywords: Node[] = []; + let keywords: Node[] = []; pushKeywordIf(keywords, switchStatement.getFirstToken(), SyntaxKind.SwitchKeyword); @@ -5176,7 +5177,7 @@ namespace ts { forEach(switchStatement.caseBlock.clauses, clause => { pushKeywordIf(keywords, clause.getFirstToken(), SyntaxKind.CaseKeyword, SyntaxKind.DefaultKeyword); - const breaksAndContinues = aggregateAllBreakAndContinueStatements(clause); + let breaksAndContinues = aggregateAllBreakAndContinueStatements(clause); forEach(breaksAndContinues, statement => { if (ownsBreakOrContinueStatement(switchStatement, statement)) { @@ -5189,7 +5190,7 @@ namespace ts { } function getTryCatchFinallyOccurrences(tryStatement: TryStatement): HighlightSpan[] { - const keywords: Node[] = []; + let keywords: Node[] = []; pushKeywordIf(keywords, tryStatement.getFirstToken(), SyntaxKind.TryKeyword); @@ -5198,7 +5199,7 @@ namespace ts { } if (tryStatement.finallyBlock) { - const finallyKeyword = findChildOfKind(tryStatement, SyntaxKind.FinallyKeyword, sourceFile); + let finallyKeyword = findChildOfKind(tryStatement, SyntaxKind.FinallyKeyword, sourceFile); pushKeywordIf(keywords, finallyKeyword, SyntaxKind.FinallyKeyword); } @@ -5206,13 +5207,13 @@ namespace ts { } function getThrowOccurrences(throwStatement: ThrowStatement): HighlightSpan[] { - const owner = getThrowStatementOwner(throwStatement); + let owner = getThrowStatementOwner(throwStatement); if (!owner) { return undefined; } - const keywords: Node[] = []; + let keywords: Node[] = []; forEach(aggregateOwnedThrowStatements(owner), throwStatement => { pushKeywordIf(keywords, throwStatement.getFirstToken(), SyntaxKind.ThrowKeyword); @@ -5230,14 +5231,14 @@ namespace ts { } function getReturnOccurrences(returnStatement: ReturnStatement): HighlightSpan[] { - const func = getContainingFunction(returnStatement); + let func = getContainingFunction(returnStatement); // If we didn't find a containing function with a block body, bail out. if (!(func && hasKind(func.body, SyntaxKind.Block))) { return undefined; } - const keywords: Node[] = []; + let keywords: Node[] = [] forEachReturnStatement(func.body, returnStatement => { pushKeywordIf(keywords, returnStatement.getFirstToken(), SyntaxKind.ReturnKeyword); }); @@ -5251,7 +5252,7 @@ namespace ts { } function getIfElseOccurrences(ifStatement: IfStatement): HighlightSpan[] { - const keywords: Node[] = []; + let keywords: Node[] = []; // Traverse upwards through all parent if-statements linked by their else-branches. while (hasKind(ifStatement.parent, SyntaxKind.IfStatement) && (ifStatement.parent).elseStatement === ifStatement) { @@ -5260,7 +5261,7 @@ namespace ts { // Now traverse back down through the else branches, aggregating if/else keywords of if-statements. while (ifStatement) { - const children = ifStatement.getChildren(); + let children = ifStatement.getChildren(); pushKeywordIf(keywords, children[0], SyntaxKind.IfKeyword); // Generally the 'else' keyword is second-to-last, so we traverse backwards. @@ -5271,20 +5272,20 @@ namespace ts { } if (!hasKind(ifStatement.elseStatement, SyntaxKind.IfStatement)) { - break; + break } ifStatement = ifStatement.elseStatement; } - const result: HighlightSpan[] = []; + let result: HighlightSpan[] = []; // We'd like to highlight else/ifs together if they are only separated by whitespace // (i.e. the keywords are separated by no comments, no newlines). for (let i = 0; i < keywords.length; i++) { if (keywords[i].kind === SyntaxKind.ElseKeyword && i < keywords.length - 1) { - const elseKeyword = keywords[i]; - const ifKeyword = keywords[i + 1]; // this *should* always be an 'if' keyword. + let elseKeyword = keywords[i]; + let ifKeyword = keywords[i + 1]; // this *should* always be an 'if' keyword. let shouldCombindElseAndIf = true; @@ -5327,9 +5328,9 @@ namespace ts { return undefined; } - const result: ReferenceEntry[] = []; - for (const entry of documentHighlights) { - for (const highlightSpan of entry.highlightSpans) { + let result: ReferenceEntry[] = []; + for (let entry of documentHighlights) { + for (let highlightSpan of entry.highlightSpans) { result.push({ fileName: entry.fileName, textSpan: highlightSpan.textSpan, @@ -5347,9 +5348,9 @@ namespace ts { return undefined; } - const referenceEntries: ReferenceEntry[] = []; + let referenceEntries: ReferenceEntry[] = []; - for (const referenceSymbol of referenceSymbols) { + for (let referenceSymbol of referenceSymbols) { addRange(referenceEntries, referenceSymbol.references); } @@ -5357,17 +5358,17 @@ namespace ts { } function findRenameLocations(fileName: string, position: number, findInStrings: boolean, findInComments: boolean): RenameLocation[] { - const referencedSymbols = findReferencedSymbols(fileName, position, findInStrings, findInComments); + let referencedSymbols = findReferencedSymbols(fileName, position, findInStrings, findInComments); return convertReferences(referencedSymbols); } function getReferencesAtPosition(fileName: string, position: number): ReferenceEntry[] { - const referencedSymbols = findReferencedSymbols(fileName, position, /*findInStrings*/ false, /*findInComments*/ false); + let referencedSymbols = findReferencedSymbols(fileName, position, /*findInStrings:*/ false, /*findInComments:*/ false); return convertReferences(referencedSymbols); } - function findReferences(fileName: string, position: number): ReferencedSymbol[] { - const referencedSymbols = findReferencedSymbols(fileName, position, /*findInStrings*/ false, /*findInComments*/ false); + function findReferences(fileName: string, position: number): ReferencedSymbol[]{ + let referencedSymbols = findReferencedSymbols(fileName, position, /*findInStrings:*/ false, /*findInComments:*/ false); // Only include referenced symbols that have a valid definition. return filter(referencedSymbols, rs => !!rs.definition); @@ -5376,17 +5377,17 @@ namespace ts { function findReferencedSymbols(fileName: string, position: number, findInStrings: boolean, findInComments: boolean): ReferencedSymbol[] { synchronizeHostData(); - const sourceFile = getValidSourceFile(fileName); + let sourceFile = getValidSourceFile(fileName); - const node = getTouchingPropertyName(sourceFile, position); + let node = getTouchingPropertyName(sourceFile, position); if (!node) { return undefined; } if (node.kind !== SyntaxKind.Identifier && // TODO (drosen): This should be enabled in a later release - currently breaks rename. - // node.kind !== SyntaxKind.ThisKeyword && - // node.kind !== SyntaxKind.SuperKeyword && + //node.kind !== SyntaxKind.ThisKeyword && + //node.kind !== SyntaxKind.SuperKeyword && !isLiteralNameOfPropertyDeclarationOrIndexAccess(node) && !isNameOfExternalModuleImportOrDeclaration(node)) { return undefined; @@ -5397,12 +5398,12 @@ namespace ts { } function getReferencedSymbolsForNode(node: Node, sourceFiles: SourceFile[], findInStrings: boolean, findInComments: boolean): ReferencedSymbol[] { - const typeChecker = program.getTypeChecker(); + let typeChecker = program.getTypeChecker(); // Labels if (isLabelName(node)) { if (isJumpStatementTarget(node)) { - const labelDefinition = getTargetLabel((node.parent), (node).text); + let labelDefinition = getTargetLabel((node.parent), (node).text); // if we have a label definition, look within its statement for references, if not, then // the label is undefined and we have no results.. return labelDefinition ? getLabelReferencesInNode(labelDefinition.parent, labelDefinition) : undefined; @@ -5421,7 +5422,7 @@ namespace ts { return getReferencesForSuperKeyword(node); } - const symbol = typeChecker.getSymbolAtLocation(node); + let symbol = typeChecker.getSymbolAtLocation(node); // Could not find a symbol e.g. unknown identifier if (!symbol) { @@ -5429,7 +5430,7 @@ namespace ts { return undefined; } - const declarations = symbol.declarations; + let declarations = symbol.declarations; // The symbol was an internal symbol and does not have a declaration e.g. undefined symbol if (!declarations || !declarations.length) { @@ -5439,29 +5440,29 @@ namespace ts { let result: ReferencedSymbol[]; // Compute the meaning from the location and the symbol it references - const searchMeaning = getIntersectingMeaningFromDeclarations(getMeaningFromLocation(node), declarations); + let searchMeaning = getIntersectingMeaningFromDeclarations(getMeaningFromLocation(node), declarations); // Get the text to search for. // Note: if this is an external module symbol, the name doesn't include quotes. - const declaredName = stripQuotes(getDeclaredName(typeChecker, symbol, node)); + let declaredName = stripQuotes(getDeclaredName(typeChecker, symbol, node)); // Try to get the smallest valid scope that we can limit our search to; // otherwise we'll need to search globally (i.e. include each file). - const scope = getSymbolScope(symbol); + let scope = getSymbolScope(symbol); // Maps from a symbol ID to the ReferencedSymbol entry in 'result'. - const symbolToIndex: number[] = []; + let symbolToIndex: number[] = []; if (scope) { result = []; getReferencesInNode(scope, symbol, declaredName, node, searchMeaning, findInStrings, findInComments, result, symbolToIndex); } else { - const internedName = getInternedName(symbol, node, declarations); - for (const sourceFile of sourceFiles) { + let internedName = getInternedName(symbol, node, declarations) + for (let sourceFile of sourceFiles) { cancellationToken.throwIfCancellationRequested(); - const nameTable = getNameTable(sourceFile); + let nameTable = getNameTable(sourceFile); if (lookUp(nameTable, internedName)) { result = result || []; @@ -5473,9 +5474,9 @@ namespace ts { return result; function getDefinition(symbol: Symbol): DefinitionInfo { - const info = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, node.getSourceFile(), getContainerNode(node), node); - const name = map(info.displayParts, p => p.text).join(""); - const declarations = symbol.declarations; + let info = getSymbolDisplayPartsDocumentationAndSymbolKind(symbol, node.getSourceFile(), getContainerNode(node), node); + let name = map(info.displayParts, p => p.text).join(""); + let declarations = symbol.declarations; if (!declarations || declarations.length === 0) { return undefined; } @@ -5505,7 +5506,7 @@ namespace ts { // Try to get the local symbol if we're dealing with an 'export default' // since that symbol has the "true" name. - const localExportDefaultSymbol = getLocalSymbolForExportDefault(symbol); + let localExportDefaultSymbol = getLocalSymbolForExportDefault(symbol); symbol = localExportDefaultSymbol || symbol; return stripQuotes(symbol.name); @@ -5522,14 +5523,14 @@ namespace ts { function getSymbolScope(symbol: Symbol): Node { // If this is the symbol of a named function expression or named class expression, // then named references are limited to its own scope. - const valueDeclaration = symbol.valueDeclaration; + let valueDeclaration = symbol.valueDeclaration; if (valueDeclaration && (valueDeclaration.kind === SyntaxKind.FunctionExpression || valueDeclaration.kind === SyntaxKind.ClassExpression)) { return valueDeclaration; } // If this is private property or method, the scope is the containing class if (symbol.flags & (SymbolFlags.Property | SymbolFlags.Method)) { - const privateDeclaration = forEach(symbol.getDeclarations(), d => (d.flags & NodeFlags.Private) ? d : undefined); + let privateDeclaration = forEach(symbol.getDeclarations(), d => (d.flags & NodeFlags.Private) ? d : undefined); if (privateDeclaration) { return getAncestor(privateDeclaration, SyntaxKind.ClassDeclaration); } @@ -5547,12 +5548,12 @@ namespace ts { return undefined; } - let scope: Node; + let scope: Node = undefined; - const declarations = symbol.getDeclarations(); + let declarations = symbol.getDeclarations(); if (declarations) { - for (const declaration of declarations) { - const container = getContainerNode(declaration); + for (let declaration of declarations) { + let container = getContainerNode(declaration); if (!container) { return undefined; @@ -5578,7 +5579,7 @@ namespace ts { } function getPossibleSymbolReferencePositions(sourceFile: SourceFile, symbolName: string, start: number, end: number): number[] { - const positions: number[] = []; + let positions: number[] = []; /// TODO: Cache symbol existence for files to save text search // Also, need to make this work for unicode escapes. @@ -5588,9 +5589,9 @@ namespace ts { return positions; } - const text = sourceFile.text; - const sourceLength = text.length; - const symbolNameLength = symbolName.length; + let text = sourceFile.text; + let sourceLength = text.length; + let symbolNameLength = symbolName.length; let position = text.indexOf(symbolName, start); while (position >= 0) { @@ -5601,7 +5602,7 @@ namespace ts { // We found a match. Make sure it's not part of a larger word (i.e. the char // before and after it have to be a non-identifier char). - const endPosition = position + symbolNameLength; + let endPosition = position + symbolNameLength; if ((position === 0 || !isIdentifierPart(text.charCodeAt(position - 1), ScriptTarget.Latest)) && (endPosition === sourceLength || !isIdentifierPart(text.charCodeAt(endPosition), ScriptTarget.Latest))) { @@ -5615,14 +5616,14 @@ namespace ts { } function getLabelReferencesInNode(container: Node, targetLabel: Identifier): ReferencedSymbol[] { - const references: ReferenceEntry[] = []; - const sourceFile = container.getSourceFile(); - const labelName = targetLabel.text; - const possiblePositions = getPossibleSymbolReferencePositions(sourceFile, labelName, container.getStart(), container.getEnd()); + let references: ReferenceEntry[] = []; + let sourceFile = container.getSourceFile(); + let labelName = targetLabel.text; + let possiblePositions = getPossibleSymbolReferencePositions(sourceFile, labelName, container.getStart(), container.getEnd()); forEach(possiblePositions, position => { cancellationToken.throwIfCancellationRequested(); - const node = getTouchingWord(sourceFile, position); + let node = getTouchingWord(sourceFile, position); if (!node || node.getWidth() !== labelName.length) { return; } @@ -5634,14 +5635,14 @@ namespace ts { } }); - const definition: DefinitionInfo = { + let definition: DefinitionInfo = { containerKind: "", containerName: "", fileName: targetLabel.getSourceFile().fileName, kind: ScriptElementKind.label, name: labelName, textSpan: createTextSpanFromBounds(targetLabel.getStart(), targetLabel.getEnd()) - }; + } return [{ definition, references }]; } @@ -5686,19 +5687,19 @@ namespace ts { result: ReferencedSymbol[], symbolToIndex: number[]): void { - const sourceFile = container.getSourceFile(); - const tripleSlashDirectivePrefixRegex = /^\/\/\/\s* { cancellationToken.throwIfCancellationRequested(); - const referenceLocation = getTouchingPropertyName(sourceFile, position); + let referenceLocation = getTouchingPropertyName(sourceFile, position); if (!isValidReferencePosition(referenceLocation, searchText)) { // This wasn't the start of a token. Check to see if it might be a // match in a comment or string if that's what the caller is asking @@ -5726,14 +5727,14 @@ namespace ts { return; } - const referenceSymbol = typeChecker.getSymbolAtLocation(referenceLocation); + let referenceSymbol = typeChecker.getSymbolAtLocation(referenceLocation); if (referenceSymbol) { - const referenceSymbolDeclaration = referenceSymbol.valueDeclaration; - const shorthandValueSymbol = typeChecker.getShorthandAssignmentValueSymbol(referenceSymbolDeclaration); - const relatedSymbol = getRelatedSymbol(searchSymbols, referenceSymbol, referenceLocation); + let referenceSymbolDeclaration = referenceSymbol.valueDeclaration; + let shorthandValueSymbol = typeChecker.getShorthandAssignmentValueSymbol(referenceSymbolDeclaration); + let relatedSymbol = getRelatedSymbol(searchSymbols, referenceSymbol, referenceLocation); if (relatedSymbol) { - const referencedSymbol = getReferencedSymbol(relatedSymbol); + let referencedSymbol = getReferencedSymbol(relatedSymbol); referencedSymbol.references.push(getReferenceEntryFromNode(referenceLocation)); } /* Because in short-hand property assignment, an identifier which stored as name of the short-hand property assignment @@ -5743,7 +5744,7 @@ namespace ts { * position of property accessing, the referenceEntry of such position will be handled in the first case. */ else if (!(referenceSymbol.flags & SymbolFlags.Transient) && searchSymbols.indexOf(shorthandValueSymbol) >= 0) { - const referencedSymbol = getReferencedSymbol(shorthandValueSymbol); + let referencedSymbol = getReferencedSymbol(shorthandValueSymbol); referencedSymbol.references.push(getReferenceEntryFromNode(referenceSymbolDeclaration.name)); } } @@ -5753,7 +5754,7 @@ namespace ts { return; function getReferencedSymbol(symbol: Symbol): ReferencedSymbol { - const symbolId = getSymbolId(symbol); + let symbolId = getSymbolId(symbol); let index = symbolToIndex[symbolId]; if (index === undefined) { index = result.length; @@ -5772,7 +5773,7 @@ namespace ts { return isInCommentHelper(sourceFile, position, isNonReferenceComment); function isNonReferenceComment(c: CommentRange): boolean { - const commentText = sourceFile.text.substring(c.pos, c.end); + let commentText = sourceFile.text.substring(c.pos, c.end); return !tripleSlashDirectivePrefixRegex.test(commentText); } } @@ -5801,20 +5802,20 @@ namespace ts { return undefined; } - const references: ReferenceEntry[] = []; + let references: ReferenceEntry[] = []; - const sourceFile = searchSpaceNode.getSourceFile(); - const possiblePositions = getPossibleSymbolReferencePositions(sourceFile, "super", searchSpaceNode.getStart(), searchSpaceNode.getEnd()); + let sourceFile = searchSpaceNode.getSourceFile(); + let possiblePositions = getPossibleSymbolReferencePositions(sourceFile, "super", searchSpaceNode.getStart(), searchSpaceNode.getEnd()); forEach(possiblePositions, position => { cancellationToken.throwIfCancellationRequested(); - const node = getTouchingWord(sourceFile, position); + let node = getTouchingWord(sourceFile, position); if (!node || node.kind !== SyntaxKind.SuperKeyword) { return; } - const container = getSuperContainer(node, /*includeFunctions*/ false); + let container = getSuperContainer(node, /*includeFunctions*/ false); // If we have a 'super' container, we must have an enclosing class. // Now make sure the owning class is the same as the search-space @@ -5824,7 +5825,7 @@ namespace ts { } }); - const definition = getDefinition(searchSpaceNode.symbol); + let definition = getDefinition(searchSpaceNode.symbol); return [{ definition, references }]; } @@ -5846,7 +5847,7 @@ namespace ts { case SyntaxKind.Constructor: case SyntaxKind.GetAccessor: case SyntaxKind.SetAccessor: - staticFlag &= searchSpaceNode.flags; + staticFlag &= searchSpaceNode.flags searchSpaceNode = searchSpaceNode.parent; // re-assign to be the owning class break; case SyntaxKind.SourceFile: @@ -5863,7 +5864,7 @@ namespace ts { return undefined; } - const references: ReferenceEntry[] = []; + let references: ReferenceEntry[] = []; let possiblePositions: number[]; if (searchSpaceNode.kind === SyntaxKind.SourceFile) { @@ -5873,7 +5874,7 @@ namespace ts { }); } else { - const sourceFile = searchSpaceNode.getSourceFile(); + let sourceFile = searchSpaceNode.getSourceFile(); possiblePositions = getPossibleSymbolReferencePositions(sourceFile, "this", searchSpaceNode.getStart(), searchSpaceNode.getEnd()); getThisReferencesInFile(sourceFile, searchSpaceNode, possiblePositions, references); } @@ -5894,12 +5895,12 @@ namespace ts { forEach(possiblePositions, position => { cancellationToken.throwIfCancellationRequested(); - const node = getTouchingWord(sourceFile, position); + let node = getTouchingWord(sourceFile, position); if (!node || (node.kind !== SyntaxKind.ThisKeyword && node.kind !== SyntaxKind.ThisType)) { return; } - const container = getThisContainer(node, /* includeArrowFunctions */ false); + let container = getThisContainer(node, /* includeArrowFunctions */ false); switch (searchSpaceNode.kind) { case SyntaxKind.FunctionExpression: @@ -5954,13 +5955,13 @@ namespace ts { * property name and variable declaration of the identifier. * Like in below example, when querying for all references for an identifier 'name', of the property assignment, the language service * should show both 'name' in 'obj' and 'name' in variable declaration - * const name = "Foo"; - * const obj = { name }; + * let name = "Foo"; + * let obj = { name }; * In order to do that, we will populate the search set with the value symbol of the identifier as a value of the property assignment * so that when matching with potential reference symbol, both symbols from property declaration and variable declaration * will be included correctly. */ - const shorthandValueSymbol = typeChecker.getShorthandAssignmentValueSymbol(location.parent); + let shorthandValueSymbol = typeChecker.getShorthandAssignmentValueSymbol(location.parent); if (shorthandValueSymbol) { result.push(shorthandValueSymbol); } @@ -6007,9 +6008,9 @@ namespace ts { function getPropertySymbolFromTypeReference(typeReference: ExpressionWithTypeArguments) { if (typeReference) { - const type = typeChecker.getTypeAtLocation(typeReference); + let type = typeChecker.getTypeAtLocation(typeReference); if (type) { - const propertySymbol = typeChecker.getPropertyOfType(type, propertyName); + let propertySymbol = typeChecker.getPropertyOfType(type, propertyName); if (propertySymbol) { result.push(propertySymbol); } @@ -6029,7 +6030,7 @@ namespace ts { // If the reference symbol is an alias, check if what it is aliasing is one of the search // symbols. if (isImportOrExportSpecifierImportSymbol(referenceSymbol)) { - const aliasedSymbol = typeChecker.getAliasedSymbol(referenceSymbol); + let aliasedSymbol = typeChecker.getAliasedSymbol(referenceSymbol); if (searchSymbols.indexOf(aliasedSymbol) >= 0) { return aliasedSymbol; } @@ -6055,7 +6056,7 @@ namespace ts { // Finally, try all properties with the same name in any type the containing type extended or implemented, and // see if any is in the list if (rootSymbol.parent && rootSymbol.parent.flags & (SymbolFlags.Class | SymbolFlags.Interface)) { - const result: Symbol[] = []; + let result: Symbol[] = []; getPropertySymbolsFromBaseTypes(rootSymbol.parent, rootSymbol.getName(), result); return forEach(result, s => searchSymbols.indexOf(s) >= 0 ? s : undefined); } @@ -6066,21 +6067,21 @@ namespace ts { function getPropertySymbolsFromContextualType(node: Node): Symbol[] { if (isNameOfPropertyAssignment(node)) { - const objectLiteral = node.parent.parent; - const contextualType = typeChecker.getContextualType(objectLiteral); - const name = (node).text; + let objectLiteral = node.parent.parent; + let contextualType = typeChecker.getContextualType(objectLiteral); + let name = (node).text; if (contextualType) { if (contextualType.flags & TypeFlags.Union) { // This is a union type, first see if the property we are looking for is a union property (i.e. exists in all types) // if not, search the constituent types for the property - const unionProperty = contextualType.getProperty(name); + let unionProperty = contextualType.getProperty(name) if (unionProperty) { return [unionProperty]; } else { - const result: Symbol[] = []; + let result: Symbol[] = []; forEach((contextualType).types, t => { - const symbol = t.getProperty(name); + let symbol = t.getProperty(name); if (symbol) { result.push(symbol); } @@ -6089,7 +6090,7 @@ namespace ts { } } else { - const symbol = contextualType.getProperty(name); + let symbol = contextualType.getProperty(name); if (symbol) { return [symbol]; } @@ -6118,8 +6119,8 @@ namespace ts { // Remember the last meaning lastIterationMeaning = meaning; - for (const declaration of declarations) { - const declarationMeaning = getMeaningFromDeclaration(declaration); + for (let declaration of declarations) { + let declarationMeaning = getMeaningFromDeclaration(declaration); if (declarationMeaning & meaning) { meaning |= declarationMeaning; @@ -6154,13 +6155,13 @@ namespace ts { return true; } - const parent = node.parent; + let parent = node.parent; if (parent) { if (parent.kind === SyntaxKind.PostfixUnaryExpression || parent.kind === SyntaxKind.PrefixUnaryExpression) { return true; } else if (parent.kind === SyntaxKind.BinaryExpression && (parent).left === node) { - const operator = (parent).operatorToken.kind; + let operator = (parent).operatorToken.kind; return SyntaxKind.FirstAssignment <= operator && operator <= SyntaxKind.LastAssignment; } } @@ -6182,8 +6183,8 @@ namespace ts { function getEmitOutput(fileName: string): EmitOutput { synchronizeHostData(); - const sourceFile = getValidSourceFile(fileName); - const outputFiles: OutputFile[] = []; + let sourceFile = getValidSourceFile(fileName); + let outputFiles: OutputFile[] = []; function writeFile(fileName: string, data: string, writeByteOrderMark: boolean) { outputFiles.push({ @@ -6193,7 +6194,7 @@ namespace ts { }); } - const emitOutput = program.emit(sourceFile, writeFile, cancellationToken); + let emitOutput = program.emit(sourceFile, writeFile, cancellationToken); return { outputFiles, @@ -6286,7 +6287,7 @@ namespace ts { } if (!isLastClause && root.parent.kind === SyntaxKind.ExpressionWithTypeArguments && root.parent.parent.kind === SyntaxKind.HeritageClause) { - const decl = root.parent.parent.parent; + let decl = root.parent.parent.parent; return (decl.kind === SyntaxKind.ClassDeclaration && (root.parent.parent).token === SyntaxKind.ImplementsKeyword) || (decl.kind === SyntaxKind.InterfaceDeclaration && (root.parent.parent).token === SyntaxKind.ExtendsKeyword); } @@ -6358,7 +6359,7 @@ namespace ts { function getSignatureHelpItems(fileName: string, position: number): SignatureHelpItems { synchronizeHostData(); - const sourceFile = getValidSourceFile(fileName); + let sourceFile = getValidSourceFile(fileName); return SignatureHelp.getSignatureHelpItems(program, sourceFile, position, cancellationToken); } @@ -6369,10 +6370,10 @@ namespace ts { } function getNameOrDottedNameSpan(fileName: string, startPos: number, endPos: number): TextSpan { - const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); // Get node at the location - const node = getTouchingPropertyName(sourceFile, startPos); + let node = getTouchingPropertyName(sourceFile, startPos); if (!node) { return; @@ -6428,13 +6429,13 @@ namespace ts { function getBreakpointStatementAtPosition(fileName: string, position: number) { // doesn't use compiler - no need to synchronize with host - const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return BreakpointResolver.spanInSourceFileAtLocation(sourceFile, position); } function getNavigationBarItems(fileName: string): NavigationBarItem[] { - const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return NavigationBar.getNavigationBarItems(sourceFile, host.getCompilationSettings()); } @@ -6466,11 +6467,11 @@ namespace ts { function getEncodedSemanticClassifications(fileName: string, span: TextSpan): Classifications { synchronizeHostData(); - const sourceFile = getValidSourceFile(fileName); - const typeChecker = program.getTypeChecker(); + let sourceFile = getValidSourceFile(fileName); + let typeChecker = program.getTypeChecker(); - const result: number[] = []; - const classifiableNames = program.getClassifiableNames(); + let result: number[] = []; + let classifiableNames = program.getClassifiableNames(); processNode(sourceFile); return { spans: result, endOfLineState: EndOfLineState.None }; @@ -6482,7 +6483,7 @@ namespace ts { } function classifySymbol(symbol: Symbol, meaningAtPosition: SemanticMeaning): ClassificationType { - const flags = symbol.getFlags(); + let flags = symbol.getFlags(); if ((flags & SymbolFlags.Classifiable) === SymbolFlags.None) { return; } @@ -6530,19 +6531,19 @@ namespace ts { function processNode(node: Node) { // Only walk into nodes that intersect the requested span. if (node && textSpanIntersectsWith(span, node.getFullStart(), node.getFullWidth())) { - const kind = node.kind; + let kind = node.kind; checkForClassificationCancellation(kind); if (kind === SyntaxKind.Identifier && !nodeIsMissing(node)) { - const identifier = 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 (classifiableNames[identifier.text]) { - const symbol = typeChecker.getSymbolAtLocation(node); + let symbol = typeChecker.getSymbolAtLocation(node); if (symbol) { - const type = classifySymbol(symbol, getMeaningFromLocation(node)); + let type = classifySymbol(symbol, getMeaningFromLocation(node)); if (type) { pushClassification(node.getStart(), node.getWidth(), type); } @@ -6582,8 +6583,8 @@ namespace ts { function convertClassifications(classifications: Classifications): ClassifiedSpan[] { Debug.assert(classifications.spans.length % 3 === 0); - const dense = classifications.spans; - const result: ClassifiedSpan[] = []; + let dense = classifications.spans; + let result: ClassifiedSpan[] = []; for (let i = 0, n = dense.length; i < n; i += 3) { result.push({ textSpan: createTextSpan(dense[i], dense[i + 1]), @@ -6600,15 +6601,15 @@ namespace ts { function getEncodedSyntacticClassifications(fileName: string, span: TextSpan): Classifications { // doesn't use compiler - no need to synchronize with host - const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); - const spanStart = span.start; - const spanLength = span.length; + let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + let spanStart = span.start; + let spanLength = span.length; // Make a scanner we can get trivia from. - const triviaScanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false, sourceFile.languageVariant, sourceFile.text); - const mergeConflictScanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false, sourceFile.languageVariant, sourceFile.text); + let triviaScanner = createScanner(ScriptTarget.Latest, /*skipTrivia:*/ false, sourceFile.languageVariant, sourceFile.text); + let mergeConflictScanner = createScanner(ScriptTarget.Latest, /*skipTrivia:*/ false, sourceFile.languageVariant, sourceFile.text); - const result: number[] = []; + let result: number[] = []; processElement(sourceFile); return { spans: result, endOfLineState: EndOfLineState.None }; @@ -6622,15 +6623,15 @@ namespace ts { function classifyLeadingTriviaAndGetTokenStart(token: Node): number { triviaScanner.setTextPos(token.pos); while (true) { - const start = triviaScanner.getTextPos(); + let start = triviaScanner.getTextPos(); // only bother scanning if we have something that could be trivia. if (!couldStartTrivia(sourceFile.text, start)) { return start; } - const kind = triviaScanner.scan(); - const end = triviaScanner.getTextPos(); - const width = end - start; + let kind = triviaScanner.scan(); + let end = triviaScanner.getTextPos(); + let width = end - start; // The moment we get something that isn't trivia, then stop processing. if (!isTrivia(kind)) { @@ -6654,8 +6655,8 @@ namespace ts { } if (kind === SyntaxKind.ConflictMarkerTrivia) { - const text = sourceFile.text; - const ch = text.charCodeAt(start); + let text = sourceFile.text; + let ch = text.charCodeAt(start); // for the <<<<<<< and >>>>>>> markers, we just add them in as comments // in the classification stream. @@ -6676,7 +6677,7 @@ namespace ts { if (kind === SyntaxKind.MultiLineCommentTrivia) { // See if this is a doc comment. If so, we'll classify certain portions of it // specially. - const docCommentAndDiagnostics = parseIsolatedJSDocComment(sourceFile.text, start, width); + let docCommentAndDiagnostics = parseIsolatedJSDocComment(sourceFile.text, start, width); if (docCommentAndDiagnostics && docCommentAndDiagnostics.jsDocComment) { docCommentAndDiagnostics.jsDocComment.parent = token; classifyJSDocComment(docCommentAndDiagnostics.jsDocComment); @@ -6695,7 +6696,7 @@ namespace ts { function classifyJSDocComment(docComment: JSDocComment) { let pos = docComment.pos; - for (const tag of docComment.tags) { + for (let tag of docComment.tags) { // As we walk through each tag, classify the portion of text from the end of // the last tag (or the start of the entire doc comment) as 'comment'. if (tag.pos !== pos) { @@ -6753,7 +6754,7 @@ namespace ts { } function processJSDocTemplateTag(tag: JSDocTemplateTag) { - for (const child of tag.getChildren()) { + for (let child of tag.getChildren()) { processElement(child); } } @@ -6775,11 +6776,11 @@ namespace ts { } function classifyDisabledCodeToken() { - const start = mergeConflictScanner.getTextPos(); - const tokenKind = mergeConflictScanner.scan(); - const end = mergeConflictScanner.getTextPos(); + let start = mergeConflictScanner.getTextPos(); + let tokenKind = mergeConflictScanner.scan(); + let end = mergeConflictScanner.getTextPos(); - const type = classifyTokenType(tokenKind); + let type = classifyTokenType(tokenKind); if (type) { pushClassification(start, end - start, type); } @@ -6790,12 +6791,12 @@ namespace ts { return; } - const tokenStart = classifyLeadingTriviaAndGetTokenStart(token); + let tokenStart = classifyLeadingTriviaAndGetTokenStart(token); - const tokenWidth = token.end - tokenStart; + let tokenWidth = token.end - tokenStart; Debug.assert(tokenWidth >= 0); if (tokenWidth > 0) { - const type = classifyTokenType(token.kind, token); + let type = classifyTokenType(token.kind, token); if (type) { pushClassification(tokenStart, tokenWidth, type); } @@ -6922,9 +6923,9 @@ namespace ts { if (decodedTextSpanIntersectsWith(spanStart, spanLength, element.pos, element.getFullWidth())) { checkForClassificationCancellation(element.kind); - const children = element.getChildren(sourceFile); + let children = element.getChildren(sourceFile); for (let i = 0, n = children.length; i < n; i++) { - const child = children[i]; + let child = children[i]; if (isToken(child)) { classifyToken(child); } @@ -6939,28 +6940,28 @@ namespace ts { function getOutliningSpans(fileName: string): OutliningSpan[] { // doesn't use compiler - no need to synchronize with host - const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return OutliningElementsCollector.collectElements(sourceFile); } function getBraceMatchingAtPosition(fileName: string, position: number) { - const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); - const result: TextSpan[] = []; + let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + let result: TextSpan[] = []; - const token = getTouchingToken(sourceFile, position); + let token = getTouchingToken(sourceFile, position); if (token.getStart(sourceFile) === position) { - const matchKind = getMatchingTokenKind(token); + let matchKind = getMatchingTokenKind(token); // Ensure that there is a corresponding token to match ours. if (matchKind) { - const parentElement = token.parent; + let parentElement = token.parent; - const childNodes = parentElement.getChildren(sourceFile); - for (const current of childNodes) { + let childNodes = parentElement.getChildren(sourceFile); + for (let current of childNodes) { if (current.kind === matchKind) { - const range1 = createTextSpan(token.getStart(sourceFile), token.getWidth(sourceFile)); - const range2 = createTextSpan(current.getStart(sourceFile), current.getWidth(sourceFile)); + let range1 = createTextSpan(token.getStart(sourceFile), token.getWidth(sourceFile)); + let range2 = createTextSpan(current.getStart(sourceFile), current.getWidth(sourceFile)); // We want to order the braces when we return the result. if (range1.start < range2.start) { @@ -6980,11 +6981,11 @@ namespace ts { function getMatchingTokenKind(token: Node): ts.SyntaxKind { switch (token.kind) { - case ts.SyntaxKind.OpenBraceToken: return ts.SyntaxKind.CloseBraceToken; + case ts.SyntaxKind.OpenBraceToken: return ts.SyntaxKind.CloseBraceToken case ts.SyntaxKind.OpenParenToken: return ts.SyntaxKind.CloseParenToken; case ts.SyntaxKind.OpenBracketToken: return ts.SyntaxKind.CloseBracketToken; case ts.SyntaxKind.LessThanToken: return ts.SyntaxKind.GreaterThanToken; - case ts.SyntaxKind.CloseBraceToken: return ts.SyntaxKind.OpenBraceToken; + case ts.SyntaxKind.CloseBraceToken: return ts.SyntaxKind.OpenBraceToken case ts.SyntaxKind.CloseParenToken: return ts.SyntaxKind.OpenParenToken; case ts.SyntaxKind.CloseBracketToken: return ts.SyntaxKind.OpenBracketToken; case ts.SyntaxKind.GreaterThanToken: return ts.SyntaxKind.LessThanToken; @@ -6996,29 +6997,29 @@ namespace ts { function getIndentationAtPosition(fileName: string, position: number, editorOptions: EditorOptions) { let start = new Date().getTime(); - const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); log("getIndentationAtPosition: getCurrentSourceFile: " + (new Date().getTime() - start)); start = new Date().getTime(); - const result = formatting.SmartIndenter.getIndentation(position, sourceFile, editorOptions); + let result = formatting.SmartIndenter.getIndentation(position, sourceFile, editorOptions); log("getIndentationAtPosition: computeIndentation : " + (new Date().getTime() - start)); return result; } function getFormattingEditsForRange(fileName: string, start: number, end: number, options: FormatCodeOptions): TextChange[] { - const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return formatting.formatSelection(start, end, sourceFile, getRuleProvider(options), options); } function getFormattingEditsForDocument(fileName: string, options: FormatCodeOptions): TextChange[] { - const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); return formatting.formatDocument(sourceFile, getRuleProvider(options), options); } function getFormattingEditsAfterKeystroke(fileName: string, position: number, key: string, options: FormatCodeOptions): TextChange[] { - const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); if (key === "}") { return formatting.formatOnClosingCurly(position, sourceFile, getRuleProvider(options), options); @@ -7054,16 +7055,16 @@ namespace ts { * be performed. */ function getDocCommentTemplateAtPosition(fileName: string, position: number): TextInsertion { - const start = new Date().getTime(); - const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); + let start = new Date().getTime(); + let sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); // Check if in a context where we don't want to perform any insertion if (isInString(sourceFile, position) || isInComment(sourceFile, position) || hasDocComment(sourceFile, position)) { return undefined; } - const tokenAtPos = getTokenAtPosition(sourceFile, position); - const tokenStart = tokenAtPos.getStart(); + let tokenAtPos = getTokenAtPosition(sourceFile, position); + let tokenStart = tokenAtPos.getStart() if (!tokenAtPos || tokenStart < position) { return undefined; } @@ -7099,11 +7100,11 @@ namespace ts { return undefined; } - const parameters = getParametersForJsDocOwningNode(commentOwner); - const posLineAndChar = sourceFile.getLineAndCharacterOfPosition(position); - const lineStart = sourceFile.getLineStarts()[posLineAndChar.line]; + let parameters = getParametersForJsDocOwningNode(commentOwner); + let posLineAndChar = sourceFile.getLineAndCharacterOfPosition(position); + let lineStart = sourceFile.getLineStarts()[posLineAndChar.line]; - const indentationStr = sourceFile.text.substr(lineStart, posLineAndChar.character); + let indentationStr = sourceFile.text.substr(lineStart, posLineAndChar.character); // TODO: call a helper method instead once PR #4133 gets merged in. const newLine = host.getNewLine ? host.getNewLine() : "\r\n"; @@ -7127,7 +7128,7 @@ namespace ts { // * if the caret was directly in front of the object, then we add an extra line and indentation. const preamble = "/**" + newLine + indentationStr + " * "; - const result = + let result = preamble + newLine + docParams + indentationStr + " */" + @@ -7171,7 +7172,7 @@ namespace ts { case SyntaxKind.ArrowFunction: return (rightHandSide).parameters; case SyntaxKind.ClassExpression: - for (const member of (rightHandSide).members) { + for (let member of (rightHandSide).members) { if (member.kind === SyntaxKind.Constructor) { return (member).parameters; } @@ -7191,15 +7192,15 @@ namespace ts { // anything away. synchronizeHostData(); - const sourceFile = getValidSourceFile(fileName); + let sourceFile = getValidSourceFile(fileName); cancellationToken.throwIfCancellationRequested(); - const fileContents = sourceFile.text; - const result: TodoComment[] = []; + let fileContents = sourceFile.text; + let result: TodoComment[] = []; if (descriptors.length > 0) { - const regExp = getTodoCommentsRegExp(); + let regExp = getTodoCommentsRegExp(); let matchArray: RegExpExecArray; while (matchArray = regExp.exec(fileContents)) { @@ -7222,15 +7223,15 @@ namespace ts { // // i.e. 'undefined' in position 3 above means TODO(jason) didn't match. // "hack" in position 4 means HACK did match. - const firstDescriptorCaptureIndex = 3; + let firstDescriptorCaptureIndex = 3; Debug.assert(matchArray.length === descriptors.length + firstDescriptorCaptureIndex); - const preamble = matchArray[1]; - const matchPosition = matchArray.index + preamble.length; + let preamble = matchArray[1]; + let matchPosition = matchArray.index + preamble.length; // OK, we have found a match in the file. This is only an acceptable match if // it is contained within a comment. - const token = getTokenAtPosition(sourceFile, matchPosition); + let token = getTokenAtPosition(sourceFile, matchPosition); if (!isInsideComment(sourceFile, token, matchPosition)) { continue; } @@ -7249,7 +7250,7 @@ namespace ts { continue; } - const message = matchArray[2]; + let message = matchArray[2]; result.push({ descriptor: descriptor, message: message, @@ -7280,14 +7281,14 @@ namespace ts { // // The following three regexps are used to match the start of the text up to the TODO // comment portion. - const singleLineCommentStart = /(?:\/\/+\s*)/.source; - const multiLineCommentStart = /(?:\/\*+\s*)/.source; - const anyNumberOfSpacesAndAsterixesAtStartOfLine = /(?:^(?:\s|\*)*)/.source; + let singleLineCommentStart = /(?:\/\/+\s*)/.source; + let multiLineCommentStart = /(?:\/\*+\s*)/.source; + let anyNumberOfSpacesAndAsterixesAtStartOfLine = /(?:^(?:\s|\*)*)/.source; // Match any of the above three TODO comment start regexps. // Note that the outermost group *is* a capture group. We want to capture the preamble // so that we can determine the starting position of the TODO comment match. - const preamble = "(" + anyNumberOfSpacesAndAsterixesAtStartOfLine + "|" + singleLineCommentStart + "|" + multiLineCommentStart + ")"; + let preamble = "(" + anyNumberOfSpacesAndAsterixesAtStartOfLine + "|" + singleLineCommentStart + "|" + multiLineCommentStart + ")"; // Takes the descriptors and forms a regexp that matches them as if they were literals. // For example, if the descriptors are "TODO(jason)" and "HACK", then this will be: @@ -7297,17 +7298,17 @@ namespace ts { // Note that the outermost group is *not* a capture group, but the innermost groups // *are* capture groups. By capturing the inner literals we can determine after // matching which descriptor we are dealing with. - const literals = "(?:" + map(descriptors, d => "(" + escapeRegExp(d.text) + ")").join("|") + ")"; + let literals = "(?:" + map(descriptors, d => "(" + escapeRegExp(d.text) + ")").join("|") + ")"; // After matching a descriptor literal, the following regexp matches the rest of the // text up to the end of the line (or */). - const endOfLineOrEndOfComment = /(?:$|\*\/)/.source; - const messageRemainder = /(?:.*?)/.source; + let endOfLineOrEndOfComment = /(?:$|\*\/)/.source + let messageRemainder = /(?:.*?)/.source // This is the portion of the match we'll return as part of the TODO comment result. We // match the literal portion up to the end of the line or end of comment. - const messagePortion = "(" + literals + messageRemainder + ")"; - const regExpString = preamble + messagePortion + endOfLineOrEndOfComment; + let messagePortion = "(" + literals + messageRemainder + ")"; + let regExpString = preamble + messagePortion + endOfLineOrEndOfComment; // The final regexp will look like this: // /((?:\/\/+\s*)|(?:\/\*+\s*)|(?:^(?:\s|\*)*))((?:(TODO\(jason\))|(HACK))(?:.*?))(?:$|\*\/)/gim @@ -7333,40 +7334,40 @@ namespace ts { function getRenameInfo(fileName: string, position: number): RenameInfo { synchronizeHostData(); - const sourceFile = getValidSourceFile(fileName); - const typeChecker = program.getTypeChecker(); + let sourceFile = getValidSourceFile(fileName); + let typeChecker = program.getTypeChecker(); - const node = getTouchingWord(sourceFile, position); + let node = getTouchingWord(sourceFile, position); // Can only rename an identifier. if (node && node.kind === SyntaxKind.Identifier) { - const symbol = typeChecker.getSymbolAtLocation(node); + let symbol = typeChecker.getSymbolAtLocation(node); // Only allow a symbol to be renamed if it actually has at least one declaration. if (symbol) { - const declarations = symbol.getDeclarations(); + let declarations = symbol.getDeclarations(); if (declarations && declarations.length > 0) { // Disallow rename for elements that are defined in the standard TypeScript library. - const defaultLibFileName = host.getDefaultLibFileName(host.getCompilationSettings()); + let defaultLibFileName = host.getDefaultLibFileName(host.getCompilationSettings()); if (defaultLibFileName) { - for (const current of declarations) { - const sourceFile = current.getSourceFile(); - const canonicalName = getCanonicalFileName(ts.normalizePath(sourceFile.fileName)); + for (let current of declarations) { + let sourceFile = current.getSourceFile(); + var canonicalName = getCanonicalFileName(ts.normalizePath(sourceFile.fileName)); if (sourceFile && getCanonicalFileName(ts.normalizePath(sourceFile.fileName)) === getCanonicalFileName(ts.normalizePath(defaultLibFileName))) { return getRenameInfoError(getLocaleSpecificMessage(Diagnostics.You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library)); } } } - const displayName = stripQuotes(getDeclaredName(typeChecker, symbol, node)); - const kind = getSymbolKind(symbol, node); + let displayName = stripQuotes(getDeclaredName(typeChecker, symbol, node)); + let kind = getSymbolKind(symbol, node); if (kind) { return { canRename: true, - kind, - displayName, localizedErrorMessage: undefined, + displayName, fullDisplayName: typeChecker.getFullyQualifiedName(symbol), + kind: kind, kindModifiers: getSymbolModifiers(symbol), triggerSpan: createTextSpan(node.getStart(), node.getWidth()) }; @@ -7433,14 +7434,14 @@ namespace ts { /* @internal */ export function getNameTable(sourceFile: SourceFile): Map { if (!sourceFile.nameTable) { - initializeNameTable(sourceFile); + initializeNameTable(sourceFile) } return sourceFile.nameTable; } function initializeNameTable(sourceFile: SourceFile): void { - const nameTable: Map = {}; + let nameTable: Map = {}; walk(sourceFile); sourceFile.nameTable = nameTable; @@ -7478,13 +7479,13 @@ namespace ts { /// Classifier export function createClassifier(): Classifier { - const scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false); + let scanner = createScanner(ScriptTarget.Latest, /*skipTrivia*/ false); /// We do not have a full parser support to know when we should parse a regex or not /// If we consider every slash token to be a regex, we could be missing cases like "1/2/3", where /// we have a series of divide operator. this list allows us to be more accurate by ruling out /// locations where a regexp cannot exist. - const noRegexTable: boolean[] = []; + let noRegexTable: boolean[] = []; noRegexTable[SyntaxKind.Identifier] = true; noRegexTable[SyntaxKind.StringLiteral] = true; noRegexTable[SyntaxKind.NumericLiteral] = true; @@ -7518,7 +7519,7 @@ namespace ts { // // Where on the second line, you will get the 'return' keyword, // a string literal, and a template end consisting of '} } `'. - const templateStack: SyntaxKind[] = []; + let templateStack: SyntaxKind[] = []; /** Returns true if 'keyword2' can legally follow 'keyword1' in any language construct. */ function canFollow(keyword1: SyntaxKind, keyword2: SyntaxKind) { @@ -7544,18 +7545,18 @@ namespace ts { } function convertClassifications(classifications: Classifications, text: string): ClassificationResult { - const entries: ClassificationInfo[] = []; - const dense = classifications.spans; + let entries: ClassificationInfo[] = []; + let dense = classifications.spans; let lastEnd = 0; for (let i = 0, n = dense.length; i < n; i += 3) { - const start = dense[i]; - const length = dense[i + 1]; - const type = dense[i + 2]; + let start = dense[i]; + let length = dense[i + 1]; + let type = dense[i + 2]; // Make a whitespace entry between the last item and this one. if (lastEnd >= 0) { - const whitespaceLength = start - lastEnd; + let whitespaceLength = start - lastEnd; if (whitespaceLength > 0) { entries.push({ length: whitespaceLength, classification: TokenClass.Whitespace }); } @@ -7565,7 +7566,7 @@ namespace ts { lastEnd = start + length; } - const whitespaceLength = text.length - lastEnd; + let whitespaceLength = text.length - lastEnd; if (whitespaceLength > 0) { entries.push({ length: whitespaceLength, classification: TokenClass.Whitespace }); } @@ -7619,7 +7620,7 @@ namespace ts { // (and a newline). That way when we lex we'll think we're still in a multiline comment. switch (lexState) { case EndOfLineState.InDoubleQuoteStringLiteral: - text = "\"\\\n" + text; + text = '"\\\n' + text; offset = 3; break; case EndOfLineState.InSingleQuoteStringLiteral: @@ -7645,7 +7646,7 @@ namespace ts { scanner.setText(text); - const result: Classifications = { + let result: Classifications = { endOfLineState: EndOfLineState.None, spans: [] }; @@ -7727,7 +7728,7 @@ namespace ts { // If we don't have anything on the template stack, // then we aren't trying to keep track of a previously scanned template head. if (templateStack.length > 0) { - const lastTemplateStackToken = lastOrUndefined(templateStack); + let lastTemplateStackToken = lastOrUndefined(templateStack); if (lastTemplateStackToken === SyntaxKind.TemplateHead) { token = scanner.reScanTemplateToken(); @@ -7757,17 +7758,17 @@ namespace ts { return result; function processToken(): void { - const start = scanner.getTokenPos(); - const end = scanner.getTextPos(); + let start = scanner.getTokenPos(); + let end = scanner.getTextPos(); addResult(start, end, classFromKind(token)); if (end >= text.length) { if (token === SyntaxKind.StringLiteral || token === SyntaxKind.StringLiteralType) { // Check to see if we finished up on a multiline string literal. - const tokenText = scanner.getTokenText(); + let tokenText = scanner.getTokenText(); if (scanner.isUnterminated()) { - const lastCharIndex = tokenText.length - 1; + let lastCharIndex = tokenText.length - 1; let numBackslashes = 0; while (tokenText.charCodeAt(lastCharIndex - numBackslashes) === CharacterCodes.backslash) { @@ -7776,7 +7777,7 @@ namespace ts { // If we have an odd number of backslashes, then the multiline string is unclosed if (numBackslashes & 1) { - const quoteChar = tokenText.charCodeAt(0); + let quoteChar = tokenText.charCodeAt(0); result.endOfLineState = quoteChar === CharacterCodes.doubleQuote ? EndOfLineState.InDoubleQuoteStringLiteral : EndOfLineState.InSingleQuoteStringLiteral; @@ -7825,7 +7826,7 @@ namespace ts { // relative to the original text. start -= offset; end -= offset; - const length = end - start; + let length = end - start; if (length > 0) { result.spans.push(start); @@ -7940,7 +7941,7 @@ namespace ts { } /// getDefaultLibraryFilePath - declare const __dirname: string; + declare let __dirname: string; /** * Get the path of the default library files (lib.d.ts) as distributed with the typescript From a2b6e8c2c0f6e5bf9ac259c16b399791e3f1ca13 Mon Sep 17 00:00:00 2001 From: Ryan Cavanaugh Date: Tue, 15 Dec 2015 11:39:54 -0800 Subject: [PATCH 16/61] Use nicer flag collection method --- src/compiler/checker.ts | 7 ++++--- 1 file changed, 4 insertions(+), 3 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 09760b6b1e5..0700a82a6b8 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -3766,13 +3766,14 @@ namespace ts { function createUnionOrIntersectionProperty(containingType: UnionOrIntersectionType, name: string): Symbol { const types = containingType.types; let props: Symbol[]; - let isOptional = !!(containingType.flags & TypeFlags.Intersection); + // Flags we want to propagate to the result if they exist in all source symbols + let commonFlags = (containingType.flags & TypeFlags.Intersection) ? SymbolFlags.Optional : SymbolFlags.None; for (const current of types) { const type = getApparentType(current); if (type !== unknownType) { const prop = getPropertyOfType(type, name); if (prop && !(getDeclarationFlagsFromSymbol(prop) & (NodeFlags.Private | NodeFlags.Protected))) { - isOptional = isOptional && !!(prop.flags & SymbolFlags.Optional); + commonFlags &= prop.flags; if (!props) { props = [prop]; } @@ -3804,7 +3805,7 @@ namespace ts { SymbolFlags.Property | SymbolFlags.Transient | SymbolFlags.SyntheticProperty | - (isOptional ? SymbolFlags.Optional : SymbolFlags.None), + commonFlags, name); result.containingType = containingType; result.declarations = declarations; From fd52e9ae157e0136ed8a66e08a1c24227fcfb85a Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Tue, 15 Dec 2015 15:49:00 -0800 Subject: [PATCH 17/61] Simplify abstract constructor type assignability checking --- src/compiler/checker.ts | 82 ++++++++++++++--------------------------- 1 file changed, 27 insertions(+), 55 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 1fdac127c50..5da30b18192 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -5528,32 +5528,24 @@ namespace ts { if (target === anyFunctionType || source === anyFunctionType) { return Ternary.True; } + const sourceSignatures = getSignaturesOfType(source, kind); const targetSignatures = getSignaturesOfType(target, kind); + if (kind === SignatureKind.Construct && sourceSignatures.length && targetSignatures.length && + isAbstractConstructorType(source) && !isAbstractConstructorType(target)) { + // An abstract constructor type is not assignable to a non-abstract constructor type + // as it would otherwise be possible to new an abstract class. Note that the assignablity + // check we perform for an extends clause excludes construct signatures from the target, + // so this check never proceeds. + if (reportErrors) { + reportError(Diagnostics.Cannot_assign_an_abstract_constructor_type_to_a_non_abstract_constructor_type); + } + return Ternary.False; + } + let result = Ternary.True; const saveErrorInfo = errorInfo; - - - if (kind === SignatureKind.Construct) { - // Only want to compare the construct signatures for abstractness guarantees. - - // Because the "abstractness" of a class is the same across all construct signatures - // (internally we are checking the corresponding declaration), it is enough to perform - // the check and report an error once over all pairs of source and target construct signatures. - // - // sourceSig and targetSig are (possibly) undefined. - // - // Note that in an extends-clause, targetSignatures is stripped, so the check never proceeds. - const sourceSig = sourceSignatures[0]; - const targetSig = targetSignatures[0]; - - result &= abstractSignatureRelatedTo(source, sourceSig, target, targetSig); - if (result !== Ternary.True) { - return result; - } - } - outer: for (const t of targetSignatures) { if (!t.hasStringLiterals || target.flags & TypeFlags.FromSignature) { // Only elaborate errors from the first failure @@ -5580,40 +5572,6 @@ namespace ts { } } return result; - - function abstractSignatureRelatedTo(source: Type, sourceSig: Signature, target: Type, targetSig: Signature) { - if (sourceSig && targetSig) { - - const sourceDecl = source.symbol && getClassLikeDeclarationOfSymbol(source.symbol); - const targetDecl = target.symbol && getClassLikeDeclarationOfSymbol(target.symbol); - - if (!sourceDecl) { - // If the source object isn't itself a class declaration, it can be freely assigned, regardless - // of whether the constructed object is abstract or not. - return Ternary.True; - } - - const sourceErasedSignature = getErasedSignature(sourceSig); - const targetErasedSignature = getErasedSignature(targetSig); - - const sourceReturnType = sourceErasedSignature && getReturnTypeOfSignature(sourceErasedSignature); - const targetReturnType = targetErasedSignature && getReturnTypeOfSignature(targetErasedSignature); - - const sourceReturnDecl = sourceReturnType && sourceReturnType.symbol && getClassLikeDeclarationOfSymbol(sourceReturnType.symbol); - const targetReturnDecl = targetReturnType && targetReturnType.symbol && getClassLikeDeclarationOfSymbol(targetReturnType.symbol); - const sourceIsAbstract = sourceReturnDecl && sourceReturnDecl.flags & NodeFlags.Abstract; - const targetIsAbstract = targetReturnDecl && targetReturnDecl.flags & NodeFlags.Abstract; - - if (sourceIsAbstract && !(targetIsAbstract && targetDecl)) { - // if target isn't a class-declaration type, then it can be new'd, so we forbid the assignment. - if (reportErrors) { - reportError(Diagnostics.Cannot_assign_an_abstract_constructor_type_to_a_non_abstract_constructor_type); - } - return Ternary.False; - } - } - return Ternary.True; - } } function signatureRelatedTo(source: Signature, target: Signature, reportErrors: boolean): Ternary { @@ -5782,6 +5740,20 @@ namespace ts { } } + // Return true if the given type is the constructor type for an abstract class + function isAbstractConstructorType(type: Type) { + if (type.flags & TypeFlags.Anonymous) { + const symbol = type.symbol; + if (symbol && symbol.flags & SymbolFlags.Class) { + const declaration = getClassLikeDeclarationOfSymbol(symbol); + if (declaration && declaration.flags & NodeFlags.Abstract) { + return true; + } + } + } + return false; + } + // Return true if the given type is part of a deeply nested chain of generic instantiations. We consider this to be the case // when structural type comparisons have been started for 10 or more instantiations of the same generic type. It is possible, // though highly unlikely, for this test to be true in a situation where a chain of instantiations is not infinitely expanding. From c21193a0b871de5368fdd73327adb5d659dd8b0b Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Tue, 15 Dec 2015 17:33:51 -0800 Subject: [PATCH 18/61] Removing unused function --- src/compiler/checker.ts | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 5da30b18192..1a1a01d6dd0 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15368,20 +15368,6 @@ namespace ts { return symbol && getExportSymbolOfValueSymbolIfExported(symbol).valueDeclaration; } - function instantiateSingleCallFunctionType(functionType: Type, typeArguments: Type[]): Type { - if (functionType === unknownType) { - return unknownType; - } - - const signature = getSingleCallSignature(functionType); - if (!signature) { - return unknownType; - } - - const instantiatedSignature = getSignatureInstantiation(signature, typeArguments); - return getOrCreateTypeFromSignature(instantiatedSignature); - } - function createResolver(): EmitResolver { return { getReferencedExportContainer, From a3cce3868b7e7e92eab3ed7cd3b1637087ef137b Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Wed, 16 Dec 2015 13:19:57 -0800 Subject: [PATCH 19/61] addressed PR feedback --- src/compiler/checker.ts | 2 +- src/compiler/diagnosticMessages.json | 2 +- .../superInObjectLiterals_ES5.errors.txt | 24 ++++++------- ...ect-literal-getters-and-setters.errors.txt | 12 +++---- tests/cases/fourslash/getOccurrencesSuper3.ts | 34 +++++++++++++++++++ 5 files changed, 54 insertions(+), 20 deletions(-) create mode 100644 tests/cases/fourslash/getOccurrencesSuper3.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 2dd567cbe90..8a81ac167b0 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -7095,7 +7095,7 @@ namespace ts { if (container.parent.kind === SyntaxKind.ObjectLiteralExpression) { if (languageVersion < ScriptTarget.ES6) { - error(node, Diagnostics.super_in_members_of_object_literal_expressions_is_only_allowed_when_option_target_is_ES2015_or_higher); + error(node, Diagnostics.super_is_only_allowed_in_members_of_object_literal_expressions_when_option_target_is_ES2015_or_higher); return unknownType; } else { diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 30b46e5cde2..34552a26b20 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -1759,7 +1759,7 @@ "category": "Error", "code": 2658 }, - "'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher.": { + "'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher.": { "category": "Error", "code": 2659 }, diff --git a/tests/baselines/reference/superInObjectLiterals_ES5.errors.txt b/tests/baselines/reference/superInObjectLiterals_ES5.errors.txt index 944766cb5ae..a3149ce8cd5 100644 --- a/tests/baselines/reference/superInObjectLiterals_ES5.errors.txt +++ b/tests/baselines/reference/superInObjectLiterals_ES5.errors.txt @@ -1,12 +1,12 @@ -tests/cases/compiler/superInObjectLiterals_ES5.ts(7,9): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. -tests/cases/compiler/superInObjectLiterals_ES5.ts(10,9): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. -tests/cases/compiler/superInObjectLiterals_ES5.ts(14,9): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +tests/cases/compiler/superInObjectLiterals_ES5.ts(7,9): error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. +tests/cases/compiler/superInObjectLiterals_ES5.ts(10,9): error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. +tests/cases/compiler/superInObjectLiterals_ES5.ts(14,9): error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. tests/cases/compiler/superInObjectLiterals_ES5.ts(17,9): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. tests/cases/compiler/superInObjectLiterals_ES5.ts(20,9): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. tests/cases/compiler/superInObjectLiterals_ES5.ts(23,9): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. -tests/cases/compiler/superInObjectLiterals_ES5.ts(39,17): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. -tests/cases/compiler/superInObjectLiterals_ES5.ts(42,17): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. -tests/cases/compiler/superInObjectLiterals_ES5.ts(46,17): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +tests/cases/compiler/superInObjectLiterals_ES5.ts(39,17): error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. +tests/cases/compiler/superInObjectLiterals_ES5.ts(42,17): error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. +tests/cases/compiler/superInObjectLiterals_ES5.ts(46,17): error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. tests/cases/compiler/superInObjectLiterals_ES5.ts(49,17): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. tests/cases/compiler/superInObjectLiterals_ES5.ts(52,17): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. @@ -20,18 +20,18 @@ tests/cases/compiler/superInObjectLiterals_ES5.ts(52,17): error TS2660: 'super' method() { super.method(); ~~~~~ -!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +!!! error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. }, get prop() { super.method(); ~~~~~ -!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +!!! error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. return 10; }, set prop(value) { super.method(); ~~~~~ -!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +!!! error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. }, p1: function () { super.method(); @@ -64,18 +64,18 @@ tests/cases/compiler/superInObjectLiterals_ES5.ts(52,17): error TS2660: 'super' method() { super.method(); ~~~~~ -!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +!!! error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. }, get prop() { super.method(); ~~~~~ -!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +!!! error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. return 10; }, set prop(value) { super.method(); ~~~~~ -!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +!!! error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. }, p1: function () { super.method(); diff --git a/tests/baselines/reference/super_inside-object-literal-getters-and-setters.errors.txt b/tests/baselines/reference/super_inside-object-literal-getters-and-setters.errors.txt index 16a66bf6fa4..5fe7fa59ff6 100644 --- a/tests/baselines/reference/super_inside-object-literal-getters-and-setters.errors.txt +++ b/tests/baselines/reference/super_inside-object-literal-getters-and-setters.errors.txt @@ -1,10 +1,10 @@ tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(4,13): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(5,20): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(5,20): error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(7,13): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(8,13): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(8,13): error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(11,20): error TS2660: 'super' can only be referenced in members of derived classes or object literal expressions. tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(20,17): error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. -tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(21,24): error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(21,24): error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. ==== tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts (7 errors) ==== @@ -16,14 +16,14 @@ tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(21,24): !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. return super._foo; ~~~~~ -!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +!!! error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. }, set foo(value: string) { ~~~ !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. super._foo = value; ~~~~~ -!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +!!! error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. }, test: function () { return super._foo; @@ -42,7 +42,7 @@ tests/cases/compiler/super_inside-object-literal-getters-and-setters.ts(21,24): !!! error TS1056: Accessors are only available when targeting ECMAScript 5 and higher. return super.test(); ~~~~~ -!!! error TS2659: 'super' in members of object literal expressions is only allowed when option 'target' is 'ES2015' or higher. +!!! error TS2659: 'super' is only allowed in members of object literal expressions when option 'target' is 'ES2015' or higher. } }; } diff --git a/tests/cases/fourslash/getOccurrencesSuper3.ts b/tests/cases/fourslash/getOccurrencesSuper3.ts new file mode 100644 index 00000000000..bceac02a392 --- /dev/null +++ b/tests/cases/fourslash/getOccurrencesSuper3.ts @@ -0,0 +1,34 @@ +/// + +////let x = { +//// a() { +//// return [|s/**/uper|].b(); +//// }, +//// b() { +//// return [|super|].a(); +//// }, +//// c: function () { +//// return [|super|].a(); +//// } +//// d: () => [|super|].b(); +////} + +function checkRange(r: FourSlashInterface.Range, expectedOccurences: FourSlashInterface.Range[]): void { + goTo.position(r.start); + if (expectedOccurences.length) { + for (const expected of expectedOccurences) { + verify.occurrencesAtPositionContains(expected); + } + } + else { + verify.occurrencesAtPositionCount(0); + } +} + +let [r0, r1, r2, r3] = test.ranges(); + +checkRange(r0, [r0, r1]); +checkRange(r1, [r0, r1]); +checkRange(r0, [r0, r1]); +checkRange(r2, []); +checkRange(r3, []); \ No newline at end of file From ddbf1030ff5a0b4c0a1c568959c1297663ce9af0 Mon Sep 17 00:00:00 2001 From: Yui T Date: Wed, 16 Dec 2015 16:06:55 -0800 Subject: [PATCH 20/61] Fix fourslash range annotation --- .../fourslash/findAllRefsParameterPropertyDeclaration1.ts | 6 +++--- .../fourslash/findAllRefsParameterPropertyDeclaration2.ts | 6 +++--- .../fourslash/findAllRefsParameterPropertyDeclaration3.ts | 6 +++--- .../cases/fourslash/renameParameterPropertyDeclaration1.ts | 6 +++--- .../cases/fourslash/renameParameterPropertyDeclaration2.ts | 6 +++--- .../cases/fourslash/renameParameterPropertyDeclaration3.ts | 6 +++--- .../cases/fourslash/renameParameterPropertyDeclaration4.ts | 4 ++-- .../cases/fourslash/renameParameterPropertyDeclaration5.ts | 4 ++-- 8 files changed, 22 insertions(+), 22 deletions(-) diff --git a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration1.ts b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration1.ts index d0854262828..5034a57ae1d 100644 --- a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration1.ts +++ b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration1.ts @@ -1,9 +1,9 @@ /// //// class Foo { -//// constructor(private |privateParam|: number) { -//// let localPrivate = |privateParam|; -//// this.|privateParam| += 10; +//// constructor(private [|privateParam|]: number) { +//// let localPrivate = [|privateParam|]; +//// this.[|privateParam|] += 10; //// } //// } diff --git a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration2.ts b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration2.ts index 7e59567364a..7db5ba13585 100644 --- a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration2.ts +++ b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration2.ts @@ -1,9 +1,9 @@ /// //// class Foo { -//// constructor(public |publicParam|: number) { -//// let localPublic = |publicParam|; -//// this.|publicParam| += 10; +//// constructor(public [|publicParam|]: number) { +//// let localPublic = [|publicParam|]; +//// this.[|publicParam|] += 10; //// } //// } diff --git a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration3.ts b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration3.ts index 2d78e9793f7..c2d8a06f658 100644 --- a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration3.ts +++ b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration3.ts @@ -1,9 +1,9 @@ /// //// class Foo { -//// constructor(protected |protectedParam|: number) { -//// let localProtected = |protectedParam|; -//// this.|protectedParam| += 10; +//// constructor(protected [|protectedParam|]: number) { +//// let localProtected = [|protectedParam|]; +//// this.[|protectedParam|] += 10; //// } //// } diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration1.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration1.ts index 1faed546d91..4ca09b71e4b 100644 --- a/tests/cases/fourslash/renameParameterPropertyDeclaration1.ts +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration1.ts @@ -1,9 +1,9 @@ /// //// class Foo { -//// constructor(private |privateParam|: number) { -//// let localPrivate = |privateParam|; -//// this.|privateParam| += 10; +//// constructor(private [|privateParam|]: number) { +//// let localPrivate = [|privateParam|]; +//// this.[|privateParam|] += 10; //// } //// } diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration2.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration2.ts index e8eec5d3a0a..695e3729f94 100644 --- a/tests/cases/fourslash/renameParameterPropertyDeclaration2.ts +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration2.ts @@ -1,9 +1,9 @@ /// //// class Foo { -//// constructor(public |publicParam|: number) { -//// let publicParam = |publicParam|; -//// this.|publicParam| += 10; +//// constructor(public [|publicParam|]: number) { +//// let publicParam = [|publicParam|]; +//// this.[|publicParam|] += 10; //// } //// } diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration3.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration3.ts index 44f4cf68858..23971f0be27 100644 --- a/tests/cases/fourslash/renameParameterPropertyDeclaration3.ts +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration3.ts @@ -1,9 +1,9 @@ /// //// class Foo { -//// constructor(protected |protectedParam|: number) { -//// let protectedParam = |protectedParam|; -//// this.|protectedParam| += 10; +//// constructor(protected [|protectedParam|]: number) { +//// let protectedParam = [|protectedParam|]; +//// this.[|protectedParam|] += 10; //// } //// } diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration4.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration4.ts index 21ba7da4141..4646de6123c 100644 --- a/tests/cases/fourslash/renameParameterPropertyDeclaration4.ts +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration4.ts @@ -1,8 +1,8 @@ /// //// class Foo { -//// constructor(protected { |protectedParam| }) { -//// let myProtectedParam = |protectedParam|; +//// constructor(protected { [|protectedParam|] }) { +//// let myProtectedParam = [|protectedParam|]; //// } //// } diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration5.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration5.ts index a4bc00b697b..6d73c7af072 100644 --- a/tests/cases/fourslash/renameParameterPropertyDeclaration5.ts +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration5.ts @@ -1,8 +1,8 @@ /// //// class Foo { -//// constructor(protected [ |protectedParam| ]) { -//// let myProtectedParam = |protectedParam|; +//// constructor(protected [ [|protectedParam|] ]) { +//// let myProtectedParam = [|protectedParam|]; //// } //// } From 479f7af4df24491ce766f1471c30bd19dab8d86e Mon Sep 17 00:00:00 2001 From: Yui T Date: Wed, 16 Dec 2015 16:24:18 -0800 Subject: [PATCH 21/61] Add debug fail when getting parameter-property declaration --- src/compiler/checker.ts | 6 +++++- 1 file changed, 5 insertions(+), 1 deletion(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9d14bb39206..b6f03cd77d1 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -442,7 +442,11 @@ namespace ts { const parameterSymbol = getSymbol(constructoDeclaration.locals, parameterName, SymbolFlags.Value); const propertySymbol = getSymbol(classDeclaration.symbol.members, parameterName, SymbolFlags.Value); - return parameterSymbol && propertySymbol ? [parameterSymbol, propertySymbol] : undefined; + if (parameterSymbol && propertySymbol) { + return [parameterSymbol, propertySymbol]; + } + + Debug.fail("There should exist two symbols, one as property declaration and one as parameter declaration"); } function isBlockScopedNameDeclaredBeforeUse(declaration: Declaration, usage: Node): boolean { From 411e90df44c64d067a0a352be5b643e652424482 Mon Sep 17 00:00:00 2001 From: Tim Perry Date: Thu, 17 Dec 2015 11:56:02 +0100 Subject: [PATCH 22/61] Improve decorator on overload error message (fixes #6064) --- src/compiler/checker.ts | 7 ++++++- src/compiler/diagnosticMessages.json | 4 ++++ .../decoratorOnClassMethodOverload1.errors.txt | 13 +++++++++++++ .../reference/decoratorOnClassMethodOverload1.js | 16 ++++++++++++++++ .../method/decoratorOnClassMethodOverload1.ts | 9 +++++++++ 5 files changed, 48 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/decoratorOnClassMethodOverload1.errors.txt create mode 100644 tests/baselines/reference/decoratorOnClassMethodOverload1.js create mode 100644 tests/cases/conformance/decorators/class/method/decoratorOnClassMethodOverload1.ts diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 1fdac127c50..6b0586f4004 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -15544,7 +15544,12 @@ namespace ts { return false; } if (!nodeCanBeDecorated(node)) { - return grammarErrorOnFirstToken(node, Diagnostics.Decorators_are_not_valid_here); + if (node.kind === SyntaxKind.MethodDeclaration && !ts.nodeIsPresent((node).body)) { + return grammarErrorOnFirstToken(node, Diagnostics.A_decorator_can_only_decorate_a_method_implementation_not_an_overload); + } + else { + return grammarErrorOnFirstToken(node, Diagnostics.Decorators_are_not_valid_here); + } } else if (node.kind === SyntaxKind.GetAccessor || node.kind === SyntaxKind.SetAccessor) { const accessors = getAllAccessorDeclarations((node.parent).members, node); diff --git a/src/compiler/diagnosticMessages.json b/src/compiler/diagnosticMessages.json index 54123808932..c9b25478a1b 100644 --- a/src/compiler/diagnosticMessages.json +++ b/src/compiler/diagnosticMessages.json @@ -795,6 +795,10 @@ "category": "Error", "code": 1248 }, + "A decorator can only decorate a method implementation, not an overload.": { + "category": "Error", + "code": 1249 + }, "'with' statements are not allowed in an async function block.": { "category": "Error", "code": 1300 diff --git a/tests/baselines/reference/decoratorOnClassMethodOverload1.errors.txt b/tests/baselines/reference/decoratorOnClassMethodOverload1.errors.txt new file mode 100644 index 00000000000..d1670bd6bb9 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethodOverload1.errors.txt @@ -0,0 +1,13 @@ +tests/cases/conformance/decorators/class/method/decoratorOnClassMethodOverload1.ts(4,5): error TS1249: A decorator can only decorate a method implementation, not an overload. + + +==== tests/cases/conformance/decorators/class/method/decoratorOnClassMethodOverload1.ts (1 errors) ==== + declare function dec(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor): TypedPropertyDescriptor; + + class C { + @dec + ~ +!!! error TS1249: A decorator can only decorate a method implementation, not an overload. + method() + method() { } + } \ No newline at end of file diff --git a/tests/baselines/reference/decoratorOnClassMethodOverload1.js b/tests/baselines/reference/decoratorOnClassMethodOverload1.js new file mode 100644 index 00000000000..cb2e29b3d00 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethodOverload1.js @@ -0,0 +1,16 @@ +//// [decoratorOnClassMethodOverload1.ts] +declare function dec(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor): TypedPropertyDescriptor; + +class C { + @dec + method() + method() { } +} + +//// [decoratorOnClassMethodOverload1.js] +var C = (function () { + function C() { + } + C.prototype.method = function () { }; + return C; +}()); diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethodOverload1.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethodOverload1.ts new file mode 100644 index 00000000000..722463b33da --- /dev/null +++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethodOverload1.ts @@ -0,0 +1,9 @@ +// @target: ES5 +// @experimentaldecorators: true +declare function dec(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor): TypedPropertyDescriptor; + +class C { + @dec + method() + method() { } +} \ No newline at end of file From cf621399a49745d693b6874eab9b792d1055d6ab Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 14:32:02 -0800 Subject: [PATCH 23/61] Add 'no-unused-variable' to 'tslint.json'. --- tslint.json | 1 + 1 file changed, 1 insertion(+) diff --git a/tslint.json b/tslint.json index 9b010d9a896..71efb21ad7b 100644 --- a/tslint.json +++ b/tslint.json @@ -38,6 +38,7 @@ "no-trailing-whitespace": true, "no-inferrable-types": true, "no-null": true, + "no-unused-variable": true, "boolean-trivia": true, "type-operator-spacing": true, "prefer-const": true, From 0a470add811a0c8edcb69fe977daad6451c9836b Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 14:33:55 -0800 Subject: [PATCH 24/61] Removed unused declarations from 'sys.ts'. --- src/compiler/sys.ts | 5 ----- 1 file changed, 5 deletions(-) diff --git a/src/compiler/sys.ts b/src/compiler/sys.ts index 836b2daeab2..c99c28bc0dd 100644 --- a/src/compiler/sys.ts +++ b/src/compiler/sys.ts @@ -218,7 +218,6 @@ namespace ts { const _fs = require("fs"); const _path = require("path"); const _os = require("os"); - const _tty = require("tty"); // average async stat takes about 30 microseconds // set chunk size to do 30 files in < 1 millisecond @@ -313,10 +312,6 @@ namespace ts { // time dynamically to match the large reference set? const watchedFileSet = createWatchedFileSet(); - function isNode4OrLater(): Boolean { - return parseInt(process.version.charAt(1)) >= 4; - } - const platform: string = _os.platform(); // win32\win64 are case insensitive platforms, MacOS (darwin) by default is also case insensitive const useCaseSensitiveFileNames = platform !== "win32" && platform !== "win64" && platform !== "darwin"; From 0843c82543da7552de929c5ef576ae6989f1d6fe Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 14:37:54 -0800 Subject: [PATCH 25/61] Removed unused declarations from 'core.ts'. --- src/compiler/core.ts | 17 ----------------- 1 file changed, 17 deletions(-) diff --git a/src/compiler/core.ts b/src/compiler/core.ts index cae7bd82103..ad434d4cfad 100644 --- a/src/compiler/core.ts +++ b/src/compiler/core.ts @@ -794,23 +794,6 @@ namespace ts { return path; } - const backslashOrDoubleQuote = /[\"\\]/g; - const escapedCharsRegExp = /[\u0000-\u001f\t\v\f\b\r\n\u2028\u2029\u0085]/g; - const escapedCharsMap: Map = { - "\0": "\\0", - "\t": "\\t", - "\v": "\\v", - "\f": "\\f", - "\b": "\\b", - "\r": "\\r", - "\n": "\\n", - "\\": "\\\\", - "\"": "\\\"", - "\u2028": "\\u2028", // lineSeparator - "\u2029": "\\u2029", // paragraphSeparator - "\u0085": "\\u0085" // nextLine - }; - export interface ObjectAllocator { getNodeConstructor(): new (kind: SyntaxKind, pos?: number, end?: number) => Node; getSourceFileConstructor(): new (kind: SyntaxKind, pos?: number, end?: number) => SourceFile; From 80c7f3a529baffdfb2eee060a497a879a711d6bd Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 14:39:15 -0800 Subject: [PATCH 26/61] Removed unused declarations from 'declarationEmitter.ts'. --- src/compiler/declarationEmitter.ts | 8 -------- 1 file changed, 8 deletions(-) diff --git a/src/compiler/declarationEmitter.ts b/src/compiler/declarationEmitter.ts index 3348b51dff7..d0c5cbff48b 100644 --- a/src/compiler/declarationEmitter.ts +++ b/src/compiler/declarationEmitter.ts @@ -1534,14 +1534,6 @@ namespace ts { } function emitBindingElement(bindingElement: BindingElement) { - function getBindingElementTypeVisibilityError(symbolAccesibilityResult: SymbolAccessiblityResult): SymbolAccessibilityDiagnostic { - const diagnosticMessage = getParameterDeclarationTypeVisibilityDiagnosticMessage(symbolAccesibilityResult); - return diagnosticMessage !== undefined ? { - diagnosticMessage, - errorNode: bindingElement, - typeName: bindingElement.name - } : undefined; - } if (bindingElement.kind === SyntaxKind.OmittedExpression) { // If bindingElement is an omittedExpression (i.e. containing elision), From b1ccf69d34c9fa20f96321793400048ffdde1fc1 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 14:50:27 -0800 Subject: [PATCH 27/61] Removed unused declarations in 'checker.ts'. --- src/compiler/checker.ts | 180 ++++------------------------------------ 1 file changed, 16 insertions(+), 164 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 1fdac127c50..96852d25efb 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -819,15 +819,6 @@ namespace ts { return resolveESModuleSymbol(resolveExternalModuleName(node, moduleSpecifier), moduleSpecifier); } - function getMemberOfModuleVariable(moduleSymbol: Symbol, name: string): Symbol { - if (moduleSymbol.flags & SymbolFlags.Variable) { - const typeAnnotation = (moduleSymbol.valueDeclaration).type; - if (typeAnnotation) { - return getPropertyOfType(getTypeFromTypeNode(typeAnnotation), name); - } - } - } - // This function creates a synthetic symbol that combines the value side of one symbol with the // type/namespace side of another symbol. Consider this example: // @@ -1063,7 +1054,6 @@ namespace ts { } const moduleReferenceLiteral = moduleReferenceExpression; - const searchPath = getDirectoryPath(getSourceFile(location).fileName); // Module names are escaped in our symbol table. However, string literal values aren't. // Escape the name in the "require(...)" clause to ensure we find the right symbol. @@ -2183,65 +2173,15 @@ namespace ts { } function isDeclarationVisible(node: Declaration): boolean { - function getContainingExternalModule(node: Node) { - for (; node; node = node.parent) { - if (node.kind === SyntaxKind.ModuleDeclaration) { - if ((node).name.kind === SyntaxKind.StringLiteral) { - return node; - } - } - else if (node.kind === SyntaxKind.SourceFile) { - return isExternalOrCommonJsModule(node) ? node : undefined; - } + if (node) { + const links = getNodeLinks(node); + if (links.isVisible === undefined) { + links.isVisible = !!determineIfDeclarationIsVisible(); } - Debug.fail("getContainingModule cant reach here"); + return links.isVisible; } - function isUsedInExportAssignment(node: Node) { - // Get source File and see if it is external module and has export assigned symbol - const externalModule = getContainingExternalModule(node); - let exportAssignmentSymbol: Symbol; - let resolvedExportSymbol: Symbol; - if (externalModule) { - // This is export assigned symbol node - const externalModuleSymbol = getSymbolOfNode(externalModule); - exportAssignmentSymbol = getExportAssignmentSymbol(externalModuleSymbol); - const symbolOfNode = getSymbolOfNode(node); - if (isSymbolUsedInExportAssignment(symbolOfNode)) { - return true; - } - - // if symbolOfNode is alias declaration, resolve the symbol declaration and check - if (symbolOfNode.flags & SymbolFlags.Alias) { - return isSymbolUsedInExportAssignment(resolveAlias(symbolOfNode)); - } - } - - // Check if the symbol is used in export assignment - function isSymbolUsedInExportAssignment(symbol: Symbol) { - if (exportAssignmentSymbol === symbol) { - return true; - } - - if (exportAssignmentSymbol && !!(exportAssignmentSymbol.flags & SymbolFlags.Alias)) { - // if export assigned symbol is alias declaration, resolve the alias - resolvedExportSymbol = resolvedExportSymbol || resolveAlias(exportAssignmentSymbol); - if (resolvedExportSymbol === symbol) { - return true; - } - - // Container of resolvedExportSymbol is visible - return forEach(resolvedExportSymbol.declarations, (current: Node) => { - while (current) { - if (current === node) { - return true; - } - current = current.parent; - } - }); - } - } - } + return false; function determineIfDeclarationIsVisible() { switch (node.kind) { @@ -2320,14 +2260,6 @@ namespace ts { Debug.fail("isDeclarationVisible unknown: SyntaxKind: " + node.kind); } } - - if (node) { - const links = getNodeLinks(node); - if (links.isVisible === undefined) { - links.isVisible = !!determineIfDeclarationIsVisible(); - } - return links.isVisible; - } } function collectLinkedAliases(node: Identifier): Node[] { @@ -3373,14 +3305,6 @@ namespace ts { } } - function addInheritedSignatures(signatures: Signature[], baseSignatures: Signature[]) { - if (baseSignatures) { - for (const signature of baseSignatures) { - signatures.push(signature); - } - } - } - function resolveDeclaredMembers(type: InterfaceType): InterfaceTypeWithDeclaredMembers { if (!(type).declaredProperties) { const symbol = type.symbol; @@ -3861,25 +3785,6 @@ namespace ts { function getSignaturesOfType(type: Type, kind: SignatureKind): Signature[] { return getSignaturesOfStructuredType(getApparentType(type), kind); } - - function typeHasConstructSignatures(type: Type): boolean { - const apparentType = getApparentType(type); - if (apparentType.flags & (TypeFlags.ObjectType | TypeFlags.Union)) { - const resolved = resolveStructuredTypeMembers(type); - return resolved.constructSignatures.length > 0; - } - return false; - } - - function typeHasCallOrConstructSignatures(type: Type): boolean { - const apparentType = getApparentType(type); - if (apparentType.flags & TypeFlags.StructuredType) { - const resolved = resolveStructuredTypeMembers(type); - return resolved.callSignatures.length > 0 || resolved.constructSignatures.length > 0; - } - return false; - } - function getIndexTypeOfStructuredType(type: Type, kind: IndexKind): Type { if (type.flags & TypeFlags.StructuredType) { const resolved = resolveStructuredTypeMembers(type); @@ -4381,10 +4286,6 @@ namespace ts { return getTypeOfGlobalSymbol(getGlobalTypeSymbol(name), arity); } - function tryGetGlobalType(name: string, arity = 0): ObjectType { - return getTypeOfGlobalSymbol(getGlobalSymbol(name, SymbolFlags.Type, /*diagnostic*/ undefined), arity); - } - /** * Returns a type that is inside a namespace at the global scope, e.g. * getExportedTypeFromNamespace('JSX', 'Element') returns the JSX.Element type @@ -6148,12 +6049,8 @@ namespace ts { } function createInferenceContext(typeParameters: TypeParameter[], inferUnionTypes: boolean): InferenceContext { - const inferences: TypeInferences[] = []; - for (const unused of typeParameters) { - inferences.push({ - primary: undefined, secondary: undefined, isFixed: false - }); - } + const inferences = map(typeParameters, createTypeInferencesObject); + return { typeParameters, inferUnionTypes, @@ -6162,6 +6059,14 @@ namespace ts { }; } + function createTypeInferencesObject(): TypeInferences { + return { + primary: undefined, + secondary: undefined, + isFixed: false, + }; + } + function inferTypes(context: InferenceContext, source: Type, target: Type) { let sourceStack: Type[]; let targetStack: Type[]; @@ -6432,10 +6337,6 @@ namespace ts { return context.inferredTypes; } - function hasAncestor(node: Node, kind: SyntaxKind): boolean { - return getAncestor(node, kind) !== undefined; - } - // EXPRESSION TYPE CHECKING function getResolvedSymbol(node: Identifier): Symbol { @@ -8035,7 +7936,6 @@ namespace ts { /// type or factory function. /// Otherwise, returns unknownSymbol. function getJsxElementTagSymbol(node: JsxOpeningLikeElement | JsxClosingElement): Symbol { - const flags: JsxFlags = JsxFlags.UnknownElement; const links = getNodeLinks(node); if (!links.resolvedSymbol) { if (isJsxIntrinsicIdentifier(node.tagName)) { @@ -14308,16 +14208,6 @@ namespace ts { } } - function getModuleStatements(node: Declaration): Statement[] { - if (node.kind === SyntaxKind.SourceFile) { - return (node).statements; - } - if (node.kind === SyntaxKind.ModuleDeclaration && (node).body.kind === SyntaxKind.ModuleBlock) { - return ((node).body).statements; - } - return emptyArray; - } - function hasExportedMembers(moduleSymbol: Symbol) { for (var id in moduleSymbol.exports) { if (id !== "export=") { @@ -15396,20 +15286,6 @@ namespace ts { return symbol && getExportSymbolOfValueSymbolIfExported(symbol).valueDeclaration; } - function instantiateSingleCallFunctionType(functionType: Type, typeArguments: Type[]): Type { - if (functionType === unknownType) { - return unknownType; - } - - const signature = getSingleCallSignature(functionType); - if (!signature) { - return unknownType; - } - - const instantiatedSignature = getSignatureInstantiation(signature, typeArguments); - return getOrCreateTypeFromSignature(instantiatedSignature); - } - function createResolver(): EmitResolver { return { getReferencedExportContainer, @@ -16458,25 +16334,6 @@ namespace ts { } } - function isIntegerLiteral(expression: Expression): boolean { - if (expression.kind === SyntaxKind.PrefixUnaryExpression) { - const unaryExpression = expression; - if (unaryExpression.operator === SyntaxKind.PlusToken || unaryExpression.operator === SyntaxKind.MinusToken) { - expression = unaryExpression.operand; - } - } - if (expression.kind === SyntaxKind.NumericLiteral) { - // Allows for scientific notation since literalExpression.text was formed by - // coercing a number to a string. Sometimes this coercion can yield a string - // in scientific notation. - // We also don't need special logic for hex because a hex integer is converted - // to decimal when it is coerced. - return /^[0-9]+([eE]\+?[0-9]+)?$/.test((expression).text); - } - - return false; - } - function hasParseDiagnostics(sourceFile: SourceFile): boolean { return sourceFile.parseDiagnostics.length > 0; } @@ -16505,11 +16362,6 @@ namespace ts { } } - function isEvalOrArgumentsIdentifier(node: Node): boolean { - return node.kind === SyntaxKind.Identifier && - ((node).text === "eval" || (node).text === "arguments"); - } - function checkGrammarConstructorTypeParameters(node: ConstructorDeclaration) { if (node.typeParameters) { return grammarErrorAtPos(getSourceFileOfNode(node), node.typeParameters.pos, node.typeParameters.end - node.typeParameters.pos, Diagnostics.Type_parameters_cannot_appear_on_a_constructor_declaration); From d7c5e18cb3439c3d5a07b721239615536429f1f5 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 14:53:46 -0800 Subject: [PATCH 28/61] Removed unused declarations in 'parser.ts'. --- src/compiler/parser.ts | 34 ---------------------------------- 1 file changed, 34 deletions(-) diff --git a/src/compiler/parser.ts b/src/compiler/parser.ts index 62d98337102..7f5d052a7e7 100644 --- a/src/compiler/parser.ts +++ b/src/compiler/parser.ts @@ -771,10 +771,6 @@ namespace ts { return doInsideOfContext(ParserContextFlags.Yield, func); } - function doOutsideOfYieldContext(func: () => T): T { - return doOutsideOfContext(ParserContextFlags.Yield, func); - } - function doInDecoratorContext(func: () => T): T { return doInsideOfContext(ParserContextFlags.Decorator, func); } @@ -791,10 +787,6 @@ namespace ts { return doInsideOfContext(ParserContextFlags.Yield | ParserContextFlags.Await, func); } - function doOutsideOfYieldAndAwaitContext(func: () => T): T { - return doOutsideOfContext(ParserContextFlags.Yield | ParserContextFlags.Await, func); - } - function inContext(flags: ParserContextFlags) { return (contextFlags & flags) !== 0; } @@ -851,10 +843,6 @@ namespace ts { return token = scanner.scan(); } - function getTokenPos(pos: number): number { - return skipTrivia(sourceText, pos); - } - function reScanGreaterToken(): SyntaxKind { return token = scanner.reScanGreaterToken(); } @@ -2644,10 +2632,6 @@ namespace ts { isStartOfExpression(); } - function allowInAndParseExpression(): Expression { - return allowInAnd(parseExpression); - } - function parseExpression(): Expression { // Expression[in]: // AssignmentExpression[in] @@ -3962,7 +3946,6 @@ namespace ts { const asteriskToken = parseOptionalToken(SyntaxKind.AsteriskToken); const tokenIsIdentifier = isIdentifier(); - const nameToken = token; const propertyName = parsePropertyName(); // Disallowing of optional property assignments happens in the grammar checker. @@ -5104,10 +5087,6 @@ namespace ts { return undefined; } - function parseHeritageClausesWorker() { - return parseList(ParsingContext.HeritageClauses, parseHeritageClause); - } - function parseHeritageClause() { if (token === SyntaxKind.ExtendsKeyword || token === SyntaxKind.ImplementsKeyword) { const node = createNode(SyntaxKind.HeritageClause); @@ -5253,12 +5232,6 @@ namespace ts { return nextToken() === SyntaxKind.SlashToken; } - function nextTokenIsCommaOrFromKeyword() { - nextToken(); - return token === SyntaxKind.CommaToken || - token === SyntaxKind.FromKeyword; - } - function parseImportDeclarationOrImportEqualsDeclaration(fullStart: number, decorators: NodeArray, modifiers: ModifiersArray): ImportEqualsDeclaration | ImportDeclaration { parseExpected(SyntaxKind.ImportKeyword); const afterImportPos = scanner.getStartPos(); @@ -5751,13 +5724,6 @@ namespace ts { return finishNode(parameter); } - function parseJSDocOptionalType(type: JSDocType): JSDocOptionalType { - const result = createNode(SyntaxKind.JSDocOptionalType, type.pos); - nextToken(); - result.type = type; - return finishNode(result); - } - function parseJSDocTypeReference(): JSDocTypeReference { const result = createNode(SyntaxKind.JSDocTypeReference); result.name = parseSimplePropertyName(); From 11acb7bf16b123841dc256002c9bbb6848f1139c Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 14:54:19 -0800 Subject: [PATCH 29/61] Removed unused declarations in 'sourcemap.ts'. --- src/compiler/sourcemap.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/compiler/sourcemap.ts b/src/compiler/sourcemap.ts index d98dc233c16..50644201544 100644 --- a/src/compiler/sourcemap.ts +++ b/src/compiler/sourcemap.ts @@ -14,7 +14,6 @@ namespace ts { reset(): void; } - const nop = <(...args: any[]) => any>Function.prototype; let nullSourceMapWriter: SourceMapWriter; export function getNullSourceMapWriter(): SourceMapWriter { From 66cf6be6d84cb79d4433723d71d73dca72542e92 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 14:55:08 -0800 Subject: [PATCH 30/61] Removed unused declarations in 'emitter.ts'. --- src/compiler/emitter.ts | 10 ---------- 1 file changed, 10 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index f0b49854734..622ec14caa8 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -779,12 +779,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi } } - function emitTrailingCommaIfPresent(nodeList: NodeArray): void { - if (nodeList.hasTrailingComma) { - write(","); - } - } - function emitLinePreservingList(parent: Node, nodes: NodeArray, allowTrailingComma: boolean, spacesBetweenBraces: boolean) { Debug.assert(nodes.length > 0); @@ -3248,10 +3242,6 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi } } - function emitDownLevelForOfStatement(node: ForOfStatement) { - emitLoop(node, emitDownLevelForOfStatementWorker); - } - function emitDownLevelForOfStatementWorker(node: ForOfStatement, loop: ConvertedLoop) { // The following ES6 code: // From 9e801c21ae368658ca5df9bcfcf2db890badb294 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 15:01:05 -0800 Subject: [PATCH 31/61] Removed unused declarations in 'harness.ts'. --- src/harness/harness.ts | 14 -------------- 1 file changed, 14 deletions(-) diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 15f3813e54d..117be8a9afb 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -31,7 +31,6 @@ // this will work in the browser via browserify var _chai: typeof chai = require("chai"); var assert: typeof _chai.assert = _chai.assert; -var expect: typeof _chai.expect = _chai.expect; declare var __dirname: string; // Node-specific var global = Function("return this").call(null); /* tslint:enable:no-var-keyword */ @@ -513,7 +512,6 @@ namespace Harness { } const folder: any = fso.GetFolder(path); - const paths: string[] = []; return filesInFolder(folder, path); }; @@ -627,18 +625,6 @@ namespace Harness { } /// Ask the server to use node's path.resolve to resolve the given path - function getResolvedPathFromServer(path: string) { - const xhr = new XMLHttpRequest(); - try { - xhr.open("GET", path + "?resolve", /*async*/ false); - xhr.send(); - } - catch (e) { - return { status: 404, responseText: null }; - } - - return waitForXHR(xhr); - } export interface XHRResponse { status: number; From 3dee60f6ef219860202622d8560d9a883c12e4b3 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 15:01:48 -0800 Subject: [PATCH 32/61] Removed unused declarations in 'harnessLanguageService.ts'. --- src/harness/harnessLanguageService.ts | 7 ------- 1 file changed, 7 deletions(-) diff --git a/src/harness/harnessLanguageService.ts b/src/harness/harnessLanguageService.ts index 3c7814df562..fb5b6ce92aa 100644 --- a/src/harness/harnessLanguageService.ts +++ b/src/harness/harnessLanguageService.ts @@ -315,13 +315,6 @@ namespace Harness.LanguageService { class LanguageServiceShimProxy implements ts.LanguageService { constructor(private shim: ts.LanguageServiceShim) { } - private unwrappJSONCallResult(result: string): any { - const parsedResult = JSON.parse(result); - if (parsedResult.error) { - throw new Error("Language Service Shim Error: " + JSON.stringify(parsedResult.error)); - } - return parsedResult.result; - } cleanupSemanticCache(): void { this.shim.cleanupSemanticCache(); } From 4a07ee730adc0ca75242325e84ef0513985fbec4 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 15:02:20 -0800 Subject: [PATCH 33/61] Removed unused declarations in 'compilerRunner.ts'. --- src/harness/compilerRunner.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/harness/compilerRunner.ts b/src/harness/compilerRunner.ts index 8ee287b2637..d1566c05d4e 100644 --- a/src/harness/compilerRunner.ts +++ b/src/harness/compilerRunner.ts @@ -251,7 +251,6 @@ class CompilerBaselineRunner extends RunnerBase { const allFiles = toBeCompiled.concat(otherFiles).filter(file => !!program.getSourceFile(file.unitName)); const fullWalker = new TypeWriterWalker(program, /*fullTypeCheck*/ true); - const pullWalker = new TypeWriterWalker(program, /*fullTypeCheck*/ false); const fullResults: ts.Map = {}; const pullResults: ts.Map = {}; From 125f0a1a232c4ffa879590775e62346cd47b59aa Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 15:03:38 -0800 Subject: [PATCH 34/61] Removed unused declarations in 'loggedIO.ts'. --- src/harness/loggedIO.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/src/harness/loggedIO.ts b/src/harness/loggedIO.ts index 0bae91f7976..3d51682f745 100644 --- a/src/harness/loggedIO.ts +++ b/src/harness/loggedIO.ts @@ -305,25 +305,6 @@ namespace Playback { } } - const pathEquivCache: any = {}; - function pathsAreEquivalent(left: string, right: string, wrapper: { resolvePath(s: string): string }) { - const key = left + "-~~-" + right; - function areSame(a: string, b: string) { - return ts.normalizeSlashes(a).toLowerCase() === ts.normalizeSlashes(b).toLowerCase(); - } - function check() { - if (Harness.Path.getFileName(left).toLowerCase() === Harness.Path.getFileName(right).toLowerCase()) { - return areSame(left, right) || areSame(wrapper.resolvePath(left), right) || areSame(left, wrapper.resolvePath(right)) || areSame(wrapper.resolvePath(left), wrapper.resolvePath(right)); - } - } - if (pathEquivCache.hasOwnProperty(key)) { - return pathEquivCache[key]; - } - else { - return pathEquivCache[key] = check(); - } - } - function noOpReplay(name: string) { // console.log("Swallowed write operation during replay: " + name); } From 7fd6aa4318db062346ebea005364efca0b868498 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 15:07:37 -0800 Subject: [PATCH 35/61] Removed unused declarations in 'editorServices.ts'. --- src/server/editorServices.ts | 36 ++++++------------------------------ 1 file changed, 6 insertions(+), 30 deletions(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 0305b7595c2..d023a9827ee 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -263,13 +263,11 @@ namespace ts.server { } resolvePath(path: string): string { - const start = new Date().getTime(); const result = this.host.resolvePath(path); return result; } fileExists(path: string): boolean { - const start = new Date().getTime(); const result = this.host.fileExists(path); return result; } @@ -325,32 +323,6 @@ namespace ts.server { } } - // assumes normalized paths - function getAbsolutePath(filename: string, directory: string) { - const rootLength = ts.getRootLength(filename); - if (rootLength > 0) { - return filename; - } - else { - const splitFilename = filename.split("/"); - const splitDir = directory.split("/"); - let i = 0; - let dirTail = 0; - const sflen = splitFilename.length; - while ((i < sflen) && (splitFilename[i].charAt(0) == ".")) { - const dots = splitFilename[i]; - if (dots == "..") { - dirTail++; - } - else if (dots != ".") { - return undefined; - } - i++; - } - return splitDir.slice(0, splitDir.length - dirTail).concat(splitFilename.slice(i)).join("/"); - } - } - export interface ProjectOptions { // these fields can be present in the project file files?: string[]; @@ -583,7 +555,9 @@ namespace ts.server { } handleProjectFilelistChanges(project: Project) { - const { succeeded, projectOptions, error } = this.configFileToProjectOptions(project.projectFilename); + // TODO: Ignoring potentially returned 'error' and 'succeeded' condition + const { projectOptions } = this.configFileToProjectOptions(project.projectFilename); + const newRootFiles = projectOptions.files.map((f => this.getCanonicalFileName(f))); const currentRootFiles = project.getRootFiles().map((f => this.getCanonicalFileName(f))); @@ -611,7 +585,9 @@ namespace ts.server { this.log("Detected newly added tsconfig file: " + fileName); - const { succeeded, projectOptions, error } = this.configFileToProjectOptions(fileName); + // TODO: Ignoring potentially returned 'error' and 'succeeded' condition + const { projectOptions } = this.configFileToProjectOptions(fileName); + const rootFilesInTsconfig = projectOptions.files.map(f => this.getCanonicalFileName(f)); const openFileRoots = this.openFileRoots.map(s => this.getCanonicalFileName(s.fileName)); From 172d509c74e4376d840eb64a48254f738a638a8a Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 15:09:12 -0800 Subject: [PATCH 36/61] Removed unused declarations in 'session.ts'. --- src/server/session.ts | 10 +--------- 1 file changed, 1 insertion(+), 9 deletions(-) diff --git a/src/server/session.ts b/src/server/session.ts index dae2384ce54..78686b79118 100644 --- a/src/server/session.ts +++ b/src/server/session.ts @@ -129,9 +129,6 @@ namespace ts.server { export class Session { protected projectService: ProjectService; - private pendingOperation = false; - private fileHash: ts.Map = {}; - private nextFileId = 1; private errorTimer: any; /*NodeJS.Timer | number*/ private immediateId: any; private changeSeq = 0; @@ -239,11 +236,6 @@ namespace ts.server { } } - private errorCheck(file: string, project: Project) { - this.syntacticCheck(file, project); - this.semanticCheck(file, project); - } - private reloadProjects() { this.projectService.reloadProjects(); } @@ -901,7 +893,7 @@ namespace ts.server { } getDiagnosticsForProject(delay: number, fileName: string) { - const { configFileName, fileNames } = this.getProjectInfo(fileName, /*needFileNameList*/ true); + const { fileNames } = this.getProjectInfo(fileName, /*needFileNameList*/ true); // No need to analyze lib.d.ts let fileNamesInProject = fileNames.filter((value, index, array) => value.indexOf("lib.d.ts") < 0); From 7637f4d2a0d6fccbb200a8411359ad6b034e8237 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 15:09:39 -0800 Subject: [PATCH 37/61] Removed unused declarations in 'server.ts'. --- src/server/server.ts | 2 -- 1 file changed, 2 deletions(-) diff --git a/src/server/server.ts b/src/server/server.ts index e29e79ac6ed..d9f078ac0eb 100644 --- a/src/server/server.ts +++ b/src/server/server.ts @@ -4,9 +4,7 @@ /* tslint:disable:no-null */ namespace ts.server { - const nodeproto: typeof NodeJS._debugger = require("_debugger"); const readline: NodeJS.ReadLine = require("readline"); - const path: NodeJS.Path = require("path"); const fs: typeof NodeJS.fs = require("fs"); const rl = readline.createInterface({ From 50542946f7051726bd9b8b26c566c0abdfdd18c9 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 15:12:25 -0800 Subject: [PATCH 38/61] Removed unused declarations in 'harness/fourslash.ts'. --- src/harness/fourslash.ts | 13 ------------- 1 file changed, 13 deletions(-) diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 24f3319285b..e8d985d40a6 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -321,11 +321,6 @@ namespace FourSlash { PlaceOpenBraceOnNewLineForControlBlocks: false, }; - this.testData.files.forEach(file => { - const fileName = file.fileName.replace(Harness.IO.directoryName(file.fileName), "").substr(1); - const fileNameWithoutExtension = fileName.substr(0, fileName.lastIndexOf(".")); - }); - // Open the first file by default this.openFile(0); } @@ -762,10 +757,6 @@ namespace FourSlash { return this.languageService.getReferencesAtPosition(this.activeFile.fileName, this.currentCaretPosition); } - private assertionMessage(name: string, actualValue: any, expectedValue: any) { - return "\nActual " + name + ":\n\t" + actualValue + "\nExpected value:\n\t" + expectedValue; - } - public getSyntacticDiagnostics(expected: string) { const diagnostics = this.languageService.getSyntacticDiagnostics(this.activeFile.fileName); this.testDiagnostics(expected, diagnostics); @@ -910,7 +901,6 @@ namespace FourSlash { } public verifyCurrentParameterSpanIs(parameter: string) { - const activeSignature = this.getActiveSignatureHelpItem(); const activeParameter = this.getActiveParameter(); assert.equal(ts.displayPartsToString(activeParameter.displayParts), parameter); } @@ -2189,9 +2179,6 @@ namespace FourSlash { } } - // TOOD: should these just use the Harness's stdout/stderr? - const fsOutput = new Harness.Compiler.WriterAggregator(); - const fsErrors = new Harness.Compiler.WriterAggregator(); export function runFourSlashTest(basePath: string, testType: FourSlashTestType, fileName: string) { const content = Harness.IO.readFile(fileName); runFourSlashTestContent(basePath, testType, content, fileName); From 5a53c613e4322d28a9931aca67a10735843cbf16 Mon Sep 17 00:00:00 2001 From: Yui T Date: Thu, 17 Dec 2015 15:51:00 -0800 Subject: [PATCH 39/61] Add assertion to check that ranges-array is not empty so it doesn't silently fail --- src/harness/fourslash.ts | 4 ++++ .../findAllRefsParameterPropertyDeclaration1.ts | 13 ++++++++----- .../findAllRefsParameterPropertyDeclaration2.ts | 1 + .../findAllRefsParameterPropertyDeclaration3.ts | 7 ++++--- tests/cases/fourslash/fourslash.ts | 1 + .../renameParameterPropertyDeclaration1.ts | 3 ++- .../renameParameterPropertyDeclaration2.ts | 3 ++- .../renameParameterPropertyDeclaration3.ts | 3 ++- .../renameParameterPropertyDeclaration4.ts | 3 ++- .../renameParameterPropertyDeclaration5.ts | 3 ++- 10 files changed, 28 insertions(+), 13 deletions(-) diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 9d729345781..729d2052a92 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -2768,6 +2768,10 @@ namespace FourSlashInterface { this.state.verifyCompletionListItemsCountIsGreaterThan(count, this.negative); } + public assertRangesEmpty(ranges: FourSlash.Range[]) { + assert(ranges.length !== 0, "Ranges array is expected to be non-empty"); + } + public completionListIsEmpty() { this.state.verifyCompletionListIsEmpty(this.negative); } diff --git a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration1.ts b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration1.ts index 5034a57ae1d..828b143a4ce 100644 --- a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration1.ts +++ b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration1.ts @@ -7,12 +7,15 @@ //// } //// } -let ranges = test.ranges(); -for (let range of ranges) { +const ranges = test.ranges(); +verify.assertRangesEmpty(ranges); +for (const range of ranges) { goTo.position(range.start); - verify.referencesCountIs(ranges.length); - for (let expectedRange of ranges) { - verify.referencesAtPositionContains(expectedRange); + if (ranges.length) { + verify.referencesCountIs(ranges.length); + for (const expectedRange of ranges) { + verify.referencesAtPositionContains(expectedRange); + } } } \ No newline at end of file diff --git a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration2.ts b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration2.ts index 7db5ba13585..6b15b334c28 100644 --- a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration2.ts +++ b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration2.ts @@ -8,6 +8,7 @@ //// } let ranges = test.ranges(); +verify.assertRangesEmpty(ranges); for (let range of ranges) { goTo.position(range.start); diff --git a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration3.ts b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration3.ts index c2d8a06f658..1310841eed4 100644 --- a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration3.ts +++ b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration3.ts @@ -7,12 +7,13 @@ //// } //// } -let ranges = test.ranges(); -for (let range of ranges) { +const ranges = test.ranges(); +verify.assertRangesEmpty(ranges); +for (const range of ranges) { goTo.position(range.start); verify.referencesCountIs(ranges.length); - for (let expectedRange of ranges) { + for (const expectedRange of ranges) { verify.referencesAtPositionContains(expectedRange); } } \ No newline at end of file diff --git a/tests/cases/fourslash/fourslash.ts b/tests/cases/fourslash/fourslash.ts index b9b379bd465..fcb221e8233 100644 --- a/tests/cases/fourslash/fourslash.ts +++ b/tests/cases/fourslash/fourslash.ts @@ -137,6 +137,7 @@ declare namespace FourSlashInterface { verifyDefinitionsName(name: string, containerName: string): void; } class verify extends verifyNegatable { + assertRangesEmpty(ranges: FourSlash.Range[]): void; caretAtMarker(markerName?: string): void; indentationIs(numberOfSpaces: number): void; indentationAtPositionIs(fileName: string, position: number, numberOfSpaces: number, indentStyle?: ts.IndentStyle): void; diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration1.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration1.ts index 4ca09b71e4b..37db51447ca 100644 --- a/tests/cases/fourslash/renameParameterPropertyDeclaration1.ts +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration1.ts @@ -7,7 +7,8 @@ //// } //// } -let ranges = test.ranges() +let ranges = test.ranges(); +verify.assertRangesEmpty(ranges); for (let range of ranges) { goTo.position(range.start); verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration2.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration2.ts index 695e3729f94..c5e44438ee3 100644 --- a/tests/cases/fourslash/renameParameterPropertyDeclaration2.ts +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration2.ts @@ -7,7 +7,8 @@ //// } //// } -let ranges = test.ranges() +let ranges = test.ranges(); +verify.assertRangesEmpty(ranges); for (let range of ranges) { goTo.position(range.start); verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration3.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration3.ts index 23971f0be27..2ca284f38d9 100644 --- a/tests/cases/fourslash/renameParameterPropertyDeclaration3.ts +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration3.ts @@ -7,7 +7,8 @@ //// } //// } -let ranges = test.ranges() +let ranges = test.ranges(); +verify.assertRangesEmpty(ranges); for (let range of ranges) { goTo.position(range.start); verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration4.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration4.ts index 4646de6123c..35d268532b9 100644 --- a/tests/cases/fourslash/renameParameterPropertyDeclaration4.ts +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration4.ts @@ -6,7 +6,8 @@ //// } //// } -let ranges = test.ranges() +let ranges = test.ranges(); +verify.assertRangesEmpty(ranges); for (let range of ranges) { goTo.position(range.start); verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration5.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration5.ts index 6d73c7af072..d32e69ad0c5 100644 --- a/tests/cases/fourslash/renameParameterPropertyDeclaration5.ts +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration5.ts @@ -6,7 +6,8 @@ //// } //// } -let ranges = test.ranges() +let ranges = test.ranges(); +verify.assertRangesEmpty(ranges); for (let range of ranges) { goTo.position(range.start); verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); From 3f65a31a4f998c950b46b4ab302dd89031fc6ab8 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Thu, 17 Dec 2015 16:43:55 -0800 Subject: [PATCH 40/61] Property show images in Language Specification markdown --- doc/images/image1.png | Bin 0 -> 11672 bytes doc/images/image2.png | Bin 0 -> 10238 bytes doc/images/image3.png | Bin 0 -> 6003 bytes doc/images/image4.png | Bin 0 -> 16082 bytes doc/spec.md | 8 ++++---- scripts/word2md.js | 7 +++++++ scripts/word2md.ts | 14 ++++++++++++++ 7 files changed, 25 insertions(+), 4 deletions(-) create mode 100644 doc/images/image1.png create mode 100644 doc/images/image2.png create mode 100644 doc/images/image3.png create mode 100644 doc/images/image4.png diff --git a/doc/images/image1.png b/doc/images/image1.png new file mode 100644 index 0000000000000000000000000000000000000000..e1db88fa4f8637f06f77e971dcdee24d5cc9cf50 GIT binary patch literal 11672 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 literal 0 HcmV?d00001 diff --git a/doc/images/image2.png b/doc/images/image2.png new file mode 100644 index 0000000000000000000000000000000000000000..c032103805785e018ae0f10cfc9a263358e436c4 GIT binary patch literal 10238 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 literal 0 HcmV?d00001 diff --git a/doc/images/image3.png b/doc/images/image3.png new file mode 100644 index 0000000000000000000000000000000000000000..5fe2ecb8f3e9d86242f2eff83bf982b06104fddc GIT binary patch literal 6003 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 VmqMj#8kokCmsXZ~|MYp_{{cK?Wjz1@ literal 0 HcmV?d00001 diff --git a/doc/spec.md b/doc/spec.md index a7947b19926..8114398ae5b 100644 --- a/doc/spec.md +++ b/doc/spec.md @@ -262,7 +262,7 @@ function f() { To benefit from this inference, a programmer can use the TypeScript language service. For example, a code editor can incorporate the TypeScript language service and use the service to find the members of a string object as in the following screen shot. -/ +![](images/image1.png) In this example, the programmer benefits from type inference without providing type annotations. Some beneficial tools, however, do require the programmer to provide type annotations. In TypeScript, we can express a parameter requirement as in the following code fragment. @@ -410,7 +410,7 @@ This signature denotes that a function may be passed as the parameter of the '$' A typical client would not need to add any additional typing but could just use a community-supplied typing to discover (through statement completion with documentation tips) and verify (through static checking) correct use of the library, as in the following screen shot. -/ +![](images/image2.png) Section [3.3](#3.3) provides additional information about object types. @@ -627,7 +627,7 @@ An important goal of TypeScript is to provide accurate and straightforward types JavaScript programming interfaces often include functions whose behavior is discriminated by a string constant passed to the function. The Document Object Model makes heavy use of this pattern. For example, the following screen shot shows that the 'createElement' method of the 'document' object has multiple signatures, some of which identify the types returned when specific strings are passed into the method. -/ +![](images/image3.png) The following code fragment uses this feature. Because the 'span' variable is inferred to have the type 'HTMLSpanElement', the code can reference without static error the 'isMultiline' property of 'span'. @@ -638,7 +638,7 @@ span.isMultiLine = false; // OK: HTMLSpanElement has isMultiline property In the following screen shot, a programming tool combines information from overloading on string parameters with contextual typing to infer that the type of the variable 'e' is 'MouseEvent' and that therefore 'e' has a 'clientX' property. -/ +![](images/image4.png) Section [3.9.2.4](#3.9.2.4) provides details on how to use string literals in function signatures. diff --git a/scripts/word2md.js b/scripts/word2md.js index e80275d5b2d..2866c92d580 100644 --- a/scripts/word2md.js +++ b/scripts/word2md.js @@ -47,6 +47,7 @@ function convertDocumentToMarkdown(doc) { var tableColumnCount; var tableCellIndex; var columnAlignment = []; + var imageCount = 0; function setProperties(target, properties) { for (var name in properties) { if (properties.hasOwnProperty(name)) { @@ -120,12 +121,18 @@ function convertDocumentToMarkdown(doc) { var text = p.range.text; var style = p.style.nameLocal; var inTable = p.range.tables.count > 0; + var containsImage = p.range.inlineShapes.count > 0; var level = 1; var sectionBreak = text.indexOf("\x0C") >= 0; text = trimEndFormattingMarks(text); if (inTable) { style = "Table"; } + else if (containsImage) { + imageCount++; + write("![](images/image" + imageCount + ".png)\n\n"); + text = ""; + } else if (style.match(/\s\d$/)) { level = +style.substr(style.length - 1); style = style.substr(0, style.length - 2); diff --git a/scripts/word2md.ts b/scripts/word2md.ts index ec9ed634b3c..1e9d7879f20 100644 --- a/scripts/word2md.ts +++ b/scripts/word2md.ts @@ -67,10 +67,17 @@ module Word { export interface Tables extends Collection { } + export interface InlineShape { + } + + export interface InlineShapes extends Collection { + } + export interface Range { find: Find; listFormat: ListFormat; tables: Tables; + inlineShapes: InlineShapes; text: string; words: Ranges; } @@ -180,6 +187,7 @@ function convertDocumentToMarkdown(doc: Word.Document): string { var tableColumnCount: number; var tableCellIndex: number; var columnAlignment: number[] = []; + var imageCount: number = 0; function setProperties(target: any, properties: any) { for (var name in properties) { @@ -261,6 +269,7 @@ function convertDocumentToMarkdown(doc: Word.Document): string { var text = p.range.text; var style = p.style.nameLocal; var inTable = p.range.tables.count > 0; + var containsImage = p.range.inlineShapes.count > 0; var level = 1; var sectionBreak = text.indexOf("\x0C") >= 0; @@ -268,6 +277,11 @@ function convertDocumentToMarkdown(doc: Word.Document): string { if (inTable) { style = "Table"; } + else if (containsImage) { + imageCount++; + write("![](images/image" + imageCount + ".png)\n\n"); + text = ""; + } else if (style.match(/\s\d$/)) { level = +style.substr(style.length - 1); style = style.substr(0, style.length - 2); From 65571426bf9e47b1d364060b72cdd48039f77d74 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 16:47:00 -0800 Subject: [PATCH 41/61] Remove missed unused declaration from 'harness.ts'. --- src/harness/harness.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/src/harness/harness.ts b/src/harness/harness.ts index 117be8a9afb..7fd81973172 100644 --- a/src/harness/harness.ts +++ b/src/harness/harness.ts @@ -615,7 +615,6 @@ namespace Harness { export const getExecutingFilePath = () => ""; export const exit = (exitCode: number) => {}; - const supportsCodePage = () => false; export let log = (s: string) => console.log(s); namespace Http { From 549fbf58ac68925a451daa0160afcbbc7b840e3c Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Thu, 17 Dec 2015 16:50:22 -0800 Subject: [PATCH 42/61] Adjusting indentation --- doc/spec.md | 8 ++++---- scripts/word2md.js | 2 +- scripts/word2md.ts | 2 +- 3 files changed, 6 insertions(+), 6 deletions(-) diff --git a/doc/spec.md b/doc/spec.md index 8114398ae5b..75745f32653 100644 --- a/doc/spec.md +++ b/doc/spec.md @@ -262,7 +262,7 @@ function f() { To benefit from this inference, a programmer can use the TypeScript language service. For example, a code editor can incorporate the TypeScript language service and use the service to find the members of a string object as in the following screen shot. -![](images/image1.png) +   ![](images/image1.png) In this example, the programmer benefits from type inference without providing type annotations. Some beneficial tools, however, do require the programmer to provide type annotations. In TypeScript, we can express a parameter requirement as in the following code fragment. @@ -410,7 +410,7 @@ This signature denotes that a function may be passed as the parameter of the '$' A typical client would not need to add any additional typing but could just use a community-supplied typing to discover (through statement completion with documentation tips) and verify (through static checking) correct use of the library, as in the following screen shot. -![](images/image2.png) +   ![](images/image2.png) Section [3.3](#3.3) provides additional information about object types. @@ -627,7 +627,7 @@ An important goal of TypeScript is to provide accurate and straightforward types JavaScript programming interfaces often include functions whose behavior is discriminated by a string constant passed to the function. The Document Object Model makes heavy use of this pattern. For example, the following screen shot shows that the 'createElement' method of the 'document' object has multiple signatures, some of which identify the types returned when specific strings are passed into the method. -![](images/image3.png) +   ![](images/image3.png) The following code fragment uses this feature. Because the 'span' variable is inferred to have the type 'HTMLSpanElement', the code can reference without static error the 'isMultiline' property of 'span'. @@ -638,7 +638,7 @@ span.isMultiLine = false; // OK: HTMLSpanElement has isMultiline property In the following screen shot, a programming tool combines information from overloading on string parameters with contextual typing to infer that the type of the variable 'e' is 'MouseEvent' and that therefore 'e' has a 'clientX' property. -![](images/image4.png) +   ![](images/image4.png) Section [3.9.2.4](#3.9.2.4) provides details on how to use string literals in function signatures. diff --git a/scripts/word2md.js b/scripts/word2md.js index 2866c92d580..33dec3259fb 100644 --- a/scripts/word2md.js +++ b/scripts/word2md.js @@ -130,7 +130,7 @@ function convertDocumentToMarkdown(doc) { } else if (containsImage) { imageCount++; - write("![](images/image" + imageCount + ".png)\n\n"); + write("   ![](images/image" + imageCount + ".png)\n\n"); text = ""; } else if (style.match(/\s\d$/)) { diff --git a/scripts/word2md.ts b/scripts/word2md.ts index 1e9d7879f20..f8aecb8f611 100644 --- a/scripts/word2md.ts +++ b/scripts/word2md.ts @@ -279,7 +279,7 @@ function convertDocumentToMarkdown(doc: Word.Document): string { } else if (containsImage) { imageCount++; - write("![](images/image" + imageCount + ".png)\n\n"); + write("   ![](images/image" + imageCount + ".png)\n\n"); text = ""; } else if (style.match(/\s\d$/)) { From f6253177094cb2fb1e32c1572a7227d96269bf36 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 17:04:45 -0800 Subject: [PATCH 43/61] Added missing require for 'session' tests that relied on 'harness.ts'. --- tests/cases/unittests/session.ts | 30 ++++++++++++++++-------------- 1 file changed, 16 insertions(+), 14 deletions(-) diff --git a/tests/cases/unittests/session.ts b/tests/cases/unittests/session.ts index c1dfd508942..1251fb7215f 100644 --- a/tests/cases/unittests/session.ts +++ b/tests/cases/unittests/session.ts @@ -1,5 +1,7 @@ /// +var expect: typeof _chai.expect = _chai.expect; + namespace ts.server { let lastWrittenToHost: string; const mockHost: ServerHost = { @@ -28,7 +30,7 @@ namespace ts.server { endGroup(): void {}, msg(s: string, type?: string): void {}, }; - + describe("the Session class", () => { let session: Session; let lastSent: protocol.Message; @@ -204,7 +206,7 @@ namespace ts.server { .to.throw(`Protocol handler already exists for command "${command}"`); }); }); - + describe("event", () => { it("can format event responses and send them", () => { const evt = "notify-test"; @@ -315,7 +317,7 @@ namespace ts.server { responseRequired: true })); } - + send(msg: protocol.Message) { this.client.handle(msg); } @@ -323,7 +325,7 @@ namespace ts.server { enqueue(msg: protocol.Request) { this.queue.unshift(msg); } - + handleRequest(msg: protocol.Request) { let response: protocol.Response; try { @@ -345,7 +347,7 @@ namespace ts.server { } } } - + class InProcClient { private server: InProcSession; private seq = 0; @@ -379,7 +381,7 @@ namespace ts.server { connect(session: InProcSession): void { this.server = session; } - + execute(command: string, args: any, callback: (resp: protocol.Response) => void): void { if (!this.server) { return; @@ -394,7 +396,7 @@ namespace ts.server { this.callbacks[this.seq] = callback; } }; - + it("can be constructed and respond to commands", (done) => { const cli = new InProcClient(); const session = new InProcSession(cli); @@ -402,23 +404,23 @@ namespace ts.server { data: true }; const toEvent = { - data: false + data: false }; let responses = 0; // Connect the client cli.connect(session); - + // Add an event handler cli.on("testevent", (eventinfo) => { expect(eventinfo).to.equal(toEvent); responses++; expect(responses).to.equal(1); }); - + // Trigger said event from the server session.event(toEvent, "testevent"); - + // Queue an echo command cli.execute("echo", toEcho, (resp) => { assert(resp.success, resp.message); @@ -426,7 +428,7 @@ namespace ts.server { expect(responses).to.equal(2); expect(resp.body).to.deep.equal(toEcho); }); - + // Queue a configure command cli.execute("configure", { hostInfo: "unit test", @@ -436,10 +438,10 @@ namespace ts.server { }, (resp) => { assert(resp.success, resp.message); responses++; - expect(responses).to.equal(3); + expect(responses).to.equal(3); done(); }); - + // Consume the queue and trigger the callbacks session.consumeQueue(); }); From e4e6f7072d798c593a0f59eeb2a8d4d9453c3dd1 Mon Sep 17 00:00:00 2001 From: Yui T Date: Thu, 17 Dec 2015 17:27:00 -0800 Subject: [PATCH 44/61] Update assert msg --- src/harness/fourslash.ts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 729d2052a92..796dc1134a1 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -2769,7 +2769,7 @@ namespace FourSlashInterface { } public assertRangesEmpty(ranges: FourSlash.Range[]) { - assert(ranges.length !== 0, "Ranges array is expected to be non-empty"); + assert(ranges.length !== 0, "Array of ranges is expected to be non-empty"); } public completionListIsEmpty() { @@ -3291,4 +3291,4 @@ namespace FourSlashInterface { }; } } -} +} From 2ec97a2d2e5ba40483f2e466ce414cb25e18314c Mon Sep 17 00:00:00 2001 From: Yui T Date: Thu, 17 Dec 2015 18:00:53 -0800 Subject: [PATCH 45/61] Address PR feed back --- Jakefile.js | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Jakefile.js b/Jakefile.js index 91bd805a27b..288472a697b 100644 --- a/Jakefile.js +++ b/Jakefile.js @@ -925,7 +925,7 @@ var lintTargets = compilerSources .concat(harnessCoreSources) .concat(serverCoreSources) .concat(scriptSources) - .concat([path.join(servicesDirectory,"services.ts")]); + .concat([path.join(servicesDirectory, "services.ts")]); desc("Runs tslint on the compiler sources"); task("lint", ["build-rules"], function() { From 03be649b1c086801c17a84f74a714188c8ae92e7 Mon Sep 17 00:00:00 2001 From: Yui T Date: Thu, 17 Dec 2015 18:14:04 -0800 Subject: [PATCH 46/61] Address feedback --- src/harness/fourslash.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 796dc1134a1..d5e1687b305 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -2768,7 +2768,7 @@ namespace FourSlashInterface { this.state.verifyCompletionListItemsCountIsGreaterThan(count, this.negative); } - public assertRangesEmpty(ranges: FourSlash.Range[]) { + public assertHasRanges(ranges: FourSlash.Range[]) { assert(ranges.length !== 0, "Array of ranges is expected to be non-empty"); } From 94e91e59607e59f749ce1a8d42a2b5dc9687723c Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Thu, 17 Dec 2015 18:20:49 -0800 Subject: [PATCH 47/61] Use hidden text in Word document for markdown image links --- doc/TypeScript Language Specification.docx | Bin 311634 -> 311406 bytes doc/spec.md | 8 ++--- scripts/word2md.js | 25 +++++++------- scripts/word2md.ts | 36 ++++++++++----------- 4 files changed, 36 insertions(+), 33 deletions(-) diff --git a/doc/TypeScript Language Specification.docx b/doc/TypeScript Language Specification.docx index 4eb94908b57bbab417b1907a6e01964be003a68c..370e5e25d8960471298e7dd08b6e0ef26b6d022a 100644 GIT binary patch delta 244673 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

PF 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 delta 244877 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 z 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

{ } - export interface InlineShape { - } - - export interface InlineShapes extends Collection { - } - export interface Range { find: Find; listFormat: ListFormat; tables: Tables; - inlineShapes: InlineShapes; text: string; + textRetrievalMode: { + includeHiddenText: boolean; + } words: Ranges; } @@ -266,22 +262,26 @@ function convertDocumentToMarkdown(doc: Word.Document): string { function writeParagraph(p: Word.Paragraph) { - var text = p.range.text; + var range = p.range; + var text = range.text; var style = p.style.nameLocal; - var inTable = p.range.tables.count > 0; - var containsImage = p.range.inlineShapes.count > 0; + var inTable = range.tables.count > 0; var level = 1; var sectionBreak = text.indexOf("\x0C") >= 0; text = trimEndFormattingMarks(text); + if (text === "/") { + range.textRetrievalMode.includeHiddenText = true; + var fullText = range.text; + range.textRetrievalMode.includeHiddenText = false; + if (text !== fullText) { + text = "  " + fullText.substr(1); + } + } + if (inTable) { style = "Table"; } - else if (containsImage) { - imageCount++; - write("   ![](images/image" + imageCount + ".png)\n\n"); - text = ""; - } else if (style.match(/\s\d$/)) { level = +style.substr(style.length - 1); style = style.substr(0, style.length - 2); @@ -294,7 +294,7 @@ function convertDocumentToMarkdown(doc: Word.Document): string { case "Heading": case "Appendix": - var section = p.range.listFormat.listString; + var section = range.listFormat.listString; write("####".substr(0, level) + ' ' + section + " " + text + "\n\n"); break; @@ -305,7 +305,7 @@ function convertDocumentToMarkdown(doc: Word.Document): string { break; case "List Paragraph": - write(" ".substr(0, p.range.listFormat.listLevelNumber * 2 - 2) + "* " + text + "\n"); + write(" ".substr(0, range.listFormat.listLevelNumber * 2 - 2) + "* " + text + "\n"); break; case "Grammar": @@ -324,7 +324,7 @@ function convertDocumentToMarkdown(doc: Word.Document): string { case "Table": if (!lastInTable) { - tableColumnCount = p.range.tables.item(1).columns.count + 1; + tableColumnCount = range.tables.item(1).columns.count + 1; tableCellIndex = 0; } if (tableCellIndex < tableColumnCount) { From 58e869d5e4ce5f888ca62c91e4670326faeeafb0 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Thu, 17 Dec 2015 18:25:17 -0800 Subject: [PATCH 48/61] Remove unused variable --- scripts/word2md.ts | 1 - 1 file changed, 1 deletion(-) diff --git a/scripts/word2md.ts b/scripts/word2md.ts index 266046cee37..62582992c49 100644 --- a/scripts/word2md.ts +++ b/scripts/word2md.ts @@ -183,7 +183,6 @@ function convertDocumentToMarkdown(doc: Word.Document): string { var tableColumnCount: number; var tableCellIndex: number; var columnAlignment: number[] = []; - var imageCount: number = 0; function setProperties(target: any, properties: any) { for (var name in properties) { From 7499c7c279933ac2fd35aa5ce11e82d319ec1a59 Mon Sep 17 00:00:00 2001 From: Yui T Date: Thu, 17 Dec 2015 18:34:21 -0800 Subject: [PATCH 49/61] Address feedback --- src/harness/fourslash.ts | 2 +- .../cases/fourslash/findAllRefsParameterPropertyDeclaration1.ts | 2 +- .../cases/fourslash/findAllRefsParameterPropertyDeclaration2.ts | 2 +- .../cases/fourslash/findAllRefsParameterPropertyDeclaration3.ts | 2 +- tests/cases/fourslash/fourslash.ts | 2 +- tests/cases/fourslash/renameParameterPropertyDeclaration1.ts | 2 +- tests/cases/fourslash/renameParameterPropertyDeclaration2.ts | 2 +- tests/cases/fourslash/renameParameterPropertyDeclaration3.ts | 2 +- tests/cases/fourslash/renameParameterPropertyDeclaration4.ts | 2 +- tests/cases/fourslash/renameParameterPropertyDeclaration5.ts | 2 +- 10 files changed, 10 insertions(+), 10 deletions(-) diff --git a/src/harness/fourslash.ts b/src/harness/fourslash.ts index 796dc1134a1..d5e1687b305 100644 --- a/src/harness/fourslash.ts +++ b/src/harness/fourslash.ts @@ -2768,7 +2768,7 @@ namespace FourSlashInterface { this.state.verifyCompletionListItemsCountIsGreaterThan(count, this.negative); } - public assertRangesEmpty(ranges: FourSlash.Range[]) { + public assertHasRanges(ranges: FourSlash.Range[]) { assert(ranges.length !== 0, "Array of ranges is expected to be non-empty"); } diff --git a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration1.ts b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration1.ts index 828b143a4ce..4018698f4ef 100644 --- a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration1.ts +++ b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration1.ts @@ -8,7 +8,7 @@ //// } const ranges = test.ranges(); -verify.assertRangesEmpty(ranges); +verify.assertHasRanges(ranges); for (const range of ranges) { goTo.position(range.start); diff --git a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration2.ts b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration2.ts index 6b15b334c28..a450a77e2dc 100644 --- a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration2.ts +++ b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration2.ts @@ -8,7 +8,7 @@ //// } let ranges = test.ranges(); -verify.assertRangesEmpty(ranges); +verify.assertHasRanges(ranges); for (let range of ranges) { goTo.position(range.start); diff --git a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration3.ts b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration3.ts index 1310841eed4..82fd67dfc9b 100644 --- a/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration3.ts +++ b/tests/cases/fourslash/findAllRefsParameterPropertyDeclaration3.ts @@ -8,7 +8,7 @@ //// } const ranges = test.ranges(); -verify.assertRangesEmpty(ranges); +verify.assertHasRanges(ranges); for (const range of ranges) { goTo.position(range.start); diff --git a/tests/cases/fourslash/fourslash.ts b/tests/cases/fourslash/fourslash.ts index fcb221e8233..dd443e942cf 100644 --- a/tests/cases/fourslash/fourslash.ts +++ b/tests/cases/fourslash/fourslash.ts @@ -137,7 +137,7 @@ declare namespace FourSlashInterface { verifyDefinitionsName(name: string, containerName: string): void; } class verify extends verifyNegatable { - assertRangesEmpty(ranges: FourSlash.Range[]): void; + assertHasRanges(ranges: FourSlash.Range[]): void; caretAtMarker(markerName?: string): void; indentationIs(numberOfSpaces: number): void; indentationAtPositionIs(fileName: string, position: number, numberOfSpaces: number, indentStyle?: ts.IndentStyle): void; diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration1.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration1.ts index 37db51447ca..42bfbf63a47 100644 --- a/tests/cases/fourslash/renameParameterPropertyDeclaration1.ts +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration1.ts @@ -8,7 +8,7 @@ //// } let ranges = test.ranges(); -verify.assertRangesEmpty(ranges); +verify.assertHasRanges(ranges); for (let range of ranges) { goTo.position(range.start); verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration2.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration2.ts index c5e44438ee3..e7ef9d1c1a2 100644 --- a/tests/cases/fourslash/renameParameterPropertyDeclaration2.ts +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration2.ts @@ -8,7 +8,7 @@ //// } let ranges = test.ranges(); -verify.assertRangesEmpty(ranges); +verify.assertHasRanges(ranges); for (let range of ranges) { goTo.position(range.start); verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration3.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration3.ts index 2ca284f38d9..9446e2aeb75 100644 --- a/tests/cases/fourslash/renameParameterPropertyDeclaration3.ts +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration3.ts @@ -8,7 +8,7 @@ //// } let ranges = test.ranges(); -verify.assertRangesEmpty(ranges); +verify.assertHasRanges(ranges); for (let range of ranges) { goTo.position(range.start); verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration4.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration4.ts index 35d268532b9..7fb4b8c757d 100644 --- a/tests/cases/fourslash/renameParameterPropertyDeclaration4.ts +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration4.ts @@ -7,7 +7,7 @@ //// } let ranges = test.ranges(); -verify.assertRangesEmpty(ranges); +verify.assertHasRanges(ranges); for (let range of ranges) { goTo.position(range.start); verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); diff --git a/tests/cases/fourslash/renameParameterPropertyDeclaration5.ts b/tests/cases/fourslash/renameParameterPropertyDeclaration5.ts index d32e69ad0c5..b7c47a4c0d7 100644 --- a/tests/cases/fourslash/renameParameterPropertyDeclaration5.ts +++ b/tests/cases/fourslash/renameParameterPropertyDeclaration5.ts @@ -7,7 +7,7 @@ //// } let ranges = test.ranges(); -verify.assertRangesEmpty(ranges); +verify.assertHasRanges(ranges); for (let range of ranges) { goTo.position(range.start); verify.renameLocations(/*findInStrings*/ false, /*findInComments*/ false); From 75678de6d99ecffec583804fd6ce52cc83c46618 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 19:47:01 -0800 Subject: [PATCH 50/61] Removed unused declarations from 'services.ts'. --- src/services/services.ts | 14 +++++++------- 1 file changed, 7 insertions(+), 7 deletions(-) diff --git a/src/services/services.ts b/src/services/services.ts index 8f9028486aa..10f404dbcad 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -2987,7 +2987,6 @@ namespace ts { function getCompletionData(fileName: string, position: number) { const typeChecker = program.getTypeChecker(); - const syntacticStart = new Date().getTime(); const sourceFile = getValidSourceFile(fileName); const isJavaScriptFile = isSourceFileJavaScript(sourceFile); @@ -6166,10 +6165,6 @@ namespace ts { return ts.NavigateTo.getNavigateToItems(program, cancellationToken, searchValue, maxResultCount); } - function containErrors(diagnostics: Diagnostic[]): boolean { - return forEach(diagnostics, diagnostic => diagnostic.category === DiagnosticCategory.Error); - } - function getEmitOutput(fileName: string): EmitOutput { synchronizeHostData(); @@ -7045,7 +7040,6 @@ namespace ts { * be performed. */ function getDocCommentTemplateAtPosition(fileName: string, position: number): TextInsertion { - const start = new Date().getTime(); const sourceFile = syntaxTreeCache.getCurrentSourceFile(fileName); // Check if in a context where we don't want to perform any insertion @@ -7339,11 +7333,17 @@ namespace ts { if (declarations && declarations.length > 0) { // Disallow rename for elements that are defined in the standard TypeScript library. const defaultLibFileName = host.getDefaultLibFileName(host.getCompilationSettings()); + const canonicalDefaultLibName = getCanonicalFileName(ts.normalizePath(defaultLibFileName)); if (defaultLibFileName) { for (const current of declarations) { const sourceFile = current.getSourceFile(); + // TODO (drosen): When is there no source file? + if (!sourceFile) { + continue; + } + const canonicalName = getCanonicalFileName(ts.normalizePath(sourceFile.fileName)); - if (sourceFile && getCanonicalFileName(ts.normalizePath(sourceFile.fileName)) === getCanonicalFileName(ts.normalizePath(defaultLibFileName))) { + if (canonicalName === canonicalDefaultLibName) { return getRenameInfoError(getLocaleSpecificMessage(Diagnostics.You_cannot_rename_elements_that_are_defined_in_the_standard_TypeScript_library)); } } From a5c632cd5a104935a737b58eb41adb79e57cbc84 Mon Sep 17 00:00:00 2001 From: Yui T Date: Thu, 17 Dec 2015 21:08:11 -0800 Subject: [PATCH 51/61] Fix merge error --- 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 d171724d7ff..4109a4eb345 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -5934,7 +5934,7 @@ namespace ts { function populateSearchSymbolSet(symbol: Symbol, location: Node): Symbol[] { // The search set contains at least the current symbol - const result = [symbol]; + let result = [symbol]; // If the symbol is an alias, add what it alaises to the list if (isImportOrExportSpecifierImportSymbol(symbol)) { From 287b316937b3976067c22a9ec2b93fce2710a35a Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Thu, 17 Dec 2015 22:00:04 -0800 Subject: [PATCH 52/61] Addressed CR feedback. --- src/server/editorServices.ts | 2 -- tests/cases/unittests/session.ts | 2 +- 2 files changed, 1 insertion(+), 3 deletions(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index d023a9827ee..80fbc573ff2 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -555,7 +555,6 @@ namespace ts.server { } handleProjectFilelistChanges(project: Project) { - // TODO: Ignoring potentially returned 'error' and 'succeeded' condition const { projectOptions } = this.configFileToProjectOptions(project.projectFilename); const newRootFiles = projectOptions.files.map((f => this.getCanonicalFileName(f))); @@ -585,7 +584,6 @@ namespace ts.server { this.log("Detected newly added tsconfig file: " + fileName); - // TODO: Ignoring potentially returned 'error' and 'succeeded' condition const { projectOptions } = this.configFileToProjectOptions(fileName); const rootFilesInTsconfig = projectOptions.files.map(f => this.getCanonicalFileName(f)); diff --git a/tests/cases/unittests/session.ts b/tests/cases/unittests/session.ts index 1251fb7215f..41f4bc599f6 100644 --- a/tests/cases/unittests/session.ts +++ b/tests/cases/unittests/session.ts @@ -1,6 +1,6 @@ /// -var expect: typeof _chai.expect = _chai.expect; +const expect: typeof _chai.expect = _chai.expect; namespace ts.server { let lastWrittenToHost: string; From a8f87bb2cafc7228c8badc3fd85d43cbf2291ce9 Mon Sep 17 00:00:00 2001 From: Vladimir Matveev Date: Fri, 18 Dec 2015 11:21:31 -0800 Subject: [PATCH 53/61] only '++' and '--' unary operators can change exports --- src/compiler/emitter.ts | 3 +- ...prefixUnaryOperatorsOnExportedVariables.js | 58 +++++++++++++++++++ ...xUnaryOperatorsOnExportedVariables.symbols | 42 ++++++++++++++ ...fixUnaryOperatorsOnExportedVariables.types | 51 ++++++++++++++++ ...prefixUnaryOperatorsOnExportedVariables.ts | 32 ++++++++++ 5 files changed, 185 insertions(+), 1 deletion(-) create mode 100644 tests/baselines/reference/prefixUnaryOperatorsOnExportedVariables.js create mode 100644 tests/baselines/reference/prefixUnaryOperatorsOnExportedVariables.symbols create mode 100644 tests/baselines/reference/prefixUnaryOperatorsOnExportedVariables.types create mode 100644 tests/cases/compiler/prefixUnaryOperatorsOnExportedVariables.ts diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 622ec14caa8..ab775ba9fc6 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -2445,7 +2445,8 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi } function emitPrefixUnaryExpression(node: PrefixUnaryExpression) { - const exportChanged = isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.operand); + const exportChanged = (node.operator === SyntaxKind.PlusPlusToken || node.operator === SyntaxKind.MinusMinusToken) && + isNameOfExportedSourceLevelDeclarationInSystemExternalModule(node.operand); if (exportChanged) { // emit diff --git a/tests/baselines/reference/prefixUnaryOperatorsOnExportedVariables.js b/tests/baselines/reference/prefixUnaryOperatorsOnExportedVariables.js new file mode 100644 index 00000000000..5d414c97d05 --- /dev/null +++ b/tests/baselines/reference/prefixUnaryOperatorsOnExportedVariables.js @@ -0,0 +1,58 @@ +//// [prefixUnaryOperatorsOnExportedVariables.ts] + +export var x = false; +export var y = 1; +if (!x) { + +} + +if (+x) { + +} + +if (-x) { + +} + +if (~x) { + +} + +if (void x) { + +} + +if (typeof x) { + +} + +if (++y) { + +} + +//// [prefixUnaryOperatorsOnExportedVariables.js] +System.register([], function(exports_1) { + "use strict"; + var x, y; + return { + setters:[], + execute: function() { + exports_1("x", x = false); + exports_1("y", y = 1); + if (!x) { + } + if (+x) { + } + if (-x) { + } + if (~x) { + } + if (void x) { + } + if (typeof x) { + } + if (exports_1("y", ++y)) { + } + } + } +}); diff --git a/tests/baselines/reference/prefixUnaryOperatorsOnExportedVariables.symbols b/tests/baselines/reference/prefixUnaryOperatorsOnExportedVariables.symbols new file mode 100644 index 00000000000..c8293ef1902 --- /dev/null +++ b/tests/baselines/reference/prefixUnaryOperatorsOnExportedVariables.symbols @@ -0,0 +1,42 @@ +=== tests/cases/compiler/prefixUnaryOperatorsOnExportedVariables.ts === + +export var x = false; +>x : Symbol(x, Decl(prefixUnaryOperatorsOnExportedVariables.ts, 1, 10)) + +export var y = 1; +>y : Symbol(y, Decl(prefixUnaryOperatorsOnExportedVariables.ts, 2, 10)) + +if (!x) { +>x : Symbol(x, Decl(prefixUnaryOperatorsOnExportedVariables.ts, 1, 10)) + +} + +if (+x) { +>x : Symbol(x, Decl(prefixUnaryOperatorsOnExportedVariables.ts, 1, 10)) + +} + +if (-x) { +>x : Symbol(x, Decl(prefixUnaryOperatorsOnExportedVariables.ts, 1, 10)) + +} + +if (~x) { +>x : Symbol(x, Decl(prefixUnaryOperatorsOnExportedVariables.ts, 1, 10)) + +} + +if (void x) { +>x : Symbol(x, Decl(prefixUnaryOperatorsOnExportedVariables.ts, 1, 10)) + +} + +if (typeof x) { +>x : Symbol(x, Decl(prefixUnaryOperatorsOnExportedVariables.ts, 1, 10)) + +} + +if (++y) { +>y : Symbol(y, Decl(prefixUnaryOperatorsOnExportedVariables.ts, 2, 10)) + +} diff --git a/tests/baselines/reference/prefixUnaryOperatorsOnExportedVariables.types b/tests/baselines/reference/prefixUnaryOperatorsOnExportedVariables.types new file mode 100644 index 00000000000..c75ba492c31 --- /dev/null +++ b/tests/baselines/reference/prefixUnaryOperatorsOnExportedVariables.types @@ -0,0 +1,51 @@ +=== tests/cases/compiler/prefixUnaryOperatorsOnExportedVariables.ts === + +export var x = false; +>x : boolean +>false : boolean + +export var y = 1; +>y : number +>1 : number + +if (!x) { +>!x : boolean +>x : boolean + +} + +if (+x) { +>+x : number +>x : boolean + +} + +if (-x) { +>-x : number +>x : boolean + +} + +if (~x) { +>~x : number +>x : boolean + +} + +if (void x) { +>void x : undefined +>x : boolean + +} + +if (typeof x) { +>typeof x : string +>x : boolean + +} + +if (++y) { +>++y : number +>y : number + +} diff --git a/tests/cases/compiler/prefixUnaryOperatorsOnExportedVariables.ts b/tests/cases/compiler/prefixUnaryOperatorsOnExportedVariables.ts new file mode 100644 index 00000000000..58b05bb513a --- /dev/null +++ b/tests/cases/compiler/prefixUnaryOperatorsOnExportedVariables.ts @@ -0,0 +1,32 @@ +// @target: ES5 +// @module: system + +export var x = false; +export var y = 1; +if (!x) { + +} + +if (+x) { + +} + +if (-x) { + +} + +if (~x) { + +} + +if (void x) { + +} + +if (typeof x) { + +} + +if (++y) { + +} \ No newline at end of file From cc5334eb89812dcc0c180089c84fbf4292a85fe3 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Fri, 18 Dec 2015 14:06:08 -0800 Subject: [PATCH 54/61] Made 'expression' non-optional in 'CaseClause'. --- src/compiler/types.ts | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/src/compiler/types.ts b/src/compiler/types.ts index a8c4ee211c3..24f70373a8a 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1195,7 +1195,7 @@ namespace ts { // @kind(SyntaxKind.CaseClause) export interface CaseClause extends Node { - expression?: Expression; + expression: Expression; statements: NodeArray; } From aba197cd4b009016063e2ca5855bedb272c4ddba Mon Sep 17 00:00:00 2001 From: Dan Corder Date: Wed, 16 Dec 2015 23:21:00 +0000 Subject: [PATCH 55/61] Fix issue #5810 doubled comment on functions in array literals --- src/compiler/emitter.ts | 9 +++-- .../reference/arrayLiteralComments.js | 31 ++++++++++++++++ .../reference/arrayLiteralComments.symbols | 21 +++++++++++ .../reference/arrayLiteralComments.types | 36 +++++++++++++++++++ tests/cases/compiler/arrayLiteralComments.ts | 14 ++++++++ 5 files changed, 108 insertions(+), 3 deletions(-) create mode 100644 tests/baselines/reference/arrayLiteralComments.js create mode 100644 tests/baselines/reference/arrayLiteralComments.symbols create mode 100644 tests/baselines/reference/arrayLiteralComments.types create mode 100644 tests/cases/compiler/arrayLiteralComments.ts diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index ab775ba9fc6..88d9d20c4c0 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -4280,9 +4280,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi // TODO (yuisu) : we should not have special cases to condition emitting comments // but have one place to fix check for these conditions. - if (node.kind !== SyntaxKind.MethodDeclaration && node.kind !== SyntaxKind.MethodSignature && - node.parent && node.parent.kind !== SyntaxKind.PropertyAssignment && - node.parent.kind !== SyntaxKind.CallExpression) { + if (node.kind !== SyntaxKind.MethodDeclaration && + node.kind !== SyntaxKind.MethodSignature && + node.parent && + node.parent.kind !== SyntaxKind.PropertyAssignment && + node.parent.kind !== SyntaxKind.CallExpression && + node.parent.kind !== SyntaxKind.ArrayLiteralExpression) { // 1. Methods will emit the comments as part of emitting method declaration // 2. If the function is a property of object literal, emitting leading-comments diff --git a/tests/baselines/reference/arrayLiteralComments.js b/tests/baselines/reference/arrayLiteralComments.js new file mode 100644 index 00000000000..4f13df1c828 --- /dev/null +++ b/tests/baselines/reference/arrayLiteralComments.js @@ -0,0 +1,31 @@ +//// [arrayLiteralComments.ts] +var testArrayWithFunc = [ + // Function comment + function() { + let x = 1; + }, + // String comment + '1', + // Numeric comment + 2, + // Object comment + { a: 1 }, + // Array comment + [1, 2, 3] +] + +//// [arrayLiteralComments.js] +var testArrayWithFunc = [ + // Function comment + function () { + var x = 1; + }, + // String comment + '1', + // Numeric comment + 2, + // Object comment + { a: 1 }, + // Array comment + [1, 2, 3] +]; diff --git a/tests/baselines/reference/arrayLiteralComments.symbols b/tests/baselines/reference/arrayLiteralComments.symbols new file mode 100644 index 00000000000..c1c173d741f --- /dev/null +++ b/tests/baselines/reference/arrayLiteralComments.symbols @@ -0,0 +1,21 @@ +=== tests/cases/compiler/arrayLiteralComments.ts === +var testArrayWithFunc = [ +>testArrayWithFunc : Symbol(testArrayWithFunc, Decl(arrayLiteralComments.ts, 0, 3)) + + // Function comment + function() { + let x = 1; +>x : Symbol(x, Decl(arrayLiteralComments.ts, 3, 11)) + + }, + // String comment + '1', + // Numeric comment + 2, + // Object comment + { a: 1 }, +>a : Symbol(a, Decl(arrayLiteralComments.ts, 10, 5)) + + // Array comment + [1, 2, 3] +] diff --git a/tests/baselines/reference/arrayLiteralComments.types b/tests/baselines/reference/arrayLiteralComments.types new file mode 100644 index 00000000000..a8c32b48e41 --- /dev/null +++ b/tests/baselines/reference/arrayLiteralComments.types @@ -0,0 +1,36 @@ +=== tests/cases/compiler/arrayLiteralComments.ts === +var testArrayWithFunc = [ +>testArrayWithFunc : ((() => void) | string | number | { a: number; } | number[])[] +>[ // Function comment function() { let x = 1; }, // String comment '1', // Numeric comment 2, // Object comment { a: 1 }, // Array comment [1, 2, 3]] : ((() => void) | string | number | { a: number; } | number[])[] + + // Function comment + function() { +>function() { let x = 1; } : () => void + + let x = 1; +>x : number +>1 : number + + }, + // String comment + '1', +>'1' : string + + // Numeric comment + 2, +>2 : number + + // Object comment + { a: 1 }, +>{ a: 1 } : { a: number; } +>a : number +>1 : number + + // Array comment + [1, 2, 3] +>[1, 2, 3] : number[] +>1 : number +>2 : number +>3 : number + +] diff --git a/tests/cases/compiler/arrayLiteralComments.ts b/tests/cases/compiler/arrayLiteralComments.ts new file mode 100644 index 00000000000..131cecc1d95 --- /dev/null +++ b/tests/cases/compiler/arrayLiteralComments.ts @@ -0,0 +1,14 @@ +var testArrayWithFunc = [ + // Function comment + function() { + let x = 1; + }, + // String comment + '1', + // Numeric comment + 2, + // Object comment + { a: 1 }, + // Array comment + [1, 2, 3] +] \ No newline at end of file From 9badf0c0261e803638d50a3b31bd5024fe4711db Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Fri, 18 Dec 2015 14:48:35 -0800 Subject: [PATCH 56/61] filelist -> fileList --- src/server/editorServices.ts | 21 ++++++++++----------- 1 file changed, 10 insertions(+), 11 deletions(-) diff --git a/src/server/editorServices.ts b/src/server/editorServices.ts index 80fbc573ff2..5a1c85fc13c 100644 --- a/src/server/editorServices.ts +++ b/src/server/editorServices.ts @@ -486,7 +486,7 @@ namespace ts.server { // number becomes 0 for a watcher, then we should close it. directoryWatchersRefCount: ts.Map = {}; hostConfiguration: HostConfiguration; - timerForDetectingProjectFilelistChanges: Map = {}; + timerForDetectingProjectFileListChanges: Map = {}; constructor(public host: ServerHost, public psLogger: Logger, public eventHandler?: ProjectServiceEventHandler) { // ts.disableIncrementalParsing = true; @@ -541,20 +541,20 @@ namespace ts.server { } this.log("Detected source file changes: " + fileName); - this.startTimerForDetectingProjectFilelistChanges(project); + this.startTimerForDetectingProjectFileListChanges(project); } - startTimerForDetectingProjectFilelistChanges(project: Project) { - if (this.timerForDetectingProjectFilelistChanges[project.projectFilename]) { - clearTimeout(this.timerForDetectingProjectFilelistChanges[project.projectFilename]); + startTimerForDetectingProjectFileListChanges(project: Project) { + if (this.timerForDetectingProjectFileListChanges[project.projectFilename]) { + clearTimeout(this.timerForDetectingProjectFileListChanges[project.projectFilename]); } - this.timerForDetectingProjectFilelistChanges[project.projectFilename] = setTimeout( - () => this.handleProjectFilelistChanges(project), + this.timerForDetectingProjectFileListChanges[project.projectFilename] = setTimeout( + () => this.handleProjectFileListChanges(project), 250 ); } - handleProjectFilelistChanges(project: Project) { + handleProjectFileListChanges(project: Project) { const { projectOptions } = this.configFileToProjectOptions(project.projectFilename); const newRootFiles = projectOptions.files.map((f => this.getCanonicalFileName(f))); @@ -1083,7 +1083,6 @@ namespace ts.server { * Close file whose contents is managed by the client * @param filename is absolute pathname */ - closeClientFile(filename: string) { const info = ts.lookUp(this.filenameToScriptInfo, filename); if (info) { @@ -1739,9 +1738,9 @@ namespace ts.server { } getLineMapper() { - return ((line: number) => { + return (line: number) => { return this.index.lineNumberToInfo(line).offset; - }); + }; } getTextChangeRangeSinceVersion(scriptVersion: number) { From e93df41f544d0495a517fafc9170b84b2867bc25 Mon Sep 17 00:00:00 2001 From: Anders Hejlsberg Date: Fri, 18 Dec 2015 19:06:44 -0800 Subject: [PATCH 57/61] Addressing CR feedback --- scripts/word2md.js | 245 --------------------------------------------- scripts/word2md.ts | 4 + 2 files changed, 4 insertions(+), 245 deletions(-) delete mode 100644 scripts/word2md.js diff --git a/scripts/word2md.js b/scripts/word2md.js deleted file mode 100644 index 4804a9f0563..00000000000 --- a/scripts/word2md.js +++ /dev/null @@ -1,245 +0,0 @@ -// word2md - Word to Markdown conversion tool -// -// word2md converts a Microsoft Word document to Markdown formatted text. The tool uses the -// Word Automation APIs to start an instance of Word and access the contents of the document -// being converted. The tool must be run using the cscript.exe script host and requires Word -// to be installed on the target machine. The name of the document to convert must be specified -// as a command line argument and the resulting Markdown is written to standard output. The -// tool recognizes the specific Word styles used in the TypeScript Language Specification. -var sys = (function () { - var fileStream = new ActiveXObject("ADODB.Stream"); - fileStream.Type = 2 /*text*/; - var binaryStream = new ActiveXObject("ADODB.Stream"); - binaryStream.Type = 1 /*binary*/; - var args = []; - for (var i = 0; i < WScript.Arguments.length; i++) { - args[i] = WScript.Arguments.Item(i); - } - return { - args: args, - createObject: function (typeName) { return new ActiveXObject(typeName); }, - write: function (s) { - WScript.StdOut.Write(s); - }, - writeFile: function (fileName, data) { - fileStream.Open(); - binaryStream.Open(); - try { - // Write characters in UTF-8 encoding - fileStream.Charset = "utf-8"; - fileStream.WriteText(data); - // We don't want the BOM, skip it by setting the starting location to 3 (size of BOM). - fileStream.Position = 3; - fileStream.CopyTo(binaryStream); - binaryStream.SaveToFile(fileName, 2 /*overwrite*/); - } - finally { - binaryStream.Close(); - fileStream.Close(); - } - } - }; -})(); -function convertDocumentToMarkdown(doc) { - var result = ""; - var lastStyle; - var lastInTable; - var tableColumnCount; - var tableCellIndex; - var columnAlignment = []; - var imageCount = 0; - function setProperties(target, properties) { - for (var name in properties) { - if (properties.hasOwnProperty(name)) { - var value = properties[name]; - if (typeof value === "object") { - setProperties(target[name], value); - } - else { - target[name] = value; - } - } - } - } - function findReplace(findText, findOptions, replaceText, replaceOptions) { - var find = doc.range().find; - find.clearFormatting(); - setProperties(find, findOptions); - var replace = find.replacement; - replace.clearFormatting(); - setProperties(replace, replaceOptions); - find.execute(findText, false, false, false, false, false, true, 0, true, replaceText, 2); - } - function fixHyperlinks() { - var count = doc.hyperlinks.count; - for (var i = 0; i < count; i++) { - var hyperlink = doc.hyperlinks.item(i + 1); - var address = hyperlink.address; - if (address && address.length > 0) { - var textToDisplay = hyperlink.textToDisplay; - hyperlink.textToDisplay = "[" + textToDisplay + "](" + address + ")"; - } - } - } - function write(s) { - result += s; - } - function writeTableHeader() { - for (var i = 0; i < tableColumnCount - 1; i++) { - switch (columnAlignment[i]) { - case 1: - write("|:---:"); - break; - case 2: - write("|---:"); - break; - default: - write("|---"); - } - } - write("|\n"); - } - function trimEndFormattingMarks(text) { - var i = text.length; - while (i > 0 && text.charCodeAt(i - 1) < 0x20) - i--; - return text.substr(0, i); - } - function writeBlockEnd() { - switch (lastStyle) { - case "Code": - write("```\n\n"); - break; - case "List Paragraph": - case "Table": - case "TOC": - write("\n"); - break; - } - } - function writeParagraph(p) { - var range = p.range; - var text = range.text; - var style = p.style.nameLocal; - var inTable = range.tables.count > 0; - var level = 1; - var sectionBreak = text.indexOf("\x0C") >= 0; - text = trimEndFormattingMarks(text); - if (text === "/") { - range.textRetrievalMode.includeHiddenText = true; - var fullText = range.text; - range.textRetrievalMode.includeHiddenText = false; - if (text !== fullText) { - text = "  " + fullText.substr(1); - } - } - if (inTable) { - style = "Table"; - } - else if (style.match(/\s\d$/)) { - level = +style.substr(style.length - 1); - style = style.substr(0, style.length - 2); - } - if (lastStyle && style !== lastStyle) { - writeBlockEnd(); - } - switch (style) { - case "Heading": - case "Appendix": - var section = range.listFormat.listString; - write("####".substr(0, level) + ' ' + section + " " + text + "\n\n"); - break; - case "Normal": - if (text.length) { - write(text + "\n\n"); - } - break; - case "List Paragraph": - write(" ".substr(0, range.listFormat.listLevelNumber * 2 - 2) + "* " + text + "\n"); - break; - case "Grammar": - write("  " + text.replace(/\s\s\s/g, " ").replace(/\x0B/g, " \n   ") + "\n\n"); - break; - case "Code": - if (lastStyle !== "Code") { - write("```TypeScript\n"); - } - else { - write("\n"); - } - write(text.replace(/\x0B/g, " \n") + "\n"); - break; - case "Table": - if (!lastInTable) { - tableColumnCount = range.tables.item(1).columns.count + 1; - tableCellIndex = 0; - } - if (tableCellIndex < tableColumnCount) { - columnAlignment[tableCellIndex] = p.alignment; - } - write("|" + text); - tableCellIndex++; - if (tableCellIndex % tableColumnCount === 0) { - write("\n"); - if (tableCellIndex === tableColumnCount) { - writeTableHeader(); - } - } - break; - case "TOC Heading": - write("## " + text + "\n\n"); - break; - case "TOC": - var strings = text.split("\t"); - write(" ".substr(0, level * 2 - 2) + "* [" + strings[0] + " " + strings[1] + "](#" + strings[0] + ")\n"); - break; - } - if (sectionBreak) { - write("
\n\n"); - } - lastStyle = style; - lastInTable = inTable; - } - function writeDocument() { - var title = doc.builtInDocumentProperties.item(1) + ""; - if (title.length) { - write("# " + title + "\n\n"); - } - for (var p = doc.paragraphs.first; p; p = p.next()) { - writeParagraph(p); - } - writeBlockEnd(); - } - findReplace("<", {}, "<", {}); - findReplace("<", { style: "Code" }, "<", {}); - findReplace("<", { style: "Code Fragment" }, "<", {}); - findReplace("<", { style: "Terminal" }, "<", {}); - findReplace("", { font: { subscript: true } }, "^&", { font: { subscript: false } }); - findReplace("", { style: "Code Fragment" }, "`^&`", { style: -66 /* default font */ }); - findReplace("", { style: "Production" }, "*^&*", { style: -66 /* default font */ }); - findReplace("", { style: "Terminal" }, "`^&`", { style: -66 /* default font */ }); - findReplace("", { font: { bold: true, italic: true } }, "***^&***", { font: { bold: false, italic: false } }); - findReplace("", { font: { italic: true } }, "*^&*", { font: { italic: false } }); - doc.fields.toggleShowCodes(); - findReplace("^19 REF", {}, "[^&](#^&)", {}); - doc.fields.toggleShowCodes(); - fixHyperlinks(); - writeDocument(); - result = result.replace(/\x85/g, "\u2026"); - result = result.replace(/\x96/g, "\u2013"); - result = result.replace(/\x97/g, "\u2014"); - return result; -} -function main(args) { - if (args.length !== 2) { - sys.write("Syntax: word2md \n"); - return; - } - var app = sys.createObject("Word.Application"); - var doc = app.documents.open(args[0]); - sys.writeFile(args[1], convertDocumentToMarkdown(doc)); - doc.close(false); - app.quit(); -} -main(sys.args); -//# sourceMappingURL=file:///c:/ts/scripts/word2md.js.map \ No newline at end of file diff --git a/scripts/word2md.ts b/scripts/word2md.ts index 62582992c49..f602c700ff9 100644 --- a/scripts/word2md.ts +++ b/scripts/word2md.ts @@ -270,6 +270,10 @@ function convertDocumentToMarkdown(doc: Word.Document): string { text = trimEndFormattingMarks(text); if (text === "/") { + // An inline image shows up in the text as a "/". When we see a paragraph + // consisting of nothing but "/", we check to see if the paragraph contains + // hidden text and, if so, emit that instead. The hidden text is assumed to + // contain an appropriate markdown image link. range.textRetrievalMode.includeHiddenText = true; var fullText = range.text; range.textRetrievalMode.includeHiddenText = false; From 3969b89b234cc642ccbc40f8fbebe3b29c74a80d Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Mon, 21 Dec 2015 13:40:59 -0800 Subject: [PATCH 58/61] Fixups for #6163. --- src/compiler/emitter.ts | 34 +++++++++++++++++++--------------- 1 file changed, 19 insertions(+), 15 deletions(-) diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 88d9d20c4c0..996dac118ef 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -4280,25 +4280,29 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi // TODO (yuisu) : we should not have special cases to condition emitting comments // but have one place to fix check for these conditions. - if (node.kind !== SyntaxKind.MethodDeclaration && - node.kind !== SyntaxKind.MethodSignature && - node.parent && - node.parent.kind !== SyntaxKind.PropertyAssignment && - node.parent.kind !== SyntaxKind.CallExpression && - node.parent.kind !== SyntaxKind.ArrayLiteralExpression) { - // 1. Methods will emit the comments as part of emitting method declaration - + const { kind, parent } = node; + if (kind !== SyntaxKind.MethodDeclaration && + kind !== SyntaxKind.MethodSignature && + parent && + parent.kind !== SyntaxKind.PropertyAssignment && + parent.kind !== SyntaxKind.CallExpression && + parent.kind !== SyntaxKind.ArrayLiteralExpression) { + // 1. Methods will emit comments at their assignment declaration sites. + // // 2. If the function is a property of object literal, emitting leading-comments - // is done by emitNodeWithoutSourceMap which then call this function. - // In particular, we would like to avoid emit comments twice in following case: - // For example: + // is done by emitNodeWithoutSourceMap which then call this function. + // In particular, we would like to avoid emit comments twice in following case: + // // var obj = { // id: // /*comment*/ () => void // } - + // // 3. If the function is an argument in call expression, emitting of comments will be - // taken care of in emit list of arguments inside of emitCallexpression + // taken care of in emit list of arguments inside of 'emitCallExpression'. + // + // 4. If the function is in an array literal, 'emitLinePreservingList' will take care + // of leading comments. emitLeadingComments(node); } @@ -4325,12 +4329,12 @@ var __awaiter = (this && this.__awaiter) || function (thisArg, _arguments, Promi } emitSignatureAndBody(node); - if (modulekind !== ModuleKind.ES6 && node.kind === SyntaxKind.FunctionDeclaration && node.parent === currentSourceFile && node.name) { + if (modulekind !== ModuleKind.ES6 && kind === SyntaxKind.FunctionDeclaration && parent === currentSourceFile && node.name) { emitExportMemberAssignments((node).name); } emitEnd(node); - if (node.kind !== SyntaxKind.MethodDeclaration && node.kind !== SyntaxKind.MethodSignature) { + if (kind !== SyntaxKind.MethodDeclaration && kind !== SyntaxKind.MethodSignature) { emitTrailingComments(node); } } From 73de79c68c42d21da57fa7c1609b353173bac472 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Mon, 21 Dec 2015 13:42:24 -0800 Subject: [PATCH 59/61] Added positive test case suggested in #6129. --- .../class/method/decoratorOnClassMethodOverload2.ts | 9 +++++++++ 1 file changed, 9 insertions(+) create mode 100644 tests/cases/conformance/decorators/class/method/decoratorOnClassMethodOverload2.ts diff --git a/tests/cases/conformance/decorators/class/method/decoratorOnClassMethodOverload2.ts b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethodOverload2.ts new file mode 100644 index 00000000000..ee5a3f33bf1 --- /dev/null +++ b/tests/cases/conformance/decorators/class/method/decoratorOnClassMethodOverload2.ts @@ -0,0 +1,9 @@ +// @target: ES5 +// @experimentaldecorators: true +declare function dec(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor): TypedPropertyDescriptor; + +class C { + method() + @dec + method() { } +} \ No newline at end of file From b262c04e669404494bed9c83d630f3d5566127c1 Mon Sep 17 00:00:00 2001 From: Daniel Rosenwasser Date: Mon, 21 Dec 2015 13:46:14 -0800 Subject: [PATCH 60/61] Accepted baselines. --- .../decoratorOnClassMethodOverload2.js | 25 +++++++++++++++++++ .../decoratorOnClassMethodOverload2.symbols | 24 ++++++++++++++++++ .../decoratorOnClassMethodOverload2.types | 24 ++++++++++++++++++ 3 files changed, 73 insertions(+) create mode 100644 tests/baselines/reference/decoratorOnClassMethodOverload2.js create mode 100644 tests/baselines/reference/decoratorOnClassMethodOverload2.symbols create mode 100644 tests/baselines/reference/decoratorOnClassMethodOverload2.types diff --git a/tests/baselines/reference/decoratorOnClassMethodOverload2.js b/tests/baselines/reference/decoratorOnClassMethodOverload2.js new file mode 100644 index 00000000000..eafa5da7110 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethodOverload2.js @@ -0,0 +1,25 @@ +//// [decoratorOnClassMethodOverload2.ts] +declare function dec(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor): TypedPropertyDescriptor; + +class C { + method() + @dec + method() { } +} + +//// [decoratorOnClassMethodOverload2.js] +var __decorate = (this && this.__decorate) || function (decorators, target, key, desc) { + var c = arguments.length, r = c < 3 ? target : desc === null ? desc = Object.getOwnPropertyDescriptor(target, key) : desc, d; + if (typeof Reflect === "object" && typeof Reflect.decorate === "function") r = Reflect.decorate(decorators, target, key, desc); + else for (var i = decorators.length - 1; i >= 0; i--) if (d = decorators[i]) r = (c < 3 ? d(r) : c > 3 ? d(target, key, r) : d(target, key)) || r; + return c > 3 && r && Object.defineProperty(target, key, r), r; +}; +var C = (function () { + function C() { + } + C.prototype.method = function () { }; + __decorate([ + dec + ], C.prototype, "method", null); + return C; +}()); diff --git a/tests/baselines/reference/decoratorOnClassMethodOverload2.symbols b/tests/baselines/reference/decoratorOnClassMethodOverload2.symbols new file mode 100644 index 00000000000..f05dd624345 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethodOverload2.symbols @@ -0,0 +1,24 @@ +=== tests/cases/conformance/decorators/class/method/decoratorOnClassMethodOverload2.ts === +declare function dec(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor): TypedPropertyDescriptor; +>dec : Symbol(dec, Decl(decoratorOnClassMethodOverload2.ts, 0, 0)) +>T : Symbol(T, Decl(decoratorOnClassMethodOverload2.ts, 0, 21)) +>target : Symbol(target, Decl(decoratorOnClassMethodOverload2.ts, 0, 24)) +>propertyKey : Symbol(propertyKey, Decl(decoratorOnClassMethodOverload2.ts, 0, 36)) +>descriptor : Symbol(descriptor, Decl(decoratorOnClassMethodOverload2.ts, 0, 57)) +>TypedPropertyDescriptor : Symbol(TypedPropertyDescriptor, Decl(lib.d.ts, --, --)) +>T : Symbol(T, Decl(decoratorOnClassMethodOverload2.ts, 0, 21)) +>TypedPropertyDescriptor : Symbol(TypedPropertyDescriptor, Decl(lib.d.ts, --, --)) +>T : Symbol(T, Decl(decoratorOnClassMethodOverload2.ts, 0, 21)) + +class C { +>C : Symbol(C, Decl(decoratorOnClassMethodOverload2.ts, 0, 126)) + + method() +>method : Symbol(method, Decl(decoratorOnClassMethodOverload2.ts, 2, 9), Decl(decoratorOnClassMethodOverload2.ts, 3, 12)) + + @dec +>dec : Symbol(dec, Decl(decoratorOnClassMethodOverload2.ts, 0, 0)) + + method() { } +>method : Symbol(method, Decl(decoratorOnClassMethodOverload2.ts, 2, 9), Decl(decoratorOnClassMethodOverload2.ts, 3, 12)) +} diff --git a/tests/baselines/reference/decoratorOnClassMethodOverload2.types b/tests/baselines/reference/decoratorOnClassMethodOverload2.types new file mode 100644 index 00000000000..7002d74a821 --- /dev/null +++ b/tests/baselines/reference/decoratorOnClassMethodOverload2.types @@ -0,0 +1,24 @@ +=== tests/cases/conformance/decorators/class/method/decoratorOnClassMethodOverload2.ts === +declare function dec(target: any, propertyKey: string, descriptor: TypedPropertyDescriptor): TypedPropertyDescriptor; +>dec : (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor +>T : T +>target : any +>propertyKey : string +>descriptor : TypedPropertyDescriptor +>TypedPropertyDescriptor : TypedPropertyDescriptor +>T : T +>TypedPropertyDescriptor : TypedPropertyDescriptor +>T : T + +class C { +>C : C + + method() +>method : () => any + + @dec +>dec : (target: any, propertyKey: string, descriptor: TypedPropertyDescriptor) => TypedPropertyDescriptor + + method() { } +>method : () => any +} From 39605fe5f823c0c987d57252ed029cee38d0e54d Mon Sep 17 00:00:00 2001 From: vladima Date: Mon, 21 Dec 2015 21:43:51 -0800 Subject: [PATCH 61/61] report pre-emit diagnostics that blocked emit --- src/compiler/program.ts | 7 +++++-- .../DeclarationErrorsNoEmitOnError.errors.txt | 11 +++++++++++ .../cases/compiler/DeclarationErrorsNoEmitOnError.ts | 8 ++++++++ 3 files changed, 24 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/DeclarationErrorsNoEmitOnError.errors.txt create mode 100644 tests/cases/compiler/DeclarationErrorsNoEmitOnError.ts diff --git a/src/compiler/program.ts b/src/compiler/program.ts index da6f7ab0ee7..d5c8b9f913f 100644 --- a/src/compiler/program.ts +++ b/src/compiler/program.ts @@ -573,8 +573,11 @@ namespace ts { // If the noEmitOnError flag is set, then check if we have any errors so far. If so, // immediately bail out. Note that we pass 'undefined' for 'sourceFile' so that we // get any preEmit diagnostics, not just the ones - if (options.noEmitOnError && getPreEmitDiagnostics(program, /*sourceFile:*/ undefined, cancellationToken).length > 0) { - return { diagnostics: [], sourceMaps: undefined, emitSkipped: true }; + if (options.noEmitOnError) { + const preEmitDiagnostics = getPreEmitDiagnostics(program, /*sourceFile:*/ undefined, cancellationToken); + if (preEmitDiagnostics.length > 0) { + return { diagnostics: preEmitDiagnostics, sourceMaps: undefined, emitSkipped: true }; + } } // Create the emit resolver outside of the "emitTime" tracking code below. That way diff --git a/tests/baselines/reference/DeclarationErrorsNoEmitOnError.errors.txt b/tests/baselines/reference/DeclarationErrorsNoEmitOnError.errors.txt new file mode 100644 index 00000000000..1f442e98d12 --- /dev/null +++ b/tests/baselines/reference/DeclarationErrorsNoEmitOnError.errors.txt @@ -0,0 +1,11 @@ +tests/cases/compiler/DeclarationErrorsNoEmitOnError.ts(4,8): error TS4033: Property 'f' of exported interface has or is using private name 'T'. + + +==== tests/cases/compiler/DeclarationErrorsNoEmitOnError.ts (1 errors) ==== + + type T = { x : number } + export interface I { + f: T; + ~ +!!! error TS4033: Property 'f' of exported interface has or is using private name 'T'. + } \ No newline at end of file diff --git a/tests/cases/compiler/DeclarationErrorsNoEmitOnError.ts b/tests/cases/compiler/DeclarationErrorsNoEmitOnError.ts new file mode 100644 index 00000000000..ef8711e7110 --- /dev/null +++ b/tests/cases/compiler/DeclarationErrorsNoEmitOnError.ts @@ -0,0 +1,8 @@ +// @module: commonjs +// @declaration: true +// @noEmitOnError: true + +type T = { x : number } +export interface I { + f: T; +} \ No newline at end of file