From 985682de034faaa0d607b9e797ab33d21568513a Mon Sep 17 00:00:00 2001 From: Mohamed Hegazy Date: Mon, 12 Jun 2017 17:52:03 -0700 Subject: [PATCH] Update LKG --- lib/lib.d.ts | 3 +- lib/lib.dom.d.ts | 3 +- lib/lib.es2016.full.d.ts | 3 +- lib/lib.es2017.full.d.ts | 3 +- lib/lib.es6.d.ts | 3 +- lib/lib.esnext.full.d.ts | 3 +- lib/tsc.js | 625 +++++++++++++---------- lib/tsserver.js | 938 +++++++++++++++++++---------------- lib/tsserverlibrary.d.ts | 98 ++-- lib/tsserverlibrary.js | 933 +++++++++++++++++++---------------- lib/typescript.d.ts | 25 +- lib/typescript.js | 954 ++++++++++++++++++++---------------- lib/typescriptServices.d.ts | 25 +- lib/typescriptServices.js | 954 ++++++++++++++++++++---------------- lib/typingsInstaller.js | 52 +- 15 files changed, 2568 insertions(+), 2054 deletions(-) diff --git a/lib/lib.d.ts b/lib/lib.d.ts index 7d80baf2b3a..57fe0e699c8 100644 --- a/lib/lib.d.ts +++ b/lib/lib.d.ts @@ -7567,7 +7567,7 @@ interface DragEvent extends MouseEvent { declare var DragEvent: { prototype: DragEvent; - new(): DragEvent; + new(type: "drag" | "dragend" | "dragenter" | "dragexit" | "dragleave" | "dragover" | "dragstart" | "drop", dragEventInit?: { dataTransfer?: DataTransfer }): DragEvent; }; interface DynamicsCompressorNode extends AudioNode { @@ -12308,6 +12308,7 @@ interface Navigator extends Object, NavigatorID, NavigatorOnLine, NavigatorConte readonly serviceWorker: ServiceWorkerContainer; readonly webdriver: boolean; readonly hardwareConcurrency: number; + readonly languages: string[]; getGamepads(): Gamepad[]; javaEnabled(): boolean; msLaunchUri(uri: string, successCallback?: MSLaunchUriCallback, noHandlerCallback?: MSLaunchUriCallback): void; diff --git a/lib/lib.dom.d.ts b/lib/lib.dom.d.ts index 1bf904d60d4..c96d5463b9c 100644 --- a/lib/lib.dom.d.ts +++ b/lib/lib.dom.d.ts @@ -3503,7 +3503,7 @@ interface DragEvent extends MouseEvent { declare var DragEvent: { prototype: DragEvent; - new(): DragEvent; + new(type: "drag" | "dragend" | "dragenter" | "dragexit" | "dragleave" | "dragover" | "dragstart" | "drop", dragEventInit?: { dataTransfer?: DataTransfer }): DragEvent; }; interface DynamicsCompressorNode extends AudioNode { @@ -8244,6 +8244,7 @@ interface Navigator extends Object, NavigatorID, NavigatorOnLine, NavigatorConte readonly serviceWorker: ServiceWorkerContainer; readonly webdriver: boolean; readonly hardwareConcurrency: number; + readonly languages: string[]; getGamepads(): Gamepad[]; javaEnabled(): boolean; msLaunchUri(uri: string, successCallback?: MSLaunchUriCallback, noHandlerCallback?: MSLaunchUriCallback): void; diff --git a/lib/lib.es2016.full.d.ts b/lib/lib.es2016.full.d.ts index ea4cdd0577f..09220599d5f 100644 --- a/lib/lib.es2016.full.d.ts +++ b/lib/lib.es2016.full.d.ts @@ -3506,7 +3506,7 @@ interface DragEvent extends MouseEvent { declare var DragEvent: { prototype: DragEvent; - new(): DragEvent; + new(type: "drag" | "dragend" | "dragenter" | "dragexit" | "dragleave" | "dragover" | "dragstart" | "drop", dragEventInit?: { dataTransfer?: DataTransfer }): DragEvent; }; interface DynamicsCompressorNode extends AudioNode { @@ -8247,6 +8247,7 @@ interface Navigator extends Object, NavigatorID, NavigatorOnLine, NavigatorConte readonly serviceWorker: ServiceWorkerContainer; readonly webdriver: boolean; readonly hardwareConcurrency: number; + readonly languages: string[]; getGamepads(): Gamepad[]; javaEnabled(): boolean; msLaunchUri(uri: string, successCallback?: MSLaunchUriCallback, noHandlerCallback?: MSLaunchUriCallback): void; diff --git a/lib/lib.es2017.full.d.ts b/lib/lib.es2017.full.d.ts index 364731e23ad..6c2f2606640 100644 --- a/lib/lib.es2017.full.d.ts +++ b/lib/lib.es2017.full.d.ts @@ -3510,7 +3510,7 @@ interface DragEvent extends MouseEvent { declare var DragEvent: { prototype: DragEvent; - new(): DragEvent; + new(type: "drag" | "dragend" | "dragenter" | "dragexit" | "dragleave" | "dragover" | "dragstart" | "drop", dragEventInit?: { dataTransfer?: DataTransfer }): DragEvent; }; interface DynamicsCompressorNode extends AudioNode { @@ -8251,6 +8251,7 @@ interface Navigator extends Object, NavigatorID, NavigatorOnLine, NavigatorConte readonly serviceWorker: ServiceWorkerContainer; readonly webdriver: boolean; readonly hardwareConcurrency: number; + readonly languages: string[]; getGamepads(): Gamepad[]; javaEnabled(): boolean; msLaunchUri(uri: string, successCallback?: MSLaunchUriCallback, noHandlerCallback?: MSLaunchUriCallback): void; diff --git a/lib/lib.es6.d.ts b/lib/lib.es6.d.ts index 06aa88b3e50..9340f56fef3 100644 --- a/lib/lib.es6.d.ts +++ b/lib/lib.es6.d.ts @@ -9391,7 +9391,7 @@ interface DragEvent extends MouseEvent { declare var DragEvent: { prototype: DragEvent; - new(): DragEvent; + new(type: "drag" | "dragend" | "dragenter" | "dragexit" | "dragleave" | "dragover" | "dragstart" | "drop", dragEventInit?: { dataTransfer?: DataTransfer }): DragEvent; }; interface DynamicsCompressorNode extends AudioNode { @@ -14132,6 +14132,7 @@ interface Navigator extends Object, NavigatorID, NavigatorOnLine, NavigatorConte readonly serviceWorker: ServiceWorkerContainer; readonly webdriver: boolean; readonly hardwareConcurrency: number; + readonly languages: string[]; getGamepads(): Gamepad[]; javaEnabled(): boolean; msLaunchUri(uri: string, successCallback?: MSLaunchUriCallback, noHandlerCallback?: MSLaunchUriCallback): void; diff --git a/lib/lib.esnext.full.d.ts b/lib/lib.esnext.full.d.ts index c3aff258d24..4d06a07f65e 100644 --- a/lib/lib.esnext.full.d.ts +++ b/lib/lib.esnext.full.d.ts @@ -3507,7 +3507,7 @@ interface DragEvent extends MouseEvent { declare var DragEvent: { prototype: DragEvent; - new(): DragEvent; + new(type: "drag" | "dragend" | "dragenter" | "dragexit" | "dragleave" | "dragover" | "dragstart" | "drop", dragEventInit?: { dataTransfer?: DataTransfer }): DragEvent; }; interface DynamicsCompressorNode extends AudioNode { @@ -8248,6 +8248,7 @@ interface Navigator extends Object, NavigatorID, NavigatorOnLine, NavigatorConte readonly serviceWorker: ServiceWorkerContainer; readonly webdriver: boolean; readonly hardwareConcurrency: number; + readonly languages: string[]; getGamepads(): Gamepad[]; javaEnabled(): boolean; msLaunchUri(uri: string, successCallback?: MSLaunchUriCallback, noHandlerCallback?: MSLaunchUriCallback): void; diff --git a/lib/tsc.js b/lib/tsc.js index 76bbdae7641..056aa61e3b6 100644 --- a/lib/tsc.js +++ b/lib/tsc.js @@ -80,15 +80,6 @@ var ts; ModuleKind[ModuleKind["ES2015"] = 5] = "ES2015"; ModuleKind[ModuleKind["ESNext"] = 6] = "ESNext"; })(ModuleKind = ts.ModuleKind || (ts.ModuleKind = {})); - var Extension; - (function (Extension) { - Extension[Extension["Ts"] = 0] = "Ts"; - Extension[Extension["Tsx"] = 1] = "Tsx"; - Extension[Extension["Dts"] = 2] = "Dts"; - Extension[Extension["Js"] = 3] = "Js"; - Extension[Extension["Jsx"] = 4] = "Jsx"; - Extension[Extension["LastTypeScriptExtension"] = 2] = "LastTypeScriptExtension"; - })(Extension = ts.Extension || (ts.Extension = {})); })(ts || (ts = {})); var ts; (function (ts) { @@ -151,7 +142,7 @@ var ts; })(ts || (ts = {})); var ts; (function (ts) { - ts.version = "2.4.0"; + ts.version = "2.4.1"; })(ts || (ts = {})); (function (ts) { ts.collator = typeof Intl === "object" && typeof Intl.Collator === "function" ? new Intl.Collator(undefined, { usage: "sort", sensitivity: "accent" }) : undefined; @@ -2132,7 +2123,7 @@ var ts; } ts.positionIsSynthesized = positionIsSynthesized; function extensionIsTypeScript(ext) { - return ext <= ts.Extension.LastTypeScriptExtension; + return ext === ".ts" || ext === ".tsx" || ext === ".d.ts"; } ts.extensionIsTypeScript = extensionIsTypeScript; function extensionFromPath(path) { @@ -2144,21 +2135,7 @@ var ts; } ts.extensionFromPath = extensionFromPath; function tryGetExtensionFromPath(path) { - if (fileExtensionIs(path, ".d.ts")) { - return ts.Extension.Dts; - } - if (fileExtensionIs(path, ".ts")) { - return ts.Extension.Ts; - } - if (fileExtensionIs(path, ".tsx")) { - return ts.Extension.Tsx; - } - if (fileExtensionIs(path, ".js")) { - return ts.Extension.Js; - } - if (fileExtensionIs(path, ".jsx")) { - return ts.Extension.Jsx; - } + return find(ts.supportedTypescriptExtensionsForExtractExtension, function (e) { return fileExtensionIs(path, e); }) || find(ts.supportedJavascriptExtensions, function (e) { return fileExtensionIs(path, e); }); } ts.tryGetExtensionFromPath = tryGetExtensionFromPath; function isCheckJsEnabledForFile(sourceFile, compilerOptions) { @@ -3358,6 +3335,7 @@ var ts; Scoped_package_detected_looking_in_0: { code: 6182, category: ts.DiagnosticCategory.Message, key: "Scoped_package_detected_looking_in_0_6182", message: "Scoped package detected, looking in '{0}'" }, Reusing_resolution_of_module_0_to_file_1_from_old_program: { code: 6183, category: ts.DiagnosticCategory.Message, key: "Reusing_resolution_of_module_0_to_file_1_from_old_program_6183", message: "Reusing resolution of module '{0}' to file '{1}' from old program." }, Reusing_module_resolutions_originating_in_0_since_resolutions_are_unchanged_from_old_program: { code: 6184, category: ts.DiagnosticCategory.Message, key: "Reusing_module_resolutions_originating_in_0_since_resolutions_are_unchanged_from_old_program_6184", message: "Reusing module resolutions originating in '{0}' since resolutions are unchanged from old program." }, + Disable_strict_checking_of_generic_signatures_in_function_types: { code: 6185, category: ts.DiagnosticCategory.Message, key: "Disable_strict_checking_of_generic_signatures_in_function_types_6185", message: "Disable strict checking of generic signatures in function types." }, Variable_0_implicitly_has_an_1_type: { code: 7005, category: ts.DiagnosticCategory.Error, key: "Variable_0_implicitly_has_an_1_type_7005", message: "Variable '{0}' implicitly has an '{1}' type." }, Parameter_0_implicitly_has_an_1_type: { code: 7006, category: ts.DiagnosticCategory.Error, key: "Parameter_0_implicitly_has_an_1_type_7006", message: "Parameter '{0}' implicitly has an '{1}' type." }, Member_0_implicitly_has_an_1_type: { code: 7008, category: ts.DiagnosticCategory.Error, key: "Member_0_implicitly_has_an_1_type_7008", message: "Member '{0}' implicitly has an '{1}' type." }, @@ -6350,6 +6328,12 @@ var ts; }); } ts.getParameterFromJSDoc = getParameterFromJSDoc; + function getTypeParameterFromJsDoc(node) { + var name = node.name.text; + var typeParameters = node.parent.parent.parent.typeParameters; + return ts.find(typeParameters, function (p) { return p.name.text === name; }); + } + ts.getTypeParameterFromJsDoc = getTypeParameterFromJsDoc; function getJSDocType(node) { var tag = getFirstJSDocTag(node, 289); if (!tag && node.kind === 146) { @@ -6373,6 +6357,11 @@ var ts; return getFirstJSDocTag(node, 288); } ts.getJSDocReturnTag = getJSDocReturnTag; + function getJSDocReturnType(node) { + var returnTag = getJSDocReturnTag(node); + return returnTag && returnTag.typeExpression && returnTag.typeExpression.type; + } + ts.getJSDocReturnType = getJSDocReturnType; function getJSDocTemplateTag(node) { return getFirstJSDocTag(node, 290); } @@ -7253,12 +7242,16 @@ var ts; }); } ts.getFirstConstructorWithBody = getFirstConstructorWithBody; - function getSetAccessorTypeAnnotationNode(accessor) { + function getSetAccessorValueParameter(accessor) { if (accessor && accessor.parameters.length > 0) { var hasThis = accessor.parameters.length === 2 && parameterIsThisKeyword(accessor.parameters[0]); - return accessor.parameters[hasThis ? 1 : 0].type; + return accessor.parameters[hasThis ? 1 : 0]; } } + function getSetAccessorTypeAnnotationNode(accessor) { + var parameter = getSetAccessorValueParameter(accessor); + return parameter && parameter.type; + } ts.getSetAccessorTypeAnnotationNode = getSetAccessorTypeAnnotationNode; function getThisParameter(signature) { if (signature.parameters.length) { @@ -7329,6 +7322,39 @@ var ts; }; } ts.getAllAccessorDeclarations = getAllAccessorDeclarations; + function getEffectiveTypeAnnotationNode(node) { + if (node.type) { + return node.type; + } + if (node.flags & 65536) { + return getJSDocType(node); + } + } + ts.getEffectiveTypeAnnotationNode = getEffectiveTypeAnnotationNode; + function getEffectiveReturnTypeNode(node) { + if (node.type) { + return node.type; + } + if (node.flags & 65536) { + return getJSDocReturnType(node); + } + } + ts.getEffectiveReturnTypeNode = getEffectiveReturnTypeNode; + function getEffectiveTypeParameterDeclarations(node) { + if (node.typeParameters) { + return node.typeParameters; + } + if (node.flags & 65536) { + var templateTag = getJSDocTemplateTag(node); + return templateTag && templateTag.typeParameters; + } + } + ts.getEffectiveTypeParameterDeclarations = getEffectiveTypeParameterDeclarations; + function getEffectiveSetAccessorTypeAnnotationNode(node) { + var parameter = getSetAccessorValueParameter(node); + return parameter && getEffectiveTypeAnnotationNode(parameter); + } + ts.getEffectiveSetAccessorTypeAnnotationNode = getEffectiveSetAccessorTypeAnnotationNode; function emitNewLineBeforeLeadingComments(lineMap, writer, node, leadingComments) { emitNewLineBeforeLeadingCommentsOfPosition(lineMap, writer, node.pos, leadingComments); } @@ -8310,10 +8336,10 @@ var ts; return node.kind === 144; } ts.isComputedPropertyName = isComputedPropertyName; - function isTypeParameter(node) { + function isTypeParameterDeclaration(node) { return node.kind === 145; } - ts.isTypeParameter = isTypeParameter; + ts.isTypeParameterDeclaration = isTypeParameterDeclaration; function isParameter(node) { return node.kind === 146; } @@ -8904,6 +8930,14 @@ var ts; ts.isJSDocLiteralType = isJSDocLiteralType; })(ts || (ts = {})); (function (ts) { + function isNode(node) { + return isNodeKind(node.kind); + } + ts.isNode = isNode; + function isNodeKind(kind) { + return kind >= 143; + } + ts.isNodeKind = isNodeKind; function isToken(n) { return n.kind >= 0 && n.kind <= 142; } @@ -9248,6 +9282,10 @@ var ts; return false; } ts.isIterationStatement = isIterationStatement; + function isForInOrOfStatement(node) { + return node.kind === 215 || node.kind === 216; + } + ts.isForInOrOfStatement = isForInOrOfStatement; function isConciseBody(node) { return ts.isBlock(node) || isExpression(node); @@ -9362,6 +9400,9 @@ var ts; || kind === 299; } function isDeclaration(node) { + if (node.kind === 145) { + return node.parent.kind !== 290 || ts.isInJavaScriptFile(node); + } return isDeclarationKind(node.kind); } ts.isDeclaration = isDeclaration; @@ -9430,6 +9471,10 @@ var ts; return node.kind >= 267 && node.kind <= 294; } ts.isJSDocNode = isJSDocNode; + function isJSDocCommentContainingNode(node) { + return node.kind === 283 || isJSDocTag(node); + } + ts.isJSDocCommentContainingNode = isJSDocCommentContainingNode; function isJSDocTag(node) { return node.kind >= 284 && node.kind <= 294; } @@ -12979,7 +13024,7 @@ var ts; else if (kind === 71) { return new (IdentifierConstructor || (IdentifierConstructor = ts.objectAllocator.getIdentifierConstructor()))(kind, pos, end); } - else if (kind < 143) { + else if (!ts.isNodeKind(kind)) { return new (TokenConstructor || (TokenConstructor = ts.objectAllocator.getTokenConstructor()))(kind, pos, end); } else { @@ -13788,7 +13833,7 @@ var ts; if (!(pos >= 0)) { pos = scanner.getStartPos(); } - return kind >= 143 ? new NodeConstructor(kind, pos, pos) : + return ts.isNodeKind(kind) ? new NodeConstructor(kind, pos, pos) : kind === 71 ? new IdentifierConstructor(kind, pos, pos) : new TokenConstructor(kind, pos, pos); } @@ -17908,7 +17953,7 @@ var ts; jsDocNamespaceNode.flags |= flags; jsDocNamespaceNode.name = typeNameOrNamespaceName; jsDocNamespaceNode.body = parseJSDocTypeNameWithNamespace(4); - return jsDocNamespaceNode; + return finishNode(jsDocNamespaceNode); } if (typeNameOrNamespaceName && flags & 4) { typeNameOrNamespaceName.isInJSDocNamespace = true; @@ -19337,7 +19382,7 @@ var ts; } function bindVariableDeclarationFlow(node) { bindEachChild(node); - if (node.initializer || node.parent.parent.kind === 215 || node.parent.parent.kind === 216) { + if (node.initializer || ts.isForInOrOfStatement(node.parent.parent)) { bindInitializedVariableFlow(node); } } @@ -19856,7 +19901,10 @@ var ts; case 158: return checkTypePredicate(node); case 145: - return declareSymbolAndAddToSymbolTable(node, 262144, 530920); + if (node.parent.kind !== 290 || ts.isInJavaScriptFile(node)) { + return declareSymbolAndAddToSymbolTable(node, 262144, 530920); + } + return; case 146: return bindParameter(node); case 226: @@ -19927,7 +19975,10 @@ var ts; case 232: return bindEnumDeclaration(node); case 233: - return bindModuleDeclaration(node); + if (node.parent.kind !== 291 || ts.isInJavaScriptFile(node)) { + return bindModuleDeclaration(node); + } + return undefined; case 254: return bindJsxAttributes(node); case 253: @@ -21503,14 +21554,14 @@ var ts; } switch (extensions) { case Extensions.DtsOnly: - return tryExtension(".d.ts", ts.Extension.Dts); + return tryExtension(".d.ts"); case Extensions.TypeScript: - return tryExtension(".ts", ts.Extension.Ts) || tryExtension(".tsx", ts.Extension.Tsx) || tryExtension(".d.ts", ts.Extension.Dts); + return tryExtension(".ts") || tryExtension(".tsx") || tryExtension(".d.ts"); case Extensions.JavaScript: - return tryExtension(".js", ts.Extension.Js) || tryExtension(".jsx", ts.Extension.Jsx); + return tryExtension(".js") || tryExtension(".jsx"); } - function tryExtension(ext, extension) { - var path = tryFile(candidate + ext, failedLookupLocations, onlyRecordFailures, state); + function tryExtension(extension) { + var path = tryFile(candidate + extension, failedLookupLocations, onlyRecordFailures, state); return path && { path: path, extension: extension }; } } @@ -21580,11 +21631,11 @@ var ts; function extensionIsOk(extensions, extension) { switch (extensions) { case Extensions.JavaScript: - return extension === ts.Extension.Js || extension === ts.Extension.Jsx; + return extension === ".js" || extension === ".jsx"; case Extensions.TypeScript: - return extension === ts.Extension.Ts || extension === ts.Extension.Tsx || extension === ts.Extension.Dts; + return extension === ".ts" || extension === ".tsx" || extension === ".d.ts"; case Extensions.DtsOnly: - return extension === ts.Extension.Dts; + return extension === ".d.ts"; } } function pathToPackageJson(directory) { @@ -22345,14 +22396,7 @@ var ts; } break; } - switch (declaration.parent.parent.kind) { - case 215: - case 216: - if (isSameScopeDescendentOf(usage, declaration.parent.parent.expression, container)) { - return true; - } - } - return false; + return ts.isForInOrOfStatement(declaration.parent.parent) && isSameScopeDescendentOf(usage, declaration.parent.parent.expression, container); } function isUsedInFunctionOrInstanceProperty(usage, declaration, container) { return !!ts.findAncestor(usage, function (current) { @@ -25038,12 +25082,6 @@ var ts; return strictNullChecks && optional ? getNullableType(type, 2048) : type; } function getTypeForVariableLikeDeclaration(declaration, includeOptionality) { - if (declaration.flags & 65536) { - var type = getTypeForDeclarationFromJSDocComment(declaration); - if (type && type !== unknownType) { - return type; - } - } if (declaration.parent.parent.kind === 215) { var indexType = getIndexType(checkNonNullExpression(declaration.parent.parent.expression)); return indexType.flags & (16384 | 262144) ? indexType : stringType; @@ -25055,8 +25093,9 @@ var ts; if (ts.isBindingPattern(declaration.parent)) { return getTypeForBindingElement(declaration); } - if (declaration.type) { - var declaredType = getTypeFromTypeNode(declaration.type); + var typeNode = ts.getEffectiveTypeAnnotationNode(declaration); + if (typeNode) { + var declaredType = getTypeFromTypeNode(typeNode); return addOptionality(declaredType, declaration.questionToken && includeOptionality); } if ((noImplicitAny || declaration.flags & 65536) && @@ -25270,10 +25309,11 @@ var ts; function getAnnotatedAccessorType(accessor) { if (accessor) { if (accessor.kind === 153) { - return accessor.type && getTypeFromTypeNode(accessor.type); + var getterTypeAnnotation = ts.getEffectiveReturnTypeNode(accessor); + return getterTypeAnnotation && getTypeFromTypeNode(getterTypeAnnotation); } else { - var setterTypeAnnotation = ts.getSetAccessorTypeAnnotationNode(accessor); + var setterTypeAnnotation = ts.getEffectiveSetAccessorTypeAnnotationNode(accessor); return setterTypeAnnotation && getTypeFromTypeNode(setterTypeAnnotation); } } @@ -25402,7 +25442,7 @@ var ts; return links.type; } function reportCircularityError(symbol) { - if (symbol.valueDeclaration.type) { + if (ts.getEffectiveTypeAnnotationNode(symbol.valueDeclaration)) { error(symbol.valueDeclaration, ts.Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, symbolToString(symbol)); return unknownType; } @@ -25904,11 +25944,15 @@ var ts; return false; } function isIndependentVariableLikeDeclaration(node) { - return node.type && isIndependentType(node.type) || !node.type && !node.initializer; + var typeNode = ts.getEffectiveTypeAnnotationNode(node); + return typeNode ? isIndependentType(typeNode) : !node.initializer; } function isIndependentFunctionLikeDeclaration(node) { - if (node.kind !== 152 && (!node.type || !isIndependentType(node.type))) { - return false; + if (node.kind !== 152) { + var typeNode = ts.getEffectiveReturnTypeNode(node); + if (!typeNode || !isIndependentType(typeNode)) { + return false; + } } for (var _i = 0, _a = node.parameters; _i < _a.length; _i++) { var parameter = _a[_i]; @@ -26515,7 +26559,7 @@ var ts; typeParameter.default = targetDefault ? instantiateType(targetDefault, typeParameter.mapper) : noConstraintType; } else { - var defaultDeclaration = typeParameter.symbol && ts.forEach(typeParameter.symbol.declarations, function (decl) { return ts.isTypeParameter(decl) && decl.default; }); + var defaultDeclaration = typeParameter.symbol && ts.forEach(typeParameter.symbol.declarations, function (decl) { return ts.isTypeParameterDeclaration(decl) && decl.default; }); typeParameter.default = defaultDeclaration ? getTypeFromTypeNode(defaultDeclaration) : noConstraintType; } } @@ -26674,20 +26718,14 @@ var ts; } return undefined; } - function getTypeParametersFromJSDocTemplate(declaration) { - if (declaration.flags & 65536) { - var templateTag = ts.getJSDocTemplateTag(declaration); - if (templateTag) { - return getTypeParametersFromDeclaration(templateTag.typeParameters); - } - } - return undefined; - } - function getTypeParametersFromDeclaration(typeParameterDeclarations) { - var result = []; - ts.forEach(typeParameterDeclarations, function (node) { + function getTypeParametersFromDeclaration(declaration) { + var result; + ts.forEach(ts.getEffectiveTypeParameterDeclarations(declaration), function (node) { var tp = getDeclaredTypeOfTypeParameter(node.symbol); if (!ts.contains(result, tp)) { + if (!result) { + result = []; + } result.push(tp); } }); @@ -26844,9 +26882,7 @@ var ts; var classType = declaration.kind === 152 ? getDeclaredTypeOfClassOrInterface(getMergedSymbol(declaration.parent.symbol)) : undefined; - var typeParameters = classType ? classType.localTypeParameters : - declaration.typeParameters ? getTypeParametersFromDeclaration(declaration.typeParameters) : - getTypeParametersFromJSDocTemplate(declaration); + var typeParameters = classType ? classType.localTypeParameters : getTypeParametersFromDeclaration(declaration); var returnType = getSignatureReturnTypeFromDeclaration(declaration, isJSConstructSignature, classType); var typePredicate = declaration.type && declaration.type.kind === 158 ? createTypePredicateFromTypePredicateNode(declaration.type) : @@ -26870,14 +26906,9 @@ var ts; else if (classType) { return classType; } - else if (declaration.type) { - return getTypeFromTypeNode(declaration.type); - } - if (declaration.flags & 65536) { - var type = getReturnTypeFromJSDocComment(declaration); - if (type && type !== unknownType) { - return type; - } + var typeNode = ts.getEffectiveReturnTypeNode(declaration); + if (typeNode) { + return getTypeFromTypeNode(typeNode); } if (declaration.kind === 153 && !ts.hasDynamicName(declaration)) { var setter = ts.getDeclarationOfKind(declaration.symbol, 154); @@ -27214,27 +27245,44 @@ var ts; } return undefined; } - function resolveTypeReferenceName(typeReferenceName) { + function resolveTypeReferenceName(typeReferenceName, meaning) { if (!typeReferenceName) { return unknownSymbol; } - return resolveEntityName(typeReferenceName, 793064) || unknownSymbol; + return resolveEntityName(typeReferenceName, meaning) || unknownSymbol; } function getTypeReferenceType(node, symbol) { var typeArguments = typeArgumentsFromTypeReferenceNode(node); if (symbol === unknownSymbol) { return unknownType; } + var type = getTypeReferenceTypeWorker(node, symbol, typeArguments); + if (type) { + return type; + } + if (symbol.flags & 107455 && node.kind === 277) { + var valueType = getTypeOfSymbol(symbol); + if (valueType.symbol && !isInferredClassType(valueType)) { + var referenceType = getTypeReferenceTypeWorker(node, valueType.symbol, typeArguments); + if (referenceType) { + return referenceType; + } + } + resolveTypeReferenceName(getTypeReferenceName(node), 793064); + return valueType; + } + return getTypeFromNonGenericTypeReference(node, symbol); + } + function getTypeReferenceTypeWorker(node, symbol, typeArguments) { if (symbol.flags & (32 | 64)) { return getTypeFromClassOrInterfaceReference(node, symbol, typeArguments); } if (symbol.flags & 524288) { return getTypeFromTypeAliasReference(node, symbol, typeArguments); } - if (symbol.flags & 107455 && node.kind === 277) { - return getTypeOfSymbol(symbol); + if (symbol.flags & 16 && node.kind === 277 && (symbol.members || ts.getJSDocClassTag(symbol.valueDeclaration))) { + return getInferredClassType(symbol); } - return getTypeFromNonGenericTypeReference(node, symbol); } function getPrimitiveTypeFromJSDocTypeReference(node) { if (ts.isIdentifier(node.name)) { @@ -27274,21 +27322,13 @@ var ts; if (!links.resolvedType) { var symbol = void 0; var type = void 0; + var meaning = 793064; if (node.kind === 277) { type = getPrimitiveTypeFromJSDocTypeReference(node); - if (!type) { - var typeReferenceName = getTypeReferenceName(node); - symbol = resolveTypeReferenceName(typeReferenceName); - type = getTypeReferenceType(node, symbol); - } + meaning |= 107455; } - else { - var typeNameOrExpression = node.kind === 159 - ? node.typeName - : ts.isEntityNameExpression(node.expression) - ? node.expression - : undefined; - symbol = typeNameOrExpression && resolveEntityName(typeNameOrExpression, 793064) || unknownSymbol; + if (!type) { + symbol = resolveTypeReferenceName(getTypeReferenceName(node), meaning); type = getTypeReferenceType(node, symbol); } links.resolvedSymbol = symbol; @@ -27640,10 +27680,13 @@ var ts; else if (type.flags & 1) { typeSet.containsAny = true; } + else if (type.flags & 8192) { + typeSet.containsNever = true; + } else if (getObjectFlags(type) & 16 && isEmptyObjectType(type)) { typeSet.containsEmptyObject = true; } - else if (!(type.flags & 8192) && (strictNullChecks || !(type.flags & 6144)) && !ts.contains(typeSet, type)) { + else if ((strictNullChecks || !(type.flags & 6144)) && !ts.contains(typeSet, type)) { if (type.flags & 32768) { typeSet.containsObjectType = true; } @@ -27668,6 +27711,9 @@ var ts; } var typeSet = []; addTypesToIntersection(typeSet, types); + if (typeSet.containsNever) { + return neverType; + } if (typeSet.containsAny) { return anyType; } @@ -28233,7 +28279,7 @@ var ts; if (signature.typePredicate) { freshTypePredicate = cloneTypePredicate(signature.typePredicate, mapper); } - var result = createSignature(signature.declaration, freshTypeParameters, signature.thisParameter && instantiateSymbol(signature.thisParameter, mapper), instantiateList(signature.parameters, mapper, instantiateSymbol), instantiateType(signature.resolvedReturnType, mapper), freshTypePredicate, signature.minArgumentCount, signature.hasRestParameter, signature.hasLiteralTypes); + var result = createSignature(signature.declaration, freshTypeParameters, signature.thisParameter && instantiateSymbol(signature.thisParameter, mapper), instantiateList(signature.parameters, mapper, instantiateSymbol), undefined, freshTypePredicate, signature.minArgumentCount, signature.hasRestParameter, signature.hasLiteralTypes); result.target = signature; result.mapper = mapper; return result; @@ -28319,10 +28365,10 @@ var ts; case 199: case 230: case 231: - var declaration = node; - if (declaration.typeParameters) { - for (var _i = 0, _a = declaration.typeParameters; _i < _a.length; _i++) { - var d = _a[_i]; + var typeParameters = ts.getEffectiveTypeParameterDeclarations(node); + if (typeParameters) { + for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) { + var d = typeParameters_1[_i]; if (ts.contains(mappedTypes, getDeclaredTypeOfTypeParameter(getSymbolOfNode(d)))) { return true; } @@ -28342,8 +28388,8 @@ var ts; break; case 279: var func = node; - for (var _b = 0, _c = func.parameters; _b < _c.length; _b++) { - var p = _c[_b]; + for (var _a = 0, _b = func.parameters; _a < _b.length; _a++) { + var p = _b[_a]; if (ts.contains(mappedTypes, getTypeOfNode(p))) { return true; } @@ -28442,7 +28488,7 @@ var ts; if (node.typeParameters) { return false; } - if (ts.forEach(node.parameters, function (p) { return !p.type; })) { + if (ts.forEach(node.parameters, function (p) { return !ts.getEffectiveTypeAnnotationNode(p); })) { return true; } if (node.kind === 187) { @@ -28514,8 +28560,9 @@ var ts; if (!target.hasRestParameter && source.minArgumentCount > target.parameters.length) { return 0; } - source = getErasedSignature(source); - target = getErasedSignature(target); + if (source.typeParameters) { + source = instantiateSignatureInContextOf(source, target); + } var result = -1; var sourceThisType = getThisTypeOfSignature(source); if (sourceThisType && sourceThisType !== voidType) { @@ -28927,7 +28974,9 @@ var ts; reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1, symbolToString(prop), typeToString(target)); } else { - errorNode = prop.valueDeclaration; + if (prop.valueDeclaration) { + errorNode = prop.valueDeclaration; + } reportError(ts.Diagnostics.Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1, symbolToString(prop), typeToString(target)); } } @@ -29384,20 +29433,24 @@ var ts; var saveErrorInfo = errorInfo; if (getObjectFlags(source) & 64 && getObjectFlags(target) & 64 && source.symbol === target.symbol) { for (var i = 0; i < targetSignatures.length; i++) { - var related = signatureRelatedTo(sourceSignatures[i], targetSignatures[i], reportErrors); + var related = signatureRelatedTo(sourceSignatures[i], targetSignatures[i], true, reportErrors); if (!related) { return 0; } result &= related; } } + else if (sourceSignatures.length === 1 && targetSignatures.length === 1) { + var eraseGenerics = relation === comparableRelation || compilerOptions.noStrictGenericChecks; + result = signatureRelatedTo(sourceSignatures[0], targetSignatures[0], eraseGenerics, reportErrors); + } else { outer: for (var _i = 0, targetSignatures_1 = targetSignatures; _i < targetSignatures_1.length; _i++) { var t = targetSignatures_1[_i]; var shouldElaborateErrors = reportErrors; for (var _a = 0, sourceSignatures_1 = sourceSignatures; _a < sourceSignatures_1.length; _a++) { var s = sourceSignatures_1[_a]; - var related = signatureRelatedTo(s, t, shouldElaborateErrors); + var related = signatureRelatedTo(s, t, true, shouldElaborateErrors); if (related) { result &= related; errorInfo = saveErrorInfo; @@ -29413,8 +29466,8 @@ var ts; } return result; } - function signatureRelatedTo(source, target, reportErrors) { - return compareSignaturesRelated(source, target, false, false, reportErrors, reportError, isRelatedTo); + function signatureRelatedTo(source, target, erase, reportErrors) { + return compareSignaturesRelated(erase ? getErasedSignature(source) : source, erase ? getErasedSignature(target) : target, false, false, reportErrors, reportError, isRelatedTo); } function signaturesIdenticalTo(source, target, kind) { var sourceSignatures = getSignaturesOfType(source, kind); @@ -31926,8 +31979,15 @@ var ts; function getContextualTypeForInitializerExpression(node) { var declaration = node.parent; if (node === declaration.initializer) { - if (declaration.type) { - return getTypeFromTypeNode(declaration.type); + var typeNode = ts.getEffectiveTypeAnnotationNode(declaration); + if (typeNode) { + return getTypeFromTypeNode(typeNode); + } + if (ts.isInJavaScriptFile(declaration)) { + var jsDocType = getTypeForDeclarationFromJSDocComment(declaration); + if (jsDocType) { + return jsDocType; + } } if (declaration.kind === 146) { var type = getContextuallyTypedParameterType(declaration); @@ -31941,12 +32001,13 @@ var ts; if (ts.isBindingPattern(declaration.parent)) { var parentDeclaration = declaration.parent.parent; var name = declaration.propertyName || declaration.name; - if (parentDeclaration.kind !== 176 && - parentDeclaration.type && - !ts.isBindingPattern(name)) { - var text = ts.getTextOfPropertyName(name); - if (text) { - return getTypeOfPropertyOfType(getTypeFromTypeNode(parentDeclaration.type), text); + if (parentDeclaration.kind !== 176) { + var parentTypeNode = ts.getEffectiveTypeAnnotationNode(parentDeclaration); + if (parentTypeNode && !ts.isBindingPattern(name)) { + var text = ts.getTextOfPropertyName(name); + if (text) { + return getTypeOfPropertyOfType(getTypeFromTypeNode(parentTypeNode), text); + } } } } @@ -31990,9 +32051,9 @@ var ts; return false; } function getContextualReturnType(functionDecl) { - if (functionDecl.type || - functionDecl.kind === 152 || - functionDecl.kind === 153 && ts.getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(functionDecl.symbol, 154))) { + if (functionDecl.kind === 152 || + ts.getEffectiveReturnTypeNode(functionDecl) || + isGetAccessorWithAnnotatedSetAccessor(functionDecl)) { return getReturnTypeOfSignature(getSignatureFromDeclaration(functionDecl)); } var signature = getContextualSignatureForFunctionLikeDeclaration(functionDecl); @@ -32986,7 +33047,7 @@ var ts; var resolved = resolveStructuredTypeMembers(targetType); if (resolved.stringIndexInfo || resolved.numberIndexInfo && isNumericLiteralName(name) || - getPropertyOfType(targetType, name) || + getPropertyOfObjectType(targetType, name) || isComparingJsxAttributes && !isUnhyphenatedJsxName(name)) { return true; } @@ -33527,8 +33588,11 @@ var ts; function instantiateSignatureInContextOf(signature, contextualSignature, contextualMapper) { var context = createInferenceContext(signature, 1); forEachMatchingParameterType(contextualSignature, signature, function (source, target) { - inferTypes(context.inferences, instantiateType(source, contextualMapper), target); + inferTypes(context.inferences, instantiateType(source, contextualMapper || identityMapper), target); }); + if (!contextualMapper) { + inferTypes(context.inferences, getReturnTypeOfSignature(contextualSignature), getReturnTypeOfSignature(signature), 4); + } return getSignatureInstantiation(signature, getInferredTypes(context)); } function inferTypeArguments(node, signature, args, excludeArgument, context) { @@ -34263,6 +34327,11 @@ var ts; } return links.inferredClassType; } + function isInferredClassType(type) { + return type.symbol + && getObjectFlags(type) & 16 + && getSymbolLinks(type.symbol).inferredClassType === type; + } function checkCallExpression(node) { checkGrammarTypeArguments(node, node.typeArguments) || checkGrammarArguments(node, node.arguments); var signature = getResolvedSignature(node); @@ -34392,37 +34461,42 @@ var ts; function getTypeOfFirstParameterOfSignature(signature) { return signature.parameters.length > 0 ? getTypeAtPosition(signature, 0) : neverType; } - function assignContextualParameterTypes(signature, context, mapper, checkMode) { + function inferFromAnnotatedParameters(signature, context, mapper) { var len = signature.parameters.length - (signature.hasRestParameter ? 1 : 0); - if (checkMode === 2) { - for (var i = 0; i < len; i++) { - var declaration = signature.parameters[i].valueDeclaration; - if (declaration.type) { - inferTypes(mapper.inferences, getTypeFromTypeNode(declaration.type), getTypeAtPosition(context, i)); + for (var i = 0; i < len; i++) { + var declaration = signature.parameters[i].valueDeclaration; + if (declaration.type) { + var typeNode = ts.getEffectiveTypeAnnotationNode(declaration); + if (typeNode) { + inferTypes(mapper.inferences, getTypeFromTypeNode(typeNode), getTypeAtPosition(context, i)); } } } + } + function assignContextualParameterTypes(signature, context) { + signature.typeParameters = context.typeParameters; if (context.thisParameter) { var parameter = signature.thisParameter; if (!parameter || parameter.valueDeclaration && !parameter.valueDeclaration.type) { if (!parameter) { signature.thisParameter = createSymbolWithType(context.thisParameter, undefined); } - assignTypeToParameterAndFixTypeParameters(signature.thisParameter, getTypeOfSymbol(context.thisParameter), mapper, checkMode); + assignTypeToParameterAndFixTypeParameters(signature.thisParameter, getTypeOfSymbol(context.thisParameter)); } } + var len = signature.parameters.length - (signature.hasRestParameter ? 1 : 0); for (var i = 0; i < len; i++) { var parameter = signature.parameters[i]; - if (!parameter.valueDeclaration.type) { + if (!ts.getEffectiveTypeAnnotationNode(parameter.valueDeclaration)) { var contextualParameterType = getTypeAtPosition(context, i); - assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType, mapper, checkMode); + assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType); } } if (signature.hasRestParameter && isRestParameterIndex(context, signature.parameters.length - 1)) { var parameter = ts.lastOrUndefined(signature.parameters); - if (!parameter.valueDeclaration.type) { + if (!ts.getEffectiveTypeAnnotationNode(parameter.valueDeclaration)) { var contextualParameterType = getTypeOfSymbol(ts.lastOrUndefined(context.parameters)); - assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType, mapper, checkMode); + assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType); } } } @@ -34439,10 +34513,10 @@ var ts; } } } - function assignTypeToParameterAndFixTypeParameters(parameter, contextualType, mapper, checkMode) { + function assignTypeToParameterAndFixTypeParameters(parameter, contextualType) { var links = getSymbolLinks(parameter); if (!links.type) { - links.type = instantiateType(contextualType, mapper); + links.type = contextualType; var name = ts.getNameOfDeclaration(parameter.valueDeclaration); if (links.type === emptyObjectType && (name.kind === 174 || name.kind === 175)) { @@ -34450,16 +34524,6 @@ var ts; } assignBindingElementTypes(parameter.valueDeclaration); } - else if (checkMode === 2) { - inferTypes(mapper.inferences, links.type, instantiateType(contextualType, mapper)); - } - } - function getReturnTypeFromJSDocComment(func) { - var returnTag = ts.getJSDocReturnTag(func); - if (returnTag && returnTag.typeExpression) { - return getTypeFromTypeNode(returnTag.typeExpression.type); - } - return undefined; } function createPromiseType(promisedType) { var globalPromiseType = getGlobalPromiseType(true); @@ -34636,13 +34700,13 @@ var ts; } var hasExplicitReturn = func.flags & 256; if (returnType && returnType.flags & 8192) { - error(func.type, ts.Diagnostics.A_function_returning_never_cannot_have_a_reachable_end_point); + error(ts.getEffectiveReturnTypeNode(func), ts.Diagnostics.A_function_returning_never_cannot_have_a_reachable_end_point); } else if (returnType && !hasExplicitReturn) { - error(func.type, ts.Diagnostics.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value); + error(ts.getEffectiveReturnTypeNode(func), ts.Diagnostics.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value); } else if (returnType && strictNullChecks && !isTypeAssignableTo(undefinedType, returnType)) { - error(func.type, ts.Diagnostics.Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined); + error(ts.getEffectiveReturnTypeNode(func), ts.Diagnostics.Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined); } else if (compilerOptions.noImplicitReturns) { if (!returnType) { @@ -34654,7 +34718,7 @@ var ts; return; } } - error(func.type || func, ts.Diagnostics.Not_all_code_paths_return_a_value); + error(ts.getEffectiveReturnTypeNode(func) || func, ts.Diagnostics.Not_all_code_paths_return_a_value); } } function checkFunctionExpressionOrObjectLiteralMethod(node, checkMode) { @@ -34669,29 +34733,30 @@ var ts; } var links = getNodeLinks(node); var type = getTypeOfSymbol(node.symbol); - var contextSensitive = isContextSensitive(node); - var mightFixTypeParameters = contextSensitive && checkMode === 2; - if (mightFixTypeParameters || !(links.flags & 1024)) { + if (!(links.flags & 1024)) { var contextualSignature = getContextualSignature(node); - var contextChecked = !!(links.flags & 1024); - if (mightFixTypeParameters || !contextChecked) { + if (!(links.flags & 1024)) { links.flags |= 1024; if (contextualSignature) { var signature = getSignaturesOfType(type, 0)[0]; - if (contextSensitive) { - assignContextualParameterTypes(signature, contextualSignature, getContextualMapper(node), checkMode); + if (isContextSensitive(node)) { + var contextualMapper = getContextualMapper(node); + if (checkMode === 2) { + inferFromAnnotatedParameters(signature, contextualSignature, contextualMapper); + } + var instantiatedContextualSignature = contextualMapper === identityMapper ? + contextualSignature : instantiateSignature(contextualSignature, contextualMapper); + assignContextualParameterTypes(signature, instantiatedContextualSignature); } - if (mightFixTypeParameters || !node.type && !signature.resolvedReturnType) { + if (!ts.getEffectiveReturnTypeNode(node) && !signature.resolvedReturnType) { var returnType = getReturnTypeFromBody(node, checkMode); if (!signature.resolvedReturnType) { signature.resolvedReturnType = returnType; } } } - if (!contextChecked) { - checkSignatureDeclaration(node); - checkNodeDeferred(node); - } + checkSignatureDeclaration(node); + checkNodeDeferred(node); } } if (produceDiagnostics && node.kind !== 151) { @@ -34704,15 +34769,16 @@ var ts; function checkFunctionExpressionOrObjectLiteralMethodDeferred(node) { ts.Debug.assert(node.kind !== 151 || ts.isObjectLiteralMethod(node)); var functionFlags = ts.getFunctionFlags(node); - var returnOrPromisedType = node.type && + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); + var returnOrPromisedType = returnTypeNode && ((functionFlags & 3) === 2 ? checkAsyncFunctionReturnType(node) : - getTypeFromTypeNode(node.type)); + getTypeFromTypeNode(returnTypeNode)); if ((functionFlags & 1) === 0) { checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, returnOrPromisedType); } if (node.body) { - if (!node.type) { + if (!returnTypeNode) { getReturnTypeOfSignature(getSignatureFromDeclaration(node)); } if (node.body.kind === 207) { @@ -34776,7 +34842,7 @@ var ts; return false; } function checkReferenceExpression(expr, invalidReferenceMessage) { - var node = ts.skipParentheses(expr); + var node = ts.skipOuterExpressions(expr, 2 | 1); if (node.kind !== 71 && node.kind !== 179 && node.kind !== 180) { error(expr, invalidReferenceMessage); return false; @@ -35351,8 +35417,9 @@ var ts; if (nodeIsYieldStar) { expressionElementType = checkIteratedTypeOrElementType(expressionType, node.expression, false, (functionFlags & 2) !== 0); } - if (func.type) { - var signatureElementType = getIteratedTypeOfGenerator(getTypeFromTypeNode(func.type), (functionFlags & 2) !== 0) || anyType; + var returnType = ts.getEffectiveReturnTypeNode(func); + if (returnType) { + var signatureElementType = getIteratedTypeOfGenerator(getTypeFromTypeNode(returnType), (functionFlags & 2) !== 0) || anyType; if (nodeIsYieldStar) { checkTypeAssignableTo(functionFlags & 2 ? getAwaitedType(expressionElementType, node.expression, ts.Diagnostics.Type_of_iterated_elements_of_a_yield_Asterisk_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member) @@ -35464,7 +35531,7 @@ var ts; if (signature && signature.typeParameters) { var contextualType = getApparentTypeOfContextualType(node); if (contextualType) { - var contextualSignature = getSingleCallSignature(contextualType); + var contextualSignature = getSingleCallSignature(getNonNullableType(contextualType)); if (contextualSignature && !contextualSignature.typeParameters) { return getOrCreateTypeFromSignature(instantiateSignatureInContextOf(signature, contextualSignature, getContextualMapper(node))); } @@ -35754,7 +35821,8 @@ var ts; } if (produceDiagnostics) { checkCollisionWithArgumentsInGeneratedCode(node); - if (noImplicitAny && !node.type) { + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); + if (noImplicitAny && !returnTypeNode) { switch (node.kind) { case 156: error(node, ts.Diagnostics.Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type); @@ -35764,19 +35832,19 @@ var ts; break; } } - if (node.type) { + if (returnTypeNode) { var functionFlags_1 = ts.getFunctionFlags(node); if ((functionFlags_1 & (4 | 1)) === 1) { - var returnType = getTypeFromTypeNode(node.type); + var returnType = getTypeFromTypeNode(returnTypeNode); if (returnType === voidType) { - error(node.type, ts.Diagnostics.A_generator_cannot_have_a_void_type_annotation); + error(returnTypeNode, ts.Diagnostics.A_generator_cannot_have_a_void_type_annotation); } else { var generatorElementType = getIteratedTypeOfGenerator(returnType, (functionFlags_1 & 2) !== 0) || anyType; var iterableIteratorInstantiation = functionFlags_1 & 2 ? createAsyncIterableIteratorType(generatorElementType) : createIterableIteratorType(generatorElementType); - checkTypeAssignableTo(iterableIteratorInstantiation, returnType, node.type); + checkTypeAssignableTo(iterableIteratorInstantiation, returnType, returnTypeNode); } } else if ((functionFlags_1 & 3) === 2) { @@ -36491,44 +36559,45 @@ var ts; return typeAsAwaitable.awaitedTypeOfType = type; } function checkAsyncFunctionReturnType(node) { - var returnType = getTypeFromTypeNode(node.type); + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); + var returnType = getTypeFromTypeNode(returnTypeNode); if (languageVersion >= 2) { if (returnType === unknownType) { return unknownType; } var globalPromiseType = getGlobalPromiseType(true); if (globalPromiseType !== emptyGenericType && !isReferenceToType(returnType, globalPromiseType)) { - error(node.type, ts.Diagnostics.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type); + error(returnTypeNode, ts.Diagnostics.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type); return unknownType; } } else { - markTypeNodeAsReferenced(node.type); + markTypeNodeAsReferenced(returnTypeNode); if (returnType === unknownType) { return unknownType; } - var promiseConstructorName = ts.getEntityNameFromTypeNode(node.type); + var promiseConstructorName = ts.getEntityNameFromTypeNode(returnTypeNode); if (promiseConstructorName === undefined) { - error(node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, typeToString(returnType)); + error(returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, typeToString(returnType)); return unknownType; } var promiseConstructorSymbol = resolveEntityName(promiseConstructorName, 107455, true); var promiseConstructorType = promiseConstructorSymbol ? getTypeOfSymbol(promiseConstructorSymbol) : unknownType; if (promiseConstructorType === unknownType) { if (promiseConstructorName.kind === 71 && promiseConstructorName.text === "Promise" && getTargetType(returnType) === getGlobalPromiseType(false)) { - error(node.type, ts.Diagnostics.An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option); + error(returnTypeNode, ts.Diagnostics.An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option); } else { - error(node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); + error(returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); } return unknownType; } var globalPromiseConstructorLikeType = getGlobalPromiseConstructorLikeType(true); if (globalPromiseConstructorLikeType === emptyObjectType) { - error(node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); + error(returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); return unknownType; } - if (!checkTypeAssignableTo(promiseConstructorType, globalPromiseConstructorLikeType, node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value)) { + if (!checkTypeAssignableTo(promiseConstructorType, globalPromiseConstructorLikeType, returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value)) { return unknownType; } var rootName = promiseConstructorName && getFirstIdentifier(promiseConstructorName); @@ -36624,7 +36693,8 @@ var ts; } } function getParameterTypeNodeForDecoratorCheck(node) { - return node.dotDotDotToken ? ts.getRestParameterElementType(node.type) : node.type; + var typeNode = ts.getEffectiveTypeAnnotationNode(node); + return ts.isRestParameter(node) ? ts.getRestParameterElementType(typeNode) : typeNode; } function checkDecorators(node) { if (!node.decorators) { @@ -36660,13 +36730,13 @@ var ts; var parameter = _c[_b]; markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(parameter)); } - markDecoratorMedataDataTypeNodeAsReferenced(node.type); + markDecoratorMedataDataTypeNodeAsReferenced(ts.getEffectiveReturnTypeNode(node)); break; case 149: - markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(node)); + markDecoratorMedataDataTypeNodeAsReferenced(ts.getEffectiveTypeAnnotationNode(node)); break; case 146: - markDecoratorMedataDataTypeNodeAsReferenced(node.type); + markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(node)); break; } } @@ -36674,7 +36744,8 @@ var ts; } function checkFunctionDeclaration(node) { if (produceDiagnostics) { - checkFunctionOrMethodDeclaration(node) || checkGrammarForGenerator(node); + checkFunctionOrMethodDeclaration(node); + checkGrammarForGenerator(node); checkCollisionWithCapturedSuperVariable(node, node.name); checkCollisionWithCapturedThisVariable(node, node.name); checkCollisionWithCapturedNewTargetVariable(node, node.name); @@ -36704,13 +36775,14 @@ var ts; } } checkSourceElement(node.body); + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); if ((functionFlags & 1) === 0) { - var returnOrPromisedType = node.type && (functionFlags & 2 + var returnOrPromisedType = returnTypeNode && (functionFlags & 2 ? checkAsyncFunctionReturnType(node) - : getTypeFromTypeNode(node.type)); + : getTypeFromTypeNode(returnTypeNode)); checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, returnOrPromisedType); } - if (produceDiagnostics && !node.type) { + if (produceDiagnostics && !returnTypeNode) { if (noImplicitAny && ts.nodeIsMissing(node.body) && !isPrivateWithinAmbient(node)) { reportImplicitAnyError(node, anyType); } @@ -36804,9 +36876,7 @@ var ts; function errorUnusedLocal(node, name) { if (isIdentifierThatStartsWithUnderScore(node)) { var declaration = ts.getRootDeclaration(node.parent); - if (declaration.kind === 226 && - (declaration.parent.parent.kind === 215 || - declaration.parent.parent.kind === 216)) { + if (declaration.kind === 226 && ts.isForInOrOfStatement(declaration.parent.parent)) { return; } } @@ -37494,7 +37564,8 @@ var ts; checkGrammarStatementInAmbientContext(node) || checkGrammarBreakOrContinueStatement(node); } function isGetAccessorWithAnnotatedSetAccessor(node) { - return !!(node.kind === 153 && ts.getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(node.symbol, 154))); + return node.kind === 153 + && ts.getEffectiveSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(node.symbol, 154)) !== undefined; } function isUnwrappedReturnTypeVoidOrAny(func, returnType) { var unwrappedReturnType = (ts.getFunctionFlags(func) & 3) === 2 @@ -37529,7 +37600,7 @@ var ts; error(node, ts.Diagnostics.Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class); } } - else if (func.type || isGetAccessorWithAnnotatedSetAccessor(func)) { + else if (ts.getEffectiveReturnTypeNode(func) || isGetAccessorWithAnnotatedSetAccessor(func)) { if (functionFlags & 2) { var promisedType = getPromisedTypeOfPromise(returnType); var awaitedType = checkAwaitedType(exprType, node, ts.Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member); @@ -38432,7 +38503,10 @@ var ts; ts.Diagnostics.Import_declaration_conflicts_with_local_declaration_of_0; error(node, message, symbolToString(symbol)); } - if (node.kind === 246 && compilerOptions.isolatedModules && !(target.flags & 107455)) { + if (compilerOptions.isolatedModules + && node.kind === 246 + && !(target.flags & 107455) + && !ts.isInAmbientContext(node)) { error(node, ts.Diagnostics.Cannot_re_export_a_type_when_the_isolatedModules_flag_is_provided); } } @@ -39044,6 +39118,11 @@ var ts; var parameter = ts.getParameterFromJSDoc(entityName.parent); return parameter && parameter.symbol; } + if (entityName.parent.kind === 145 && entityName.parent.parent.kind === 290) { + ts.Debug.assert(!ts.isInJavaScriptFile(entityName)); + var typeParameter = ts.getTypeParameterFromJsDoc(entityName.parent); + return typeParameter && typeParameter.symbol; + } if (ts.isPartOfExpression(entityName)) { if (ts.nodeIsMissing(entityName)) { return undefined; @@ -40876,9 +40955,7 @@ var ts; switch (name.parent.kind) { case 242: case 246: - if (name.parent.propertyName) { - return true; - } + return true; default: return ts.isDeclarationName(name); } @@ -41011,9 +41088,9 @@ var ts; case 149: return ts.updateProperty(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.type, visitor, ts.isTypeNode), visitNode(node.initializer, visitor, ts.isExpression)); case 150: - return ts.updateMethodSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken)); + return ts.updateMethodSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken)); case 151: - return ts.updateMethod(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateMethod(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 152: return ts.updateConstructor(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitFunctionBody(node.body, visitor, context)); case 153: @@ -41021,9 +41098,9 @@ var ts; case 154: return ts.updateSetAccessor(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isPropertyName), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitFunctionBody(node.body, visitor, context)); case 155: - return ts.updateCallSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateCallSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 156: - return ts.updateConstructSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateConstructSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 157: return ts.updateIndexSignature(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 158: @@ -41031,9 +41108,9 @@ var ts; case 159: return ts.updateTypeReferenceNode(node, visitNode(node.typeName, visitor, ts.isEntityName), nodesVisitor(node.typeArguments, visitor, ts.isTypeNode)); case 160: - return ts.updateFunctionTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateFunctionTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 161: - return ts.updateConstructorTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateConstructorTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 162: return ts.updateTypeQueryNode(node, visitNode(node.exprName, visitor, ts.isEntityName)); case 163: @@ -41053,7 +41130,7 @@ var ts; case 171: return ts.updateIndexedAccessTypeNode(node, visitNode(node.objectType, visitor, ts.isTypeNode), visitNode(node.indexType, visitor, ts.isTypeNode)); case 172: - return ts.updateMappedTypeNode(node, visitNode(node.readonlyToken, tokenVisitor, ts.isToken), visitNode(node.typeParameter, visitor, ts.isTypeParameter), visitNode(node.questionToken, tokenVisitor, ts.isToken), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateMappedTypeNode(node, visitNode(node.readonlyToken, tokenVisitor, ts.isToken), visitNode(node.typeParameter, visitor, ts.isTypeParameterDeclaration), visitNode(node.questionToken, tokenVisitor, ts.isToken), visitNode(node.type, visitor, ts.isTypeNode)); case 173: return ts.updateLiteralTypeNode(node, visitNode(node.literal, visitor, ts.isExpression)); case 174: @@ -41081,9 +41158,9 @@ var ts; case 185: return ts.updateParen(node, visitNode(node.expression, visitor, ts.isExpression)); case 186: - return ts.updateFunctionExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateFunctionExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 187: - return ts.updateArrowFunction(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateArrowFunction(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 188: return ts.updateDelete(node, visitNode(node.expression, visitor, ts.isExpression)); case 189: @@ -41107,7 +41184,7 @@ var ts; case 198: return ts.updateSpread(node, visitNode(node.expression, visitor, ts.isExpression)); case 199: - return ts.updateClassExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); + return ts.updateClassExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); case 201: return ts.updateExpressionWithTypeArguments(node, nodesVisitor(node.typeArguments, visitor, ts.isTypeNode), visitNode(node.expression, visitor, ts.isExpression)); case 202: @@ -41157,13 +41234,13 @@ var ts; case 227: return ts.updateVariableDeclarationList(node, nodesVisitor(node.declarations, visitor, ts.isVariableDeclaration)); case 228: - return ts.updateFunctionDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateFunctionDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 229: - return ts.updateClassDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); + return ts.updateClassDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); case 230: - return ts.updateInterfaceDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isTypeElement)); + return ts.updateInterfaceDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isTypeElement)); case 231: - return ts.updateTypeAliasDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateTypeAliasDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 232: return ts.updateEnumDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.members, visitor, ts.isEnumMember)); case 233: @@ -41700,34 +41777,7 @@ var ts; } var Debug; (function (Debug) { - if (Debug.isDebugging) { - Object.defineProperties(ts.objectAllocator.getSymbolConstructor().prototype, { - "__debugFlags": { get: function () { return ts.formatSymbolFlags(this.flags); } } - }); - Object.defineProperties(ts.objectAllocator.getTypeConstructor().prototype, { - "__debugFlags": { get: function () { return ts.formatTypeFlags(this.flags); } }, - "__debugObjectFlags": { get: function () { return this.flags & 32768 ? ts.formatObjectFlags(this.objectFlags) : ""; } }, - "__debugTypeToString": { value: function () { return this.checker.typeToString(this); } }, - }); - for (var _i = 0, _a = [ts.objectAllocator.getNodeConstructor(), ts.objectAllocator.getIdentifierConstructor(), ts.objectAllocator.getTokenConstructor(), ts.objectAllocator.getSourceFileConstructor()]; _i < _a.length; _i++) { - var ctor = _a[_i]; - if (!ctor.prototype.hasOwnProperty("__debugKind")) { - Object.defineProperties(ctor.prototype, { - "__debugKind": { get: function () { return ts.formatSyntaxKind(this.kind); } }, - "__debugModifierFlags": { get: function () { return ts.formatModifierFlags(ts.getModifierFlagsNoCache(this)); } }, - "__debugTransformFlags": { get: function () { return ts.formatTransformFlags(this.transformFlags); } }, - "__debugEmitFlags": { get: function () { return ts.formatEmitFlags(ts.getEmitFlags(this)); } }, - "__debugGetText": { value: function (includeTrivia) { - if (ts.nodeIsSynthesized(this)) - return ""; - var parseNode = ts.getParseTreeNode(this); - var sourceFile = parseNode && ts.getSourceFileOfNode(parseNode); - return sourceFile ? ts.getSourceTextOfNodeFromSourceFile(sourceFile, parseNode, includeTrivia) : ""; - } } - }); - } - } - } + var isDebugInfoEnabled = false; Debug.failBadSyntaxKind = Debug.shouldAssert(1) ? function (node, message) { return Debug.fail((message || "Unexpected node.") + "\r\nNode " + ts.formatSyntaxKind(node.kind) + " was unexpected.", Debug.failBadSyntaxKind); } : ts.noop; @@ -41746,6 +41796,46 @@ var ts; Debug.assertMissingNode = Debug.shouldAssert(1) ? function (node, message) { return Debug.assert(node === undefined, message || "Unexpected node.", function () { return "Node " + ts.formatSyntaxKind(node.kind) + " was unexpected'."; }, Debug.assertMissingNode); } : ts.noop; + function enableDebugInfo() { + if (isDebugInfoEnabled) + return; + Object.defineProperties(ts.objectAllocator.getSymbolConstructor().prototype, { + "__debugFlags": { get: function () { return ts.formatSymbolFlags(this.flags); } } + }); + Object.defineProperties(ts.objectAllocator.getTypeConstructor().prototype, { + "__debugFlags": { get: function () { return ts.formatTypeFlags(this.flags); } }, + "__debugObjectFlags": { get: function () { return this.flags & 32768 ? ts.formatObjectFlags(this.objectFlags) : ""; } }, + "__debugTypeToString": { value: function () { return this.checker.typeToString(this); } }, + }); + var nodeConstructors = [ + ts.objectAllocator.getNodeConstructor(), + ts.objectAllocator.getIdentifierConstructor(), + ts.objectAllocator.getTokenConstructor(), + ts.objectAllocator.getSourceFileConstructor() + ]; + for (var _i = 0, nodeConstructors_1 = nodeConstructors; _i < nodeConstructors_1.length; _i++) { + var ctor = nodeConstructors_1[_i]; + if (!ctor.prototype.hasOwnProperty("__debugKind")) { + Object.defineProperties(ctor.prototype, { + "__debugKind": { get: function () { return ts.formatSyntaxKind(this.kind); } }, + "__debugModifierFlags": { get: function () { return ts.formatModifierFlags(ts.getModifierFlagsNoCache(this)); } }, + "__debugTransformFlags": { get: function () { return ts.formatTransformFlags(this.transformFlags); } }, + "__debugEmitFlags": { get: function () { return ts.formatEmitFlags(ts.getEmitFlags(this)); } }, + "__debugGetText": { + value: function (includeTrivia) { + if (ts.nodeIsSynthesized(this)) + return ""; + var parseNode = ts.getParseTreeNode(this); + var sourceFile = parseNode && ts.getSourceFileOfNode(parseNode); + return sourceFile ? ts.getSourceTextOfNodeFromSourceFile(sourceFile, parseNode, includeTrivia) : ""; + } + } + }); + } + } + isDebugInfoEnabled = true; + } + Debug.enableDebugInfo = enableDebugInfo; })(Debug = ts.Debug || (ts.Debug = {})); })(ts || (ts = {})); var ts; @@ -47227,7 +47317,7 @@ var ts; if (variables.length === 0) { return undefined; } - return ts.createStatement(ts.inlineExpressions(ts.map(variables, transformInitializedVariable))); + return ts.setSourceMapRange(ts.createStatement(ts.inlineExpressions(ts.map(variables, transformInitializedVariable))), node); } } function visitBinaryExpression(node) { @@ -47542,7 +47632,7 @@ var ts; return undefined; } function transformInitializedVariable(node) { - return ts.createAssignment(ts.getSynthesizedClone(node.name), ts.visitNode(node.initializer, visitor, ts.isExpression)); + return ts.setSourceMapRange(ts.createAssignment(ts.setSourceMapRange(ts.getSynthesizedClone(node.name), node.name), ts.visitNode(node.initializer, visitor, ts.isExpression)), node); } function transformAndEmitIfStatement(node) { if (containsYield(node)) { @@ -50351,7 +50441,7 @@ var ts; function hoistVariableDeclaration(name) { ts.Debug.assert(state > 0, "Cannot modify the lexical environment during initialization."); ts.Debug.assert(state < 2, "Cannot modify the lexical environment after transformation has completed."); - var decl = ts.createVariableDeclaration(name); + var decl = ts.setEmitFlags(ts.createVariableDeclaration(name), 64); if (!lexicalEnvironmentVariableDeclarations) { lexicalEnvironmentVariableDeclarations = [decl]; } @@ -56447,14 +56537,14 @@ var ts; function getResolutionDiagnostic(options, _a) { var extension = _a.extension; switch (extension) { - case ts.Extension.Ts: - case ts.Extension.Dts: + case ".ts": + case ".d.ts": return undefined; - case ts.Extension.Tsx: + case ".tsx": return needJsx(); - case ts.Extension.Jsx: + case ".jsx": return needJsx() || needAllowJs(); - case ts.Extension.Js: + case ".js": return needAllowJs(); } function needJsx() { @@ -57056,6 +57146,12 @@ var ts; category: ts.Diagnostics.Advanced_Options, description: ts.Diagnostics.The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files }, + { + name: "noStrictGenericChecks", + type: "boolean", + category: ts.Diagnostics.Advanced_Options, + description: ts.Diagnostics.Disable_strict_checking_of_generic_signatures_in_function_types, + }, { name: "plugins", type: "list", @@ -58367,6 +58463,9 @@ var ts; return; } })(ts || (ts = {})); +if (ts.Debug.isDebugging) { + ts.Debug.enableDebugInfo(); +} if (ts.sys.tryEnableSourceMapsForHost && /^development$/i.test(ts.sys.getEnvironmentVariable("NODE_ENV"))) { ts.sys.tryEnableSourceMapsForHost(); } diff --git a/lib/tsserver.js b/lib/tsserver.js index ae66af0fe37..a3479aba7b4 100644 --- a/lib/tsserver.js +++ b/lib/tsserver.js @@ -954,12 +954,11 @@ var ts; })(CharacterCodes = ts.CharacterCodes || (ts.CharacterCodes = {})); var Extension; (function (Extension) { - Extension[Extension["Ts"] = 0] = "Ts"; - Extension[Extension["Tsx"] = 1] = "Tsx"; - Extension[Extension["Dts"] = 2] = "Dts"; - Extension[Extension["Js"] = 3] = "Js"; - Extension[Extension["Jsx"] = 4] = "Jsx"; - Extension[Extension["LastTypeScriptExtension"] = 2] = "LastTypeScriptExtension"; + Extension["Ts"] = ".ts"; + Extension["Tsx"] = ".tsx"; + Extension["Dts"] = ".d.ts"; + Extension["Js"] = ".js"; + Extension["Jsx"] = ".jsx"; })(Extension = ts.Extension || (ts.Extension = {})); var TransformFlags; (function (TransformFlags) { @@ -1145,7 +1144,7 @@ var ts; })(ts || (ts = {})); var ts; (function (ts) { - ts.version = "2.4.0"; + ts.version = "2.4.1"; })(ts || (ts = {})); (function (ts) { var Ternary; @@ -3152,7 +3151,7 @@ var ts; } ts.positionIsSynthesized = positionIsSynthesized; function extensionIsTypeScript(ext) { - return ext <= ts.Extension.LastTypeScriptExtension; + return ext === ".ts" || ext === ".tsx" || ext === ".d.ts"; } ts.extensionIsTypeScript = extensionIsTypeScript; function extensionFromPath(path) { @@ -3164,21 +3163,7 @@ var ts; } ts.extensionFromPath = extensionFromPath; function tryGetExtensionFromPath(path) { - if (fileExtensionIs(path, ".d.ts")) { - return ts.Extension.Dts; - } - if (fileExtensionIs(path, ".ts")) { - return ts.Extension.Ts; - } - if (fileExtensionIs(path, ".tsx")) { - return ts.Extension.Tsx; - } - if (fileExtensionIs(path, ".js")) { - return ts.Extension.Js; - } - if (fileExtensionIs(path, ".jsx")) { - return ts.Extension.Jsx; - } + return find(ts.supportedTypescriptExtensionsForExtractExtension, function (e) { return fileExtensionIs(path, e); }) || find(ts.supportedJavascriptExtensions, function (e) { return fileExtensionIs(path, e); }); } ts.tryGetExtensionFromPath = tryGetExtensionFromPath; function isCheckJsEnabledForFile(sourceFile, compilerOptions) { @@ -4383,6 +4368,7 @@ var ts; Scoped_package_detected_looking_in_0: { code: 6182, category: ts.DiagnosticCategory.Message, key: "Scoped_package_detected_looking_in_0_6182", message: "Scoped package detected, looking in '{0}'" }, Reusing_resolution_of_module_0_to_file_1_from_old_program: { code: 6183, category: ts.DiagnosticCategory.Message, key: "Reusing_resolution_of_module_0_to_file_1_from_old_program_6183", message: "Reusing resolution of module '{0}' to file '{1}' from old program." }, Reusing_module_resolutions_originating_in_0_since_resolutions_are_unchanged_from_old_program: { code: 6184, category: ts.DiagnosticCategory.Message, key: "Reusing_module_resolutions_originating_in_0_since_resolutions_are_unchanged_from_old_program_6184", message: "Reusing module resolutions originating in '{0}' since resolutions are unchanged from old program." }, + Disable_strict_checking_of_generic_signatures_in_function_types: { code: 6185, category: ts.DiagnosticCategory.Message, key: "Disable_strict_checking_of_generic_signatures_in_function_types_6185", message: "Disable strict checking of generic signatures in function types." }, Variable_0_implicitly_has_an_1_type: { code: 7005, category: ts.DiagnosticCategory.Error, key: "Variable_0_implicitly_has_an_1_type_7005", message: "Variable '{0}' implicitly has an '{1}' type." }, Parameter_0_implicitly_has_an_1_type: { code: 7006, category: ts.DiagnosticCategory.Error, key: "Parameter_0_implicitly_has_an_1_type_7006", message: "Parameter '{0}' implicitly has an '{1}' type." }, Member_0_implicitly_has_an_1_type: { code: 7008, category: ts.DiagnosticCategory.Error, key: "Member_0_implicitly_has_an_1_type_7008", message: "Member '{0}' implicitly has an '{1}' type." }, @@ -5031,14 +5017,14 @@ var ts; } switch (extensions) { case Extensions.DtsOnly: - return tryExtension(".d.ts", ts.Extension.Dts); + return tryExtension(".d.ts"); case Extensions.TypeScript: - return tryExtension(".ts", ts.Extension.Ts) || tryExtension(".tsx", ts.Extension.Tsx) || tryExtension(".d.ts", ts.Extension.Dts); + return tryExtension(".ts") || tryExtension(".tsx") || tryExtension(".d.ts"); case Extensions.JavaScript: - return tryExtension(".js", ts.Extension.Js) || tryExtension(".jsx", ts.Extension.Jsx); + return tryExtension(".js") || tryExtension(".jsx"); } - function tryExtension(ext, extension) { - var path = tryFile(candidate + ext, failedLookupLocations, onlyRecordFailures, state); + function tryExtension(extension) { + var path = tryFile(candidate + extension, failedLookupLocations, onlyRecordFailures, state); return path && { path: path, extension: extension }; } } @@ -5108,11 +5094,11 @@ var ts; function extensionIsOk(extensions, extension) { switch (extensions) { case Extensions.JavaScript: - return extension === ts.Extension.Js || extension === ts.Extension.Jsx; + return extension === ".js" || extension === ".jsx"; case Extensions.TypeScript: - return extension === ts.Extension.Ts || extension === ts.Extension.Tsx || extension === ts.Extension.Dts; + return extension === ".ts" || extension === ".tsx" || extension === ".d.ts"; case Extensions.DtsOnly: - return extension === ts.Extension.Dts; + return extension === ".d.ts"; } } function pathToPackageJson(directory) { @@ -6572,6 +6558,12 @@ var ts; }); } ts.getParameterFromJSDoc = getParameterFromJSDoc; + function getTypeParameterFromJsDoc(node) { + var name = node.name.text; + var typeParameters = node.parent.parent.parent.typeParameters; + return ts.find(typeParameters, function (p) { return p.name.text === name; }); + } + ts.getTypeParameterFromJsDoc = getTypeParameterFromJsDoc; function getJSDocType(node) { var tag = getFirstJSDocTag(node, 289); if (!tag && node.kind === 146) { @@ -6595,6 +6587,11 @@ var ts; return getFirstJSDocTag(node, 288); } ts.getJSDocReturnTag = getJSDocReturnTag; + function getJSDocReturnType(node) { + var returnTag = getJSDocReturnTag(node); + return returnTag && returnTag.typeExpression && returnTag.typeExpression.type; + } + ts.getJSDocReturnType = getJSDocReturnType; function getJSDocTemplateTag(node) { return getFirstJSDocTag(node, 290); } @@ -7494,12 +7491,16 @@ var ts; }); } ts.getFirstConstructorWithBody = getFirstConstructorWithBody; - function getSetAccessorTypeAnnotationNode(accessor) { + function getSetAccessorValueParameter(accessor) { if (accessor && accessor.parameters.length > 0) { var hasThis = accessor.parameters.length === 2 && parameterIsThisKeyword(accessor.parameters[0]); - return accessor.parameters[hasThis ? 1 : 0].type; + return accessor.parameters[hasThis ? 1 : 0]; } } + function getSetAccessorTypeAnnotationNode(accessor) { + var parameter = getSetAccessorValueParameter(accessor); + return parameter && parameter.type; + } ts.getSetAccessorTypeAnnotationNode = getSetAccessorTypeAnnotationNode; function getThisParameter(signature) { if (signature.parameters.length) { @@ -7570,6 +7571,39 @@ var ts; }; } ts.getAllAccessorDeclarations = getAllAccessorDeclarations; + function getEffectiveTypeAnnotationNode(node) { + if (node.type) { + return node.type; + } + if (node.flags & 65536) { + return getJSDocType(node); + } + } + ts.getEffectiveTypeAnnotationNode = getEffectiveTypeAnnotationNode; + function getEffectiveReturnTypeNode(node) { + if (node.type) { + return node.type; + } + if (node.flags & 65536) { + return getJSDocReturnType(node); + } + } + ts.getEffectiveReturnTypeNode = getEffectiveReturnTypeNode; + function getEffectiveTypeParameterDeclarations(node) { + if (node.typeParameters) { + return node.typeParameters; + } + if (node.flags & 65536) { + var templateTag = getJSDocTemplateTag(node); + return templateTag && templateTag.typeParameters; + } + } + ts.getEffectiveTypeParameterDeclarations = getEffectiveTypeParameterDeclarations; + function getEffectiveSetAccessorTypeAnnotationNode(node) { + var parameter = getSetAccessorValueParameter(node); + return parameter && getEffectiveTypeAnnotationNode(parameter); + } + ts.getEffectiveSetAccessorTypeAnnotationNode = getEffectiveSetAccessorTypeAnnotationNode; function emitNewLineBeforeLeadingComments(lineMap, writer, node, leadingComments) { emitNewLineBeforeLeadingCommentsOfPosition(lineMap, writer, node.pos, leadingComments); } @@ -8551,10 +8585,10 @@ var ts; return node.kind === 144; } ts.isComputedPropertyName = isComputedPropertyName; - function isTypeParameter(node) { + function isTypeParameterDeclaration(node) { return node.kind === 145; } - ts.isTypeParameter = isTypeParameter; + ts.isTypeParameterDeclaration = isTypeParameterDeclaration; function isParameter(node) { return node.kind === 146; } @@ -9145,6 +9179,14 @@ var ts; ts.isJSDocLiteralType = isJSDocLiteralType; })(ts || (ts = {})); (function (ts) { + function isNode(node) { + return isNodeKind(node.kind); + } + ts.isNode = isNode; + function isNodeKind(kind) { + return kind >= 143; + } + ts.isNodeKind = isNodeKind; function isToken(n) { return n.kind >= 0 && n.kind <= 142; } @@ -9489,6 +9531,10 @@ var ts; return false; } ts.isIterationStatement = isIterationStatement; + function isForInOrOfStatement(node) { + return node.kind === 215 || node.kind === 216; + } + ts.isForInOrOfStatement = isForInOrOfStatement; function isConciseBody(node) { return ts.isBlock(node) || isExpression(node); @@ -9603,6 +9649,9 @@ var ts; || kind === 299; } function isDeclaration(node) { + if (node.kind === 145) { + return node.parent.kind !== 290 || ts.isInJavaScriptFile(node); + } return isDeclarationKind(node.kind); } ts.isDeclaration = isDeclaration; @@ -9671,6 +9720,10 @@ var ts; return node.kind >= 267 && node.kind <= 294; } ts.isJSDocNode = isJSDocNode; + function isJSDocCommentContainingNode(node) { + return node.kind === 283 || isJSDocTag(node); + } + ts.isJSDocCommentContainingNode = isJSDocCommentContainingNode; function isJSDocTag(node) { return node.kind >= 284 && node.kind <= 294; } @@ -14816,7 +14869,7 @@ var ts; else if (kind === 71) { return new (IdentifierConstructor || (IdentifierConstructor = ts.objectAllocator.getIdentifierConstructor()))(kind, pos, end); } - else if (kind < 143) { + else if (!ts.isNodeKind(kind)) { return new (TokenConstructor || (TokenConstructor = ts.objectAllocator.getTokenConstructor()))(kind, pos, end); } else { @@ -15625,7 +15678,7 @@ var ts; if (!(pos >= 0)) { pos = scanner.getStartPos(); } - return kind >= 143 ? new NodeConstructor(kind, pos, pos) : + return ts.isNodeKind(kind) ? new NodeConstructor(kind, pos, pos) : kind === 71 ? new IdentifierConstructor(kind, pos, pos) : new TokenConstructor(kind, pos, pos); } @@ -19788,7 +19841,7 @@ var ts; jsDocNamespaceNode.flags |= flags; jsDocNamespaceNode.name = typeNameOrNamespaceName; jsDocNamespaceNode.body = parseJSDocTypeNameWithNamespace(4); - return jsDocNamespaceNode; + return finishNode(jsDocNamespaceNode); } if (typeNameOrNamespaceName && flags & 4) { typeNameOrNamespaceName.isInJSDocNamespace = true; @@ -21239,7 +21292,7 @@ var ts; } function bindVariableDeclarationFlow(node) { bindEachChild(node); - if (node.initializer || node.parent.parent.kind === 215 || node.parent.parent.kind === 216) { + if (node.initializer || ts.isForInOrOfStatement(node.parent.parent)) { bindInitializedVariableFlow(node); } } @@ -21763,7 +21816,10 @@ var ts; case 158: return checkTypePredicate(node); case 145: - return declareSymbolAndAddToSymbolTable(node, 262144, 530920); + if (node.parent.kind !== 290 || ts.isInJavaScriptFile(node)) { + return declareSymbolAndAddToSymbolTable(node, 262144, 530920); + } + return; case 146: return bindParameter(node); case 226: @@ -21834,7 +21890,10 @@ var ts; case 232: return bindEnumDeclaration(node); case 233: - return bindModuleDeclaration(node); + if (node.parent.kind !== 291 || ts.isInJavaScriptFile(node)) { + return bindModuleDeclaration(node); + } + return undefined; case 254: return bindJsxAttributes(node); case 253: @@ -23539,14 +23598,7 @@ var ts; } break; } - switch (declaration.parent.parent.kind) { - case 215: - case 216: - if (isSameScopeDescendentOf(usage, declaration.parent.parent.expression, container)) { - return true; - } - } - return false; + return ts.isForInOrOfStatement(declaration.parent.parent) && isSameScopeDescendentOf(usage, declaration.parent.parent.expression, container); } function isUsedInFunctionOrInstanceProperty(usage, declaration, container) { return !!ts.findAncestor(usage, function (current) { @@ -26232,12 +26284,6 @@ var ts; return strictNullChecks && optional ? getNullableType(type, 2048) : type; } function getTypeForVariableLikeDeclaration(declaration, includeOptionality) { - if (declaration.flags & 65536) { - var type = getTypeForDeclarationFromJSDocComment(declaration); - if (type && type !== unknownType) { - return type; - } - } if (declaration.parent.parent.kind === 215) { var indexType = getIndexType(checkNonNullExpression(declaration.parent.parent.expression)); return indexType.flags & (16384 | 262144) ? indexType : stringType; @@ -26249,8 +26295,9 @@ var ts; if (ts.isBindingPattern(declaration.parent)) { return getTypeForBindingElement(declaration); } - if (declaration.type) { - var declaredType = getTypeFromTypeNode(declaration.type); + var typeNode = ts.getEffectiveTypeAnnotationNode(declaration); + if (typeNode) { + var declaredType = getTypeFromTypeNode(typeNode); return addOptionality(declaredType, declaration.questionToken && includeOptionality); } if ((noImplicitAny || declaration.flags & 65536) && @@ -26464,10 +26511,11 @@ var ts; function getAnnotatedAccessorType(accessor) { if (accessor) { if (accessor.kind === 153) { - return accessor.type && getTypeFromTypeNode(accessor.type); + var getterTypeAnnotation = ts.getEffectiveReturnTypeNode(accessor); + return getterTypeAnnotation && getTypeFromTypeNode(getterTypeAnnotation); } else { - var setterTypeAnnotation = ts.getSetAccessorTypeAnnotationNode(accessor); + var setterTypeAnnotation = ts.getEffectiveSetAccessorTypeAnnotationNode(accessor); return setterTypeAnnotation && getTypeFromTypeNode(setterTypeAnnotation); } } @@ -26596,7 +26644,7 @@ var ts; return links.type; } function reportCircularityError(symbol) { - if (symbol.valueDeclaration.type) { + if (ts.getEffectiveTypeAnnotationNode(symbol.valueDeclaration)) { error(symbol.valueDeclaration, ts.Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, symbolToString(symbol)); return unknownType; } @@ -27098,11 +27146,15 @@ var ts; return false; } function isIndependentVariableLikeDeclaration(node) { - return node.type && isIndependentType(node.type) || !node.type && !node.initializer; + var typeNode = ts.getEffectiveTypeAnnotationNode(node); + return typeNode ? isIndependentType(typeNode) : !node.initializer; } function isIndependentFunctionLikeDeclaration(node) { - if (node.kind !== 152 && (!node.type || !isIndependentType(node.type))) { - return false; + if (node.kind !== 152) { + var typeNode = ts.getEffectiveReturnTypeNode(node); + if (!typeNode || !isIndependentType(typeNode)) { + return false; + } } for (var _i = 0, _a = node.parameters; _i < _a.length; _i++) { var parameter = _a[_i]; @@ -27709,7 +27761,7 @@ var ts; typeParameter.default = targetDefault ? instantiateType(targetDefault, typeParameter.mapper) : noConstraintType; } else { - var defaultDeclaration = typeParameter.symbol && ts.forEach(typeParameter.symbol.declarations, function (decl) { return ts.isTypeParameter(decl) && decl.default; }); + var defaultDeclaration = typeParameter.symbol && ts.forEach(typeParameter.symbol.declarations, function (decl) { return ts.isTypeParameterDeclaration(decl) && decl.default; }); typeParameter.default = defaultDeclaration ? getTypeFromTypeNode(defaultDeclaration) : noConstraintType; } } @@ -27868,20 +27920,14 @@ var ts; } return undefined; } - function getTypeParametersFromJSDocTemplate(declaration) { - if (declaration.flags & 65536) { - var templateTag = ts.getJSDocTemplateTag(declaration); - if (templateTag) { - return getTypeParametersFromDeclaration(templateTag.typeParameters); - } - } - return undefined; - } - function getTypeParametersFromDeclaration(typeParameterDeclarations) { - var result = []; - ts.forEach(typeParameterDeclarations, function (node) { + function getTypeParametersFromDeclaration(declaration) { + var result; + ts.forEach(ts.getEffectiveTypeParameterDeclarations(declaration), function (node) { var tp = getDeclaredTypeOfTypeParameter(node.symbol); if (!ts.contains(result, tp)) { + if (!result) { + result = []; + } result.push(tp); } }); @@ -28038,9 +28084,7 @@ var ts; var classType = declaration.kind === 152 ? getDeclaredTypeOfClassOrInterface(getMergedSymbol(declaration.parent.symbol)) : undefined; - var typeParameters = classType ? classType.localTypeParameters : - declaration.typeParameters ? getTypeParametersFromDeclaration(declaration.typeParameters) : - getTypeParametersFromJSDocTemplate(declaration); + var typeParameters = classType ? classType.localTypeParameters : getTypeParametersFromDeclaration(declaration); var returnType = getSignatureReturnTypeFromDeclaration(declaration, isJSConstructSignature, classType); var typePredicate = declaration.type && declaration.type.kind === 158 ? createTypePredicateFromTypePredicateNode(declaration.type) : @@ -28064,14 +28108,9 @@ var ts; else if (classType) { return classType; } - else if (declaration.type) { - return getTypeFromTypeNode(declaration.type); - } - if (declaration.flags & 65536) { - var type = getReturnTypeFromJSDocComment(declaration); - if (type && type !== unknownType) { - return type; - } + var typeNode = ts.getEffectiveReturnTypeNode(declaration); + if (typeNode) { + return getTypeFromTypeNode(typeNode); } if (declaration.kind === 153 && !ts.hasDynamicName(declaration)) { var setter = ts.getDeclarationOfKind(declaration.symbol, 154); @@ -28408,27 +28447,44 @@ var ts; } return undefined; } - function resolveTypeReferenceName(typeReferenceName) { + function resolveTypeReferenceName(typeReferenceName, meaning) { if (!typeReferenceName) { return unknownSymbol; } - return resolveEntityName(typeReferenceName, 793064) || unknownSymbol; + return resolveEntityName(typeReferenceName, meaning) || unknownSymbol; } function getTypeReferenceType(node, symbol) { var typeArguments = typeArgumentsFromTypeReferenceNode(node); if (symbol === unknownSymbol) { return unknownType; } + var type = getTypeReferenceTypeWorker(node, symbol, typeArguments); + if (type) { + return type; + } + if (symbol.flags & 107455 && node.kind === 277) { + var valueType = getTypeOfSymbol(symbol); + if (valueType.symbol && !isInferredClassType(valueType)) { + var referenceType = getTypeReferenceTypeWorker(node, valueType.symbol, typeArguments); + if (referenceType) { + return referenceType; + } + } + resolveTypeReferenceName(getTypeReferenceName(node), 793064); + return valueType; + } + return getTypeFromNonGenericTypeReference(node, symbol); + } + function getTypeReferenceTypeWorker(node, symbol, typeArguments) { if (symbol.flags & (32 | 64)) { return getTypeFromClassOrInterfaceReference(node, symbol, typeArguments); } if (symbol.flags & 524288) { return getTypeFromTypeAliasReference(node, symbol, typeArguments); } - if (symbol.flags & 107455 && node.kind === 277) { - return getTypeOfSymbol(symbol); + if (symbol.flags & 16 && node.kind === 277 && (symbol.members || ts.getJSDocClassTag(symbol.valueDeclaration))) { + return getInferredClassType(symbol); } - return getTypeFromNonGenericTypeReference(node, symbol); } function getPrimitiveTypeFromJSDocTypeReference(node) { if (ts.isIdentifier(node.name)) { @@ -28468,21 +28524,13 @@ var ts; if (!links.resolvedType) { var symbol = void 0; var type = void 0; + var meaning = 793064; if (node.kind === 277) { type = getPrimitiveTypeFromJSDocTypeReference(node); - if (!type) { - var typeReferenceName = getTypeReferenceName(node); - symbol = resolveTypeReferenceName(typeReferenceName); - type = getTypeReferenceType(node, symbol); - } + meaning |= 107455; } - else { - var typeNameOrExpression = node.kind === 159 - ? node.typeName - : ts.isEntityNameExpression(node.expression) - ? node.expression - : undefined; - symbol = typeNameOrExpression && resolveEntityName(typeNameOrExpression, 793064) || unknownSymbol; + if (!type) { + symbol = resolveTypeReferenceName(getTypeReferenceName(node), meaning); type = getTypeReferenceType(node, symbol); } links.resolvedSymbol = symbol; @@ -28834,10 +28882,13 @@ var ts; else if (type.flags & 1) { typeSet.containsAny = true; } + else if (type.flags & 8192) { + typeSet.containsNever = true; + } else if (getObjectFlags(type) & 16 && isEmptyObjectType(type)) { typeSet.containsEmptyObject = true; } - else if (!(type.flags & 8192) && (strictNullChecks || !(type.flags & 6144)) && !ts.contains(typeSet, type)) { + else if ((strictNullChecks || !(type.flags & 6144)) && !ts.contains(typeSet, type)) { if (type.flags & 32768) { typeSet.containsObjectType = true; } @@ -28862,6 +28913,9 @@ var ts; } var typeSet = []; addTypesToIntersection(typeSet, types); + if (typeSet.containsNever) { + return neverType; + } if (typeSet.containsAny) { return anyType; } @@ -29427,7 +29481,7 @@ var ts; if (signature.typePredicate) { freshTypePredicate = cloneTypePredicate(signature.typePredicate, mapper); } - var result = createSignature(signature.declaration, freshTypeParameters, signature.thisParameter && instantiateSymbol(signature.thisParameter, mapper), instantiateList(signature.parameters, mapper, instantiateSymbol), instantiateType(signature.resolvedReturnType, mapper), freshTypePredicate, signature.minArgumentCount, signature.hasRestParameter, signature.hasLiteralTypes); + var result = createSignature(signature.declaration, freshTypeParameters, signature.thisParameter && instantiateSymbol(signature.thisParameter, mapper), instantiateList(signature.parameters, mapper, instantiateSymbol), undefined, freshTypePredicate, signature.minArgumentCount, signature.hasRestParameter, signature.hasLiteralTypes); result.target = signature; result.mapper = mapper; return result; @@ -29513,10 +29567,10 @@ var ts; case 199: case 230: case 231: - var declaration = node; - if (declaration.typeParameters) { - for (var _i = 0, _a = declaration.typeParameters; _i < _a.length; _i++) { - var d = _a[_i]; + var typeParameters = ts.getEffectiveTypeParameterDeclarations(node); + if (typeParameters) { + for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) { + var d = typeParameters_1[_i]; if (ts.contains(mappedTypes, getDeclaredTypeOfTypeParameter(getSymbolOfNode(d)))) { return true; } @@ -29536,8 +29590,8 @@ var ts; break; case 279: var func = node; - for (var _b = 0, _c = func.parameters; _b < _c.length; _b++) { - var p = _c[_b]; + for (var _a = 0, _b = func.parameters; _a < _b.length; _a++) { + var p = _b[_a]; if (ts.contains(mappedTypes, getTypeOfNode(p))) { return true; } @@ -29636,7 +29690,7 @@ var ts; if (node.typeParameters) { return false; } - if (ts.forEach(node.parameters, function (p) { return !p.type; })) { + if (ts.forEach(node.parameters, function (p) { return !ts.getEffectiveTypeAnnotationNode(p); })) { return true; } if (node.kind === 187) { @@ -29708,8 +29762,9 @@ var ts; if (!target.hasRestParameter && source.minArgumentCount > target.parameters.length) { return 0; } - source = getErasedSignature(source); - target = getErasedSignature(target); + if (source.typeParameters) { + source = instantiateSignatureInContextOf(source, target); + } var result = -1; var sourceThisType = getThisTypeOfSignature(source); if (sourceThisType && sourceThisType !== voidType) { @@ -30121,7 +30176,9 @@ var ts; reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1, symbolToString(prop), typeToString(target)); } else { - errorNode = prop.valueDeclaration; + if (prop.valueDeclaration) { + errorNode = prop.valueDeclaration; + } reportError(ts.Diagnostics.Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1, symbolToString(prop), typeToString(target)); } } @@ -30578,20 +30635,24 @@ var ts; var saveErrorInfo = errorInfo; if (getObjectFlags(source) & 64 && getObjectFlags(target) & 64 && source.symbol === target.symbol) { for (var i = 0; i < targetSignatures.length; i++) { - var related = signatureRelatedTo(sourceSignatures[i], targetSignatures[i], reportErrors); + var related = signatureRelatedTo(sourceSignatures[i], targetSignatures[i], true, reportErrors); if (!related) { return 0; } result &= related; } } + else if (sourceSignatures.length === 1 && targetSignatures.length === 1) { + var eraseGenerics = relation === comparableRelation || compilerOptions.noStrictGenericChecks; + result = signatureRelatedTo(sourceSignatures[0], targetSignatures[0], eraseGenerics, reportErrors); + } else { outer: for (var _i = 0, targetSignatures_1 = targetSignatures; _i < targetSignatures_1.length; _i++) { var t = targetSignatures_1[_i]; var shouldElaborateErrors = reportErrors; for (var _a = 0, sourceSignatures_1 = sourceSignatures; _a < sourceSignatures_1.length; _a++) { var s = sourceSignatures_1[_a]; - var related = signatureRelatedTo(s, t, shouldElaborateErrors); + var related = signatureRelatedTo(s, t, true, shouldElaborateErrors); if (related) { result &= related; errorInfo = saveErrorInfo; @@ -30607,8 +30668,8 @@ var ts; } return result; } - function signatureRelatedTo(source, target, reportErrors) { - return compareSignaturesRelated(source, target, false, false, reportErrors, reportError, isRelatedTo); + function signatureRelatedTo(source, target, erase, reportErrors) { + return compareSignaturesRelated(erase ? getErasedSignature(source) : source, erase ? getErasedSignature(target) : target, false, false, reportErrors, reportError, isRelatedTo); } function signaturesIdenticalTo(source, target, kind) { var sourceSignatures = getSignaturesOfType(source, kind); @@ -33120,8 +33181,15 @@ var ts; function getContextualTypeForInitializerExpression(node) { var declaration = node.parent; if (node === declaration.initializer) { - if (declaration.type) { - return getTypeFromTypeNode(declaration.type); + var typeNode = ts.getEffectiveTypeAnnotationNode(declaration); + if (typeNode) { + return getTypeFromTypeNode(typeNode); + } + if (ts.isInJavaScriptFile(declaration)) { + var jsDocType = getTypeForDeclarationFromJSDocComment(declaration); + if (jsDocType) { + return jsDocType; + } } if (declaration.kind === 146) { var type = getContextuallyTypedParameterType(declaration); @@ -33135,12 +33203,13 @@ var ts; if (ts.isBindingPattern(declaration.parent)) { var parentDeclaration = declaration.parent.parent; var name = declaration.propertyName || declaration.name; - if (parentDeclaration.kind !== 176 && - parentDeclaration.type && - !ts.isBindingPattern(name)) { - var text = ts.getTextOfPropertyName(name); - if (text) { - return getTypeOfPropertyOfType(getTypeFromTypeNode(parentDeclaration.type), text); + if (parentDeclaration.kind !== 176) { + var parentTypeNode = ts.getEffectiveTypeAnnotationNode(parentDeclaration); + if (parentTypeNode && !ts.isBindingPattern(name)) { + var text = ts.getTextOfPropertyName(name); + if (text) { + return getTypeOfPropertyOfType(getTypeFromTypeNode(parentTypeNode), text); + } } } } @@ -33184,9 +33253,9 @@ var ts; return false; } function getContextualReturnType(functionDecl) { - if (functionDecl.type || - functionDecl.kind === 152 || - functionDecl.kind === 153 && ts.getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(functionDecl.symbol, 154))) { + if (functionDecl.kind === 152 || + ts.getEffectiveReturnTypeNode(functionDecl) || + isGetAccessorWithAnnotatedSetAccessor(functionDecl)) { return getReturnTypeOfSignature(getSignatureFromDeclaration(functionDecl)); } var signature = getContextualSignatureForFunctionLikeDeclaration(functionDecl); @@ -34180,7 +34249,7 @@ var ts; var resolved = resolveStructuredTypeMembers(targetType); if (resolved.stringIndexInfo || resolved.numberIndexInfo && isNumericLiteralName(name) || - getPropertyOfType(targetType, name) || + getPropertyOfObjectType(targetType, name) || isComparingJsxAttributes && !isUnhyphenatedJsxName(name)) { return true; } @@ -34721,8 +34790,11 @@ var ts; function instantiateSignatureInContextOf(signature, contextualSignature, contextualMapper) { var context = createInferenceContext(signature, 1); forEachMatchingParameterType(contextualSignature, signature, function (source, target) { - inferTypes(context.inferences, instantiateType(source, contextualMapper), target); + inferTypes(context.inferences, instantiateType(source, contextualMapper || identityMapper), target); }); + if (!contextualMapper) { + inferTypes(context.inferences, getReturnTypeOfSignature(contextualSignature), getReturnTypeOfSignature(signature), 4); + } return getSignatureInstantiation(signature, getInferredTypes(context)); } function inferTypeArguments(node, signature, args, excludeArgument, context) { @@ -35457,6 +35529,11 @@ var ts; } return links.inferredClassType; } + function isInferredClassType(type) { + return type.symbol + && getObjectFlags(type) & 16 + && getSymbolLinks(type.symbol).inferredClassType === type; + } function checkCallExpression(node) { checkGrammarTypeArguments(node, node.typeArguments) || checkGrammarArguments(node, node.arguments); var signature = getResolvedSignature(node); @@ -35586,37 +35663,42 @@ var ts; function getTypeOfFirstParameterOfSignature(signature) { return signature.parameters.length > 0 ? getTypeAtPosition(signature, 0) : neverType; } - function assignContextualParameterTypes(signature, context, mapper, checkMode) { + function inferFromAnnotatedParameters(signature, context, mapper) { var len = signature.parameters.length - (signature.hasRestParameter ? 1 : 0); - if (checkMode === 2) { - for (var i = 0; i < len; i++) { - var declaration = signature.parameters[i].valueDeclaration; - if (declaration.type) { - inferTypes(mapper.inferences, getTypeFromTypeNode(declaration.type), getTypeAtPosition(context, i)); + for (var i = 0; i < len; i++) { + var declaration = signature.parameters[i].valueDeclaration; + if (declaration.type) { + var typeNode = ts.getEffectiveTypeAnnotationNode(declaration); + if (typeNode) { + inferTypes(mapper.inferences, getTypeFromTypeNode(typeNode), getTypeAtPosition(context, i)); } } } + } + function assignContextualParameterTypes(signature, context) { + signature.typeParameters = context.typeParameters; if (context.thisParameter) { var parameter = signature.thisParameter; if (!parameter || parameter.valueDeclaration && !parameter.valueDeclaration.type) { if (!parameter) { signature.thisParameter = createSymbolWithType(context.thisParameter, undefined); } - assignTypeToParameterAndFixTypeParameters(signature.thisParameter, getTypeOfSymbol(context.thisParameter), mapper, checkMode); + assignTypeToParameterAndFixTypeParameters(signature.thisParameter, getTypeOfSymbol(context.thisParameter)); } } + var len = signature.parameters.length - (signature.hasRestParameter ? 1 : 0); for (var i = 0; i < len; i++) { var parameter = signature.parameters[i]; - if (!parameter.valueDeclaration.type) { + if (!ts.getEffectiveTypeAnnotationNode(parameter.valueDeclaration)) { var contextualParameterType = getTypeAtPosition(context, i); - assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType, mapper, checkMode); + assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType); } } if (signature.hasRestParameter && isRestParameterIndex(context, signature.parameters.length - 1)) { var parameter = ts.lastOrUndefined(signature.parameters); - if (!parameter.valueDeclaration.type) { + if (!ts.getEffectiveTypeAnnotationNode(parameter.valueDeclaration)) { var contextualParameterType = getTypeOfSymbol(ts.lastOrUndefined(context.parameters)); - assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType, mapper, checkMode); + assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType); } } } @@ -35633,10 +35715,10 @@ var ts; } } } - function assignTypeToParameterAndFixTypeParameters(parameter, contextualType, mapper, checkMode) { + function assignTypeToParameterAndFixTypeParameters(parameter, contextualType) { var links = getSymbolLinks(parameter); if (!links.type) { - links.type = instantiateType(contextualType, mapper); + links.type = contextualType; var name = ts.getNameOfDeclaration(parameter.valueDeclaration); if (links.type === emptyObjectType && (name.kind === 174 || name.kind === 175)) { @@ -35644,16 +35726,6 @@ var ts; } assignBindingElementTypes(parameter.valueDeclaration); } - else if (checkMode === 2) { - inferTypes(mapper.inferences, links.type, instantiateType(contextualType, mapper)); - } - } - function getReturnTypeFromJSDocComment(func) { - var returnTag = ts.getJSDocReturnTag(func); - if (returnTag && returnTag.typeExpression) { - return getTypeFromTypeNode(returnTag.typeExpression.type); - } - return undefined; } function createPromiseType(promisedType) { var globalPromiseType = getGlobalPromiseType(true); @@ -35830,13 +35902,13 @@ var ts; } var hasExplicitReturn = func.flags & 256; if (returnType && returnType.flags & 8192) { - error(func.type, ts.Diagnostics.A_function_returning_never_cannot_have_a_reachable_end_point); + error(ts.getEffectiveReturnTypeNode(func), ts.Diagnostics.A_function_returning_never_cannot_have_a_reachable_end_point); } else if (returnType && !hasExplicitReturn) { - error(func.type, ts.Diagnostics.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value); + error(ts.getEffectiveReturnTypeNode(func), ts.Diagnostics.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value); } else if (returnType && strictNullChecks && !isTypeAssignableTo(undefinedType, returnType)) { - error(func.type, ts.Diagnostics.Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined); + error(ts.getEffectiveReturnTypeNode(func), ts.Diagnostics.Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined); } else if (compilerOptions.noImplicitReturns) { if (!returnType) { @@ -35848,7 +35920,7 @@ var ts; return; } } - error(func.type || func, ts.Diagnostics.Not_all_code_paths_return_a_value); + error(ts.getEffectiveReturnTypeNode(func) || func, ts.Diagnostics.Not_all_code_paths_return_a_value); } } function checkFunctionExpressionOrObjectLiteralMethod(node, checkMode) { @@ -35863,29 +35935,30 @@ var ts; } var links = getNodeLinks(node); var type = getTypeOfSymbol(node.symbol); - var contextSensitive = isContextSensitive(node); - var mightFixTypeParameters = contextSensitive && checkMode === 2; - if (mightFixTypeParameters || !(links.flags & 1024)) { + if (!(links.flags & 1024)) { var contextualSignature = getContextualSignature(node); - var contextChecked = !!(links.flags & 1024); - if (mightFixTypeParameters || !contextChecked) { + if (!(links.flags & 1024)) { links.flags |= 1024; if (contextualSignature) { var signature = getSignaturesOfType(type, 0)[0]; - if (contextSensitive) { - assignContextualParameterTypes(signature, contextualSignature, getContextualMapper(node), checkMode); + if (isContextSensitive(node)) { + var contextualMapper = getContextualMapper(node); + if (checkMode === 2) { + inferFromAnnotatedParameters(signature, contextualSignature, contextualMapper); + } + var instantiatedContextualSignature = contextualMapper === identityMapper ? + contextualSignature : instantiateSignature(contextualSignature, contextualMapper); + assignContextualParameterTypes(signature, instantiatedContextualSignature); } - if (mightFixTypeParameters || !node.type && !signature.resolvedReturnType) { + if (!ts.getEffectiveReturnTypeNode(node) && !signature.resolvedReturnType) { var returnType = getReturnTypeFromBody(node, checkMode); if (!signature.resolvedReturnType) { signature.resolvedReturnType = returnType; } } } - if (!contextChecked) { - checkSignatureDeclaration(node); - checkNodeDeferred(node); - } + checkSignatureDeclaration(node); + checkNodeDeferred(node); } } if (produceDiagnostics && node.kind !== 151) { @@ -35898,15 +35971,16 @@ var ts; function checkFunctionExpressionOrObjectLiteralMethodDeferred(node) { ts.Debug.assert(node.kind !== 151 || ts.isObjectLiteralMethod(node)); var functionFlags = ts.getFunctionFlags(node); - var returnOrPromisedType = node.type && + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); + var returnOrPromisedType = returnTypeNode && ((functionFlags & 3) === 2 ? checkAsyncFunctionReturnType(node) : - getTypeFromTypeNode(node.type)); + getTypeFromTypeNode(returnTypeNode)); if ((functionFlags & 1) === 0) { checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, returnOrPromisedType); } if (node.body) { - if (!node.type) { + if (!returnTypeNode) { getReturnTypeOfSignature(getSignatureFromDeclaration(node)); } if (node.body.kind === 207) { @@ -35970,7 +36044,7 @@ var ts; return false; } function checkReferenceExpression(expr, invalidReferenceMessage) { - var node = ts.skipParentheses(expr); + var node = ts.skipOuterExpressions(expr, 2 | 1); if (node.kind !== 71 && node.kind !== 179 && node.kind !== 180) { error(expr, invalidReferenceMessage); return false; @@ -36545,8 +36619,9 @@ var ts; if (nodeIsYieldStar) { expressionElementType = checkIteratedTypeOrElementType(expressionType, node.expression, false, (functionFlags & 2) !== 0); } - if (func.type) { - var signatureElementType = getIteratedTypeOfGenerator(getTypeFromTypeNode(func.type), (functionFlags & 2) !== 0) || anyType; + var returnType = ts.getEffectiveReturnTypeNode(func); + if (returnType) { + var signatureElementType = getIteratedTypeOfGenerator(getTypeFromTypeNode(returnType), (functionFlags & 2) !== 0) || anyType; if (nodeIsYieldStar) { checkTypeAssignableTo(functionFlags & 2 ? getAwaitedType(expressionElementType, node.expression, ts.Diagnostics.Type_of_iterated_elements_of_a_yield_Asterisk_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member) @@ -36658,7 +36733,7 @@ var ts; if (signature && signature.typeParameters) { var contextualType = getApparentTypeOfContextualType(node); if (contextualType) { - var contextualSignature = getSingleCallSignature(contextualType); + var contextualSignature = getSingleCallSignature(getNonNullableType(contextualType)); if (contextualSignature && !contextualSignature.typeParameters) { return getOrCreateTypeFromSignature(instantiateSignatureInContextOf(signature, contextualSignature, getContextualMapper(node))); } @@ -36948,7 +37023,8 @@ var ts; } if (produceDiagnostics) { checkCollisionWithArgumentsInGeneratedCode(node); - if (noImplicitAny && !node.type) { + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); + if (noImplicitAny && !returnTypeNode) { switch (node.kind) { case 156: error(node, ts.Diagnostics.Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type); @@ -36958,19 +37034,19 @@ var ts; break; } } - if (node.type) { + if (returnTypeNode) { var functionFlags_1 = ts.getFunctionFlags(node); if ((functionFlags_1 & (4 | 1)) === 1) { - var returnType = getTypeFromTypeNode(node.type); + var returnType = getTypeFromTypeNode(returnTypeNode); if (returnType === voidType) { - error(node.type, ts.Diagnostics.A_generator_cannot_have_a_void_type_annotation); + error(returnTypeNode, ts.Diagnostics.A_generator_cannot_have_a_void_type_annotation); } else { var generatorElementType = getIteratedTypeOfGenerator(returnType, (functionFlags_1 & 2) !== 0) || anyType; var iterableIteratorInstantiation = functionFlags_1 & 2 ? createAsyncIterableIteratorType(generatorElementType) : createIterableIteratorType(generatorElementType); - checkTypeAssignableTo(iterableIteratorInstantiation, returnType, node.type); + checkTypeAssignableTo(iterableIteratorInstantiation, returnType, returnTypeNode); } } else if ((functionFlags_1 & 3) === 2) { @@ -37692,44 +37768,45 @@ var ts; return typeAsAwaitable.awaitedTypeOfType = type; } function checkAsyncFunctionReturnType(node) { - var returnType = getTypeFromTypeNode(node.type); + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); + var returnType = getTypeFromTypeNode(returnTypeNode); if (languageVersion >= 2) { if (returnType === unknownType) { return unknownType; } var globalPromiseType = getGlobalPromiseType(true); if (globalPromiseType !== emptyGenericType && !isReferenceToType(returnType, globalPromiseType)) { - error(node.type, ts.Diagnostics.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type); + error(returnTypeNode, ts.Diagnostics.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type); return unknownType; } } else { - markTypeNodeAsReferenced(node.type); + markTypeNodeAsReferenced(returnTypeNode); if (returnType === unknownType) { return unknownType; } - var promiseConstructorName = ts.getEntityNameFromTypeNode(node.type); + var promiseConstructorName = ts.getEntityNameFromTypeNode(returnTypeNode); if (promiseConstructorName === undefined) { - error(node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, typeToString(returnType)); + error(returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, typeToString(returnType)); return unknownType; } var promiseConstructorSymbol = resolveEntityName(promiseConstructorName, 107455, true); var promiseConstructorType = promiseConstructorSymbol ? getTypeOfSymbol(promiseConstructorSymbol) : unknownType; if (promiseConstructorType === unknownType) { if (promiseConstructorName.kind === 71 && promiseConstructorName.text === "Promise" && getTargetType(returnType) === getGlobalPromiseType(false)) { - error(node.type, ts.Diagnostics.An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option); + error(returnTypeNode, ts.Diagnostics.An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option); } else { - error(node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); + error(returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); } return unknownType; } var globalPromiseConstructorLikeType = getGlobalPromiseConstructorLikeType(true); if (globalPromiseConstructorLikeType === emptyObjectType) { - error(node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); + error(returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); return unknownType; } - if (!checkTypeAssignableTo(promiseConstructorType, globalPromiseConstructorLikeType, node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value)) { + if (!checkTypeAssignableTo(promiseConstructorType, globalPromiseConstructorLikeType, returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value)) { return unknownType; } var rootName = promiseConstructorName && getFirstIdentifier(promiseConstructorName); @@ -37825,7 +37902,8 @@ var ts; } } function getParameterTypeNodeForDecoratorCheck(node) { - return node.dotDotDotToken ? ts.getRestParameterElementType(node.type) : node.type; + var typeNode = ts.getEffectiveTypeAnnotationNode(node); + return ts.isRestParameter(node) ? ts.getRestParameterElementType(typeNode) : typeNode; } function checkDecorators(node) { if (!node.decorators) { @@ -37861,13 +37939,13 @@ var ts; var parameter = _c[_b]; markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(parameter)); } - markDecoratorMedataDataTypeNodeAsReferenced(node.type); + markDecoratorMedataDataTypeNodeAsReferenced(ts.getEffectiveReturnTypeNode(node)); break; case 149: - markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(node)); + markDecoratorMedataDataTypeNodeAsReferenced(ts.getEffectiveTypeAnnotationNode(node)); break; case 146: - markDecoratorMedataDataTypeNodeAsReferenced(node.type); + markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(node)); break; } } @@ -37875,7 +37953,8 @@ var ts; } function checkFunctionDeclaration(node) { if (produceDiagnostics) { - checkFunctionOrMethodDeclaration(node) || checkGrammarForGenerator(node); + checkFunctionOrMethodDeclaration(node); + checkGrammarForGenerator(node); checkCollisionWithCapturedSuperVariable(node, node.name); checkCollisionWithCapturedThisVariable(node, node.name); checkCollisionWithCapturedNewTargetVariable(node, node.name); @@ -37905,13 +37984,14 @@ var ts; } } checkSourceElement(node.body); + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); if ((functionFlags & 1) === 0) { - var returnOrPromisedType = node.type && (functionFlags & 2 + var returnOrPromisedType = returnTypeNode && (functionFlags & 2 ? checkAsyncFunctionReturnType(node) - : getTypeFromTypeNode(node.type)); + : getTypeFromTypeNode(returnTypeNode)); checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, returnOrPromisedType); } - if (produceDiagnostics && !node.type) { + if (produceDiagnostics && !returnTypeNode) { if (noImplicitAny && ts.nodeIsMissing(node.body) && !isPrivateWithinAmbient(node)) { reportImplicitAnyError(node, anyType); } @@ -38005,9 +38085,7 @@ var ts; function errorUnusedLocal(node, name) { if (isIdentifierThatStartsWithUnderScore(node)) { var declaration = ts.getRootDeclaration(node.parent); - if (declaration.kind === 226 && - (declaration.parent.parent.kind === 215 || - declaration.parent.parent.kind === 216)) { + if (declaration.kind === 226 && ts.isForInOrOfStatement(declaration.parent.parent)) { return; } } @@ -38695,7 +38773,8 @@ var ts; checkGrammarStatementInAmbientContext(node) || checkGrammarBreakOrContinueStatement(node); } function isGetAccessorWithAnnotatedSetAccessor(node) { - return !!(node.kind === 153 && ts.getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(node.symbol, 154))); + return node.kind === 153 + && ts.getEffectiveSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(node.symbol, 154)) !== undefined; } function isUnwrappedReturnTypeVoidOrAny(func, returnType) { var unwrappedReturnType = (ts.getFunctionFlags(func) & 3) === 2 @@ -38730,7 +38809,7 @@ var ts; error(node, ts.Diagnostics.Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class); } } - else if (func.type || isGetAccessorWithAnnotatedSetAccessor(func)) { + else if (ts.getEffectiveReturnTypeNode(func) || isGetAccessorWithAnnotatedSetAccessor(func)) { if (functionFlags & 2) { var promisedType = getPromisedTypeOfPromise(returnType); var awaitedType = checkAwaitedType(exprType, node, ts.Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member); @@ -39633,7 +39712,10 @@ var ts; ts.Diagnostics.Import_declaration_conflicts_with_local_declaration_of_0; error(node, message, symbolToString(symbol)); } - if (node.kind === 246 && compilerOptions.isolatedModules && !(target.flags & 107455)) { + if (compilerOptions.isolatedModules + && node.kind === 246 + && !(target.flags & 107455) + && !ts.isInAmbientContext(node)) { error(node, ts.Diagnostics.Cannot_re_export_a_type_when_the_isolatedModules_flag_is_provided); } } @@ -40245,6 +40327,11 @@ var ts; var parameter = ts.getParameterFromJSDoc(entityName.parent); return parameter && parameter.symbol; } + if (entityName.parent.kind === 145 && entityName.parent.parent.kind === 290) { + ts.Debug.assert(!ts.isInJavaScriptFile(entityName)); + var typeParameter = ts.getTypeParameterFromJsDoc(entityName.parent); + return typeParameter && typeParameter.symbol; + } if (ts.isPartOfExpression(entityName)) { if (ts.nodeIsMissing(entityName)) { return undefined; @@ -42077,9 +42164,7 @@ var ts; switch (name.parent.kind) { case 242: case 246: - if (name.parent.propertyName) { - return true; - } + return true; default: return ts.isDeclarationName(name); } @@ -42212,9 +42297,9 @@ var ts; case 149: return ts.updateProperty(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.type, visitor, ts.isTypeNode), visitNode(node.initializer, visitor, ts.isExpression)); case 150: - return ts.updateMethodSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken)); + return ts.updateMethodSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken)); case 151: - return ts.updateMethod(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateMethod(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 152: return ts.updateConstructor(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitFunctionBody(node.body, visitor, context)); case 153: @@ -42222,9 +42307,9 @@ var ts; case 154: return ts.updateSetAccessor(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isPropertyName), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitFunctionBody(node.body, visitor, context)); case 155: - return ts.updateCallSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateCallSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 156: - return ts.updateConstructSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateConstructSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 157: return ts.updateIndexSignature(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 158: @@ -42232,9 +42317,9 @@ var ts; case 159: return ts.updateTypeReferenceNode(node, visitNode(node.typeName, visitor, ts.isEntityName), nodesVisitor(node.typeArguments, visitor, ts.isTypeNode)); case 160: - return ts.updateFunctionTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateFunctionTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 161: - return ts.updateConstructorTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateConstructorTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 162: return ts.updateTypeQueryNode(node, visitNode(node.exprName, visitor, ts.isEntityName)); case 163: @@ -42254,7 +42339,7 @@ var ts; case 171: return ts.updateIndexedAccessTypeNode(node, visitNode(node.objectType, visitor, ts.isTypeNode), visitNode(node.indexType, visitor, ts.isTypeNode)); case 172: - return ts.updateMappedTypeNode(node, visitNode(node.readonlyToken, tokenVisitor, ts.isToken), visitNode(node.typeParameter, visitor, ts.isTypeParameter), visitNode(node.questionToken, tokenVisitor, ts.isToken), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateMappedTypeNode(node, visitNode(node.readonlyToken, tokenVisitor, ts.isToken), visitNode(node.typeParameter, visitor, ts.isTypeParameterDeclaration), visitNode(node.questionToken, tokenVisitor, ts.isToken), visitNode(node.type, visitor, ts.isTypeNode)); case 173: return ts.updateLiteralTypeNode(node, visitNode(node.literal, visitor, ts.isExpression)); case 174: @@ -42282,9 +42367,9 @@ var ts; case 185: return ts.updateParen(node, visitNode(node.expression, visitor, ts.isExpression)); case 186: - return ts.updateFunctionExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateFunctionExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 187: - return ts.updateArrowFunction(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateArrowFunction(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 188: return ts.updateDelete(node, visitNode(node.expression, visitor, ts.isExpression)); case 189: @@ -42308,7 +42393,7 @@ var ts; case 198: return ts.updateSpread(node, visitNode(node.expression, visitor, ts.isExpression)); case 199: - return ts.updateClassExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); + return ts.updateClassExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); case 201: return ts.updateExpressionWithTypeArguments(node, nodesVisitor(node.typeArguments, visitor, ts.isTypeNode), visitNode(node.expression, visitor, ts.isExpression)); case 202: @@ -42358,13 +42443,13 @@ var ts; case 227: return ts.updateVariableDeclarationList(node, nodesVisitor(node.declarations, visitor, ts.isVariableDeclaration)); case 228: - return ts.updateFunctionDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateFunctionDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 229: - return ts.updateClassDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); + return ts.updateClassDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); case 230: - return ts.updateInterfaceDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isTypeElement)); + return ts.updateInterfaceDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isTypeElement)); case 231: - return ts.updateTypeAliasDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateTypeAliasDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 232: return ts.updateEnumDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.members, visitor, ts.isEnumMember)); case 233: @@ -42901,34 +42986,7 @@ var ts; } var Debug; (function (Debug) { - if (Debug.isDebugging) { - Object.defineProperties(ts.objectAllocator.getSymbolConstructor().prototype, { - "__debugFlags": { get: function () { return ts.formatSymbolFlags(this.flags); } } - }); - Object.defineProperties(ts.objectAllocator.getTypeConstructor().prototype, { - "__debugFlags": { get: function () { return ts.formatTypeFlags(this.flags); } }, - "__debugObjectFlags": { get: function () { return this.flags & 32768 ? ts.formatObjectFlags(this.objectFlags) : ""; } }, - "__debugTypeToString": { value: function () { return this.checker.typeToString(this); } }, - }); - for (var _i = 0, _a = [ts.objectAllocator.getNodeConstructor(), ts.objectAllocator.getIdentifierConstructor(), ts.objectAllocator.getTokenConstructor(), ts.objectAllocator.getSourceFileConstructor()]; _i < _a.length; _i++) { - var ctor = _a[_i]; - if (!ctor.prototype.hasOwnProperty("__debugKind")) { - Object.defineProperties(ctor.prototype, { - "__debugKind": { get: function () { return ts.formatSyntaxKind(this.kind); } }, - "__debugModifierFlags": { get: function () { return ts.formatModifierFlags(ts.getModifierFlagsNoCache(this)); } }, - "__debugTransformFlags": { get: function () { return ts.formatTransformFlags(this.transformFlags); } }, - "__debugEmitFlags": { get: function () { return ts.formatEmitFlags(ts.getEmitFlags(this)); } }, - "__debugGetText": { value: function (includeTrivia) { - if (ts.nodeIsSynthesized(this)) - return ""; - var parseNode = ts.getParseTreeNode(this); - var sourceFile = parseNode && ts.getSourceFileOfNode(parseNode); - return sourceFile ? ts.getSourceTextOfNodeFromSourceFile(sourceFile, parseNode, includeTrivia) : ""; - } } - }); - } - } - } + var isDebugInfoEnabled = false; Debug.failBadSyntaxKind = Debug.shouldAssert(1) ? function (node, message) { return Debug.fail((message || "Unexpected node.") + "\r\nNode " + ts.formatSyntaxKind(node.kind) + " was unexpected.", Debug.failBadSyntaxKind); } : ts.noop; @@ -42947,6 +43005,46 @@ var ts; Debug.assertMissingNode = Debug.shouldAssert(1) ? function (node, message) { return Debug.assert(node === undefined, message || "Unexpected node.", function () { return "Node " + ts.formatSyntaxKind(node.kind) + " was unexpected'."; }, Debug.assertMissingNode); } : ts.noop; + function enableDebugInfo() { + if (isDebugInfoEnabled) + return; + Object.defineProperties(ts.objectAllocator.getSymbolConstructor().prototype, { + "__debugFlags": { get: function () { return ts.formatSymbolFlags(this.flags); } } + }); + Object.defineProperties(ts.objectAllocator.getTypeConstructor().prototype, { + "__debugFlags": { get: function () { return ts.formatTypeFlags(this.flags); } }, + "__debugObjectFlags": { get: function () { return this.flags & 32768 ? ts.formatObjectFlags(this.objectFlags) : ""; } }, + "__debugTypeToString": { value: function () { return this.checker.typeToString(this); } }, + }); + var nodeConstructors = [ + ts.objectAllocator.getNodeConstructor(), + ts.objectAllocator.getIdentifierConstructor(), + ts.objectAllocator.getTokenConstructor(), + ts.objectAllocator.getSourceFileConstructor() + ]; + for (var _i = 0, nodeConstructors_1 = nodeConstructors; _i < nodeConstructors_1.length; _i++) { + var ctor = nodeConstructors_1[_i]; + if (!ctor.prototype.hasOwnProperty("__debugKind")) { + Object.defineProperties(ctor.prototype, { + "__debugKind": { get: function () { return ts.formatSyntaxKind(this.kind); } }, + "__debugModifierFlags": { get: function () { return ts.formatModifierFlags(ts.getModifierFlagsNoCache(this)); } }, + "__debugTransformFlags": { get: function () { return ts.formatTransformFlags(this.transformFlags); } }, + "__debugEmitFlags": { get: function () { return ts.formatEmitFlags(ts.getEmitFlags(this)); } }, + "__debugGetText": { + value: function (includeTrivia) { + if (ts.nodeIsSynthesized(this)) + return ""; + var parseNode = ts.getParseTreeNode(this); + var sourceFile = parseNode && ts.getSourceFileOfNode(parseNode); + return sourceFile ? ts.getSourceTextOfNodeFromSourceFile(sourceFile, parseNode, includeTrivia) : ""; + } + } + }); + } + } + isDebugInfoEnabled = true; + } + Debug.enableDebugInfo = enableDebugInfo; })(Debug = ts.Debug || (ts.Debug = {})); })(ts || (ts = {})); var ts; @@ -48507,7 +48605,7 @@ var ts; if (variables.length === 0) { return undefined; } - return ts.createStatement(ts.inlineExpressions(ts.map(variables, transformInitializedVariable))); + return ts.setSourceMapRange(ts.createStatement(ts.inlineExpressions(ts.map(variables, transformInitializedVariable))), node); } } function visitBinaryExpression(node) { @@ -48822,7 +48920,7 @@ var ts; return undefined; } function transformInitializedVariable(node) { - return ts.createAssignment(ts.getSynthesizedClone(node.name), ts.visitNode(node.initializer, visitor, ts.isExpression)); + return ts.setSourceMapRange(ts.createAssignment(ts.setSourceMapRange(ts.getSynthesizedClone(node.name), node.name), ts.visitNode(node.initializer, visitor, ts.isExpression)), node); } function transformAndEmitIfStatement(node) { if (containsYield(node)) { @@ -51713,7 +51811,7 @@ var ts; function hoistVariableDeclaration(name) { ts.Debug.assert(state > 0, "Cannot modify the lexical environment during initialization."); ts.Debug.assert(state < 2, "Cannot modify the lexical environment after transformation has completed."); - var decl = ts.createVariableDeclaration(name); + var decl = ts.setEmitFlags(ts.createVariableDeclaration(name), 64); if (!lexicalEnvironmentVariableDeclarations) { lexicalEnvironmentVariableDeclarations = [decl]; } @@ -57879,14 +57977,14 @@ var ts; function getResolutionDiagnostic(options, _a) { var extension = _a.extension; switch (extension) { - case ts.Extension.Ts: - case ts.Extension.Dts: + case ".ts": + case ".d.ts": return undefined; - case ts.Extension.Tsx: + case ".tsx": return needJsx(); - case ts.Extension.Jsx: + case ".jsx": return needJsx() || needAllowJs(); - case ts.Extension.Js: + case ".js": return needAllowJs(); } function needJsx() { @@ -58488,6 +58586,12 @@ var ts; category: ts.Diagnostics.Advanced_Options, description: ts.Diagnostics.The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files }, + { + name: "noStrictGenericChecks", + type: "boolean", + category: ts.Diagnostics.Advanced_Options, + description: ts.Diagnostics.Disable_strict_checking_of_generic_signatures_in_function_types, + }, { name: "plugins", type: "list", @@ -59573,6 +59677,10 @@ var ts; else if (isNamespaceReference(node)) { return 4; } + else if (ts.isTypeParameterDeclaration(node.parent)) { + ts.Debug.assert(ts.isJSDocTemplateTag(node.parent.parent)); + return 2; + } else { return 1; } @@ -60078,7 +60186,7 @@ var ts; } } ts.findNextToken = findNextToken; - function findPrecedingToken(position, sourceFile, startNode) { + function findPrecedingToken(position, sourceFile, startNode, includeJsDoc) { return find(startNode || sourceFile); function findRightmostToken(n) { if (ts.isToken(n)) { @@ -60096,7 +60204,7 @@ var ts; for (var i = 0; i < children.length; i++) { var child = children[i]; if (position < child.end && (nodeHasTokens(child) || child.kind === 10)) { - var start = child.getStart(sourceFile); + var start = (includeJsDoc && child.jsDoc ? child.jsDoc[0] : child).getStart(sourceFile); var lookInPreviousChild = (start >= position) || (child.kind === 10 && start === child.end); if (lookInPreviousChild) { @@ -60108,7 +60216,7 @@ var ts; } } } - ts.Debug.assert(startNode !== undefined || n.kind === 265); + ts.Debug.assert(startNode !== undefined || n.kind === 265 || ts.isJSDocCommentContainingNode(n)); if (children.length) { var candidate = findRightmostChildNodeWithTokens(children, children.length); return candidate && findRightmostToken(candidate); @@ -61703,7 +61811,7 @@ var ts; } } function tryClassifyNode(node) { - if (ts.isJSDocNode(node)) { + if (ts.isJSDoc(node)) { return true; } if (ts.nodeIsMissing(node)) { @@ -62554,12 +62662,12 @@ var ts; } } start = ts.timestamp(); - var previousToken = ts.findPrecedingToken(position, sourceFile); + var previousToken = ts.findPrecedingToken(position, sourceFile, undefined, true); log("getCompletionData: Get previous token 1: " + (ts.timestamp() - start)); var contextToken = previousToken; if (contextToken && position <= contextToken.end && ts.isWord(contextToken.kind)) { var start_2 = ts.timestamp(); - contextToken = ts.findPrecedingToken(contextToken.getFullStart(), sourceFile); + contextToken = ts.findPrecedingToken(contextToken.getFullStart(), sourceFile, undefined, true); log("getCompletionData: Get previous token 2: " + (ts.timestamp() - start_2)); } var node = currentToken; @@ -62841,34 +62949,29 @@ var ts; typeMembers = typeChecker.getAllPossiblePropertiesOfType(typeForObject); existingMembers = objectLikeContainer.properties; } - else if (objectLikeContainer.kind === 174) { + else { + ts.Debug.assert(objectLikeContainer.kind === 174); isNewIdentifierLocation = false; var rootDeclaration = ts.getRootDeclaration(objectLikeContainer.parent); - if (ts.isVariableLike(rootDeclaration)) { - var canGetType = !!(rootDeclaration.initializer || rootDeclaration.type); - if (!canGetType && rootDeclaration.kind === 146) { - if (ts.isExpression(rootDeclaration.parent)) { - canGetType = !!typeChecker.getContextualType(rootDeclaration.parent); - } - else if (rootDeclaration.parent.kind === 151 || rootDeclaration.parent.kind === 154) { - canGetType = ts.isExpression(rootDeclaration.parent.parent) && !!typeChecker.getContextualType(rootDeclaration.parent.parent); - } + if (!ts.isVariableLike(rootDeclaration)) + throw ts.Debug.fail("Root declaration is not variable-like."); + var canGetType = rootDeclaration.initializer || rootDeclaration.type || rootDeclaration.parent.parent.kind === 216; + if (!canGetType && rootDeclaration.kind === 146) { + if (ts.isExpression(rootDeclaration.parent)) { + canGetType = !!typeChecker.getContextualType(rootDeclaration.parent); } - if (canGetType) { - var typeForObject = typeChecker.getTypeAtLocation(objectLikeContainer); - if (!typeForObject) - return false; - typeMembers = typeChecker.getPropertiesOfType(typeForObject); - existingMembers = objectLikeContainer.elements; + else if (rootDeclaration.parent.kind === 151 || rootDeclaration.parent.kind === 154) { + canGetType = ts.isExpression(rootDeclaration.parent.parent) && !!typeChecker.getContextualType(rootDeclaration.parent.parent); } } - else { - ts.Debug.fail("Root declaration is not variable-like."); + if (canGetType) { + var typeForObject = typeChecker.getTypeAtLocation(objectLikeContainer); + if (!typeForObject) + return false; + typeMembers = typeChecker.getPropertiesOfType(typeForObject); + existingMembers = objectLikeContainer.elements; } } - else { - ts.Debug.fail("Expected object literal or binding pattern, got " + objectLikeContainer.kind); - } if (typeMembers && typeMembers.length > 0) { symbols = filterObjectMembersList(typeMembers, existingMembers); } @@ -62936,7 +63039,7 @@ var ts; case 17: case 26: var parent = contextToken.parent; - if (parent && (parent.kind === 178 || parent.kind === 174)) { + if (ts.isObjectLiteralExpression(parent) || ts.isObjectBindingPattern(parent)) { return parent; } break; @@ -63336,15 +63439,23 @@ var ts; (function (DocumentHighlights) { function getDocumentHighlights(program, cancellationToken, sourceFile, position, sourceFilesToSearch) { var node = ts.getTouchingWord(sourceFile, position, true); - return node && (getSemanticDocumentHighlights(node, program, cancellationToken, sourceFilesToSearch) || getSyntacticDocumentHighlights(node, sourceFile)); + if (!node) + return undefined; + if (ts.isJsxOpeningElement(node.parent) && node.parent.tagName === node || ts.isJsxClosingElement(node.parent)) { + var _a = node.parent.parent, openingElement = _a.openingElement, closingElement = _a.closingElement; + var highlightSpans = [openingElement, closingElement].map(function (_a) { + var tagName = _a.tagName; + return getHighlightSpanForNode(tagName, sourceFile); + }); + return [{ fileName: sourceFile.fileName, highlightSpans: highlightSpans }]; + } + return getSemanticDocumentHighlights(node, program, cancellationToken, sourceFilesToSearch) || getSyntacticDocumentHighlights(node, sourceFile); } DocumentHighlights.getDocumentHighlights = getDocumentHighlights; function getHighlightSpanForNode(node, sourceFile) { - var start = node.getStart(sourceFile); - var end = node.getEnd(); return { fileName: sourceFile.fileName, - textSpan: ts.createTextSpanFromBounds(start, end), + textSpan: ts.createTextSpanFromNode(node, sourceFile), kind: "none" }; } @@ -64902,11 +65013,8 @@ var ts; } return parent ? scope.getSourceFile() : scope; } - function getPossibleSymbolReferencePositions(sourceFile, symbolName, container, fullStart) { + function getPossibleSymbolReferencePositions(sourceFile, symbolName, container) { if (container === void 0) { container = sourceFile; } - if (fullStart === void 0) { fullStart = false; } - var start = fullStart ? container.getFullStart() : container.getStart(sourceFile); - var end = container.getEnd(); var positions = []; if (!symbolName || !symbolName.length) { return positions; @@ -64914,9 +65022,9 @@ var ts; var text = sourceFile.text; var sourceLength = text.length; var symbolNameLength = symbolName.length; - var position = text.indexOf(symbolName, start); + var position = text.indexOf(symbolName, container.pos); while (position >= 0) { - if (position > end) + if (position > container.end) break; var endPosition = position + symbolNameLength; if ((position === 0 || !ts.isIdentifierPart(text.charCodeAt(position - 1), 5)) && @@ -64964,7 +65072,7 @@ var ts; return references.length ? [{ definition: { type: "keyword", node: references[0].node }, references: references }] : undefined; } function addReferencesForKeywordInFile(sourceFile, kind, searchText, references) { - var possiblePositions = getPossibleSymbolReferencePositions(sourceFile, searchText, sourceFile, true); + var possiblePositions = getPossibleSymbolReferencePositions(sourceFile, searchText, sourceFile); for (var _i = 0, possiblePositions_2 = possiblePositions; _i < possiblePositions_2.length; _i++) { var position = possiblePositions_2[_i]; var referenceLocation = ts.getTouchingPropertyName(sourceFile, position, true); @@ -64981,8 +65089,7 @@ var ts; if (!state.markSearchedSymbol(sourceFile, search.symbol)) { return; } - var fullStart = state.options.findInComments || container.jsDoc !== undefined || ts.forEach(search.symbol.declarations, function (d) { return d.kind === 291; }); - for (var _i = 0, _a = getPossibleSymbolReferencePositions(sourceFile, search.text, container, fullStart); _i < _a.length; _i++) { + for (var _i = 0, _a = getPossibleSymbolReferencePositions(sourceFile, search.text, container); _i < _a.length; _i++) { var position = _a[_i]; getReferencesAtLocation(sourceFile, position, search, state); } @@ -73283,7 +73390,7 @@ var ts; ts.servicesVersion = "0.5"; var ruleProvider; function createNode(kind, pos, end, parent) { - var node = kind >= 143 ? new NodeObject(kind, pos, end) : + var node = ts.isNodeKind(kind) ? new NodeObject(kind, pos, end) : kind === 71 ? new IdentifierObject(71, pos, end) : new TokenObject(kind, pos, end); node.parent = parent; @@ -73328,10 +73435,10 @@ var ts; } return sourceFile.text.substring(this.getStart(sourceFile), this.getEnd()); }; - NodeObject.prototype.addSyntheticNodes = function (nodes, pos, end, useJSDocScanner) { + NodeObject.prototype.addSyntheticNodes = function (nodes, pos, end) { ts.scanner.setTextPos(pos); while (pos < end) { - var token = useJSDocScanner ? ts.scanner.scanJSDocToken() : ts.scanner.scan(); + var token = ts.scanner.scan(); ts.Debug.assert(token !== 1); var textPos = ts.scanner.getTextPos(); if (textPos <= end) { @@ -73360,50 +73467,44 @@ var ts; }; NodeObject.prototype.createChildren = function (sourceFile) { var _this = this; - if (this.kind === 283 || ts.isJSDocTag(this)) { + if (!ts.isNodeKind(this.kind)) { + this._children = ts.emptyArray; + return; + } + if (ts.isJSDocCommentContainingNode(this)) { var children_3 = []; this.forEachChild(function (child) { children_3.push(child); }); this._children = children_3; + return; } - else if (this.kind >= 143) { - var children_4 = []; - ts.scanner.setText((sourceFile || this.getSourceFile()).text); - var pos_3 = this.pos; - var useJSDocScanner_1 = ts.isJSDocNode(this); - var processNode = function (node) { - var isJSDocTagNode = ts.isJSDocNode(node); - if (!isJSDocTagNode && pos_3 < node.pos) { - pos_3 = _this.addSyntheticNodes(children_4, pos_3, node.pos, useJSDocScanner_1); - } - children_4.push(node); - if (!isJSDocTagNode) { - pos_3 = node.end; - } - }; - var processNodes = function (nodes) { - if (pos_3 < nodes.pos) { - pos_3 = _this.addSyntheticNodes(children_4, pos_3, nodes.pos, useJSDocScanner_1); - } - children_4.push(_this.createSyntaxList(nodes)); - pos_3 = nodes.end; - }; - if (this.jsDoc) { - for (var _i = 0, _a = this.jsDoc; _i < _a.length; _i++) { - var jsDocComment = _a[_i]; - processNode(jsDocComment); - } + var children = []; + ts.scanner.setText((sourceFile || this.getSourceFile()).text); + var pos = this.pos; + var processNode = function (node) { + pos = _this.addSyntheticNodes(children, pos, node.pos); + children.push(node); + pos = node.end; + }; + var processNodes = function (nodes) { + if (pos < nodes.pos) { + pos = _this.addSyntheticNodes(children, pos, nodes.pos); } - pos_3 = this.pos; - ts.forEachChild(this, processNode, processNodes); - if (pos_3 < this.end) { - this.addSyntheticNodes(children_4, pos_3, this.end); + children.push(_this.createSyntaxList(nodes)); + pos = nodes.end; + }; + if (this.jsDoc) { + for (var _i = 0, _a = this.jsDoc; _i < _a.length; _i++) { + var jsDocComment = _a[_i]; + processNode(jsDocComment); } - ts.scanner.setText(undefined); - this._children = children_4; } - else { - this._children = ts.emptyArray; + pos = this.pos; + ts.forEachChild(this, processNode, processNodes); + if (pos < this.end) { + this.addSyntheticNodes(children, pos, this.end); } + ts.scanner.setText(undefined); + this._children = children; }; NodeObject.prototype.getChildCount = function (sourceFile) { if (!this._children) @@ -75320,7 +75421,7 @@ var ts; var compilerOptions = JSON.parse(compilerOptionsJson); var result = ts.resolveModuleName(moduleName, ts.normalizeSlashes(fileName), compilerOptions, _this.host); var resolvedFileName = result.resolvedModule ? result.resolvedModule.resolvedFileName : undefined; - if (result.resolvedModule && result.resolvedModule.extension !== ts.Extension.Ts && result.resolvedModule.extension !== ts.Extension.Tsx && result.resolvedModule.extension !== ts.Extension.Dts) { + if (result.resolvedModule && result.resolvedModule.extension !== ".ts" && result.resolvedModule.extension !== ".tsx" && result.resolvedModule.extension !== ".d.ts") { resolvedFileName = undefined; } return { @@ -78300,6 +78401,7 @@ var ts; if (!this.eventHandler) return; var data = { + projectId: this.host.createHash(projectKey), fileStats: server.countEachFileTypes(project.getScriptInfos()), compilerOptions: ts.convertCompilerOptionsForTelemetry(project.getCompilerOptions()), typeAcquisition: convertTypeAcquisition(project.getTypeAcquisition()), @@ -78994,6 +79096,7 @@ var ts; } return true; } + server.CommandNames = server.protocol.CommandTypes; function formatMessage(msg, logger, byteLength, newLine) { var verboseLogging = logger.hasLevel(server.LogLevel.verbose); var json = JSON.stringify(msg); @@ -79090,19 +79193,19 @@ var ts; var _this = this; this.changeSeq = 0; this.handlers = ts.createMapFromTemplate((_a = {}, - _a["openExternalProject"] = function (request) { + _a[server.CommandNames.OpenExternalProject] = function (request) { _this.projectService.openExternalProject(request.arguments, false); return _this.requiredResponse(true); }, - _a["openExternalProjects"] = function (request) { + _a[server.CommandNames.OpenExternalProjects] = function (request) { _this.projectService.openExternalProjects(request.arguments.projects); return _this.requiredResponse(true); }, - _a["closeExternalProject"] = function (request) { + _a[server.CommandNames.CloseExternalProject] = function (request) { _this.projectService.closeExternalProject(request.arguments.projectFileName); return _this.requiredResponse(true); }, - _a["synchronizeProjectList"] = function (request) { + _a[server.CommandNames.SynchronizeProjectList] = function (request) { var result = _this.projectService.synchronizeProjectList(request.arguments.knownProjects); if (!result.some(function (p) { return p.projectErrors && p.projectErrors.length !== 0; })) { return _this.requiredResponse(result); @@ -79120,219 +79223,219 @@ var ts; }); return _this.requiredResponse(converted); }, - _a["applyChangedToOpenFiles"] = function (request) { + _a[server.CommandNames.ApplyChangedToOpenFiles] = function (request) { _this.projectService.applyChangesInOpenFiles(request.arguments.openFiles, request.arguments.changedFiles, request.arguments.closedFiles); _this.changeSeq++; return _this.requiredResponse(true); }, - _a["exit"] = function () { + _a[server.CommandNames.Exit] = function () { _this.exit(); return _this.notRequired(); }, - _a["definition"] = function (request) { + _a[server.CommandNames.Definition] = function (request) { return _this.requiredResponse(_this.getDefinition(request.arguments, true)); }, - _a["definition-full"] = function (request) { + _a[server.CommandNames.DefinitionFull] = function (request) { return _this.requiredResponse(_this.getDefinition(request.arguments, false)); }, - _a["typeDefinition"] = function (request) { + _a[server.CommandNames.TypeDefinition] = function (request) { return _this.requiredResponse(_this.getTypeDefinition(request.arguments)); }, - _a["implementation"] = function (request) { + _a[server.CommandNames.Implementation] = function (request) { return _this.requiredResponse(_this.getImplementation(request.arguments, true)); }, - _a["implementation-full"] = function (request) { + _a[server.CommandNames.ImplementationFull] = function (request) { return _this.requiredResponse(_this.getImplementation(request.arguments, false)); }, - _a["references"] = function (request) { + _a[server.CommandNames.References] = function (request) { return _this.requiredResponse(_this.getReferences(request.arguments, true)); }, - _a["references-full"] = function (request) { + _a[server.CommandNames.ReferencesFull] = function (request) { return _this.requiredResponse(_this.getReferences(request.arguments, false)); }, - _a["rename"] = function (request) { + _a[server.CommandNames.Rename] = function (request) { return _this.requiredResponse(_this.getRenameLocations(request.arguments, true)); }, - _a["renameLocations-full"] = function (request) { + _a[server.CommandNames.RenameLocationsFull] = function (request) { return _this.requiredResponse(_this.getRenameLocations(request.arguments, false)); }, - _a["rename-full"] = function (request) { + _a[server.CommandNames.RenameInfoFull] = function (request) { return _this.requiredResponse(_this.getRenameInfo(request.arguments)); }, - _a["open"] = function (request) { + _a[server.CommandNames.Open] = function (request) { _this.openClientFile(server.toNormalizedPath(request.arguments.file), request.arguments.fileContent, server.convertScriptKindName(request.arguments.scriptKindName), request.arguments.projectRootPath ? server.toNormalizedPath(request.arguments.projectRootPath) : undefined); return _this.notRequired(); }, - _a["quickinfo"] = function (request) { + _a[server.CommandNames.Quickinfo] = function (request) { return _this.requiredResponse(_this.getQuickInfoWorker(request.arguments, true)); }, - _a["quickinfo-full"] = function (request) { + _a[server.CommandNames.QuickinfoFull] = function (request) { return _this.requiredResponse(_this.getQuickInfoWorker(request.arguments, false)); }, - _a["outliningSpans"] = function (request) { + _a[server.CommandNames.OutliningSpans] = function (request) { return _this.requiredResponse(_this.getOutliningSpans(request.arguments)); }, - _a["todoComments"] = function (request) { + _a[server.CommandNames.TodoComments] = function (request) { return _this.requiredResponse(_this.getTodoComments(request.arguments)); }, - _a["indentation"] = function (request) { + _a[server.CommandNames.Indentation] = function (request) { return _this.requiredResponse(_this.getIndentation(request.arguments)); }, - _a["nameOrDottedNameSpan"] = function (request) { + _a[server.CommandNames.NameOrDottedNameSpan] = function (request) { return _this.requiredResponse(_this.getNameOrDottedNameSpan(request.arguments)); }, - _a["breakpointStatement"] = function (request) { + _a[server.CommandNames.BreakpointStatement] = function (request) { return _this.requiredResponse(_this.getBreakpointStatement(request.arguments)); }, - _a["braceCompletion"] = function (request) { + _a[server.CommandNames.BraceCompletion] = function (request) { return _this.requiredResponse(_this.isValidBraceCompletion(request.arguments)); }, - _a["docCommentTemplate"] = function (request) { + _a[server.CommandNames.DocCommentTemplate] = function (request) { return _this.requiredResponse(_this.getDocCommentTemplate(request.arguments)); }, - _a["format"] = function (request) { + _a[server.CommandNames.Format] = function (request) { return _this.requiredResponse(_this.getFormattingEditsForRange(request.arguments)); }, - _a["formatonkey"] = function (request) { + _a[server.CommandNames.Formatonkey] = function (request) { return _this.requiredResponse(_this.getFormattingEditsAfterKeystroke(request.arguments)); }, - _a["format-full"] = function (request) { + _a[server.CommandNames.FormatFull] = function (request) { return _this.requiredResponse(_this.getFormattingEditsForDocumentFull(request.arguments)); }, - _a["formatonkey-full"] = function (request) { + _a[server.CommandNames.FormatonkeyFull] = function (request) { return _this.requiredResponse(_this.getFormattingEditsAfterKeystrokeFull(request.arguments)); }, - _a["formatRange-full"] = function (request) { + _a[server.CommandNames.FormatRangeFull] = function (request) { return _this.requiredResponse(_this.getFormattingEditsForRangeFull(request.arguments)); }, - _a["completions"] = function (request) { + _a[server.CommandNames.Completions] = function (request) { return _this.requiredResponse(_this.getCompletions(request.arguments, true)); }, - _a["completions-full"] = function (request) { + _a[server.CommandNames.CompletionsFull] = function (request) { return _this.requiredResponse(_this.getCompletions(request.arguments, false)); }, - _a["completionEntryDetails"] = function (request) { + _a[server.CommandNames.CompletionDetails] = function (request) { return _this.requiredResponse(_this.getCompletionEntryDetails(request.arguments)); }, - _a["compileOnSaveAffectedFileList"] = function (request) { + _a[server.CommandNames.CompileOnSaveAffectedFileList] = function (request) { return _this.requiredResponse(_this.getCompileOnSaveAffectedFileList(request.arguments)); }, - _a["compileOnSaveEmitFile"] = function (request) { + _a[server.CommandNames.CompileOnSaveEmitFile] = function (request) { return _this.requiredResponse(_this.emitFile(request.arguments)); }, - _a["signatureHelp"] = function (request) { + _a[server.CommandNames.SignatureHelp] = function (request) { return _this.requiredResponse(_this.getSignatureHelpItems(request.arguments, true)); }, - _a["signatureHelp-full"] = function (request) { + _a[server.CommandNames.SignatureHelpFull] = function (request) { return _this.requiredResponse(_this.getSignatureHelpItems(request.arguments, false)); }, - _a["compilerOptionsDiagnostics-full"] = function (request) { + _a[server.CommandNames.CompilerOptionsDiagnosticsFull] = function (request) { return _this.requiredResponse(_this.getCompilerOptionsDiagnostics(request.arguments)); }, - _a["encodedSemanticClassifications-full"] = function (request) { + _a[server.CommandNames.EncodedSemanticClassificationsFull] = function (request) { return _this.requiredResponse(_this.getEncodedSemanticClassifications(request.arguments)); }, - _a["cleanup"] = function () { + _a[server.CommandNames.Cleanup] = function () { _this.cleanup(); return _this.requiredResponse(true); }, - _a["semanticDiagnosticsSync"] = function (request) { + _a[server.CommandNames.SemanticDiagnosticsSync] = function (request) { return _this.requiredResponse(_this.getSemanticDiagnosticsSync(request.arguments)); }, - _a["syntacticDiagnosticsSync"] = function (request) { + _a[server.CommandNames.SyntacticDiagnosticsSync] = function (request) { return _this.requiredResponse(_this.getSyntacticDiagnosticsSync(request.arguments)); }, - _a["geterr"] = function (request) { + _a[server.CommandNames.Geterr] = function (request) { _this.errorCheck.startNew(function (next) { return _this.getDiagnostics(next, request.arguments.delay, request.arguments.files); }); return _this.notRequired(); }, - _a["geterrForProject"] = function (request) { + _a[server.CommandNames.GeterrForProject] = function (request) { _this.errorCheck.startNew(function (next) { return _this.getDiagnosticsForProject(next, request.arguments.delay, request.arguments.file); }); return _this.notRequired(); }, - _a["change"] = function (request) { + _a[server.CommandNames.Change] = function (request) { _this.change(request.arguments); return _this.notRequired(); }, - _a["configure"] = function (request) { + _a[server.CommandNames.Configure] = function (request) { _this.projectService.setHostConfiguration(request.arguments); - _this.output(undefined, "configure", request.seq); + _this.output(undefined, server.CommandNames.Configure, request.seq); return _this.notRequired(); }, - _a["reload"] = function (request) { + _a[server.CommandNames.Reload] = function (request) { _this.reload(request.arguments, request.seq); return _this.requiredResponse({ reloadFinished: true }); }, - _a["saveto"] = function (request) { + _a[server.CommandNames.Saveto] = function (request) { var savetoArgs = request.arguments; _this.saveToTmp(savetoArgs.file, savetoArgs.tmpfile); return _this.notRequired(); }, - _a["close"] = function (request) { + _a[server.CommandNames.Close] = function (request) { var closeArgs = request.arguments; _this.closeClientFile(closeArgs.file); return _this.notRequired(); }, - _a["navto"] = function (request) { + _a[server.CommandNames.Navto] = function (request) { return _this.requiredResponse(_this.getNavigateToItems(request.arguments, true)); }, - _a["navto-full"] = function (request) { + _a[server.CommandNames.NavtoFull] = function (request) { return _this.requiredResponse(_this.getNavigateToItems(request.arguments, false)); }, - _a["brace"] = function (request) { + _a[server.CommandNames.Brace] = function (request) { return _this.requiredResponse(_this.getBraceMatching(request.arguments, true)); }, - _a["brace-full"] = function (request) { + _a[server.CommandNames.BraceFull] = function (request) { return _this.requiredResponse(_this.getBraceMatching(request.arguments, false)); }, - _a["navbar"] = function (request) { + _a[server.CommandNames.NavBar] = function (request) { return _this.requiredResponse(_this.getNavigationBarItems(request.arguments, true)); }, - _a["navbar-full"] = function (request) { + _a[server.CommandNames.NavBarFull] = function (request) { return _this.requiredResponse(_this.getNavigationBarItems(request.arguments, false)); }, - _a["navtree"] = function (request) { + _a[server.CommandNames.NavTree] = function (request) { return _this.requiredResponse(_this.getNavigationTree(request.arguments, true)); }, - _a["navtree-full"] = function (request) { + _a[server.CommandNames.NavTreeFull] = function (request) { return _this.requiredResponse(_this.getNavigationTree(request.arguments, false)); }, - _a["occurrences"] = function (request) { + _a[server.CommandNames.Occurrences] = function (request) { return _this.requiredResponse(_this.getOccurrences(request.arguments)); }, - _a["documentHighlights"] = function (request) { + _a[server.CommandNames.DocumentHighlights] = function (request) { return _this.requiredResponse(_this.getDocumentHighlights(request.arguments, true)); }, - _a["documentHighlights-full"] = function (request) { + _a[server.CommandNames.DocumentHighlightsFull] = function (request) { return _this.requiredResponse(_this.getDocumentHighlights(request.arguments, false)); }, - _a["compilerOptionsForInferredProjects"] = function (request) { + _a[server.CommandNames.CompilerOptionsForInferredProjects] = function (request) { _this.setCompilerOptionsForInferredProjects(request.arguments); return _this.requiredResponse(true); }, - _a["projectInfo"] = function (request) { + _a[server.CommandNames.ProjectInfo] = function (request) { return _this.requiredResponse(_this.getProjectInfo(request.arguments)); }, - _a["reloadProjects"] = function () { + _a[server.CommandNames.ReloadProjects] = function () { _this.projectService.reloadProjects(); return _this.notRequired(); }, - _a["getCodeFixes"] = function (request) { + _a[server.CommandNames.GetCodeFixes] = function (request) { return _this.requiredResponse(_this.getCodeFixes(request.arguments, true)); }, - _a["getCodeFixes-full"] = function (request) { + _a[server.CommandNames.GetCodeFixesFull] = function (request) { return _this.requiredResponse(_this.getCodeFixes(request.arguments, false)); }, - _a["getSupportedCodeFixes"] = function () { + _a[server.CommandNames.GetSupportedCodeFixes] = function () { return _this.requiredResponse(_this.getSupportedCodeFixes()); }, - _a["getApplicableRefactors"] = function (request) { + _a[server.CommandNames.GetApplicableRefactors] = function (request) { return _this.requiredResponse(_this.getApplicableRefactors(request.arguments)); }, - _a["getEditsForRefactor"] = function (request) { + _a[server.CommandNames.GetEditsForRefactor] = function (request) { return _this.requiredResponse(_this.getEditsForRefactor(request.arguments, true)); }, - _a["getEditsForRefactor-full"] = function (request) { + _a[server.CommandNames.GetEditsForRefactorFull] = function (request) { return _this.requiredResponse(_this.getEditsForRefactor(request.arguments, false)); }, _a)); @@ -80180,7 +80283,7 @@ var ts; if (project) { this.changeSeq++; if (project.reloadScript(file, tempFileName)) { - this.output(undefined, "reload", reqSeq); + this.output(undefined, server.CommandNames.Reload, reqSeq); } } }; @@ -80521,7 +80624,7 @@ var ts; } else { this.logger.msg("Unrecognized JSON command: " + JSON.stringify(request), server.Msg.Err); - this.output(undefined, "unknown", request.seq, "Unrecognized JSON command: " + request.command); + this.output(undefined, server.CommandNames.Unknown, request.seq, "Unrecognized JSON command: " + request.command); return { responseRequired: false }; } }; @@ -80560,7 +80663,7 @@ var ts; return; } this.logError(err, message); - this.output(undefined, request ? request.command : "unknown", request ? request.seq : 0, "Error processing request. " + err.message + "\n" + err.stack); + this.output(undefined, request ? request.command : server.CommandNames.Unknown, request ? request.seq : 0, "Error processing request. " + err.message + "\n" + err.stack); } }; return Session; @@ -81423,6 +81526,7 @@ var ts; var childProcess = require("child_process"); var os = require("os"); function getGlobalTypingsCacheLocation() { + var versionMajorMinor = ts.version.match(/\d+\.\d+/)[0]; switch (process.platform) { case "win32": { var basePath = process.env.LOCALAPPDATA || @@ -81431,7 +81535,7 @@ var ts; process.env.USERPROFILE || (process.env.HOMEDRIVE && process.env.HOMEPATH && ts.normalizeSlashes(process.env.HOMEDRIVE + process.env.HOMEPATH)) || os.tmpdir(); - return ts.combinePaths(ts.normalizeSlashes(basePath), "Microsoft/TypeScript"); + return ts.combinePaths(ts.combinePaths(ts.normalizeSlashes(basePath), "Microsoft/TypeScript"), versionMajorMinor); } case "openbsd": case "freebsd": @@ -81439,7 +81543,7 @@ var ts; case "linux": case "android": { var cacheLocation = getNonWindowsCacheLocation(process.platform === "darwin"); - return ts.combinePaths(cacheLocation, "typescript"); + return ts.combinePaths(ts.combinePaths(cacheLocation, "typescript"), versionMajorMinor); } default: ts.Debug.fail("unsupported platform '" + process.platform + "'"); diff --git a/lib/tsserverlibrary.d.ts b/lib/tsserverlibrary.d.ts index 48afba08f40..18346bd4d02 100644 --- a/lib/tsserverlibrary.d.ts +++ b/lib/tsserverlibrary.d.ts @@ -54,7 +54,7 @@ declare namespace ts { pos: number; end: number; } - const enum SyntaxKind { + enum SyntaxKind { Unknown = 0, EndOfFileToken = 1, SingleLineCommentTrivia = 2, @@ -387,7 +387,7 @@ declare namespace ts { FirstJSDocTagNode = 284, LastJSDocTagNode = 294, } - const enum NodeFlags { + enum NodeFlags { None = 0, Let = 1, Const = 2, @@ -414,7 +414,7 @@ declare namespace ts { ContextFlags = 96256, TypeExcludesFlags = 20480, } - const enum ModifierFlags { + enum ModifierFlags { None = 0, Export = 1, Ambient = 2, @@ -434,7 +434,7 @@ declare namespace ts { TypeScriptModifier = 2270, ExportDefault = 513, } - const enum JsxFlags { + enum JsxFlags { None = 0, IntrinsicNamedElement = 1, IntrinsicIndexedElement = 2, @@ -1114,6 +1114,7 @@ declare namespace ts { condition?: Expression; incrementor?: Expression; } + type ForInOrOfStatement = ForInStatement | ForOfStatement; interface ForInStatement extends IterationStatement { kind: SyntaxKind.ForInStatement; initializer: ForInitializer; @@ -1187,7 +1188,7 @@ declare namespace ts { variableDeclaration: VariableDeclaration; block: Block; } - type DeclarationWithTypeParameters = SignatureDeclaration | ClassLikeDeclaration | InterfaceDeclaration | TypeAliasDeclaration; + type DeclarationWithTypeParameters = SignatureDeclaration | ClassLikeDeclaration | InterfaceDeclaration | TypeAliasDeclaration | JSDocTemplateTag; interface ClassLikeDeclaration extends NamedDeclaration { name?: Identifier; typeParameters?: NodeArray; @@ -1485,7 +1486,7 @@ declare namespace ts { name: Identifier; isBracketed: boolean; } - const enum FlowFlags { + enum FlowFlags { Unreachable = 1, Start = 2, BranchLabel = 4, @@ -1732,7 +1733,7 @@ declare namespace ts { reportInaccessibleThisError(): void; reportPrivateInBaseOfClassExpression(propertyName: string): void; } - const enum TypeFormatFlags { + enum TypeFormatFlags { None = 0, WriteArrayAsGenericType = 1, UseTypeOfFunction = 4, @@ -1749,12 +1750,12 @@ declare namespace ts { AddUndefined = 8192, WriteClassExpressionAsTypeLiteral = 16384, } - const enum SymbolFormatFlags { + enum SymbolFormatFlags { None = 0, WriteTypeParametersOrArguments = 1, UseOnlyExternalAliasing = 2, } - const enum TypePredicateKind { + enum TypePredicateKind { This = 0, Identifier = 1, } @@ -1771,7 +1772,7 @@ declare namespace ts { parameterIndex: number; } type TypePredicate = IdentifierTypePredicate | ThisTypePredicate; - const enum SymbolFlags { + enum SymbolFlags { None = 0, FunctionScopedVariable = 1, BlockScopedVariable = 2, @@ -1845,7 +1846,7 @@ declare namespace ts { globalExports?: SymbolTable; } type SymbolTable = Map; - const enum TypeFlags { + enum TypeFlags { Any = 1, String = 2, Number = 4, @@ -1902,7 +1903,7 @@ declare namespace ts { } interface EnumType extends Type { } - const enum ObjectFlags { + enum ObjectFlags { Class = 1, Interface = 2, Reference = 4, @@ -1964,7 +1965,7 @@ declare namespace ts { interface IndexType extends Type { type: TypeVariable | UnionOrIntersectionType; } - const enum SignatureKind { + enum SignatureKind { Call = 0, Construct = 1, } @@ -1973,7 +1974,7 @@ declare namespace ts { typeParameters?: TypeParameter[]; parameters: Symbol[]; } - const enum IndexKind { + enum IndexKind { String = 0, Number = 1, } @@ -1982,7 +1983,7 @@ declare namespace ts { isReadonly: boolean; declaration?: SignatureDeclaration; } - const enum InferencePriority { + enum InferencePriority { NakedTypeVariable = 1, MappedType = 2, ReturnType = 4, @@ -1995,7 +1996,7 @@ declare namespace ts { topLevel: boolean; isFixed: boolean; } - const enum InferenceFlags { + enum InferenceFlags { InferUnionTypes = 1, NoDefault = 2, AnyDefault = 4, @@ -2075,6 +2076,7 @@ declare namespace ts { noImplicitAny?: boolean; noImplicitReturns?: boolean; noImplicitThis?: boolean; + noStrictGenericChecks?: boolean; noUnusedLocals?: boolean; noUnusedParameters?: boolean; noImplicitUseStrict?: boolean; @@ -2130,13 +2132,13 @@ declare namespace ts { ES2015 = 5, ESNext = 6, } - const enum JsxEmit { + enum JsxEmit { None = 0, Preserve = 1, React = 2, ReactNative = 3, } - const enum NewLineKind { + enum NewLineKind { CarriageReturnLineFeed = 0, LineFeed = 1, } @@ -2144,7 +2146,7 @@ declare namespace ts { line: number; character: number; } - const enum ScriptKind { + enum ScriptKind { Unknown = 0, JS = 1, JSX = 2, @@ -2152,7 +2154,7 @@ declare namespace ts { TSX = 4, External = 5, } - const enum ScriptTarget { + enum ScriptTarget { ES3 = 0, ES5 = 1, ES2015 = 2, @@ -2161,7 +2163,7 @@ declare namespace ts { ESNext = 5, Latest = 5, } - const enum LanguageVariant { + enum LanguageVariant { Standard = 0, JSX = 1, } @@ -2174,7 +2176,7 @@ declare namespace ts { wildcardDirectories?: MapLike; compileOnSave?: boolean; } - const enum WatchDirectoryFlags { + enum WatchDirectoryFlags { None = 0, Recursive = 1, } @@ -2199,12 +2201,11 @@ declare namespace ts { extension: Extension; } enum Extension { - Ts = 0, - Tsx = 1, - Dts = 2, - Js = 3, - Jsx = 4, - LastTypeScriptExtension = 2, + Ts = ".ts", + Tsx = ".tsx", + Dts = ".d.ts", + Js = ".js", + Jsx = ".jsx", } interface ResolvedModuleWithFailedLookupLocations { resolvedModule: ResolvedModuleFull | undefined; @@ -2241,7 +2242,7 @@ declare namespace ts { text: string; skipTrivia?: (pos: number) => number; } - const enum EmitFlags { + enum EmitFlags { SingleLine = 1, AdviseOnEmitNode = 2, NoSubstitution = 4, @@ -2277,7 +2278,7 @@ declare namespace ts { readonly text: string; readonly priority?: number; } - const enum EmitHint { + enum EmitHint { SourceFile = 0, Expression = 1, IdentifierName = 2, @@ -2338,7 +2339,7 @@ declare namespace ts { } } declare namespace ts { - const version = "2.4.0"; + const version = "2.4.1"; } declare function setTimeout(handler: (...args: any[]) => void, timeout: number): any; declare function clearTimeout(handle: any): void; @@ -2533,7 +2534,7 @@ declare namespace ts { function isIdentifier(node: Node): node is Identifier; function isQualifiedName(node: Node): node is QualifiedName; function isComputedPropertyName(node: Node): node is ComputedPropertyName; - function isTypeParameter(node: Node): node is TypeParameterDeclaration; + function isTypeParameterDeclaration(node: Node): node is TypeParameterDeclaration; function isParameter(node: Node): node is ParameterDeclaration; function isDecorator(node: Node): node is Decorator; function isPropertySignature(node: Node): node is PropertySignature; @@ -2706,6 +2707,7 @@ declare namespace ts { function isIterationStatement(node: Node, lookInLabeledStatements: boolean): node is IterationStatement; function isJsxOpeningLikeElement(node: Node): node is JsxOpeningLikeElement; function isCaseOrDefaultClause(node: Node): node is CaseOrDefaultClause; + function isJSDocCommentContainingNode(node: Node): boolean; } declare namespace ts { function createNodeArray(elements?: T[], hasTrailingComma?: boolean): NodeArray; @@ -3291,7 +3293,7 @@ declare namespace ts { fileName: string; highlightSpans: HighlightSpan[]; } - const enum HighlightSpanKind { + enum HighlightSpanKind { none = "none", definition = "definition", reference = "reference", @@ -3486,7 +3488,7 @@ declare namespace ts { outputFiles: OutputFile[]; emitSkipped: boolean; } - const enum OutputFileType { + enum OutputFileType { JavaScript = 0, SourceMap = 1, Declaration = 2, @@ -3496,7 +3498,7 @@ declare namespace ts { writeByteOrderMark: boolean; text: string; } - const enum EndOfLineState { + enum EndOfLineState { None = 0, InMultiLineCommentTrivia = 1, InSingleQuoteStringLiteral = 2, @@ -3528,7 +3530,7 @@ declare namespace ts { getClassificationsForLine(text: string, lexState: EndOfLineState, syntacticClassifierAbsent: boolean): ClassificationResult; getEncodedLexicalClassifications(text: string, endOfLineState: EndOfLineState, syntacticClassifierAbsent: boolean): Classifications; } - const enum ScriptElementKind { + enum ScriptElementKind { unknown = "", warning = "warning", keyword = "keyword", @@ -3563,7 +3565,7 @@ declare namespace ts { externalModuleName = "external module name", jsxAttribute = "JSX attribute", } - const enum ScriptElementKindModifier { + enum ScriptElementKindModifier { none = "", publicMemberModifier = "public", privateMemberModifier = "private", @@ -3573,7 +3575,7 @@ declare namespace ts { staticModifier = "static", abstractModifier = "abstract", } - const enum ClassificationTypeNames { + enum ClassificationTypeNames { comment = "comment", identifier = "identifier", keyword = "keyword", @@ -3598,7 +3600,7 @@ declare namespace ts { jsxText = "jsx text", jsxAttributeStringLiteralValue = "jsx attribute string literal value", } - const enum ClassificationType { + enum ClassificationType { comment = 1, identifier = 2, keyword = 3, @@ -3858,7 +3860,7 @@ declare namespace ts.server { } } declare namespace ts.server.protocol { - const enum CommandTypes { + enum CommandTypes { Brace = "brace", BraceCompletion = "braceCompletion", Change = "change", @@ -4597,7 +4599,7 @@ declare namespace ts.server.protocol { interface NavTreeResponse extends Response { body?: NavigationTree; } - const enum IndentStyle { + enum IndentStyle { None = "None", Block = "Block", Smart = "Smart", @@ -4694,13 +4696,13 @@ declare namespace ts.server.protocol { typeRoots?: string[]; [option: string]: CompilerOptionsValue | undefined; } - const enum JsxEmit { + enum JsxEmit { None = "None", Preserve = "Preserve", ReactNative = "ReactNative", React = "React", } - const enum ModuleKind { + enum ModuleKind { None = "None", CommonJS = "CommonJS", AMD = "AMD", @@ -4709,15 +4711,15 @@ declare namespace ts.server.protocol { ES6 = "ES6", ES2015 = "ES2015", } - const enum ModuleResolutionKind { + enum ModuleResolutionKind { Classic = "Classic", Node = "Node", } - const enum NewLineKind { + enum NewLineKind { Crlf = "Crlf", Lf = "Lf", } - const enum ScriptTarget { + enum ScriptTarget { ES3 = "ES3", ES5 = "ES5", ES6 = "ES6", @@ -4737,7 +4739,8 @@ declare namespace ts.server { interface EventSender { event(payload: T, eventName: string): void; } - export import CommandNames = protocol.CommandTypes; + type CommandNames = protocol.CommandTypes; + const CommandNames: any; function formatMessage(msg: T, logger: server.Logger, byteLength: (s: string, encoding: string) => number, newLine: string): string; interface SessionOptions { host: ServerHost; @@ -5308,6 +5311,7 @@ declare namespace ts.server { readonly data: ProjectInfoTelemetryEventData; } interface ProjectInfoTelemetryEventData { + readonly projectId: string; readonly fileStats: FileStats; readonly compilerOptions: ts.CompilerOptions; readonly extends: boolean | undefined; diff --git a/lib/tsserverlibrary.js b/lib/tsserverlibrary.js index eb4a2b0ca78..42ef6180d2c 100644 --- a/lib/tsserverlibrary.js +++ b/lib/tsserverlibrary.js @@ -954,12 +954,11 @@ var ts; })(CharacterCodes = ts.CharacterCodes || (ts.CharacterCodes = {})); var Extension; (function (Extension) { - Extension[Extension["Ts"] = 0] = "Ts"; - Extension[Extension["Tsx"] = 1] = "Tsx"; - Extension[Extension["Dts"] = 2] = "Dts"; - Extension[Extension["Js"] = 3] = "Js"; - Extension[Extension["Jsx"] = 4] = "Jsx"; - Extension[Extension["LastTypeScriptExtension"] = 2] = "LastTypeScriptExtension"; + Extension["Ts"] = ".ts"; + Extension["Tsx"] = ".tsx"; + Extension["Dts"] = ".d.ts"; + Extension["Js"] = ".js"; + Extension["Jsx"] = ".jsx"; })(Extension = ts.Extension || (ts.Extension = {})); var TransformFlags; (function (TransformFlags) { @@ -1145,7 +1144,7 @@ var ts; })(ts || (ts = {})); var ts; (function (ts) { - ts.version = "2.4.0"; + ts.version = "2.4.1"; })(ts || (ts = {})); (function (ts) { var Ternary; @@ -3152,7 +3151,7 @@ var ts; } ts.positionIsSynthesized = positionIsSynthesized; function extensionIsTypeScript(ext) { - return ext <= ts.Extension.LastTypeScriptExtension; + return ext === ".ts" || ext === ".tsx" || ext === ".d.ts"; } ts.extensionIsTypeScript = extensionIsTypeScript; function extensionFromPath(path) { @@ -3164,21 +3163,7 @@ var ts; } ts.extensionFromPath = extensionFromPath; function tryGetExtensionFromPath(path) { - if (fileExtensionIs(path, ".d.ts")) { - return ts.Extension.Dts; - } - if (fileExtensionIs(path, ".ts")) { - return ts.Extension.Ts; - } - if (fileExtensionIs(path, ".tsx")) { - return ts.Extension.Tsx; - } - if (fileExtensionIs(path, ".js")) { - return ts.Extension.Js; - } - if (fileExtensionIs(path, ".jsx")) { - return ts.Extension.Jsx; - } + return find(ts.supportedTypescriptExtensionsForExtractExtension, function (e) { return fileExtensionIs(path, e); }) || find(ts.supportedJavascriptExtensions, function (e) { return fileExtensionIs(path, e); }); } ts.tryGetExtensionFromPath = tryGetExtensionFromPath; function isCheckJsEnabledForFile(sourceFile, compilerOptions) { @@ -4383,6 +4368,7 @@ var ts; Scoped_package_detected_looking_in_0: { code: 6182, category: ts.DiagnosticCategory.Message, key: "Scoped_package_detected_looking_in_0_6182", message: "Scoped package detected, looking in '{0}'" }, Reusing_resolution_of_module_0_to_file_1_from_old_program: { code: 6183, category: ts.DiagnosticCategory.Message, key: "Reusing_resolution_of_module_0_to_file_1_from_old_program_6183", message: "Reusing resolution of module '{0}' to file '{1}' from old program." }, Reusing_module_resolutions_originating_in_0_since_resolutions_are_unchanged_from_old_program: { code: 6184, category: ts.DiagnosticCategory.Message, key: "Reusing_module_resolutions_originating_in_0_since_resolutions_are_unchanged_from_old_program_6184", message: "Reusing module resolutions originating in '{0}' since resolutions are unchanged from old program." }, + Disable_strict_checking_of_generic_signatures_in_function_types: { code: 6185, category: ts.DiagnosticCategory.Message, key: "Disable_strict_checking_of_generic_signatures_in_function_types_6185", message: "Disable strict checking of generic signatures in function types." }, Variable_0_implicitly_has_an_1_type: { code: 7005, category: ts.DiagnosticCategory.Error, key: "Variable_0_implicitly_has_an_1_type_7005", message: "Variable '{0}' implicitly has an '{1}' type." }, Parameter_0_implicitly_has_an_1_type: { code: 7006, category: ts.DiagnosticCategory.Error, key: "Parameter_0_implicitly_has_an_1_type_7006", message: "Parameter '{0}' implicitly has an '{1}' type." }, Member_0_implicitly_has_an_1_type: { code: 7008, category: ts.DiagnosticCategory.Error, key: "Member_0_implicitly_has_an_1_type_7008", message: "Member '{0}' implicitly has an '{1}' type." }, @@ -6654,6 +6640,12 @@ var ts; category: ts.Diagnostics.Advanced_Options, description: ts.Diagnostics.The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files }, + { + name: "noStrictGenericChecks", + type: "boolean", + category: ts.Diagnostics.Advanced_Options, + description: ts.Diagnostics.Disable_strict_checking_of_generic_signatures_in_function_types, + }, { name: "plugins", type: "list", @@ -8011,14 +8003,14 @@ var ts; } switch (extensions) { case Extensions.DtsOnly: - return tryExtension(".d.ts", ts.Extension.Dts); + return tryExtension(".d.ts"); case Extensions.TypeScript: - return tryExtension(".ts", ts.Extension.Ts) || tryExtension(".tsx", ts.Extension.Tsx) || tryExtension(".d.ts", ts.Extension.Dts); + return tryExtension(".ts") || tryExtension(".tsx") || tryExtension(".d.ts"); case Extensions.JavaScript: - return tryExtension(".js", ts.Extension.Js) || tryExtension(".jsx", ts.Extension.Jsx); + return tryExtension(".js") || tryExtension(".jsx"); } - function tryExtension(ext, extension) { - var path = tryFile(candidate + ext, failedLookupLocations, onlyRecordFailures, state); + function tryExtension(extension) { + var path = tryFile(candidate + extension, failedLookupLocations, onlyRecordFailures, state); return path && { path: path, extension: extension }; } } @@ -8088,11 +8080,11 @@ var ts; function extensionIsOk(extensions, extension) { switch (extensions) { case Extensions.JavaScript: - return extension === ts.Extension.Js || extension === ts.Extension.Jsx; + return extension === ".js" || extension === ".jsx"; case Extensions.TypeScript: - return extension === ts.Extension.Ts || extension === ts.Extension.Tsx || extension === ts.Extension.Dts; + return extension === ".ts" || extension === ".tsx" || extension === ".d.ts"; case Extensions.DtsOnly: - return extension === ts.Extension.Dts; + return extension === ".d.ts"; } } function pathToPackageJson(directory) { @@ -9552,6 +9544,12 @@ var ts; }); } ts.getParameterFromJSDoc = getParameterFromJSDoc; + function getTypeParameterFromJsDoc(node) { + var name = node.name.text; + var typeParameters = node.parent.parent.parent.typeParameters; + return ts.find(typeParameters, function (p) { return p.name.text === name; }); + } + ts.getTypeParameterFromJsDoc = getTypeParameterFromJsDoc; function getJSDocType(node) { var tag = getFirstJSDocTag(node, 289); if (!tag && node.kind === 146) { @@ -9575,6 +9573,11 @@ var ts; return getFirstJSDocTag(node, 288); } ts.getJSDocReturnTag = getJSDocReturnTag; + function getJSDocReturnType(node) { + var returnTag = getJSDocReturnTag(node); + return returnTag && returnTag.typeExpression && returnTag.typeExpression.type; + } + ts.getJSDocReturnType = getJSDocReturnType; function getJSDocTemplateTag(node) { return getFirstJSDocTag(node, 290); } @@ -10474,12 +10477,16 @@ var ts; }); } ts.getFirstConstructorWithBody = getFirstConstructorWithBody; - function getSetAccessorTypeAnnotationNode(accessor) { + function getSetAccessorValueParameter(accessor) { if (accessor && accessor.parameters.length > 0) { var hasThis = accessor.parameters.length === 2 && parameterIsThisKeyword(accessor.parameters[0]); - return accessor.parameters[hasThis ? 1 : 0].type; + return accessor.parameters[hasThis ? 1 : 0]; } } + function getSetAccessorTypeAnnotationNode(accessor) { + var parameter = getSetAccessorValueParameter(accessor); + return parameter && parameter.type; + } ts.getSetAccessorTypeAnnotationNode = getSetAccessorTypeAnnotationNode; function getThisParameter(signature) { if (signature.parameters.length) { @@ -10550,6 +10557,39 @@ var ts; }; } ts.getAllAccessorDeclarations = getAllAccessorDeclarations; + function getEffectiveTypeAnnotationNode(node) { + if (node.type) { + return node.type; + } + if (node.flags & 65536) { + return getJSDocType(node); + } + } + ts.getEffectiveTypeAnnotationNode = getEffectiveTypeAnnotationNode; + function getEffectiveReturnTypeNode(node) { + if (node.type) { + return node.type; + } + if (node.flags & 65536) { + return getJSDocReturnType(node); + } + } + ts.getEffectiveReturnTypeNode = getEffectiveReturnTypeNode; + function getEffectiveTypeParameterDeclarations(node) { + if (node.typeParameters) { + return node.typeParameters; + } + if (node.flags & 65536) { + var templateTag = getJSDocTemplateTag(node); + return templateTag && templateTag.typeParameters; + } + } + ts.getEffectiveTypeParameterDeclarations = getEffectiveTypeParameterDeclarations; + function getEffectiveSetAccessorTypeAnnotationNode(node) { + var parameter = getSetAccessorValueParameter(node); + return parameter && getEffectiveTypeAnnotationNode(parameter); + } + ts.getEffectiveSetAccessorTypeAnnotationNode = getEffectiveSetAccessorTypeAnnotationNode; function emitNewLineBeforeLeadingComments(lineMap, writer, node, leadingComments) { emitNewLineBeforeLeadingCommentsOfPosition(lineMap, writer, node.pos, leadingComments); } @@ -11531,10 +11571,10 @@ var ts; return node.kind === 144; } ts.isComputedPropertyName = isComputedPropertyName; - function isTypeParameter(node) { + function isTypeParameterDeclaration(node) { return node.kind === 145; } - ts.isTypeParameter = isTypeParameter; + ts.isTypeParameterDeclaration = isTypeParameterDeclaration; function isParameter(node) { return node.kind === 146; } @@ -12125,6 +12165,14 @@ var ts; ts.isJSDocLiteralType = isJSDocLiteralType; })(ts || (ts = {})); (function (ts) { + function isNode(node) { + return isNodeKind(node.kind); + } + ts.isNode = isNode; + function isNodeKind(kind) { + return kind >= 143; + } + ts.isNodeKind = isNodeKind; function isToken(n) { return n.kind >= 0 && n.kind <= 142; } @@ -12469,6 +12517,10 @@ var ts; return false; } ts.isIterationStatement = isIterationStatement; + function isForInOrOfStatement(node) { + return node.kind === 215 || node.kind === 216; + } + ts.isForInOrOfStatement = isForInOrOfStatement; function isConciseBody(node) { return ts.isBlock(node) || isExpression(node); @@ -12583,6 +12635,9 @@ var ts; || kind === 299; } function isDeclaration(node) { + if (node.kind === 145) { + return node.parent.kind !== 290 || ts.isInJavaScriptFile(node); + } return isDeclarationKind(node.kind); } ts.isDeclaration = isDeclaration; @@ -12651,6 +12706,10 @@ var ts; return node.kind >= 267 && node.kind <= 294; } ts.isJSDocNode = isJSDocNode; + function isJSDocCommentContainingNode(node) { + return node.kind === 283 || isJSDocTag(node); + } + ts.isJSDocCommentContainingNode = isJSDocCommentContainingNode; function isJSDocTag(node) { return node.kind >= 284 && node.kind <= 294; } @@ -16207,7 +16266,7 @@ var ts; else if (kind === 71) { return new (IdentifierConstructor || (IdentifierConstructor = ts.objectAllocator.getIdentifierConstructor()))(kind, pos, end); } - else if (kind < 143) { + else if (!ts.isNodeKind(kind)) { return new (TokenConstructor || (TokenConstructor = ts.objectAllocator.getTokenConstructor()))(kind, pos, end); } else { @@ -17016,7 +17075,7 @@ var ts; if (!(pos >= 0)) { pos = scanner.getStartPos(); } - return kind >= 143 ? new NodeConstructor(kind, pos, pos) : + return ts.isNodeKind(kind) ? new NodeConstructor(kind, pos, pos) : kind === 71 ? new IdentifierConstructor(kind, pos, pos) : new TokenConstructor(kind, pos, pos); } @@ -21179,7 +21238,7 @@ var ts; jsDocNamespaceNode.flags |= flags; jsDocNamespaceNode.name = typeNameOrNamespaceName; jsDocNamespaceNode.body = parseJSDocTypeNameWithNamespace(4); - return jsDocNamespaceNode; + return finishNode(jsDocNamespaceNode); } if (typeNameOrNamespaceName && flags & 4) { typeNameOrNamespaceName.isInJSDocNamespace = true; @@ -22630,7 +22689,7 @@ var ts; } function bindVariableDeclarationFlow(node) { bindEachChild(node); - if (node.initializer || node.parent.parent.kind === 215 || node.parent.parent.kind === 216) { + if (node.initializer || ts.isForInOrOfStatement(node.parent.parent)) { bindInitializedVariableFlow(node); } } @@ -23154,7 +23213,10 @@ var ts; case 158: return checkTypePredicate(node); case 145: - return declareSymbolAndAddToSymbolTable(node, 262144, 530920); + if (node.parent.kind !== 290 || ts.isInJavaScriptFile(node)) { + return declareSymbolAndAddToSymbolTable(node, 262144, 530920); + } + return; case 146: return bindParameter(node); case 226: @@ -23225,7 +23287,10 @@ var ts; case 232: return bindEnumDeclaration(node); case 233: - return bindModuleDeclaration(node); + if (node.parent.kind !== 291 || ts.isInJavaScriptFile(node)) { + return bindModuleDeclaration(node); + } + return undefined; case 254: return bindJsxAttributes(node); case 253: @@ -24930,14 +24995,7 @@ var ts; } break; } - switch (declaration.parent.parent.kind) { - case 215: - case 216: - if (isSameScopeDescendentOf(usage, declaration.parent.parent.expression, container)) { - return true; - } - } - return false; + return ts.isForInOrOfStatement(declaration.parent.parent) && isSameScopeDescendentOf(usage, declaration.parent.parent.expression, container); } function isUsedInFunctionOrInstanceProperty(usage, declaration, container) { return !!ts.findAncestor(usage, function (current) { @@ -27623,12 +27681,6 @@ var ts; return strictNullChecks && optional ? getNullableType(type, 2048) : type; } function getTypeForVariableLikeDeclaration(declaration, includeOptionality) { - if (declaration.flags & 65536) { - var type = getTypeForDeclarationFromJSDocComment(declaration); - if (type && type !== unknownType) { - return type; - } - } if (declaration.parent.parent.kind === 215) { var indexType = getIndexType(checkNonNullExpression(declaration.parent.parent.expression)); return indexType.flags & (16384 | 262144) ? indexType : stringType; @@ -27640,8 +27692,9 @@ var ts; if (ts.isBindingPattern(declaration.parent)) { return getTypeForBindingElement(declaration); } - if (declaration.type) { - var declaredType = getTypeFromTypeNode(declaration.type); + var typeNode = ts.getEffectiveTypeAnnotationNode(declaration); + if (typeNode) { + var declaredType = getTypeFromTypeNode(typeNode); return addOptionality(declaredType, declaration.questionToken && includeOptionality); } if ((noImplicitAny || declaration.flags & 65536) && @@ -27855,10 +27908,11 @@ var ts; function getAnnotatedAccessorType(accessor) { if (accessor) { if (accessor.kind === 153) { - return accessor.type && getTypeFromTypeNode(accessor.type); + var getterTypeAnnotation = ts.getEffectiveReturnTypeNode(accessor); + return getterTypeAnnotation && getTypeFromTypeNode(getterTypeAnnotation); } else { - var setterTypeAnnotation = ts.getSetAccessorTypeAnnotationNode(accessor); + var setterTypeAnnotation = ts.getEffectiveSetAccessorTypeAnnotationNode(accessor); return setterTypeAnnotation && getTypeFromTypeNode(setterTypeAnnotation); } } @@ -27987,7 +28041,7 @@ var ts; return links.type; } function reportCircularityError(symbol) { - if (symbol.valueDeclaration.type) { + if (ts.getEffectiveTypeAnnotationNode(symbol.valueDeclaration)) { error(symbol.valueDeclaration, ts.Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, symbolToString(symbol)); return unknownType; } @@ -28489,11 +28543,15 @@ var ts; return false; } function isIndependentVariableLikeDeclaration(node) { - return node.type && isIndependentType(node.type) || !node.type && !node.initializer; + var typeNode = ts.getEffectiveTypeAnnotationNode(node); + return typeNode ? isIndependentType(typeNode) : !node.initializer; } function isIndependentFunctionLikeDeclaration(node) { - if (node.kind !== 152 && (!node.type || !isIndependentType(node.type))) { - return false; + if (node.kind !== 152) { + var typeNode = ts.getEffectiveReturnTypeNode(node); + if (!typeNode || !isIndependentType(typeNode)) { + return false; + } } for (var _i = 0, _a = node.parameters; _i < _a.length; _i++) { var parameter = _a[_i]; @@ -29100,7 +29158,7 @@ var ts; typeParameter.default = targetDefault ? instantiateType(targetDefault, typeParameter.mapper) : noConstraintType; } else { - var defaultDeclaration = typeParameter.symbol && ts.forEach(typeParameter.symbol.declarations, function (decl) { return ts.isTypeParameter(decl) && decl.default; }); + var defaultDeclaration = typeParameter.symbol && ts.forEach(typeParameter.symbol.declarations, function (decl) { return ts.isTypeParameterDeclaration(decl) && decl.default; }); typeParameter.default = defaultDeclaration ? getTypeFromTypeNode(defaultDeclaration) : noConstraintType; } } @@ -29259,20 +29317,14 @@ var ts; } return undefined; } - function getTypeParametersFromJSDocTemplate(declaration) { - if (declaration.flags & 65536) { - var templateTag = ts.getJSDocTemplateTag(declaration); - if (templateTag) { - return getTypeParametersFromDeclaration(templateTag.typeParameters); - } - } - return undefined; - } - function getTypeParametersFromDeclaration(typeParameterDeclarations) { - var result = []; - ts.forEach(typeParameterDeclarations, function (node) { + function getTypeParametersFromDeclaration(declaration) { + var result; + ts.forEach(ts.getEffectiveTypeParameterDeclarations(declaration), function (node) { var tp = getDeclaredTypeOfTypeParameter(node.symbol); if (!ts.contains(result, tp)) { + if (!result) { + result = []; + } result.push(tp); } }); @@ -29429,9 +29481,7 @@ var ts; var classType = declaration.kind === 152 ? getDeclaredTypeOfClassOrInterface(getMergedSymbol(declaration.parent.symbol)) : undefined; - var typeParameters = classType ? classType.localTypeParameters : - declaration.typeParameters ? getTypeParametersFromDeclaration(declaration.typeParameters) : - getTypeParametersFromJSDocTemplate(declaration); + var typeParameters = classType ? classType.localTypeParameters : getTypeParametersFromDeclaration(declaration); var returnType = getSignatureReturnTypeFromDeclaration(declaration, isJSConstructSignature, classType); var typePredicate = declaration.type && declaration.type.kind === 158 ? createTypePredicateFromTypePredicateNode(declaration.type) : @@ -29455,14 +29505,9 @@ var ts; else if (classType) { return classType; } - else if (declaration.type) { - return getTypeFromTypeNode(declaration.type); - } - if (declaration.flags & 65536) { - var type = getReturnTypeFromJSDocComment(declaration); - if (type && type !== unknownType) { - return type; - } + var typeNode = ts.getEffectiveReturnTypeNode(declaration); + if (typeNode) { + return getTypeFromTypeNode(typeNode); } if (declaration.kind === 153 && !ts.hasDynamicName(declaration)) { var setter = ts.getDeclarationOfKind(declaration.symbol, 154); @@ -29799,27 +29844,44 @@ var ts; } return undefined; } - function resolveTypeReferenceName(typeReferenceName) { + function resolveTypeReferenceName(typeReferenceName, meaning) { if (!typeReferenceName) { return unknownSymbol; } - return resolveEntityName(typeReferenceName, 793064) || unknownSymbol; + return resolveEntityName(typeReferenceName, meaning) || unknownSymbol; } function getTypeReferenceType(node, symbol) { var typeArguments = typeArgumentsFromTypeReferenceNode(node); if (symbol === unknownSymbol) { return unknownType; } + var type = getTypeReferenceTypeWorker(node, symbol, typeArguments); + if (type) { + return type; + } + if (symbol.flags & 107455 && node.kind === 277) { + var valueType = getTypeOfSymbol(symbol); + if (valueType.symbol && !isInferredClassType(valueType)) { + var referenceType = getTypeReferenceTypeWorker(node, valueType.symbol, typeArguments); + if (referenceType) { + return referenceType; + } + } + resolveTypeReferenceName(getTypeReferenceName(node), 793064); + return valueType; + } + return getTypeFromNonGenericTypeReference(node, symbol); + } + function getTypeReferenceTypeWorker(node, symbol, typeArguments) { if (symbol.flags & (32 | 64)) { return getTypeFromClassOrInterfaceReference(node, symbol, typeArguments); } if (symbol.flags & 524288) { return getTypeFromTypeAliasReference(node, symbol, typeArguments); } - if (symbol.flags & 107455 && node.kind === 277) { - return getTypeOfSymbol(symbol); + if (symbol.flags & 16 && node.kind === 277 && (symbol.members || ts.getJSDocClassTag(symbol.valueDeclaration))) { + return getInferredClassType(symbol); } - return getTypeFromNonGenericTypeReference(node, symbol); } function getPrimitiveTypeFromJSDocTypeReference(node) { if (ts.isIdentifier(node.name)) { @@ -29859,21 +29921,13 @@ var ts; if (!links.resolvedType) { var symbol = void 0; var type = void 0; + var meaning = 793064; if (node.kind === 277) { type = getPrimitiveTypeFromJSDocTypeReference(node); - if (!type) { - var typeReferenceName = getTypeReferenceName(node); - symbol = resolveTypeReferenceName(typeReferenceName); - type = getTypeReferenceType(node, symbol); - } + meaning |= 107455; } - else { - var typeNameOrExpression = node.kind === 159 - ? node.typeName - : ts.isEntityNameExpression(node.expression) - ? node.expression - : undefined; - symbol = typeNameOrExpression && resolveEntityName(typeNameOrExpression, 793064) || unknownSymbol; + if (!type) { + symbol = resolveTypeReferenceName(getTypeReferenceName(node), meaning); type = getTypeReferenceType(node, symbol); } links.resolvedSymbol = symbol; @@ -30225,10 +30279,13 @@ var ts; else if (type.flags & 1) { typeSet.containsAny = true; } + else if (type.flags & 8192) { + typeSet.containsNever = true; + } else if (getObjectFlags(type) & 16 && isEmptyObjectType(type)) { typeSet.containsEmptyObject = true; } - else if (!(type.flags & 8192) && (strictNullChecks || !(type.flags & 6144)) && !ts.contains(typeSet, type)) { + else if ((strictNullChecks || !(type.flags & 6144)) && !ts.contains(typeSet, type)) { if (type.flags & 32768) { typeSet.containsObjectType = true; } @@ -30253,6 +30310,9 @@ var ts; } var typeSet = []; addTypesToIntersection(typeSet, types); + if (typeSet.containsNever) { + return neverType; + } if (typeSet.containsAny) { return anyType; } @@ -30818,7 +30878,7 @@ var ts; if (signature.typePredicate) { freshTypePredicate = cloneTypePredicate(signature.typePredicate, mapper); } - var result = createSignature(signature.declaration, freshTypeParameters, signature.thisParameter && instantiateSymbol(signature.thisParameter, mapper), instantiateList(signature.parameters, mapper, instantiateSymbol), instantiateType(signature.resolvedReturnType, mapper), freshTypePredicate, signature.minArgumentCount, signature.hasRestParameter, signature.hasLiteralTypes); + var result = createSignature(signature.declaration, freshTypeParameters, signature.thisParameter && instantiateSymbol(signature.thisParameter, mapper), instantiateList(signature.parameters, mapper, instantiateSymbol), undefined, freshTypePredicate, signature.minArgumentCount, signature.hasRestParameter, signature.hasLiteralTypes); result.target = signature; result.mapper = mapper; return result; @@ -30904,10 +30964,10 @@ var ts; case 199: case 230: case 231: - var declaration = node; - if (declaration.typeParameters) { - for (var _i = 0, _a = declaration.typeParameters; _i < _a.length; _i++) { - var d = _a[_i]; + var typeParameters = ts.getEffectiveTypeParameterDeclarations(node); + if (typeParameters) { + for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) { + var d = typeParameters_1[_i]; if (ts.contains(mappedTypes, getDeclaredTypeOfTypeParameter(getSymbolOfNode(d)))) { return true; } @@ -30927,8 +30987,8 @@ var ts; break; case 279: var func = node; - for (var _b = 0, _c = func.parameters; _b < _c.length; _b++) { - var p = _c[_b]; + for (var _a = 0, _b = func.parameters; _a < _b.length; _a++) { + var p = _b[_a]; if (ts.contains(mappedTypes, getTypeOfNode(p))) { return true; } @@ -31027,7 +31087,7 @@ var ts; if (node.typeParameters) { return false; } - if (ts.forEach(node.parameters, function (p) { return !p.type; })) { + if (ts.forEach(node.parameters, function (p) { return !ts.getEffectiveTypeAnnotationNode(p); })) { return true; } if (node.kind === 187) { @@ -31099,8 +31159,9 @@ var ts; if (!target.hasRestParameter && source.minArgumentCount > target.parameters.length) { return 0; } - source = getErasedSignature(source); - target = getErasedSignature(target); + if (source.typeParameters) { + source = instantiateSignatureInContextOf(source, target); + } var result = -1; var sourceThisType = getThisTypeOfSignature(source); if (sourceThisType && sourceThisType !== voidType) { @@ -31512,7 +31573,9 @@ var ts; reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1, symbolToString(prop), typeToString(target)); } else { - errorNode = prop.valueDeclaration; + if (prop.valueDeclaration) { + errorNode = prop.valueDeclaration; + } reportError(ts.Diagnostics.Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1, symbolToString(prop), typeToString(target)); } } @@ -31969,20 +32032,24 @@ var ts; var saveErrorInfo = errorInfo; if (getObjectFlags(source) & 64 && getObjectFlags(target) & 64 && source.symbol === target.symbol) { for (var i = 0; i < targetSignatures.length; i++) { - var related = signatureRelatedTo(sourceSignatures[i], targetSignatures[i], reportErrors); + var related = signatureRelatedTo(sourceSignatures[i], targetSignatures[i], true, reportErrors); if (!related) { return 0; } result &= related; } } + else if (sourceSignatures.length === 1 && targetSignatures.length === 1) { + var eraseGenerics = relation === comparableRelation || compilerOptions.noStrictGenericChecks; + result = signatureRelatedTo(sourceSignatures[0], targetSignatures[0], eraseGenerics, reportErrors); + } else { outer: for (var _i = 0, targetSignatures_1 = targetSignatures; _i < targetSignatures_1.length; _i++) { var t = targetSignatures_1[_i]; var shouldElaborateErrors = reportErrors; for (var _a = 0, sourceSignatures_1 = sourceSignatures; _a < sourceSignatures_1.length; _a++) { var s = sourceSignatures_1[_a]; - var related = signatureRelatedTo(s, t, shouldElaborateErrors); + var related = signatureRelatedTo(s, t, true, shouldElaborateErrors); if (related) { result &= related; errorInfo = saveErrorInfo; @@ -31998,8 +32065,8 @@ var ts; } return result; } - function signatureRelatedTo(source, target, reportErrors) { - return compareSignaturesRelated(source, target, false, false, reportErrors, reportError, isRelatedTo); + function signatureRelatedTo(source, target, erase, reportErrors) { + return compareSignaturesRelated(erase ? getErasedSignature(source) : source, erase ? getErasedSignature(target) : target, false, false, reportErrors, reportError, isRelatedTo); } function signaturesIdenticalTo(source, target, kind) { var sourceSignatures = getSignaturesOfType(source, kind); @@ -34511,8 +34578,15 @@ var ts; function getContextualTypeForInitializerExpression(node) { var declaration = node.parent; if (node === declaration.initializer) { - if (declaration.type) { - return getTypeFromTypeNode(declaration.type); + var typeNode = ts.getEffectiveTypeAnnotationNode(declaration); + if (typeNode) { + return getTypeFromTypeNode(typeNode); + } + if (ts.isInJavaScriptFile(declaration)) { + var jsDocType = getTypeForDeclarationFromJSDocComment(declaration); + if (jsDocType) { + return jsDocType; + } } if (declaration.kind === 146) { var type = getContextuallyTypedParameterType(declaration); @@ -34526,12 +34600,13 @@ var ts; if (ts.isBindingPattern(declaration.parent)) { var parentDeclaration = declaration.parent.parent; var name = declaration.propertyName || declaration.name; - if (parentDeclaration.kind !== 176 && - parentDeclaration.type && - !ts.isBindingPattern(name)) { - var text = ts.getTextOfPropertyName(name); - if (text) { - return getTypeOfPropertyOfType(getTypeFromTypeNode(parentDeclaration.type), text); + if (parentDeclaration.kind !== 176) { + var parentTypeNode = ts.getEffectiveTypeAnnotationNode(parentDeclaration); + if (parentTypeNode && !ts.isBindingPattern(name)) { + var text = ts.getTextOfPropertyName(name); + if (text) { + return getTypeOfPropertyOfType(getTypeFromTypeNode(parentTypeNode), text); + } } } } @@ -34575,9 +34650,9 @@ var ts; return false; } function getContextualReturnType(functionDecl) { - if (functionDecl.type || - functionDecl.kind === 152 || - functionDecl.kind === 153 && ts.getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(functionDecl.symbol, 154))) { + if (functionDecl.kind === 152 || + ts.getEffectiveReturnTypeNode(functionDecl) || + isGetAccessorWithAnnotatedSetAccessor(functionDecl)) { return getReturnTypeOfSignature(getSignatureFromDeclaration(functionDecl)); } var signature = getContextualSignatureForFunctionLikeDeclaration(functionDecl); @@ -35571,7 +35646,7 @@ var ts; var resolved = resolveStructuredTypeMembers(targetType); if (resolved.stringIndexInfo || resolved.numberIndexInfo && isNumericLiteralName(name) || - getPropertyOfType(targetType, name) || + getPropertyOfObjectType(targetType, name) || isComparingJsxAttributes && !isUnhyphenatedJsxName(name)) { return true; } @@ -36112,8 +36187,11 @@ var ts; function instantiateSignatureInContextOf(signature, contextualSignature, contextualMapper) { var context = createInferenceContext(signature, 1); forEachMatchingParameterType(contextualSignature, signature, function (source, target) { - inferTypes(context.inferences, instantiateType(source, contextualMapper), target); + inferTypes(context.inferences, instantiateType(source, contextualMapper || identityMapper), target); }); + if (!contextualMapper) { + inferTypes(context.inferences, getReturnTypeOfSignature(contextualSignature), getReturnTypeOfSignature(signature), 4); + } return getSignatureInstantiation(signature, getInferredTypes(context)); } function inferTypeArguments(node, signature, args, excludeArgument, context) { @@ -36848,6 +36926,11 @@ var ts; } return links.inferredClassType; } + function isInferredClassType(type) { + return type.symbol + && getObjectFlags(type) & 16 + && getSymbolLinks(type.symbol).inferredClassType === type; + } function checkCallExpression(node) { checkGrammarTypeArguments(node, node.typeArguments) || checkGrammarArguments(node, node.arguments); var signature = getResolvedSignature(node); @@ -36977,37 +37060,42 @@ var ts; function getTypeOfFirstParameterOfSignature(signature) { return signature.parameters.length > 0 ? getTypeAtPosition(signature, 0) : neverType; } - function assignContextualParameterTypes(signature, context, mapper, checkMode) { + function inferFromAnnotatedParameters(signature, context, mapper) { var len = signature.parameters.length - (signature.hasRestParameter ? 1 : 0); - if (checkMode === 2) { - for (var i = 0; i < len; i++) { - var declaration = signature.parameters[i].valueDeclaration; - if (declaration.type) { - inferTypes(mapper.inferences, getTypeFromTypeNode(declaration.type), getTypeAtPosition(context, i)); + for (var i = 0; i < len; i++) { + var declaration = signature.parameters[i].valueDeclaration; + if (declaration.type) { + var typeNode = ts.getEffectiveTypeAnnotationNode(declaration); + if (typeNode) { + inferTypes(mapper.inferences, getTypeFromTypeNode(typeNode), getTypeAtPosition(context, i)); } } } + } + function assignContextualParameterTypes(signature, context) { + signature.typeParameters = context.typeParameters; if (context.thisParameter) { var parameter = signature.thisParameter; if (!parameter || parameter.valueDeclaration && !parameter.valueDeclaration.type) { if (!parameter) { signature.thisParameter = createSymbolWithType(context.thisParameter, undefined); } - assignTypeToParameterAndFixTypeParameters(signature.thisParameter, getTypeOfSymbol(context.thisParameter), mapper, checkMode); + assignTypeToParameterAndFixTypeParameters(signature.thisParameter, getTypeOfSymbol(context.thisParameter)); } } + var len = signature.parameters.length - (signature.hasRestParameter ? 1 : 0); for (var i = 0; i < len; i++) { var parameter = signature.parameters[i]; - if (!parameter.valueDeclaration.type) { + if (!ts.getEffectiveTypeAnnotationNode(parameter.valueDeclaration)) { var contextualParameterType = getTypeAtPosition(context, i); - assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType, mapper, checkMode); + assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType); } } if (signature.hasRestParameter && isRestParameterIndex(context, signature.parameters.length - 1)) { var parameter = ts.lastOrUndefined(signature.parameters); - if (!parameter.valueDeclaration.type) { + if (!ts.getEffectiveTypeAnnotationNode(parameter.valueDeclaration)) { var contextualParameterType = getTypeOfSymbol(ts.lastOrUndefined(context.parameters)); - assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType, mapper, checkMode); + assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType); } } } @@ -37024,10 +37112,10 @@ var ts; } } } - function assignTypeToParameterAndFixTypeParameters(parameter, contextualType, mapper, checkMode) { + function assignTypeToParameterAndFixTypeParameters(parameter, contextualType) { var links = getSymbolLinks(parameter); if (!links.type) { - links.type = instantiateType(contextualType, mapper); + links.type = contextualType; var name = ts.getNameOfDeclaration(parameter.valueDeclaration); if (links.type === emptyObjectType && (name.kind === 174 || name.kind === 175)) { @@ -37035,16 +37123,6 @@ var ts; } assignBindingElementTypes(parameter.valueDeclaration); } - else if (checkMode === 2) { - inferTypes(mapper.inferences, links.type, instantiateType(contextualType, mapper)); - } - } - function getReturnTypeFromJSDocComment(func) { - var returnTag = ts.getJSDocReturnTag(func); - if (returnTag && returnTag.typeExpression) { - return getTypeFromTypeNode(returnTag.typeExpression.type); - } - return undefined; } function createPromiseType(promisedType) { var globalPromiseType = getGlobalPromiseType(true); @@ -37221,13 +37299,13 @@ var ts; } var hasExplicitReturn = func.flags & 256; if (returnType && returnType.flags & 8192) { - error(func.type, ts.Diagnostics.A_function_returning_never_cannot_have_a_reachable_end_point); + error(ts.getEffectiveReturnTypeNode(func), ts.Diagnostics.A_function_returning_never_cannot_have_a_reachable_end_point); } else if (returnType && !hasExplicitReturn) { - error(func.type, ts.Diagnostics.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value); + error(ts.getEffectiveReturnTypeNode(func), ts.Diagnostics.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value); } else if (returnType && strictNullChecks && !isTypeAssignableTo(undefinedType, returnType)) { - error(func.type, ts.Diagnostics.Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined); + error(ts.getEffectiveReturnTypeNode(func), ts.Diagnostics.Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined); } else if (compilerOptions.noImplicitReturns) { if (!returnType) { @@ -37239,7 +37317,7 @@ var ts; return; } } - error(func.type || func, ts.Diagnostics.Not_all_code_paths_return_a_value); + error(ts.getEffectiveReturnTypeNode(func) || func, ts.Diagnostics.Not_all_code_paths_return_a_value); } } function checkFunctionExpressionOrObjectLiteralMethod(node, checkMode) { @@ -37254,29 +37332,30 @@ var ts; } var links = getNodeLinks(node); var type = getTypeOfSymbol(node.symbol); - var contextSensitive = isContextSensitive(node); - var mightFixTypeParameters = contextSensitive && checkMode === 2; - if (mightFixTypeParameters || !(links.flags & 1024)) { + if (!(links.flags & 1024)) { var contextualSignature = getContextualSignature(node); - var contextChecked = !!(links.flags & 1024); - if (mightFixTypeParameters || !contextChecked) { + if (!(links.flags & 1024)) { links.flags |= 1024; if (contextualSignature) { var signature = getSignaturesOfType(type, 0)[0]; - if (contextSensitive) { - assignContextualParameterTypes(signature, contextualSignature, getContextualMapper(node), checkMode); + if (isContextSensitive(node)) { + var contextualMapper = getContextualMapper(node); + if (checkMode === 2) { + inferFromAnnotatedParameters(signature, contextualSignature, contextualMapper); + } + var instantiatedContextualSignature = contextualMapper === identityMapper ? + contextualSignature : instantiateSignature(contextualSignature, contextualMapper); + assignContextualParameterTypes(signature, instantiatedContextualSignature); } - if (mightFixTypeParameters || !node.type && !signature.resolvedReturnType) { + if (!ts.getEffectiveReturnTypeNode(node) && !signature.resolvedReturnType) { var returnType = getReturnTypeFromBody(node, checkMode); if (!signature.resolvedReturnType) { signature.resolvedReturnType = returnType; } } } - if (!contextChecked) { - checkSignatureDeclaration(node); - checkNodeDeferred(node); - } + checkSignatureDeclaration(node); + checkNodeDeferred(node); } } if (produceDiagnostics && node.kind !== 151) { @@ -37289,15 +37368,16 @@ var ts; function checkFunctionExpressionOrObjectLiteralMethodDeferred(node) { ts.Debug.assert(node.kind !== 151 || ts.isObjectLiteralMethod(node)); var functionFlags = ts.getFunctionFlags(node); - var returnOrPromisedType = node.type && + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); + var returnOrPromisedType = returnTypeNode && ((functionFlags & 3) === 2 ? checkAsyncFunctionReturnType(node) : - getTypeFromTypeNode(node.type)); + getTypeFromTypeNode(returnTypeNode)); if ((functionFlags & 1) === 0) { checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, returnOrPromisedType); } if (node.body) { - if (!node.type) { + if (!returnTypeNode) { getReturnTypeOfSignature(getSignatureFromDeclaration(node)); } if (node.body.kind === 207) { @@ -37361,7 +37441,7 @@ var ts; return false; } function checkReferenceExpression(expr, invalidReferenceMessage) { - var node = ts.skipParentheses(expr); + var node = ts.skipOuterExpressions(expr, 2 | 1); if (node.kind !== 71 && node.kind !== 179 && node.kind !== 180) { error(expr, invalidReferenceMessage); return false; @@ -37936,8 +38016,9 @@ var ts; if (nodeIsYieldStar) { expressionElementType = checkIteratedTypeOrElementType(expressionType, node.expression, false, (functionFlags & 2) !== 0); } - if (func.type) { - var signatureElementType = getIteratedTypeOfGenerator(getTypeFromTypeNode(func.type), (functionFlags & 2) !== 0) || anyType; + var returnType = ts.getEffectiveReturnTypeNode(func); + if (returnType) { + var signatureElementType = getIteratedTypeOfGenerator(getTypeFromTypeNode(returnType), (functionFlags & 2) !== 0) || anyType; if (nodeIsYieldStar) { checkTypeAssignableTo(functionFlags & 2 ? getAwaitedType(expressionElementType, node.expression, ts.Diagnostics.Type_of_iterated_elements_of_a_yield_Asterisk_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member) @@ -38049,7 +38130,7 @@ var ts; if (signature && signature.typeParameters) { var contextualType = getApparentTypeOfContextualType(node); if (contextualType) { - var contextualSignature = getSingleCallSignature(contextualType); + var contextualSignature = getSingleCallSignature(getNonNullableType(contextualType)); if (contextualSignature && !contextualSignature.typeParameters) { return getOrCreateTypeFromSignature(instantiateSignatureInContextOf(signature, contextualSignature, getContextualMapper(node))); } @@ -38339,7 +38420,8 @@ var ts; } if (produceDiagnostics) { checkCollisionWithArgumentsInGeneratedCode(node); - if (noImplicitAny && !node.type) { + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); + if (noImplicitAny && !returnTypeNode) { switch (node.kind) { case 156: error(node, ts.Diagnostics.Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type); @@ -38349,19 +38431,19 @@ var ts; break; } } - if (node.type) { + if (returnTypeNode) { var functionFlags_1 = ts.getFunctionFlags(node); if ((functionFlags_1 & (4 | 1)) === 1) { - var returnType = getTypeFromTypeNode(node.type); + var returnType = getTypeFromTypeNode(returnTypeNode); if (returnType === voidType) { - error(node.type, ts.Diagnostics.A_generator_cannot_have_a_void_type_annotation); + error(returnTypeNode, ts.Diagnostics.A_generator_cannot_have_a_void_type_annotation); } else { var generatorElementType = getIteratedTypeOfGenerator(returnType, (functionFlags_1 & 2) !== 0) || anyType; var iterableIteratorInstantiation = functionFlags_1 & 2 ? createAsyncIterableIteratorType(generatorElementType) : createIterableIteratorType(generatorElementType); - checkTypeAssignableTo(iterableIteratorInstantiation, returnType, node.type); + checkTypeAssignableTo(iterableIteratorInstantiation, returnType, returnTypeNode); } } else if ((functionFlags_1 & 3) === 2) { @@ -39083,44 +39165,45 @@ var ts; return typeAsAwaitable.awaitedTypeOfType = type; } function checkAsyncFunctionReturnType(node) { - var returnType = getTypeFromTypeNode(node.type); + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); + var returnType = getTypeFromTypeNode(returnTypeNode); if (languageVersion >= 2) { if (returnType === unknownType) { return unknownType; } var globalPromiseType = getGlobalPromiseType(true); if (globalPromiseType !== emptyGenericType && !isReferenceToType(returnType, globalPromiseType)) { - error(node.type, ts.Diagnostics.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type); + error(returnTypeNode, ts.Diagnostics.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type); return unknownType; } } else { - markTypeNodeAsReferenced(node.type); + markTypeNodeAsReferenced(returnTypeNode); if (returnType === unknownType) { return unknownType; } - var promiseConstructorName = ts.getEntityNameFromTypeNode(node.type); + var promiseConstructorName = ts.getEntityNameFromTypeNode(returnTypeNode); if (promiseConstructorName === undefined) { - error(node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, typeToString(returnType)); + error(returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, typeToString(returnType)); return unknownType; } var promiseConstructorSymbol = resolveEntityName(promiseConstructorName, 107455, true); var promiseConstructorType = promiseConstructorSymbol ? getTypeOfSymbol(promiseConstructorSymbol) : unknownType; if (promiseConstructorType === unknownType) { if (promiseConstructorName.kind === 71 && promiseConstructorName.text === "Promise" && getTargetType(returnType) === getGlobalPromiseType(false)) { - error(node.type, ts.Diagnostics.An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option); + error(returnTypeNode, ts.Diagnostics.An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option); } else { - error(node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); + error(returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); } return unknownType; } var globalPromiseConstructorLikeType = getGlobalPromiseConstructorLikeType(true); if (globalPromiseConstructorLikeType === emptyObjectType) { - error(node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); + error(returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); return unknownType; } - if (!checkTypeAssignableTo(promiseConstructorType, globalPromiseConstructorLikeType, node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value)) { + if (!checkTypeAssignableTo(promiseConstructorType, globalPromiseConstructorLikeType, returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value)) { return unknownType; } var rootName = promiseConstructorName && getFirstIdentifier(promiseConstructorName); @@ -39216,7 +39299,8 @@ var ts; } } function getParameterTypeNodeForDecoratorCheck(node) { - return node.dotDotDotToken ? ts.getRestParameterElementType(node.type) : node.type; + var typeNode = ts.getEffectiveTypeAnnotationNode(node); + return ts.isRestParameter(node) ? ts.getRestParameterElementType(typeNode) : typeNode; } function checkDecorators(node) { if (!node.decorators) { @@ -39252,13 +39336,13 @@ var ts; var parameter = _c[_b]; markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(parameter)); } - markDecoratorMedataDataTypeNodeAsReferenced(node.type); + markDecoratorMedataDataTypeNodeAsReferenced(ts.getEffectiveReturnTypeNode(node)); break; case 149: - markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(node)); + markDecoratorMedataDataTypeNodeAsReferenced(ts.getEffectiveTypeAnnotationNode(node)); break; case 146: - markDecoratorMedataDataTypeNodeAsReferenced(node.type); + markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(node)); break; } } @@ -39266,7 +39350,8 @@ var ts; } function checkFunctionDeclaration(node) { if (produceDiagnostics) { - checkFunctionOrMethodDeclaration(node) || checkGrammarForGenerator(node); + checkFunctionOrMethodDeclaration(node); + checkGrammarForGenerator(node); checkCollisionWithCapturedSuperVariable(node, node.name); checkCollisionWithCapturedThisVariable(node, node.name); checkCollisionWithCapturedNewTargetVariable(node, node.name); @@ -39296,13 +39381,14 @@ var ts; } } checkSourceElement(node.body); + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); if ((functionFlags & 1) === 0) { - var returnOrPromisedType = node.type && (functionFlags & 2 + var returnOrPromisedType = returnTypeNode && (functionFlags & 2 ? checkAsyncFunctionReturnType(node) - : getTypeFromTypeNode(node.type)); + : getTypeFromTypeNode(returnTypeNode)); checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, returnOrPromisedType); } - if (produceDiagnostics && !node.type) { + if (produceDiagnostics && !returnTypeNode) { if (noImplicitAny && ts.nodeIsMissing(node.body) && !isPrivateWithinAmbient(node)) { reportImplicitAnyError(node, anyType); } @@ -39396,9 +39482,7 @@ var ts; function errorUnusedLocal(node, name) { if (isIdentifierThatStartsWithUnderScore(node)) { var declaration = ts.getRootDeclaration(node.parent); - if (declaration.kind === 226 && - (declaration.parent.parent.kind === 215 || - declaration.parent.parent.kind === 216)) { + if (declaration.kind === 226 && ts.isForInOrOfStatement(declaration.parent.parent)) { return; } } @@ -40086,7 +40170,8 @@ var ts; checkGrammarStatementInAmbientContext(node) || checkGrammarBreakOrContinueStatement(node); } function isGetAccessorWithAnnotatedSetAccessor(node) { - return !!(node.kind === 153 && ts.getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(node.symbol, 154))); + return node.kind === 153 + && ts.getEffectiveSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(node.symbol, 154)) !== undefined; } function isUnwrappedReturnTypeVoidOrAny(func, returnType) { var unwrappedReturnType = (ts.getFunctionFlags(func) & 3) === 2 @@ -40121,7 +40206,7 @@ var ts; error(node, ts.Diagnostics.Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class); } } - else if (func.type || isGetAccessorWithAnnotatedSetAccessor(func)) { + else if (ts.getEffectiveReturnTypeNode(func) || isGetAccessorWithAnnotatedSetAccessor(func)) { if (functionFlags & 2) { var promisedType = getPromisedTypeOfPromise(returnType); var awaitedType = checkAwaitedType(exprType, node, ts.Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member); @@ -41024,7 +41109,10 @@ var ts; ts.Diagnostics.Import_declaration_conflicts_with_local_declaration_of_0; error(node, message, symbolToString(symbol)); } - if (node.kind === 246 && compilerOptions.isolatedModules && !(target.flags & 107455)) { + if (compilerOptions.isolatedModules + && node.kind === 246 + && !(target.flags & 107455) + && !ts.isInAmbientContext(node)) { error(node, ts.Diagnostics.Cannot_re_export_a_type_when_the_isolatedModules_flag_is_provided); } } @@ -41636,6 +41724,11 @@ var ts; var parameter = ts.getParameterFromJSDoc(entityName.parent); return parameter && parameter.symbol; } + if (entityName.parent.kind === 145 && entityName.parent.parent.kind === 290) { + ts.Debug.assert(!ts.isInJavaScriptFile(entityName)); + var typeParameter = ts.getTypeParameterFromJsDoc(entityName.parent); + return typeParameter && typeParameter.symbol; + } if (ts.isPartOfExpression(entityName)) { if (ts.nodeIsMissing(entityName)) { return undefined; @@ -43468,9 +43561,7 @@ var ts; switch (name.parent.kind) { case 242: case 246: - if (name.parent.propertyName) { - return true; - } + return true; default: return ts.isDeclarationName(name); } @@ -43603,9 +43694,9 @@ var ts; case 149: return ts.updateProperty(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.type, visitor, ts.isTypeNode), visitNode(node.initializer, visitor, ts.isExpression)); case 150: - return ts.updateMethodSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken)); + return ts.updateMethodSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken)); case 151: - return ts.updateMethod(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateMethod(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 152: return ts.updateConstructor(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitFunctionBody(node.body, visitor, context)); case 153: @@ -43613,9 +43704,9 @@ var ts; case 154: return ts.updateSetAccessor(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isPropertyName), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitFunctionBody(node.body, visitor, context)); case 155: - return ts.updateCallSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateCallSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 156: - return ts.updateConstructSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateConstructSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 157: return ts.updateIndexSignature(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 158: @@ -43623,9 +43714,9 @@ var ts; case 159: return ts.updateTypeReferenceNode(node, visitNode(node.typeName, visitor, ts.isEntityName), nodesVisitor(node.typeArguments, visitor, ts.isTypeNode)); case 160: - return ts.updateFunctionTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateFunctionTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 161: - return ts.updateConstructorTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateConstructorTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 162: return ts.updateTypeQueryNode(node, visitNode(node.exprName, visitor, ts.isEntityName)); case 163: @@ -43645,7 +43736,7 @@ var ts; case 171: return ts.updateIndexedAccessTypeNode(node, visitNode(node.objectType, visitor, ts.isTypeNode), visitNode(node.indexType, visitor, ts.isTypeNode)); case 172: - return ts.updateMappedTypeNode(node, visitNode(node.readonlyToken, tokenVisitor, ts.isToken), visitNode(node.typeParameter, visitor, ts.isTypeParameter), visitNode(node.questionToken, tokenVisitor, ts.isToken), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateMappedTypeNode(node, visitNode(node.readonlyToken, tokenVisitor, ts.isToken), visitNode(node.typeParameter, visitor, ts.isTypeParameterDeclaration), visitNode(node.questionToken, tokenVisitor, ts.isToken), visitNode(node.type, visitor, ts.isTypeNode)); case 173: return ts.updateLiteralTypeNode(node, visitNode(node.literal, visitor, ts.isExpression)); case 174: @@ -43673,9 +43764,9 @@ var ts; case 185: return ts.updateParen(node, visitNode(node.expression, visitor, ts.isExpression)); case 186: - return ts.updateFunctionExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateFunctionExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 187: - return ts.updateArrowFunction(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateArrowFunction(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 188: return ts.updateDelete(node, visitNode(node.expression, visitor, ts.isExpression)); case 189: @@ -43699,7 +43790,7 @@ var ts; case 198: return ts.updateSpread(node, visitNode(node.expression, visitor, ts.isExpression)); case 199: - return ts.updateClassExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); + return ts.updateClassExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); case 201: return ts.updateExpressionWithTypeArguments(node, nodesVisitor(node.typeArguments, visitor, ts.isTypeNode), visitNode(node.expression, visitor, ts.isExpression)); case 202: @@ -43749,13 +43840,13 @@ var ts; case 227: return ts.updateVariableDeclarationList(node, nodesVisitor(node.declarations, visitor, ts.isVariableDeclaration)); case 228: - return ts.updateFunctionDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateFunctionDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 229: - return ts.updateClassDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); + return ts.updateClassDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); case 230: - return ts.updateInterfaceDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isTypeElement)); + return ts.updateInterfaceDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isTypeElement)); case 231: - return ts.updateTypeAliasDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateTypeAliasDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 232: return ts.updateEnumDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.members, visitor, ts.isEnumMember)); case 233: @@ -44292,34 +44383,7 @@ var ts; } var Debug; (function (Debug) { - if (Debug.isDebugging) { - Object.defineProperties(ts.objectAllocator.getSymbolConstructor().prototype, { - "__debugFlags": { get: function () { return ts.formatSymbolFlags(this.flags); } } - }); - Object.defineProperties(ts.objectAllocator.getTypeConstructor().prototype, { - "__debugFlags": { get: function () { return ts.formatTypeFlags(this.flags); } }, - "__debugObjectFlags": { get: function () { return this.flags & 32768 ? ts.formatObjectFlags(this.objectFlags) : ""; } }, - "__debugTypeToString": { value: function () { return this.checker.typeToString(this); } }, - }); - for (var _i = 0, _a = [ts.objectAllocator.getNodeConstructor(), ts.objectAllocator.getIdentifierConstructor(), ts.objectAllocator.getTokenConstructor(), ts.objectAllocator.getSourceFileConstructor()]; _i < _a.length; _i++) { - var ctor = _a[_i]; - if (!ctor.prototype.hasOwnProperty("__debugKind")) { - Object.defineProperties(ctor.prototype, { - "__debugKind": { get: function () { return ts.formatSyntaxKind(this.kind); } }, - "__debugModifierFlags": { get: function () { return ts.formatModifierFlags(ts.getModifierFlagsNoCache(this)); } }, - "__debugTransformFlags": { get: function () { return ts.formatTransformFlags(this.transformFlags); } }, - "__debugEmitFlags": { get: function () { return ts.formatEmitFlags(ts.getEmitFlags(this)); } }, - "__debugGetText": { value: function (includeTrivia) { - if (ts.nodeIsSynthesized(this)) - return ""; - var parseNode = ts.getParseTreeNode(this); - var sourceFile = parseNode && ts.getSourceFileOfNode(parseNode); - return sourceFile ? ts.getSourceTextOfNodeFromSourceFile(sourceFile, parseNode, includeTrivia) : ""; - } } - }); - } - } - } + var isDebugInfoEnabled = false; Debug.failBadSyntaxKind = Debug.shouldAssert(1) ? function (node, message) { return Debug.fail((message || "Unexpected node.") + "\r\nNode " + ts.formatSyntaxKind(node.kind) + " was unexpected.", Debug.failBadSyntaxKind); } : ts.noop; @@ -44338,6 +44402,46 @@ var ts; Debug.assertMissingNode = Debug.shouldAssert(1) ? function (node, message) { return Debug.assert(node === undefined, message || "Unexpected node.", function () { return "Node " + ts.formatSyntaxKind(node.kind) + " was unexpected'."; }, Debug.assertMissingNode); } : ts.noop; + function enableDebugInfo() { + if (isDebugInfoEnabled) + return; + Object.defineProperties(ts.objectAllocator.getSymbolConstructor().prototype, { + "__debugFlags": { get: function () { return ts.formatSymbolFlags(this.flags); } } + }); + Object.defineProperties(ts.objectAllocator.getTypeConstructor().prototype, { + "__debugFlags": { get: function () { return ts.formatTypeFlags(this.flags); } }, + "__debugObjectFlags": { get: function () { return this.flags & 32768 ? ts.formatObjectFlags(this.objectFlags) : ""; } }, + "__debugTypeToString": { value: function () { return this.checker.typeToString(this); } }, + }); + var nodeConstructors = [ + ts.objectAllocator.getNodeConstructor(), + ts.objectAllocator.getIdentifierConstructor(), + ts.objectAllocator.getTokenConstructor(), + ts.objectAllocator.getSourceFileConstructor() + ]; + for (var _i = 0, nodeConstructors_1 = nodeConstructors; _i < nodeConstructors_1.length; _i++) { + var ctor = nodeConstructors_1[_i]; + if (!ctor.prototype.hasOwnProperty("__debugKind")) { + Object.defineProperties(ctor.prototype, { + "__debugKind": { get: function () { return ts.formatSyntaxKind(this.kind); } }, + "__debugModifierFlags": { get: function () { return ts.formatModifierFlags(ts.getModifierFlagsNoCache(this)); } }, + "__debugTransformFlags": { get: function () { return ts.formatTransformFlags(this.transformFlags); } }, + "__debugEmitFlags": { get: function () { return ts.formatEmitFlags(ts.getEmitFlags(this)); } }, + "__debugGetText": { + value: function (includeTrivia) { + if (ts.nodeIsSynthesized(this)) + return ""; + var parseNode = ts.getParseTreeNode(this); + var sourceFile = parseNode && ts.getSourceFileOfNode(parseNode); + return sourceFile ? ts.getSourceTextOfNodeFromSourceFile(sourceFile, parseNode, includeTrivia) : ""; + } + } + }); + } + } + isDebugInfoEnabled = true; + } + Debug.enableDebugInfo = enableDebugInfo; })(Debug = ts.Debug || (ts.Debug = {})); })(ts || (ts = {})); var ts; @@ -49898,7 +50002,7 @@ var ts; if (variables.length === 0) { return undefined; } - return ts.createStatement(ts.inlineExpressions(ts.map(variables, transformInitializedVariable))); + return ts.setSourceMapRange(ts.createStatement(ts.inlineExpressions(ts.map(variables, transformInitializedVariable))), node); } } function visitBinaryExpression(node) { @@ -50213,7 +50317,7 @@ var ts; return undefined; } function transformInitializedVariable(node) { - return ts.createAssignment(ts.getSynthesizedClone(node.name), ts.visitNode(node.initializer, visitor, ts.isExpression)); + return ts.setSourceMapRange(ts.createAssignment(ts.setSourceMapRange(ts.getSynthesizedClone(node.name), node.name), ts.visitNode(node.initializer, visitor, ts.isExpression)), node); } function transformAndEmitIfStatement(node) { if (containsYield(node)) { @@ -53104,7 +53208,7 @@ var ts; function hoistVariableDeclaration(name) { ts.Debug.assert(state > 0, "Cannot modify the lexical environment during initialization."); ts.Debug.assert(state < 2, "Cannot modify the lexical environment after transformation has completed."); - var decl = ts.createVariableDeclaration(name); + var decl = ts.setEmitFlags(ts.createVariableDeclaration(name), 64); if (!lexicalEnvironmentVariableDeclarations) { lexicalEnvironmentVariableDeclarations = [decl]; } @@ -59270,14 +59374,14 @@ var ts; function getResolutionDiagnostic(options, _a) { var extension = _a.extension; switch (extension) { - case ts.Extension.Ts: - case ts.Extension.Dts: + case ".ts": + case ".d.ts": return undefined; - case ts.Extension.Tsx: + case ".tsx": return needJsx(); - case ts.Extension.Jsx: + case ".jsx": return needJsx() || needAllowJs(); - case ts.Extension.Js: + case ".js": return needAllowJs(); } function needJsx() { @@ -59573,6 +59677,10 @@ var ts; else if (isNamespaceReference(node)) { return 4; } + else if (ts.isTypeParameterDeclaration(node.parent)) { + ts.Debug.assert(ts.isJSDocTemplateTag(node.parent.parent)); + return 2; + } else { return 1; } @@ -60078,7 +60186,7 @@ var ts; } } ts.findNextToken = findNextToken; - function findPrecedingToken(position, sourceFile, startNode) { + function findPrecedingToken(position, sourceFile, startNode, includeJsDoc) { return find(startNode || sourceFile); function findRightmostToken(n) { if (ts.isToken(n)) { @@ -60096,7 +60204,7 @@ var ts; for (var i = 0; i < children.length; i++) { var child = children[i]; if (position < child.end && (nodeHasTokens(child) || child.kind === 10)) { - var start = child.getStart(sourceFile); + var start = (includeJsDoc && child.jsDoc ? child.jsDoc[0] : child).getStart(sourceFile); var lookInPreviousChild = (start >= position) || (child.kind === 10 && start === child.end); if (lookInPreviousChild) { @@ -60108,7 +60216,7 @@ var ts; } } } - ts.Debug.assert(startNode !== undefined || n.kind === 265); + ts.Debug.assert(startNode !== undefined || n.kind === 265 || ts.isJSDocCommentContainingNode(n)); if (children.length) { var candidate = findRightmostChildNodeWithTokens(children, children.length); return candidate && findRightmostToken(candidate); @@ -61703,7 +61811,7 @@ var ts; } } function tryClassifyNode(node) { - if (ts.isJSDocNode(node)) { + if (ts.isJSDoc(node)) { return true; } if (ts.nodeIsMissing(node)) { @@ -62554,12 +62662,12 @@ var ts; } } start = ts.timestamp(); - var previousToken = ts.findPrecedingToken(position, sourceFile); + var previousToken = ts.findPrecedingToken(position, sourceFile, undefined, true); log("getCompletionData: Get previous token 1: " + (ts.timestamp() - start)); var contextToken = previousToken; if (contextToken && position <= contextToken.end && ts.isWord(contextToken.kind)) { var start_2 = ts.timestamp(); - contextToken = ts.findPrecedingToken(contextToken.getFullStart(), sourceFile); + contextToken = ts.findPrecedingToken(contextToken.getFullStart(), sourceFile, undefined, true); log("getCompletionData: Get previous token 2: " + (ts.timestamp() - start_2)); } var node = currentToken; @@ -62841,34 +62949,29 @@ var ts; typeMembers = typeChecker.getAllPossiblePropertiesOfType(typeForObject); existingMembers = objectLikeContainer.properties; } - else if (objectLikeContainer.kind === 174) { + else { + ts.Debug.assert(objectLikeContainer.kind === 174); isNewIdentifierLocation = false; var rootDeclaration = ts.getRootDeclaration(objectLikeContainer.parent); - if (ts.isVariableLike(rootDeclaration)) { - var canGetType = !!(rootDeclaration.initializer || rootDeclaration.type); - if (!canGetType && rootDeclaration.kind === 146) { - if (ts.isExpression(rootDeclaration.parent)) { - canGetType = !!typeChecker.getContextualType(rootDeclaration.parent); - } - else if (rootDeclaration.parent.kind === 151 || rootDeclaration.parent.kind === 154) { - canGetType = ts.isExpression(rootDeclaration.parent.parent) && !!typeChecker.getContextualType(rootDeclaration.parent.parent); - } + if (!ts.isVariableLike(rootDeclaration)) + throw ts.Debug.fail("Root declaration is not variable-like."); + var canGetType = rootDeclaration.initializer || rootDeclaration.type || rootDeclaration.parent.parent.kind === 216; + if (!canGetType && rootDeclaration.kind === 146) { + if (ts.isExpression(rootDeclaration.parent)) { + canGetType = !!typeChecker.getContextualType(rootDeclaration.parent); } - if (canGetType) { - var typeForObject = typeChecker.getTypeAtLocation(objectLikeContainer); - if (!typeForObject) - return false; - typeMembers = typeChecker.getPropertiesOfType(typeForObject); - existingMembers = objectLikeContainer.elements; + else if (rootDeclaration.parent.kind === 151 || rootDeclaration.parent.kind === 154) { + canGetType = ts.isExpression(rootDeclaration.parent.parent) && !!typeChecker.getContextualType(rootDeclaration.parent.parent); } } - else { - ts.Debug.fail("Root declaration is not variable-like."); + if (canGetType) { + var typeForObject = typeChecker.getTypeAtLocation(objectLikeContainer); + if (!typeForObject) + return false; + typeMembers = typeChecker.getPropertiesOfType(typeForObject); + existingMembers = objectLikeContainer.elements; } } - else { - ts.Debug.fail("Expected object literal or binding pattern, got " + objectLikeContainer.kind); - } if (typeMembers && typeMembers.length > 0) { symbols = filterObjectMembersList(typeMembers, existingMembers); } @@ -62936,7 +63039,7 @@ var ts; case 17: case 26: var parent = contextToken.parent; - if (parent && (parent.kind === 178 || parent.kind === 174)) { + if (ts.isObjectLiteralExpression(parent) || ts.isObjectBindingPattern(parent)) { return parent; } break; @@ -63336,15 +63439,23 @@ var ts; (function (DocumentHighlights) { function getDocumentHighlights(program, cancellationToken, sourceFile, position, sourceFilesToSearch) { var node = ts.getTouchingWord(sourceFile, position, true); - return node && (getSemanticDocumentHighlights(node, program, cancellationToken, sourceFilesToSearch) || getSyntacticDocumentHighlights(node, sourceFile)); + if (!node) + return undefined; + if (ts.isJsxOpeningElement(node.parent) && node.parent.tagName === node || ts.isJsxClosingElement(node.parent)) { + var _a = node.parent.parent, openingElement = _a.openingElement, closingElement = _a.closingElement; + var highlightSpans = [openingElement, closingElement].map(function (_a) { + var tagName = _a.tagName; + return getHighlightSpanForNode(tagName, sourceFile); + }); + return [{ fileName: sourceFile.fileName, highlightSpans: highlightSpans }]; + } + return getSemanticDocumentHighlights(node, program, cancellationToken, sourceFilesToSearch) || getSyntacticDocumentHighlights(node, sourceFile); } DocumentHighlights.getDocumentHighlights = getDocumentHighlights; function getHighlightSpanForNode(node, sourceFile) { - var start = node.getStart(sourceFile); - var end = node.getEnd(); return { fileName: sourceFile.fileName, - textSpan: ts.createTextSpanFromBounds(start, end), + textSpan: ts.createTextSpanFromNode(node, sourceFile), kind: "none" }; } @@ -64902,11 +65013,8 @@ var ts; } return parent ? scope.getSourceFile() : scope; } - function getPossibleSymbolReferencePositions(sourceFile, symbolName, container, fullStart) { + function getPossibleSymbolReferencePositions(sourceFile, symbolName, container) { if (container === void 0) { container = sourceFile; } - if (fullStart === void 0) { fullStart = false; } - var start = fullStart ? container.getFullStart() : container.getStart(sourceFile); - var end = container.getEnd(); var positions = []; if (!symbolName || !symbolName.length) { return positions; @@ -64914,9 +65022,9 @@ var ts; var text = sourceFile.text; var sourceLength = text.length; var symbolNameLength = symbolName.length; - var position = text.indexOf(symbolName, start); + var position = text.indexOf(symbolName, container.pos); while (position >= 0) { - if (position > end) + if (position > container.end) break; var endPosition = position + symbolNameLength; if ((position === 0 || !ts.isIdentifierPart(text.charCodeAt(position - 1), 5)) && @@ -64964,7 +65072,7 @@ var ts; return references.length ? [{ definition: { type: "keyword", node: references[0].node }, references: references }] : undefined; } function addReferencesForKeywordInFile(sourceFile, kind, searchText, references) { - var possiblePositions = getPossibleSymbolReferencePositions(sourceFile, searchText, sourceFile, true); + var possiblePositions = getPossibleSymbolReferencePositions(sourceFile, searchText, sourceFile); for (var _i = 0, possiblePositions_2 = possiblePositions; _i < possiblePositions_2.length; _i++) { var position = possiblePositions_2[_i]; var referenceLocation = ts.getTouchingPropertyName(sourceFile, position, true); @@ -64981,8 +65089,7 @@ var ts; if (!state.markSearchedSymbol(sourceFile, search.symbol)) { return; } - var fullStart = state.options.findInComments || container.jsDoc !== undefined || ts.forEach(search.symbol.declarations, function (d) { return d.kind === 291; }); - for (var _i = 0, _a = getPossibleSymbolReferencePositions(sourceFile, search.text, container, fullStart); _i < _a.length; _i++) { + for (var _i = 0, _a = getPossibleSymbolReferencePositions(sourceFile, search.text, container); _i < _a.length; _i++) { var position = _a[_i]; getReferencesAtLocation(sourceFile, position, search, state); } @@ -73283,7 +73390,7 @@ var ts; ts.servicesVersion = "0.5"; var ruleProvider; function createNode(kind, pos, end, parent) { - var node = kind >= 143 ? new NodeObject(kind, pos, end) : + var node = ts.isNodeKind(kind) ? new NodeObject(kind, pos, end) : kind === 71 ? new IdentifierObject(71, pos, end) : new TokenObject(kind, pos, end); node.parent = parent; @@ -73328,10 +73435,10 @@ var ts; } return sourceFile.text.substring(this.getStart(sourceFile), this.getEnd()); }; - NodeObject.prototype.addSyntheticNodes = function (nodes, pos, end, useJSDocScanner) { + NodeObject.prototype.addSyntheticNodes = function (nodes, pos, end) { ts.scanner.setTextPos(pos); while (pos < end) { - var token = useJSDocScanner ? ts.scanner.scanJSDocToken() : ts.scanner.scan(); + var token = ts.scanner.scan(); ts.Debug.assert(token !== 1); var textPos = ts.scanner.getTextPos(); if (textPos <= end) { @@ -73360,50 +73467,44 @@ var ts; }; NodeObject.prototype.createChildren = function (sourceFile) { var _this = this; - if (this.kind === 283 || ts.isJSDocTag(this)) { + if (!ts.isNodeKind(this.kind)) { + this._children = ts.emptyArray; + return; + } + if (ts.isJSDocCommentContainingNode(this)) { var children_3 = []; this.forEachChild(function (child) { children_3.push(child); }); this._children = children_3; + return; } - else if (this.kind >= 143) { - var children_4 = []; - ts.scanner.setText((sourceFile || this.getSourceFile()).text); - var pos_3 = this.pos; - var useJSDocScanner_1 = ts.isJSDocNode(this); - var processNode = function (node) { - var isJSDocTagNode = ts.isJSDocNode(node); - if (!isJSDocTagNode && pos_3 < node.pos) { - pos_3 = _this.addSyntheticNodes(children_4, pos_3, node.pos, useJSDocScanner_1); - } - children_4.push(node); - if (!isJSDocTagNode) { - pos_3 = node.end; - } - }; - var processNodes = function (nodes) { - if (pos_3 < nodes.pos) { - pos_3 = _this.addSyntheticNodes(children_4, pos_3, nodes.pos, useJSDocScanner_1); - } - children_4.push(_this.createSyntaxList(nodes)); - pos_3 = nodes.end; - }; - if (this.jsDoc) { - for (var _i = 0, _a = this.jsDoc; _i < _a.length; _i++) { - var jsDocComment = _a[_i]; - processNode(jsDocComment); - } + var children = []; + ts.scanner.setText((sourceFile || this.getSourceFile()).text); + var pos = this.pos; + var processNode = function (node) { + pos = _this.addSyntheticNodes(children, pos, node.pos); + children.push(node); + pos = node.end; + }; + var processNodes = function (nodes) { + if (pos < nodes.pos) { + pos = _this.addSyntheticNodes(children, pos, nodes.pos); } - pos_3 = this.pos; - ts.forEachChild(this, processNode, processNodes); - if (pos_3 < this.end) { - this.addSyntheticNodes(children_4, pos_3, this.end); + children.push(_this.createSyntaxList(nodes)); + pos = nodes.end; + }; + if (this.jsDoc) { + for (var _i = 0, _a = this.jsDoc; _i < _a.length; _i++) { + var jsDocComment = _a[_i]; + processNode(jsDocComment); } - ts.scanner.setText(undefined); - this._children = children_4; } - else { - this._children = ts.emptyArray; + pos = this.pos; + ts.forEachChild(this, processNode, processNodes); + if (pos < this.end) { + this.addSyntheticNodes(children, pos, this.end); } + ts.scanner.setText(undefined); + this._children = children; }; NodeObject.prototype.getChildCount = function (sourceFile) { if (!this._children) @@ -75253,6 +75354,7 @@ var ts; } return true; } + server.CommandNames = server.protocol.CommandTypes; function formatMessage(msg, logger, byteLength, newLine) { var verboseLogging = logger.hasLevel(server.LogLevel.verbose); var json = JSON.stringify(msg); @@ -75349,19 +75451,19 @@ var ts; var _this = this; this.changeSeq = 0; this.handlers = ts.createMapFromTemplate((_a = {}, - _a["openExternalProject"] = function (request) { + _a[server.CommandNames.OpenExternalProject] = function (request) { _this.projectService.openExternalProject(request.arguments, false); return _this.requiredResponse(true); }, - _a["openExternalProjects"] = function (request) { + _a[server.CommandNames.OpenExternalProjects] = function (request) { _this.projectService.openExternalProjects(request.arguments.projects); return _this.requiredResponse(true); }, - _a["closeExternalProject"] = function (request) { + _a[server.CommandNames.CloseExternalProject] = function (request) { _this.projectService.closeExternalProject(request.arguments.projectFileName); return _this.requiredResponse(true); }, - _a["synchronizeProjectList"] = function (request) { + _a[server.CommandNames.SynchronizeProjectList] = function (request) { var result = _this.projectService.synchronizeProjectList(request.arguments.knownProjects); if (!result.some(function (p) { return p.projectErrors && p.projectErrors.length !== 0; })) { return _this.requiredResponse(result); @@ -75379,219 +75481,219 @@ var ts; }); return _this.requiredResponse(converted); }, - _a["applyChangedToOpenFiles"] = function (request) { + _a[server.CommandNames.ApplyChangedToOpenFiles] = function (request) { _this.projectService.applyChangesInOpenFiles(request.arguments.openFiles, request.arguments.changedFiles, request.arguments.closedFiles); _this.changeSeq++; return _this.requiredResponse(true); }, - _a["exit"] = function () { + _a[server.CommandNames.Exit] = function () { _this.exit(); return _this.notRequired(); }, - _a["definition"] = function (request) { + _a[server.CommandNames.Definition] = function (request) { return _this.requiredResponse(_this.getDefinition(request.arguments, true)); }, - _a["definition-full"] = function (request) { + _a[server.CommandNames.DefinitionFull] = function (request) { return _this.requiredResponse(_this.getDefinition(request.arguments, false)); }, - _a["typeDefinition"] = function (request) { + _a[server.CommandNames.TypeDefinition] = function (request) { return _this.requiredResponse(_this.getTypeDefinition(request.arguments)); }, - _a["implementation"] = function (request) { + _a[server.CommandNames.Implementation] = function (request) { return _this.requiredResponse(_this.getImplementation(request.arguments, true)); }, - _a["implementation-full"] = function (request) { + _a[server.CommandNames.ImplementationFull] = function (request) { return _this.requiredResponse(_this.getImplementation(request.arguments, false)); }, - _a["references"] = function (request) { + _a[server.CommandNames.References] = function (request) { return _this.requiredResponse(_this.getReferences(request.arguments, true)); }, - _a["references-full"] = function (request) { + _a[server.CommandNames.ReferencesFull] = function (request) { return _this.requiredResponse(_this.getReferences(request.arguments, false)); }, - _a["rename"] = function (request) { + _a[server.CommandNames.Rename] = function (request) { return _this.requiredResponse(_this.getRenameLocations(request.arguments, true)); }, - _a["renameLocations-full"] = function (request) { + _a[server.CommandNames.RenameLocationsFull] = function (request) { return _this.requiredResponse(_this.getRenameLocations(request.arguments, false)); }, - _a["rename-full"] = function (request) { + _a[server.CommandNames.RenameInfoFull] = function (request) { return _this.requiredResponse(_this.getRenameInfo(request.arguments)); }, - _a["open"] = function (request) { + _a[server.CommandNames.Open] = function (request) { _this.openClientFile(server.toNormalizedPath(request.arguments.file), request.arguments.fileContent, server.convertScriptKindName(request.arguments.scriptKindName), request.arguments.projectRootPath ? server.toNormalizedPath(request.arguments.projectRootPath) : undefined); return _this.notRequired(); }, - _a["quickinfo"] = function (request) { + _a[server.CommandNames.Quickinfo] = function (request) { return _this.requiredResponse(_this.getQuickInfoWorker(request.arguments, true)); }, - _a["quickinfo-full"] = function (request) { + _a[server.CommandNames.QuickinfoFull] = function (request) { return _this.requiredResponse(_this.getQuickInfoWorker(request.arguments, false)); }, - _a["outliningSpans"] = function (request) { + _a[server.CommandNames.OutliningSpans] = function (request) { return _this.requiredResponse(_this.getOutliningSpans(request.arguments)); }, - _a["todoComments"] = function (request) { + _a[server.CommandNames.TodoComments] = function (request) { return _this.requiredResponse(_this.getTodoComments(request.arguments)); }, - _a["indentation"] = function (request) { + _a[server.CommandNames.Indentation] = function (request) { return _this.requiredResponse(_this.getIndentation(request.arguments)); }, - _a["nameOrDottedNameSpan"] = function (request) { + _a[server.CommandNames.NameOrDottedNameSpan] = function (request) { return _this.requiredResponse(_this.getNameOrDottedNameSpan(request.arguments)); }, - _a["breakpointStatement"] = function (request) { + _a[server.CommandNames.BreakpointStatement] = function (request) { return _this.requiredResponse(_this.getBreakpointStatement(request.arguments)); }, - _a["braceCompletion"] = function (request) { + _a[server.CommandNames.BraceCompletion] = function (request) { return _this.requiredResponse(_this.isValidBraceCompletion(request.arguments)); }, - _a["docCommentTemplate"] = function (request) { + _a[server.CommandNames.DocCommentTemplate] = function (request) { return _this.requiredResponse(_this.getDocCommentTemplate(request.arguments)); }, - _a["format"] = function (request) { + _a[server.CommandNames.Format] = function (request) { return _this.requiredResponse(_this.getFormattingEditsForRange(request.arguments)); }, - _a["formatonkey"] = function (request) { + _a[server.CommandNames.Formatonkey] = function (request) { return _this.requiredResponse(_this.getFormattingEditsAfterKeystroke(request.arguments)); }, - _a["format-full"] = function (request) { + _a[server.CommandNames.FormatFull] = function (request) { return _this.requiredResponse(_this.getFormattingEditsForDocumentFull(request.arguments)); }, - _a["formatonkey-full"] = function (request) { + _a[server.CommandNames.FormatonkeyFull] = function (request) { return _this.requiredResponse(_this.getFormattingEditsAfterKeystrokeFull(request.arguments)); }, - _a["formatRange-full"] = function (request) { + _a[server.CommandNames.FormatRangeFull] = function (request) { return _this.requiredResponse(_this.getFormattingEditsForRangeFull(request.arguments)); }, - _a["completions"] = function (request) { + _a[server.CommandNames.Completions] = function (request) { return _this.requiredResponse(_this.getCompletions(request.arguments, true)); }, - _a["completions-full"] = function (request) { + _a[server.CommandNames.CompletionsFull] = function (request) { return _this.requiredResponse(_this.getCompletions(request.arguments, false)); }, - _a["completionEntryDetails"] = function (request) { + _a[server.CommandNames.CompletionDetails] = function (request) { return _this.requiredResponse(_this.getCompletionEntryDetails(request.arguments)); }, - _a["compileOnSaveAffectedFileList"] = function (request) { + _a[server.CommandNames.CompileOnSaveAffectedFileList] = function (request) { return _this.requiredResponse(_this.getCompileOnSaveAffectedFileList(request.arguments)); }, - _a["compileOnSaveEmitFile"] = function (request) { + _a[server.CommandNames.CompileOnSaveEmitFile] = function (request) { return _this.requiredResponse(_this.emitFile(request.arguments)); }, - _a["signatureHelp"] = function (request) { + _a[server.CommandNames.SignatureHelp] = function (request) { return _this.requiredResponse(_this.getSignatureHelpItems(request.arguments, true)); }, - _a["signatureHelp-full"] = function (request) { + _a[server.CommandNames.SignatureHelpFull] = function (request) { return _this.requiredResponse(_this.getSignatureHelpItems(request.arguments, false)); }, - _a["compilerOptionsDiagnostics-full"] = function (request) { + _a[server.CommandNames.CompilerOptionsDiagnosticsFull] = function (request) { return _this.requiredResponse(_this.getCompilerOptionsDiagnostics(request.arguments)); }, - _a["encodedSemanticClassifications-full"] = function (request) { + _a[server.CommandNames.EncodedSemanticClassificationsFull] = function (request) { return _this.requiredResponse(_this.getEncodedSemanticClassifications(request.arguments)); }, - _a["cleanup"] = function () { + _a[server.CommandNames.Cleanup] = function () { _this.cleanup(); return _this.requiredResponse(true); }, - _a["semanticDiagnosticsSync"] = function (request) { + _a[server.CommandNames.SemanticDiagnosticsSync] = function (request) { return _this.requiredResponse(_this.getSemanticDiagnosticsSync(request.arguments)); }, - _a["syntacticDiagnosticsSync"] = function (request) { + _a[server.CommandNames.SyntacticDiagnosticsSync] = function (request) { return _this.requiredResponse(_this.getSyntacticDiagnosticsSync(request.arguments)); }, - _a["geterr"] = function (request) { + _a[server.CommandNames.Geterr] = function (request) { _this.errorCheck.startNew(function (next) { return _this.getDiagnostics(next, request.arguments.delay, request.arguments.files); }); return _this.notRequired(); }, - _a["geterrForProject"] = function (request) { + _a[server.CommandNames.GeterrForProject] = function (request) { _this.errorCheck.startNew(function (next) { return _this.getDiagnosticsForProject(next, request.arguments.delay, request.arguments.file); }); return _this.notRequired(); }, - _a["change"] = function (request) { + _a[server.CommandNames.Change] = function (request) { _this.change(request.arguments); return _this.notRequired(); }, - _a["configure"] = function (request) { + _a[server.CommandNames.Configure] = function (request) { _this.projectService.setHostConfiguration(request.arguments); - _this.output(undefined, "configure", request.seq); + _this.output(undefined, server.CommandNames.Configure, request.seq); return _this.notRequired(); }, - _a["reload"] = function (request) { + _a[server.CommandNames.Reload] = function (request) { _this.reload(request.arguments, request.seq); return _this.requiredResponse({ reloadFinished: true }); }, - _a["saveto"] = function (request) { + _a[server.CommandNames.Saveto] = function (request) { var savetoArgs = request.arguments; _this.saveToTmp(savetoArgs.file, savetoArgs.tmpfile); return _this.notRequired(); }, - _a["close"] = function (request) { + _a[server.CommandNames.Close] = function (request) { var closeArgs = request.arguments; _this.closeClientFile(closeArgs.file); return _this.notRequired(); }, - _a["navto"] = function (request) { + _a[server.CommandNames.Navto] = function (request) { return _this.requiredResponse(_this.getNavigateToItems(request.arguments, true)); }, - _a["navto-full"] = function (request) { + _a[server.CommandNames.NavtoFull] = function (request) { return _this.requiredResponse(_this.getNavigateToItems(request.arguments, false)); }, - _a["brace"] = function (request) { + _a[server.CommandNames.Brace] = function (request) { return _this.requiredResponse(_this.getBraceMatching(request.arguments, true)); }, - _a["brace-full"] = function (request) { + _a[server.CommandNames.BraceFull] = function (request) { return _this.requiredResponse(_this.getBraceMatching(request.arguments, false)); }, - _a["navbar"] = function (request) { + _a[server.CommandNames.NavBar] = function (request) { return _this.requiredResponse(_this.getNavigationBarItems(request.arguments, true)); }, - _a["navbar-full"] = function (request) { + _a[server.CommandNames.NavBarFull] = function (request) { return _this.requiredResponse(_this.getNavigationBarItems(request.arguments, false)); }, - _a["navtree"] = function (request) { + _a[server.CommandNames.NavTree] = function (request) { return _this.requiredResponse(_this.getNavigationTree(request.arguments, true)); }, - _a["navtree-full"] = function (request) { + _a[server.CommandNames.NavTreeFull] = function (request) { return _this.requiredResponse(_this.getNavigationTree(request.arguments, false)); }, - _a["occurrences"] = function (request) { + _a[server.CommandNames.Occurrences] = function (request) { return _this.requiredResponse(_this.getOccurrences(request.arguments)); }, - _a["documentHighlights"] = function (request) { + _a[server.CommandNames.DocumentHighlights] = function (request) { return _this.requiredResponse(_this.getDocumentHighlights(request.arguments, true)); }, - _a["documentHighlights-full"] = function (request) { + _a[server.CommandNames.DocumentHighlightsFull] = function (request) { return _this.requiredResponse(_this.getDocumentHighlights(request.arguments, false)); }, - _a["compilerOptionsForInferredProjects"] = function (request) { + _a[server.CommandNames.CompilerOptionsForInferredProjects] = function (request) { _this.setCompilerOptionsForInferredProjects(request.arguments); return _this.requiredResponse(true); }, - _a["projectInfo"] = function (request) { + _a[server.CommandNames.ProjectInfo] = function (request) { return _this.requiredResponse(_this.getProjectInfo(request.arguments)); }, - _a["reloadProjects"] = function () { + _a[server.CommandNames.ReloadProjects] = function () { _this.projectService.reloadProjects(); return _this.notRequired(); }, - _a["getCodeFixes"] = function (request) { + _a[server.CommandNames.GetCodeFixes] = function (request) { return _this.requiredResponse(_this.getCodeFixes(request.arguments, true)); }, - _a["getCodeFixes-full"] = function (request) { + _a[server.CommandNames.GetCodeFixesFull] = function (request) { return _this.requiredResponse(_this.getCodeFixes(request.arguments, false)); }, - _a["getSupportedCodeFixes"] = function () { + _a[server.CommandNames.GetSupportedCodeFixes] = function () { return _this.requiredResponse(_this.getSupportedCodeFixes()); }, - _a["getApplicableRefactors"] = function (request) { + _a[server.CommandNames.GetApplicableRefactors] = function (request) { return _this.requiredResponse(_this.getApplicableRefactors(request.arguments)); }, - _a["getEditsForRefactor"] = function (request) { + _a[server.CommandNames.GetEditsForRefactor] = function (request) { return _this.requiredResponse(_this.getEditsForRefactor(request.arguments, true)); }, - _a["getEditsForRefactor-full"] = function (request) { + _a[server.CommandNames.GetEditsForRefactorFull] = function (request) { return _this.requiredResponse(_this.getEditsForRefactor(request.arguments, false)); }, _a)); @@ -76439,7 +76541,7 @@ var ts; if (project) { this.changeSeq++; if (project.reloadScript(file, tempFileName)) { - this.output(undefined, "reload", reqSeq); + this.output(undefined, server.CommandNames.Reload, reqSeq); } } }; @@ -76780,7 +76882,7 @@ var ts; } else { this.logger.msg("Unrecognized JSON command: " + JSON.stringify(request), server.Msg.Err); - this.output(undefined, "unknown", request.seq, "Unrecognized JSON command: " + request.command); + this.output(undefined, server.CommandNames.Unknown, request.seq, "Unrecognized JSON command: " + request.command); return { responseRequired: false }; } }; @@ -76819,7 +76921,7 @@ var ts; return; } this.logError(err, message); - this.output(undefined, request ? request.command : "unknown", request ? request.seq : 0, "Error processing request. " + err.message + "\n" + err.stack); + this.output(undefined, request ? request.command : server.CommandNames.Unknown, request ? request.seq : 0, "Error processing request. " + err.message + "\n" + err.stack); } }; return Session; @@ -80110,6 +80212,7 @@ var ts; if (!this.eventHandler) return; var data = { + projectId: this.host.createHash(projectKey), fileStats: server.countEachFileTypes(project.getScriptInfos()), compilerOptions: ts.convertCompilerOptionsForTelemetry(project.getCompilerOptions()), typeAcquisition: convertTypeAcquisition(project.getTypeAcquisition()), @@ -81250,7 +81353,7 @@ var ts; var compilerOptions = JSON.parse(compilerOptionsJson); var result = ts.resolveModuleName(moduleName, ts.normalizeSlashes(fileName), compilerOptions, _this.host); var resolvedFileName = result.resolvedModule ? result.resolvedModule.resolvedFileName : undefined; - if (result.resolvedModule && result.resolvedModule.extension !== ts.Extension.Ts && result.resolvedModule.extension !== ts.Extension.Tsx && result.resolvedModule.extension !== ts.Extension.Dts) { + if (result.resolvedModule && result.resolvedModule.extension !== ".ts" && result.resolvedModule.extension !== ".tsx" && result.resolvedModule.extension !== ".d.ts") { resolvedFileName = undefined; } return { diff --git a/lib/typescript.d.ts b/lib/typescript.d.ts index 7a7489eea8a..fb5346c28aa 100644 --- a/lib/typescript.d.ts +++ b/lib/typescript.d.ts @@ -1147,6 +1147,7 @@ declare namespace ts { condition?: Expression; incrementor?: Expression; } + type ForInOrOfStatement = ForInStatement | ForOfStatement; interface ForInStatement extends IterationStatement { kind: SyntaxKind.ForInStatement; initializer: ForInitializer; @@ -1220,7 +1221,7 @@ declare namespace ts { variableDeclaration: VariableDeclaration; block: Block; } - type DeclarationWithTypeParameters = SignatureDeclaration | ClassLikeDeclaration | InterfaceDeclaration | TypeAliasDeclaration; + type DeclarationWithTypeParameters = SignatureDeclaration | ClassLikeDeclaration | InterfaceDeclaration | TypeAliasDeclaration | JSDocTemplateTag; interface ClassLikeDeclaration extends NamedDeclaration { name?: Identifier; typeParameters?: NodeArray; @@ -2183,6 +2184,7 @@ declare namespace ts { noImplicitAny?: boolean; noImplicitReturns?: boolean; noImplicitThis?: boolean; + noStrictGenericChecks?: boolean; noUnusedLocals?: boolean; noUnusedParameters?: boolean; noImplicitUseStrict?: boolean; @@ -2331,12 +2333,11 @@ declare namespace ts { extension: Extension; } enum Extension { - Ts = 0, - Tsx = 1, - Dts = 2, - Js = 3, - Jsx = 4, - LastTypeScriptExtension = 2, + Ts = ".ts", + Tsx = ".tsx", + Dts = ".d.ts", + Js = ".js", + Jsx = ".jsx", } interface ResolvedModuleWithFailedLookupLocations { resolvedModule: ResolvedModuleFull | undefined; @@ -2592,7 +2593,7 @@ declare namespace ts { } declare namespace ts { /** The version of the TypeScript compiler release */ - const version = "2.4.0"; + const version = "2.4.1"; } declare function setTimeout(handler: (...args: any[]) => void, timeout: number): any; declare function clearTimeout(handle: any): void; @@ -2627,6 +2628,10 @@ declare namespace ts { getDirectories(path: string): string[]; readDirectory(path: string, extensions?: string[], exclude?: string[], include?: string[]): string[]; getModifiedTime?(path: string): Date; + /** + * This should be cryptographically secure. + * A good implementation is node.js' `crypto.createHash`. (https://nodejs.org/api/crypto.html#crypto_crypto_createhash_algorithm) + */ createHash?(data: string): string; getMemoryUsage?(): number; exit(exitCode?: number): void; @@ -2785,7 +2790,7 @@ declare namespace ts { function isIdentifier(node: Node): node is Identifier; function isQualifiedName(node: Node): node is QualifiedName; function isComputedPropertyName(node: Node): node is ComputedPropertyName; - function isTypeParameter(node: Node): node is TypeParameterDeclaration; + function isTypeParameterDeclaration(node: Node): node is TypeParameterDeclaration; function isParameter(node: Node): node is ParameterDeclaration; function isDecorator(node: Node): node is Decorator; function isPropertySignature(node: Node): node is PropertySignature; @@ -2967,6 +2972,8 @@ declare namespace ts { function isIterationStatement(node: Node, lookInLabeledStatements: boolean): node is IterationStatement; function isJsxOpeningLikeElement(node: Node): node is JsxOpeningLikeElement; function isCaseOrDefaultClause(node: Node): node is CaseOrDefaultClause; + /** True if node is of a kind that may contain comment text. */ + function isJSDocCommentContainingNode(node: Node): boolean; } declare namespace ts { /** diff --git a/lib/typescript.js b/lib/typescript.js index 712abadd7b1..96a530f4517 100644 --- a/lib/typescript.js +++ b/lib/typescript.js @@ -1064,12 +1064,11 @@ var ts; })(CharacterCodes = ts.CharacterCodes || (ts.CharacterCodes = {})); var Extension; (function (Extension) { - Extension[Extension["Ts"] = 0] = "Ts"; - Extension[Extension["Tsx"] = 1] = "Tsx"; - Extension[Extension["Dts"] = 2] = "Dts"; - Extension[Extension["Js"] = 3] = "Js"; - Extension[Extension["Jsx"] = 4] = "Jsx"; - Extension[Extension["LastTypeScriptExtension"] = 2] = "LastTypeScriptExtension"; + Extension["Ts"] = ".ts"; + Extension["Tsx"] = ".tsx"; + Extension["Dts"] = ".d.ts"; + Extension["Js"] = ".js"; + Extension["Jsx"] = ".jsx"; })(Extension = ts.Extension || (ts.Extension = {})); /* @internal */ var TransformFlags; @@ -1318,7 +1317,7 @@ var ts; var ts; (function (ts) { /** The version of the TypeScript compiler release */ - ts.version = "2.4.0"; + ts.version = "2.4.1"; })(ts || (ts = {})); /* @internal */ (function (ts) { @@ -3292,13 +3291,13 @@ var ts; function getScriptKindFromFileName(fileName) { var ext = fileName.substr(fileName.lastIndexOf(".")); switch (ext.toLowerCase()) { - case ".js": + case ".js" /* Js */: return 1 /* JS */; - case ".jsx": + case ".jsx" /* Jsx */: return 2 /* JSX */; - case ".ts": + case ".ts" /* Ts */: return 3 /* TS */; - case ".tsx": + case ".tsx" /* Tsx */: return 4 /* TSX */; default: return 0 /* Unknown */; @@ -3308,10 +3307,10 @@ var ts; /** * List of supported extensions in order of file resolution precedence. */ - ts.supportedTypeScriptExtensions = [".ts", ".tsx", ".d.ts"]; + ts.supportedTypeScriptExtensions = [".ts" /* Ts */, ".tsx" /* Tsx */, ".d.ts" /* Dts */]; /** Must have ".d.ts" first because if ".ts" goes first, that will be detected as the extension instead of ".d.ts". */ - ts.supportedTypescriptExtensionsForExtractExtension = [".d.ts", ".ts", ".tsx"]; - ts.supportedJavascriptExtensions = [".js", ".jsx"]; + ts.supportedTypescriptExtensionsForExtractExtension = [".d.ts" /* Dts */, ".ts" /* Ts */, ".tsx" /* Tsx */]; + ts.supportedJavascriptExtensions = [".js" /* Js */, ".jsx" /* Jsx */]; var allSupportedExtensions = ts.supportedTypeScriptExtensions.concat(ts.supportedJavascriptExtensions); function getSupportedExtensions(options, extraFileExtensions) { var needAllExtensions = options && options.allowJs; @@ -3399,7 +3398,7 @@ var ts; } } ts.getNextLowestExtensionPriority = getNextLowestExtensionPriority; - var extensionsToRemove = [".d.ts", ".ts", ".js", ".tsx", ".jsx"]; + var extensionsToRemove = [".d.ts" /* Dts */, ".ts" /* Ts */, ".js" /* Js */, ".tsx" /* Tsx */, ".jsx" /* Jsx */]; function removeFileExtension(path) { for (var _i = 0, extensionsToRemove_1 = extensionsToRemove; _i < extensionsToRemove_1.length; _i++) { var ext = extensionsToRemove_1[_i]; @@ -3636,7 +3635,7 @@ var ts; ts.positionIsSynthesized = positionIsSynthesized; /** True if an extension is one of the supported TypeScript extensions. */ function extensionIsTypeScript(ext) { - return ext <= ts.Extension.LastTypeScriptExtension; + return ext === ".ts" /* Ts */ || ext === ".tsx" /* Tsx */ || ext === ".d.ts" /* Dts */; } ts.extensionIsTypeScript = extensionIsTypeScript; /** @@ -3652,21 +3651,7 @@ var ts; } ts.extensionFromPath = extensionFromPath; function tryGetExtensionFromPath(path) { - if (fileExtensionIs(path, ".d.ts")) { - return ts.Extension.Dts; - } - if (fileExtensionIs(path, ".ts")) { - return ts.Extension.Ts; - } - if (fileExtensionIs(path, ".tsx")) { - return ts.Extension.Tsx; - } - if (fileExtensionIs(path, ".js")) { - return ts.Extension.Js; - } - if (fileExtensionIs(path, ".jsx")) { - return ts.Extension.Jsx; - } + return find(ts.supportedTypescriptExtensionsForExtractExtension, function (e) { return fileExtensionIs(path, e); }) || find(ts.supportedJavascriptExtensions, function (e) { return fileExtensionIs(path, e); }); } ts.tryGetExtensionFromPath = tryGetExtensionFromPath; function isCheckJsEnabledForFile(sourceFile, compilerOptions) { @@ -4902,6 +4887,7 @@ var ts; Scoped_package_detected_looking_in_0: { code: 6182, category: ts.DiagnosticCategory.Message, key: "Scoped_package_detected_looking_in_0_6182", message: "Scoped package detected, looking in '{0}'" }, Reusing_resolution_of_module_0_to_file_1_from_old_program: { code: 6183, category: ts.DiagnosticCategory.Message, key: "Reusing_resolution_of_module_0_to_file_1_from_old_program_6183", message: "Reusing resolution of module '{0}' to file '{1}' from old program." }, Reusing_module_resolutions_originating_in_0_since_resolutions_are_unchanged_from_old_program: { code: 6184, category: ts.DiagnosticCategory.Message, key: "Reusing_module_resolutions_originating_in_0_since_resolutions_are_unchanged_from_old_program_6184", message: "Reusing module resolutions originating in '{0}' since resolutions are unchanged from old program." }, + Disable_strict_checking_of_generic_signatures_in_function_types: { code: 6185, category: ts.DiagnosticCategory.Message, key: "Disable_strict_checking_of_generic_signatures_in_function_types_6185", message: "Disable strict checking of generic signatures in function types." }, Variable_0_implicitly_has_an_1_type: { code: 7005, category: ts.DiagnosticCategory.Error, key: "Variable_0_implicitly_has_an_1_type_7005", message: "Variable '{0}' implicitly has an '{1}' type." }, Parameter_0_implicitly_has_an_1_type: { code: 7006, category: ts.DiagnosticCategory.Error, key: "Parameter_0_implicitly_has_an_1_type_7006", message: "Parameter '{0}' implicitly has an '{1}' type." }, Member_0_implicitly_has_an_1_type: { code: 7008, category: ts.DiagnosticCategory.Error, key: "Member_0_implicitly_has_an_1_type_7008", message: "Member '{0}' implicitly has an '{1}' type." }, @@ -8241,6 +8227,12 @@ var ts; }); } ts.getParameterFromJSDoc = getParameterFromJSDoc; + function getTypeParameterFromJsDoc(node) { + var name = node.name.text; + var typeParameters = node.parent.parent.parent.typeParameters; + return ts.find(typeParameters, function (p) { return p.name.text === name; }); + } + ts.getTypeParameterFromJsDoc = getTypeParameterFromJsDoc; function getJSDocType(node) { var tag = getFirstJSDocTag(node, 289 /* JSDocTypeTag */); if (!tag && node.kind === 146 /* Parameter */) { @@ -8264,6 +8256,11 @@ var ts; return getFirstJSDocTag(node, 288 /* JSDocReturnTag */); } ts.getJSDocReturnTag = getJSDocReturnTag; + function getJSDocReturnType(node) { + var returnTag = getJSDocReturnTag(node); + return returnTag && returnTag.typeExpression && returnTag.typeExpression.type; + } + ts.getJSDocReturnType = getJSDocReturnType; function getJSDocTemplateTag(node) { return getFirstJSDocTag(node, 290 /* JSDocTemplateTag */); } @@ -9124,7 +9121,7 @@ var ts; var path = outputDir ? getSourceFilePathInNewDir(sourceFile, host, outputDir) : sourceFile.fileName; - return ts.removeFileExtension(path) + ".d.ts"; + return ts.removeFileExtension(path) + ".d.ts" /* Dts */; } ts.getDeclarationEmitOutputFilePath = getDeclarationEmitOutputFilePath; /** @@ -9174,7 +9171,7 @@ var ts; if (sourceFiles.length) { var jsFilePath = options.outFile || options.out; var sourceMapFilePath = getSourceMapFilePath(jsFilePath, options); - var declarationFilePath = options.declaration ? ts.removeFileExtension(jsFilePath) + ".d.ts" : ""; + var declarationFilePath = options.declaration ? ts.removeFileExtension(jsFilePath) + ".d.ts" /* Dts */ : ""; action({ jsFilePath: jsFilePath, sourceMapFilePath: sourceMapFilePath, declarationFilePath: declarationFilePath }, ts.createBundle(sourceFiles), emitOnlyDtsFiles); } } @@ -9198,16 +9195,16 @@ var ts; function getOutputExtension(sourceFile, options) { if (options.jsx === 1 /* Preserve */) { if (isSourceFileJavaScript(sourceFile)) { - if (ts.fileExtensionIs(sourceFile.fileName, ".jsx")) { - return ".jsx"; + if (ts.fileExtensionIs(sourceFile.fileName, ".jsx" /* Jsx */)) { + return ".jsx" /* Jsx */; } } else if (sourceFile.languageVariant === 1 /* JSX */) { // TypeScript source file preserving JSX syntax - return ".jsx"; + return ".jsx" /* Jsx */; } } - return ".js"; + return ".js" /* Js */; } function getSourceFilePathInNewDir(sourceFile, host, newDirPath) { var sourceFilePath = ts.getNormalizedAbsolutePath(sourceFile.fileName, host.getCurrentDirectory()); @@ -9239,13 +9236,17 @@ var ts; }); } ts.getFirstConstructorWithBody = getFirstConstructorWithBody; - /** Get the type annotaion for the value parameter. */ - function getSetAccessorTypeAnnotationNode(accessor) { + function getSetAccessorValueParameter(accessor) { if (accessor && accessor.parameters.length > 0) { var hasThis = accessor.parameters.length === 2 && parameterIsThisKeyword(accessor.parameters[0]); - return accessor.parameters[hasThis ? 1 : 0].type; + return accessor.parameters[hasThis ? 1 : 0]; } } + /** Get the type annotation for the value parameter. */ + function getSetAccessorTypeAnnotationNode(accessor) { + var parameter = getSetAccessorValueParameter(accessor); + return parameter && parameter.type; + } ts.getSetAccessorTypeAnnotationNode = getSetAccessorTypeAnnotationNode; function getThisParameter(signature) { if (signature.parameters.length) { @@ -9316,6 +9317,55 @@ var ts; }; } ts.getAllAccessorDeclarations = getAllAccessorDeclarations; + /** + * Gets the effective type annotation of a variable, parameter, or property. If the node was + * parsed in a JavaScript file, gets the type annotation from JSDoc. + */ + function getEffectiveTypeAnnotationNode(node) { + if (node.type) { + return node.type; + } + if (node.flags & 65536 /* JavaScriptFile */) { + return getJSDocType(node); + } + } + ts.getEffectiveTypeAnnotationNode = getEffectiveTypeAnnotationNode; + /** + * Gets the effective return type annotation of a signature. If the node was parsed in a + * JavaScript file, gets the return type annotation from JSDoc. + */ + function getEffectiveReturnTypeNode(node) { + if (node.type) { + return node.type; + } + if (node.flags & 65536 /* JavaScriptFile */) { + return getJSDocReturnType(node); + } + } + ts.getEffectiveReturnTypeNode = getEffectiveReturnTypeNode; + /** + * Gets the effective type parameters. If the node was parsed in a + * JavaScript file, gets the type parameters from the `@template` tag from JSDoc. + */ + function getEffectiveTypeParameterDeclarations(node) { + if (node.typeParameters) { + return node.typeParameters; + } + if (node.flags & 65536 /* JavaScriptFile */) { + var templateTag = getJSDocTemplateTag(node); + return templateTag && templateTag.typeParameters; + } + } + ts.getEffectiveTypeParameterDeclarations = getEffectiveTypeParameterDeclarations; + /** + * Gets the effective type annotation of the value parameter of a set accessor. If the node + * was parsed in a JavaScript file, gets the type annotation from JSDoc. + */ + function getEffectiveSetAccessorTypeAnnotationNode(node) { + var parameter = getSetAccessorValueParameter(node); + return parameter && getEffectiveTypeAnnotationNode(parameter); + } + ts.getEffectiveSetAccessorTypeAnnotationNode = getEffectiveSetAccessorTypeAnnotationNode; function emitNewLineBeforeLeadingComments(lineMap, writer, node, leadingComments) { emitNewLineBeforeLeadingCommentsOfPosition(lineMap, writer, node.pos, leadingComments); } @@ -10556,10 +10606,10 @@ var ts; } ts.isComputedPropertyName = isComputedPropertyName; // Signature elements - function isTypeParameter(node) { + function isTypeParameterDeclaration(node) { return node.kind === 145 /* TypeParameter */; } - ts.isTypeParameter = isTypeParameter; + ts.isTypeParameterDeclaration = isTypeParameterDeclaration; function isParameter(node) { return node.kind === 146 /* Parameter */; } @@ -11167,6 +11217,16 @@ var ts; // All node tests in the following list should *not* reference parent pointers so that // they may be used with transformations. (function (ts) { + /* @internal */ + function isNode(node) { + return isNodeKind(node.kind); + } + ts.isNode = isNode; + /* @internal */ + function isNodeKind(kind) { + return kind >= 143 /* FirstNode */; + } + ts.isNodeKind = isNodeKind; /** * True if node is of some token syntax kind. * For example, this is true for an IfKeyword but not for an IfStatement. @@ -11564,6 +11624,11 @@ var ts; return false; } ts.isIterationStatement = isIterationStatement; + /* @internal */ + function isForInOrOfStatement(node) { + return node.kind === 215 /* ForInStatement */ || node.kind === 216 /* ForOfStatement */; + } + ts.isForInOrOfStatement = isForInOrOfStatement; // Element /* @internal */ function isConciseBody(node) { @@ -11688,6 +11753,9 @@ var ts; } /* @internal */ function isDeclaration(node) { + if (node.kind === 145 /* TypeParameter */) { + return node.parent.kind !== 290 /* JSDocTemplateTag */ || ts.isInJavaScriptFile(node); + } return isDeclarationKind(node.kind); } ts.isDeclaration = isDeclaration; @@ -11773,6 +11841,11 @@ var ts; return node.kind >= 267 /* FirstJSDocNode */ && node.kind <= 294 /* LastJSDocNode */; } ts.isJSDocNode = isJSDocNode; + /** True if node is of a kind that may contain comment text. */ + function isJSDocCommentContainingNode(node) { + return node.kind === 283 /* JSDocComment */ || isJSDocTag(node); + } + ts.isJSDocCommentContainingNode = isJSDocCommentContainingNode; // TODO: determine what this does before making it public. /* @internal */ function isJSDocTag(node) { @@ -15842,7 +15915,7 @@ var ts; else if (kind === 71 /* Identifier */) { return new (IdentifierConstructor || (IdentifierConstructor = ts.objectAllocator.getIdentifierConstructor()))(kind, pos, end); } - else if (kind < 143 /* FirstNode */) { + else if (!ts.isNodeKind(kind)) { return new (TokenConstructor || (TokenConstructor = ts.objectAllocator.getTokenConstructor()))(kind, pos, end); } else { @@ -16555,7 +16628,7 @@ var ts; sourceFile.languageVersion = languageVersion; sourceFile.fileName = ts.normalizePath(fileName); sourceFile.languageVariant = getLanguageVariant(scriptKind); - sourceFile.isDeclarationFile = ts.fileExtensionIs(sourceFile.fileName, ".d.ts"); + sourceFile.isDeclarationFile = ts.fileExtensionIs(sourceFile.fileName, ".d.ts" /* Dts */); sourceFile.scriptKind = scriptKind; return sourceFile; } @@ -16832,7 +16905,7 @@ var ts; if (!(pos >= 0)) { pos = scanner.getStartPos(); } - return kind >= 143 /* FirstNode */ ? new NodeConstructor(kind, pos, pos) : + return ts.isNodeKind(kind) ? new NodeConstructor(kind, pos, pos) : kind === 71 /* Identifier */ ? new IdentifierConstructor(kind, pos, pos) : new TokenConstructor(kind, pos, pos); } @@ -21889,7 +21962,7 @@ var ts; jsDocNamespaceNode.flags |= flags; jsDocNamespaceNode.name = typeNameOrNamespaceName; jsDocNamespaceNode.body = parseJSDocTypeNameWithNamespace(4 /* NestedNamespace */); - return jsDocNamespaceNode; + return finishNode(jsDocNamespaceNode); } if (typeNameOrNamespaceName && flags & 4 /* NestedNamespace */) { typeNameOrNamespaceName.isInJSDocNamespace = true; @@ -23690,7 +23763,7 @@ var ts; } function bindVariableDeclarationFlow(node) { bindEachChild(node); - if (node.initializer || node.parent.parent.kind === 215 /* ForInStatement */ || node.parent.parent.kind === 216 /* ForOfStatement */) { + if (node.initializer || ts.isForInOrOfStatement(node.parent.parent)) { bindInitializedVariableFlow(node); } } @@ -23861,7 +23934,7 @@ var ts; // All the children of these container types are never visible through another // symbol (i.e. through another symbol's 'exports' or 'members'). Instead, // they're only accessed 'lexically' (i.e. from code that exists underneath - // their container in the tree. To accomplish this, we simply add their declared + // their container in the tree). To accomplish this, we simply add their declared // symbol to the 'locals' of the container. These symbols can then be found as // the type checker walks up the containers, checking them for matching names. return declareSymbol(container.locals, /*parent*/ undefined, node, symbolFlags, symbolExcludes); @@ -24335,7 +24408,10 @@ var ts; case 158 /* TypePredicate */: return checkTypePredicate(node); case 145 /* TypeParameter */: - return declareSymbolAndAddToSymbolTable(node, 262144 /* TypeParameter */, 530920 /* TypeParameterExcludes */); + if (node.parent.kind !== 290 /* JSDocTemplateTag */ || ts.isInJavaScriptFile(node)) { + return declareSymbolAndAddToSymbolTable(node, 262144 /* TypeParameter */, 530920 /* TypeParameterExcludes */); + } + return; case 146 /* Parameter */: return bindParameter(node); case 226 /* VariableDeclaration */: @@ -24412,7 +24488,10 @@ var ts; case 232 /* EnumDeclaration */: return bindEnumDeclaration(node); case 233 /* ModuleDeclaration */: - return bindModuleDeclaration(node); + if (node.parent.kind !== 291 /* JSDocTypedefTag */ || ts.isInJavaScriptFile(node)) { + return bindModuleDeclaration(node); + } + return undefined; // Jsx-attributes case 254 /* JsxAttributes */: return bindJsxAttributes(node); @@ -26340,14 +26419,14 @@ var ts; } switch (extensions) { case Extensions.DtsOnly: - return tryExtension(".d.ts", ts.Extension.Dts); + return tryExtension(".d.ts" /* Dts */); case Extensions.TypeScript: - return tryExtension(".ts", ts.Extension.Ts) || tryExtension(".tsx", ts.Extension.Tsx) || tryExtension(".d.ts", ts.Extension.Dts); + return tryExtension(".ts" /* Ts */) || tryExtension(".tsx" /* Tsx */) || tryExtension(".d.ts" /* Dts */); case Extensions.JavaScript: - return tryExtension(".js", ts.Extension.Js) || tryExtension(".jsx", ts.Extension.Jsx); + return tryExtension(".js" /* Js */) || tryExtension(".jsx" /* Jsx */); } - function tryExtension(ext, extension) { - var path = tryFile(candidate + ext, failedLookupLocations, onlyRecordFailures, state); + function tryExtension(extension) { + var path = tryFile(candidate + extension, failedLookupLocations, onlyRecordFailures, state); return path && { path: path, extension: extension }; } } @@ -26423,11 +26502,11 @@ var ts; function extensionIsOk(extensions, extension) { switch (extensions) { case Extensions.JavaScript: - return extension === ts.Extension.Js || extension === ts.Extension.Jsx; + return extension === ".js" /* Js */ || extension === ".jsx" /* Jsx */; case Extensions.TypeScript: - return extension === ts.Extension.Ts || extension === ts.Extension.Tsx || extension === ts.Extension.Dts; + return extension === ".ts" /* Ts */ || extension === ".tsx" /* Tsx */ || extension === ".d.ts" /* Dts */; case Extensions.DtsOnly: - return extension === ts.Extension.Dts; + return extension === ".d.ts" /* Dts */; } } function pathToPackageJson(directory) { @@ -27350,15 +27429,8 @@ var ts; } break; } - switch (declaration.parent.parent.kind) { - case 215 /* ForInStatement */: - case 216 /* ForOfStatement */: - // ForIn/ForOf case - use site should not be used in expression part - if (isSameScopeDescendentOf(usage, declaration.parent.parent.expression, container)) { - return true; - } - } - return false; + // ForIn/ForOf case - use site should not be used in expression part + return ts.isForInOrOfStatement(declaration.parent.parent) && isSameScopeDescendentOf(usage, declaration.parent.parent.expression, container); } function isUsedInFunctionOrInstanceProperty(usage, declaration, container) { return !!ts.findAncestor(usage, function (current) { @@ -30410,15 +30482,6 @@ var ts; } // Return the inferred type for a variable, parameter, or property declaration function getTypeForVariableLikeDeclaration(declaration, includeOptionality) { - if (declaration.flags & 65536 /* JavaScriptFile */) { - // If this is a variable in a JavaScript file, then use the JSDoc type (if it has - // one as its type), otherwise fallback to the below standard TS codepaths to - // try to figure it out. - var type = getTypeForDeclarationFromJSDocComment(declaration); - if (type && type !== unknownType) { - return type; - } - } // A variable declared in a for..in statement is of type string, or of type keyof T when the // right hand expression is of a type parameter type. if (declaration.parent.parent.kind === 215 /* ForInStatement */) { @@ -30437,8 +30500,9 @@ var ts; return getTypeForBindingElement(declaration); } // Use type from type annotation if one is present - if (declaration.type) { - var declaredType = getTypeFromTypeNode(declaration.type); + var typeNode = ts.getEffectiveTypeAnnotationNode(declaration); + if (typeNode) { + var declaredType = getTypeFromTypeNode(typeNode); return addOptionality(declaredType, /*optional*/ declaration.questionToken && includeOptionality); } if ((noImplicitAny || declaration.flags & 65536 /* JavaScriptFile */) && @@ -30705,10 +30769,11 @@ var ts; function getAnnotatedAccessorType(accessor) { if (accessor) { if (accessor.kind === 153 /* GetAccessor */) { - return accessor.type && getTypeFromTypeNode(accessor.type); + var getterTypeAnnotation = ts.getEffectiveReturnTypeNode(accessor); + return getterTypeAnnotation && getTypeFromTypeNode(getterTypeAnnotation); } else { - var setterTypeAnnotation = ts.getSetAccessorTypeAnnotationNode(accessor); + var setterTypeAnnotation = ts.getEffectiveSetAccessorTypeAnnotationNode(accessor); return setterTypeAnnotation && getTypeFromTypeNode(setterTypeAnnotation); } } @@ -30846,7 +30911,7 @@ var ts; } function reportCircularityError(symbol) { // Check if variable has type annotation that circularly references the variable itself - if (symbol.valueDeclaration.type) { + if (ts.getEffectiveTypeAnnotationNode(symbol.valueDeclaration)) { error(symbol.valueDeclaration, ts.Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, symbolToString(symbol)); return unknownType; } @@ -31401,13 +31466,17 @@ var ts; // A variable-like declaration is considered independent (free of this references) if it has a type annotation // that specifies an independent type, or if it has no type annotation and no initializer (and thus of type any). function isIndependentVariableLikeDeclaration(node) { - return node.type && isIndependentType(node.type) || !node.type && !node.initializer; + var typeNode = ts.getEffectiveTypeAnnotationNode(node); + return typeNode ? isIndependentType(typeNode) : !node.initializer; } // A function-like declaration is considered independent (free of this references) if it has a return type // annotation that is considered independent and if each parameter is considered independent. function isIndependentFunctionLikeDeclaration(node) { - if (node.kind !== 152 /* Constructor */ && (!node.type || !isIndependentType(node.type))) { - return false; + if (node.kind !== 152 /* Constructor */) { + var typeNode = ts.getEffectiveReturnTypeNode(node); + if (!typeNode || !isIndependentType(typeNode)) { + return false; + } } for (var _i = 0, _a = node.parameters; _i < _a.length; _i++) { var parameter = _a[_i]; @@ -32087,7 +32156,7 @@ var ts; typeParameter.default = targetDefault ? instantiateType(targetDefault, typeParameter.mapper) : noConstraintType; } else { - var defaultDeclaration = typeParameter.symbol && ts.forEach(typeParameter.symbol.declarations, function (decl) { return ts.isTypeParameter(decl) && decl.default; }); + var defaultDeclaration = typeParameter.symbol && ts.forEach(typeParameter.symbol.declarations, function (decl) { return ts.isTypeParameterDeclaration(decl) && decl.default; }); typeParameter.default = defaultDeclaration ? getTypeFromTypeNode(defaultDeclaration) : noConstraintType; } } @@ -32274,22 +32343,16 @@ var ts; } return undefined; } - function getTypeParametersFromJSDocTemplate(declaration) { - if (declaration.flags & 65536 /* JavaScriptFile */) { - var templateTag = ts.getJSDocTemplateTag(declaration); - if (templateTag) { - return getTypeParametersFromDeclaration(templateTag.typeParameters); - } - } - return undefined; - } // Return list of type parameters with duplicates removed (duplicate identifier errors are generated in the actual // type checking functions). - function getTypeParametersFromDeclaration(typeParameterDeclarations) { - var result = []; - ts.forEach(typeParameterDeclarations, function (node) { + function getTypeParametersFromDeclaration(declaration) { + var result; + ts.forEach(ts.getEffectiveTypeParameterDeclarations(declaration), function (node) { var tp = getDeclaredTypeOfTypeParameter(node.symbol); if (!ts.contains(result, tp)) { + if (!result) { + result = []; + } result.push(tp); } }); @@ -32468,9 +32531,7 @@ var ts; var classType = declaration.kind === 152 /* Constructor */ ? getDeclaredTypeOfClassOrInterface(getMergedSymbol(declaration.parent.symbol)) : undefined; - var typeParameters = classType ? classType.localTypeParameters : - declaration.typeParameters ? getTypeParametersFromDeclaration(declaration.typeParameters) : - getTypeParametersFromJSDocTemplate(declaration); + var typeParameters = classType ? classType.localTypeParameters : getTypeParametersFromDeclaration(declaration); var returnType = getSignatureReturnTypeFromDeclaration(declaration, isJSConstructSignature, classType); var typePredicate = declaration.type && declaration.type.kind === 158 /* TypePredicate */ ? createTypePredicateFromTypePredicateNode(declaration.type) : @@ -32495,14 +32556,9 @@ var ts; else if (classType) { return classType; } - else if (declaration.type) { - return getTypeFromTypeNode(declaration.type); - } - if (declaration.flags & 65536 /* JavaScriptFile */) { - var type = getReturnTypeFromJSDocComment(declaration); - if (type && type !== unknownType) { - return type; - } + var typeNode = ts.getEffectiveReturnTypeNode(declaration); + if (typeNode) { + return getTypeFromTypeNode(typeNode); } // TypeScript 1.0 spec (April 2014): // If only one accessor includes a type annotation, the other behaves as if it had the same type annotation. @@ -32868,30 +32924,48 @@ var ts; } return undefined; } - function resolveTypeReferenceName(typeReferenceName) { + function resolveTypeReferenceName(typeReferenceName, meaning) { if (!typeReferenceName) { return unknownSymbol; } - return resolveEntityName(typeReferenceName, 793064 /* Type */) || unknownSymbol; + return resolveEntityName(typeReferenceName, meaning) || unknownSymbol; } function getTypeReferenceType(node, symbol) { var typeArguments = typeArgumentsFromTypeReferenceNode(node); // Do unconditionally so we mark type arguments as referenced. if (symbol === unknownSymbol) { return unknownType; } + var type = getTypeReferenceTypeWorker(node, symbol, typeArguments); + if (type) { + return type; + } + if (symbol.flags & 107455 /* Value */ && node.kind === 277 /* JSDocTypeReference */) { + // A JSDocTypeReference may have resolved to a value (as opposed to a type). If + // the symbol is a constructor function, return the inferred class type; otherwise, + // the type of this reference is just the type of the value we resolved to. + var valueType = getTypeOfSymbol(symbol); + if (valueType.symbol && !isInferredClassType(valueType)) { + var referenceType = getTypeReferenceTypeWorker(node, valueType.symbol, typeArguments); + if (referenceType) { + return referenceType; + } + } + // Resolve the type reference as a Type for the purpose of reporting errors. + resolveTypeReferenceName(getTypeReferenceName(node), 793064 /* Type */); + return valueType; + } + return getTypeFromNonGenericTypeReference(node, symbol); + } + function getTypeReferenceTypeWorker(node, symbol, typeArguments) { if (symbol.flags & (32 /* Class */ | 64 /* Interface */)) { return getTypeFromClassOrInterfaceReference(node, symbol, typeArguments); } if (symbol.flags & 524288 /* TypeAlias */) { return getTypeFromTypeAliasReference(node, symbol, typeArguments); } - if (symbol.flags & 107455 /* Value */ && node.kind === 277 /* JSDocTypeReference */) { - // A JSDocTypeReference may have resolved to a value (as opposed to a type). In - // that case, the type of this reference is just the type of the value we resolved - // to. - return getTypeOfSymbol(symbol); + if (symbol.flags & 16 /* Function */ && node.kind === 277 /* JSDocTypeReference */ && (symbol.members || ts.getJSDocClassTag(symbol.valueDeclaration))) { + return getInferredClassType(symbol); } - return getTypeFromNonGenericTypeReference(node, symbol); } function getPrimitiveTypeFromJSDocTypeReference(node) { if (ts.isIdentifier(node.name)) { @@ -32931,22 +33005,13 @@ var ts; if (!links.resolvedType) { var symbol = void 0; var type = void 0; + var meaning = 793064 /* Type */; if (node.kind === 277 /* JSDocTypeReference */) { type = getPrimitiveTypeFromJSDocTypeReference(node); - if (!type) { - var typeReferenceName = getTypeReferenceName(node); - symbol = resolveTypeReferenceName(typeReferenceName); - type = getTypeReferenceType(node, symbol); - } + meaning |= 107455 /* Value */; } - else { - // We only support expressions that are simple qualified names. For other expressions this produces undefined. - var typeNameOrExpression = node.kind === 159 /* TypeReference */ - ? node.typeName - : ts.isEntityNameExpression(node.expression) - ? node.expression - : undefined; - symbol = typeNameOrExpression && resolveEntityName(typeNameOrExpression, 793064 /* Type */) || unknownSymbol; + if (!type) { + symbol = resolveTypeReferenceName(getTypeReferenceName(node), meaning); type = getTypeReferenceType(node, symbol); } // Cache both the resolved symbol and the resolved type. The resolved symbol is needed in when we check the @@ -33328,10 +33393,13 @@ var ts; else if (type.flags & 1 /* Any */) { typeSet.containsAny = true; } + else if (type.flags & 8192 /* Never */) { + typeSet.containsNever = true; + } else if (getObjectFlags(type) & 16 /* Anonymous */ && isEmptyObjectType(type)) { typeSet.containsEmptyObject = true; } - else if (!(type.flags & 8192 /* Never */) && (strictNullChecks || !(type.flags & 6144 /* Nullable */)) && !ts.contains(typeSet, type)) { + else if ((strictNullChecks || !(type.flags & 6144 /* Nullable */)) && !ts.contains(typeSet, type)) { if (type.flags & 32768 /* Object */) { typeSet.containsObjectType = true; } @@ -33368,6 +33436,9 @@ var ts; } var typeSet = []; addTypesToIntersection(typeSet, types); + if (typeSet.containsNever) { + return neverType; + } if (typeSet.containsAny) { return anyType; } @@ -33970,7 +34041,8 @@ var ts; if (signature.typePredicate) { freshTypePredicate = cloneTypePredicate(signature.typePredicate, mapper); } - var result = createSignature(signature.declaration, freshTypeParameters, signature.thisParameter && instantiateSymbol(signature.thisParameter, mapper), instantiateList(signature.parameters, mapper, instantiateSymbol), instantiateType(signature.resolvedReturnType, mapper), freshTypePredicate, signature.minArgumentCount, signature.hasRestParameter, signature.hasLiteralTypes); + var result = createSignature(signature.declaration, freshTypeParameters, signature.thisParameter && instantiateSymbol(signature.thisParameter, mapper), instantiateList(signature.parameters, mapper, instantiateSymbol), + /*resolvedReturnType*/ undefined, freshTypePredicate, signature.minArgumentCount, signature.hasRestParameter, signature.hasLiteralTypes); result.target = signature; result.mapper = mapper; return result; @@ -34069,10 +34141,10 @@ var ts; case 199 /* ClassExpression */: case 230 /* InterfaceDeclaration */: case 231 /* TypeAliasDeclaration */: - var declaration = node; - if (declaration.typeParameters) { - for (var _i = 0, _a = declaration.typeParameters; _i < _a.length; _i++) { - var d = _a[_i]; + var typeParameters = ts.getEffectiveTypeParameterDeclarations(node); + if (typeParameters) { + for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) { + var d = typeParameters_1[_i]; if (ts.contains(mappedTypes, getDeclaredTypeOfTypeParameter(getSymbolOfNode(d)))) { return true; } @@ -34092,8 +34164,8 @@ var ts; break; case 279 /* JSDocFunctionType */: var func = node; - for (var _b = 0, _c = func.parameters; _b < _c.length; _b++) { - var p = _c[_b]; + for (var _a = 0, _b = func.parameters; _a < _b.length; _a++) { + var p = _b[_a]; if (ts.contains(mappedTypes, getTypeOfNode(p))) { return true; } @@ -34221,7 +34293,7 @@ var ts; return false; } // Functions with any parameters that lack type annotations are context sensitive. - if (ts.forEach(node.parameters, function (p) { return !p.type; })) { + if (ts.forEach(node.parameters, function (p) { return !ts.getEffectiveTypeAnnotationNode(p); })) { return true; } // For arrow functions we now know we're not context sensitive. @@ -34321,10 +34393,9 @@ var ts; if (!target.hasRestParameter && source.minArgumentCount > target.parameters.length) { return 0 /* False */; } - // Spec 1.0 Section 3.8.3 & 3.8.4: - // M and N (the signatures) are instantiated using type Any as the type argument for all type parameters declared by M and N - source = getErasedSignature(source); - target = getErasedSignature(target); + if (source.typeParameters) { + source = instantiateSignatureInContextOf(source, target); + } var result = -1 /* True */; var sourceThisType = getThisTypeOfSignature(source); if (sourceThisType && sourceThisType !== voidType) { @@ -34800,7 +34871,9 @@ var ts; reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1, symbolToString(prop), typeToString(target)); } else { - errorNode = prop.valueDeclaration; + if (prop.valueDeclaration) { + errorNode = prop.valueDeclaration; + } reportError(ts.Diagnostics.Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1, symbolToString(prop), typeToString(target)); } } @@ -35307,17 +35380,27 @@ var ts; var result = -1 /* True */; var saveErrorInfo = errorInfo; if (getObjectFlags(source) & 64 /* Instantiated */ && getObjectFlags(target) & 64 /* Instantiated */ && source.symbol === target.symbol) { - // We instantiations of the same anonymous type (which typically will be the type of a method). - // Simply do a pairwise comparison of the signatures in the two signature lists instead of the - // much more expensive N * M comparison matrix we explore below. + // We have instantiations of the same anonymous type (which typically will be the type of a + // method). Simply do a pairwise comparison of the signatures in the two signature lists instead + // of the much more expensive N * M comparison matrix we explore below. We erase type parameters + // as they are known to always be the same. for (var i = 0; i < targetSignatures.length; i++) { - var related = signatureRelatedTo(sourceSignatures[i], targetSignatures[i], reportErrors); + var related = signatureRelatedTo(sourceSignatures[i], targetSignatures[i], /*erase*/ true, reportErrors); if (!related) { return 0 /* False */; } result &= related; } } + else if (sourceSignatures.length === 1 && targetSignatures.length === 1) { + // For simple functions (functions with a single signature) we only erase type parameters for + // the comparable relation. Otherwise, if the source signature is generic, we instantiate it + // in the context of the target signature before checking the relationship. Ideally we'd do + // this regardless of the number of signatures, but the potential costs are prohibitive due + // to the quadratic nature of the logic below. + var eraseGenerics = relation === comparableRelation || compilerOptions.noStrictGenericChecks; + result = signatureRelatedTo(sourceSignatures[0], targetSignatures[0], eraseGenerics, reportErrors); + } else { outer: for (var _i = 0, targetSignatures_1 = targetSignatures; _i < targetSignatures_1.length; _i++) { var t = targetSignatures_1[_i]; @@ -35325,7 +35408,7 @@ var ts; var shouldElaborateErrors = reportErrors; for (var _a = 0, sourceSignatures_1 = sourceSignatures; _a < sourceSignatures_1.length; _a++) { var s = sourceSignatures_1[_a]; - var related = signatureRelatedTo(s, t, shouldElaborateErrors); + var related = signatureRelatedTo(s, t, /*erase*/ true, shouldElaborateErrors); if (related) { result &= related; errorInfo = saveErrorInfo; @@ -35344,8 +35427,9 @@ var ts; /** * See signatureAssignableTo, compareSignaturesIdentical */ - function signatureRelatedTo(source, target, reportErrors) { - return compareSignaturesRelated(source, target, /*checkAsCallback*/ false, /*ignoreReturnTypes*/ false, reportErrors, reportError, isRelatedTo); + function signatureRelatedTo(source, target, erase, reportErrors) { + return compareSignaturesRelated(erase ? getErasedSignature(source) : source, erase ? getErasedSignature(target) : target, + /*checkAsCallback*/ false, /*ignoreReturnTypes*/ false, reportErrors, reportError, isRelatedTo); } function signaturesIdenticalTo(source, target, kind) { var sourceSignatures = getSignaturesOfType(source, kind); @@ -38313,8 +38397,15 @@ var ts; function getContextualTypeForInitializerExpression(node) { var declaration = node.parent; if (node === declaration.initializer) { - if (declaration.type) { - return getTypeFromTypeNode(declaration.type); + var typeNode = ts.getEffectiveTypeAnnotationNode(declaration); + if (typeNode) { + return getTypeFromTypeNode(typeNode); + } + if (ts.isInJavaScriptFile(declaration)) { + var jsDocType = getTypeForDeclarationFromJSDocComment(declaration); + if (jsDocType) { + return jsDocType; + } } if (declaration.kind === 146 /* Parameter */) { var type = getContextuallyTypedParameterType(declaration); @@ -38328,12 +38419,13 @@ var ts; if (ts.isBindingPattern(declaration.parent)) { var parentDeclaration = declaration.parent.parent; var name = declaration.propertyName || declaration.name; - if (parentDeclaration.kind !== 176 /* BindingElement */ && - parentDeclaration.type && - !ts.isBindingPattern(name)) { - var text = ts.getTextOfPropertyName(name); - if (text) { - return getTypeOfPropertyOfType(getTypeFromTypeNode(parentDeclaration.type), text); + if (parentDeclaration.kind !== 176 /* BindingElement */) { + var parentTypeNode = ts.getEffectiveTypeAnnotationNode(parentDeclaration); + if (parentTypeNode && !ts.isBindingPattern(name)) { + var text = ts.getTextOfPropertyName(name); + if (text) { + return getTypeOfPropertyOfType(getTypeFromTypeNode(parentTypeNode), text); + } } } } @@ -38379,9 +38471,9 @@ var ts; function getContextualReturnType(functionDecl) { // If the containing function has a return type annotation, is a constructor, or is a get accessor whose // corresponding set accessor has a type annotation, return statements in the function are contextually typed - if (functionDecl.type || - functionDecl.kind === 152 /* Constructor */ || - functionDecl.kind === 153 /* GetAccessor */ && ts.getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(functionDecl.symbol, 154 /* SetAccessor */))) { + if (functionDecl.kind === 152 /* Constructor */ || + ts.getEffectiveReturnTypeNode(functionDecl) || + isGetAccessorWithAnnotatedSetAccessor(functionDecl)) { return getReturnTypeOfSignature(getSignatureFromDeclaration(functionDecl)); } // Otherwise, if the containing function is contextually typed by a function type with exactly one call signature @@ -39658,9 +39750,13 @@ var ts; } /** * Check if a property with the given name is known anywhere in the given type. In an object type, a property - * is considered known if the object type is empty and the check is for assignability, if the object type has - * index signatures, or if the property is actually declared in the object type. In a union or intersection - * type, a property is considered known if it is known in any constituent type. + * is considered known if + * 1. the object type is empty and the check is for assignability, or + * 2. if the object type has index signatures, or + * 3. if the property is actually declared in the object type + * (this means that 'toString', for example, is not usually a known property). + * 4. In a union or intersection type, + * a property is considered known if it is known in any constituent type. * @param targetType a type to search a given name in * @param name a property name to search * @param isComparingJsxAttributes a boolean flag indicating whether we are searching in JsxAttributesType @@ -39670,7 +39766,7 @@ var ts; var resolved = resolveStructuredTypeMembers(targetType); if (resolved.stringIndexInfo || resolved.numberIndexInfo && isNumericLiteralName(name) || - getPropertyOfType(targetType, name) || + getPropertyOfObjectType(targetType, name) || isComparingJsxAttributes && !isUnhyphenatedJsxName(name)) { // For JSXAttributes, if the attribute has a hyphenated name, consider that the attribute to be known. return true; @@ -40341,8 +40437,11 @@ var ts; var context = createInferenceContext(signature, 1 /* InferUnionTypes */); forEachMatchingParameterType(contextualSignature, signature, function (source, target) { // Type parameters from outer context referenced by source type are fixed by instantiation of the source type - inferTypes(context.inferences, instantiateType(source, contextualMapper), target); + inferTypes(context.inferences, instantiateType(source, contextualMapper || identityMapper), target); }); + if (!contextualMapper) { + inferTypes(context.inferences, getReturnTypeOfSignature(contextualSignature), getReturnTypeOfSignature(signature), 4 /* ReturnType */); + } return getSignatureInstantiation(signature, getInferredTypes(context)); } function inferTypeArguments(node, signature, args, excludeArgument, context) { @@ -40378,10 +40477,10 @@ var ts; // outer call expression. Effectively we just want a snapshot of whatever has been // inferred for any outer call expression so far. var instantiatedType = instantiateType(contextualType, cloneTypeMapper(getContextualMapper(node))); - // If the contextual type is a generic pure function type, we instantiate the type with - // its own type parameters and type arguments. This ensures that the type parameters are - // not erased to type any during type inference such that they can be inferred as actual - // types from the contextual type. For example: + // If the contextual type is a generic function type with a single call signature, we + // instantiate the type with its own type parameters and type arguments. This ensures that + // the type parameters are not erased to type any during type inference such that they can + // be inferred as actual types from the contextual type. For example: // declare function arrayMap(f: (x: T) => U): (a: T[]) => U[]; // const boxElements: (a: A[]) => { value: A }[] = arrayMap(value => ({ value })); // Above, the type of the 'value' parameter is inferred to be 'A'. @@ -41422,6 +41521,11 @@ var ts; } return links.inferredClassType; } + function isInferredClassType(type) { + return type.symbol + && getObjectFlags(type) & 16 /* Anonymous */ + && getSymbolLinks(type.symbol).inferredClassType === type; + } /** * Syntactically and semantically checks a call or new expression. * @param node The call/new expression to be checked. @@ -41570,37 +41674,42 @@ var ts; function getTypeOfFirstParameterOfSignature(signature) { return signature.parameters.length > 0 ? getTypeAtPosition(signature, 0) : neverType; } - function assignContextualParameterTypes(signature, context, mapper, checkMode) { + function inferFromAnnotatedParameters(signature, context, mapper) { var len = signature.parameters.length - (signature.hasRestParameter ? 1 : 0); - if (checkMode === 2 /* Inferential */) { - for (var i = 0; i < len; i++) { - var declaration = signature.parameters[i].valueDeclaration; - if (declaration.type) { - inferTypes(mapper.inferences, getTypeFromTypeNode(declaration.type), getTypeAtPosition(context, i)); + for (var i = 0; i < len; i++) { + var declaration = signature.parameters[i].valueDeclaration; + if (declaration.type) { + var typeNode = ts.getEffectiveTypeAnnotationNode(declaration); + if (typeNode) { + inferTypes(mapper.inferences, getTypeFromTypeNode(typeNode), getTypeAtPosition(context, i)); } } } + } + function assignContextualParameterTypes(signature, context) { + signature.typeParameters = context.typeParameters; if (context.thisParameter) { var parameter = signature.thisParameter; if (!parameter || parameter.valueDeclaration && !parameter.valueDeclaration.type) { if (!parameter) { signature.thisParameter = createSymbolWithType(context.thisParameter, /*type*/ undefined); } - assignTypeToParameterAndFixTypeParameters(signature.thisParameter, getTypeOfSymbol(context.thisParameter), mapper, checkMode); + assignTypeToParameterAndFixTypeParameters(signature.thisParameter, getTypeOfSymbol(context.thisParameter)); } } + var len = signature.parameters.length - (signature.hasRestParameter ? 1 : 0); for (var i = 0; i < len; i++) { var parameter = signature.parameters[i]; - if (!parameter.valueDeclaration.type) { + if (!ts.getEffectiveTypeAnnotationNode(parameter.valueDeclaration)) { var contextualParameterType = getTypeAtPosition(context, i); - assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType, mapper, checkMode); + assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType); } } if (signature.hasRestParameter && isRestParameterIndex(context, signature.parameters.length - 1)) { var parameter = ts.lastOrUndefined(signature.parameters); - if (!parameter.valueDeclaration.type) { + if (!ts.getEffectiveTypeAnnotationNode(parameter.valueDeclaration)) { var contextualParameterType = getTypeOfSymbol(ts.lastOrUndefined(context.parameters)); - assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType, mapper, checkMode); + assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType); } } } @@ -41619,10 +41728,10 @@ var ts; } } } - function assignTypeToParameterAndFixTypeParameters(parameter, contextualType, mapper, checkMode) { + function assignTypeToParameterAndFixTypeParameters(parameter, contextualType) { var links = getSymbolLinks(parameter); if (!links.type) { - links.type = instantiateType(contextualType, mapper); + links.type = contextualType; var name = ts.getNameOfDeclaration(parameter.valueDeclaration); // if inference didn't come up with anything but {}, fall back to the binding pattern if present. if (links.type === emptyObjectType && @@ -41631,45 +41740,6 @@ var ts; } assignBindingElementTypes(parameter.valueDeclaration); } - else if (checkMode === 2 /* Inferential */) { - // Even if the parameter already has a type, it might be because it was given a type while - // processing the function as an argument to a prior signature during overload resolution. - // If this was the case, it may have caused some type parameters to be fixed. So here, - // we need to ensure that type parameters at the same positions get fixed again. This is - // done by calling instantiateType to attach the mapper to the contextualType, and then - // calling inferTypes to force a walk of contextualType so that all the correct fixing - // happens. The choice to pass in links.type may seem kind of arbitrary, but it serves - // to make sure that all the correct positions in contextualType are reached by the walk. - // Here is an example: - // - // interface Base { - // baseProp; - // } - // interface Derived extends Base { - // toBase(): Base; - // } - // - // var derived: Derived; - // - // declare function foo(x: T, func: (p: T) => T): T; - // declare function foo(x: T, func: (p: T) => T): T; - // - // var result = foo(derived, d => d.toBase()); - // - // We are typing d while checking the second overload. But we've already given d - // a type (Derived) from the first overload. However, we still want to fix the - // T in the second overload so that we do not infer Base as a candidate for T - // (inferring Base would make type argument inference inconsistent between the two - // overloads). - inferTypes(mapper.inferences, links.type, instantiateType(contextualType, mapper)); - } - } - function getReturnTypeFromJSDocComment(func) { - var returnTag = ts.getJSDocReturnTag(func); - if (returnTag && returnTag.typeExpression) { - return getTypeFromTypeNode(returnTag.typeExpression.type); - } - return undefined; } function createPromiseType(promisedType) { // creates a `Promise` type where `T` is the promisedType argument @@ -41875,16 +41945,16 @@ var ts; } var hasExplicitReturn = func.flags & 256 /* HasExplicitReturn */; if (returnType && returnType.flags & 8192 /* Never */) { - error(func.type, ts.Diagnostics.A_function_returning_never_cannot_have_a_reachable_end_point); + error(ts.getEffectiveReturnTypeNode(func), ts.Diagnostics.A_function_returning_never_cannot_have_a_reachable_end_point); } else if (returnType && !hasExplicitReturn) { // minimal check: function has syntactic return type annotation and no explicit return statements in the body // this function does not conform to the specification. // NOTE: having returnType !== undefined is a precondition for entering this branch so func.type will always be present - error(func.type, ts.Diagnostics.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value); + error(ts.getEffectiveReturnTypeNode(func), ts.Diagnostics.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value); } else if (returnType && strictNullChecks && !isTypeAssignableTo(undefinedType, returnType)) { - error(func.type, ts.Diagnostics.Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined); + error(ts.getEffectiveReturnTypeNode(func), ts.Diagnostics.Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined); } else if (compilerOptions.noImplicitReturns) { if (!returnType) { @@ -41899,7 +41969,7 @@ var ts; return; } } - error(func.type || func, ts.Diagnostics.Not_all_code_paths_return_a_value); + error(ts.getEffectiveReturnTypeNode(func) || func, ts.Diagnostics.Not_all_code_paths_return_a_value); } } function checkFunctionExpressionOrObjectLiteralMethod(node, checkMode) { @@ -41916,35 +41986,34 @@ var ts; } var links = getNodeLinks(node); var type = getTypeOfSymbol(node.symbol); - var contextSensitive = isContextSensitive(node); - var mightFixTypeParameters = contextSensitive && checkMode === 2 /* Inferential */; // Check if function expression is contextually typed and assign parameter types if so. - // See the comment in assignTypeToParameterAndFixTypeParameters to understand why we need to - // check mightFixTypeParameters. - if (mightFixTypeParameters || !(links.flags & 1024 /* ContextChecked */)) { + if (!(links.flags & 1024 /* ContextChecked */)) { var contextualSignature = getContextualSignature(node); // If a type check is started at a function expression that is an argument of a function call, obtaining the // contextual type may recursively get back to here during overload resolution of the call. If so, we will have // already assigned contextual types. - var contextChecked = !!(links.flags & 1024 /* ContextChecked */); - if (mightFixTypeParameters || !contextChecked) { + if (!(links.flags & 1024 /* ContextChecked */)) { links.flags |= 1024 /* ContextChecked */; if (contextualSignature) { var signature = getSignaturesOfType(type, 0 /* Call */)[0]; - if (contextSensitive) { - assignContextualParameterTypes(signature, contextualSignature, getContextualMapper(node), checkMode); + if (isContextSensitive(node)) { + var contextualMapper = getContextualMapper(node); + if (checkMode === 2 /* Inferential */) { + inferFromAnnotatedParameters(signature, contextualSignature, contextualMapper); + } + var instantiatedContextualSignature = contextualMapper === identityMapper ? + contextualSignature : instantiateSignature(contextualSignature, contextualMapper); + assignContextualParameterTypes(signature, instantiatedContextualSignature); } - if (mightFixTypeParameters || !node.type && !signature.resolvedReturnType) { + if (!ts.getEffectiveReturnTypeNode(node) && !signature.resolvedReturnType) { var returnType = getReturnTypeFromBody(node, checkMode); if (!signature.resolvedReturnType) { signature.resolvedReturnType = returnType; } } } - if (!contextChecked) { - checkSignatureDeclaration(node); - checkNodeDeferred(node); - } + checkSignatureDeclaration(node); + checkNodeDeferred(node); } } if (produceDiagnostics && node.kind !== 151 /* MethodDeclaration */) { @@ -41957,16 +42026,17 @@ var ts; function checkFunctionExpressionOrObjectLiteralMethodDeferred(node) { ts.Debug.assert(node.kind !== 151 /* MethodDeclaration */ || ts.isObjectLiteralMethod(node)); var functionFlags = ts.getFunctionFlags(node); - var returnOrPromisedType = node.type && + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); + var returnOrPromisedType = returnTypeNode && ((functionFlags & 3 /* AsyncGenerator */) === 2 /* Async */ ? checkAsyncFunctionReturnType(node) : - getTypeFromTypeNode(node.type)); // AsyncGenerator function, Generator function, or normal function + getTypeFromTypeNode(returnTypeNode)); // AsyncGenerator function, Generator function, or normal function if ((functionFlags & 1 /* Generator */) === 0) { // return is not necessary in the body of generators checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, returnOrPromisedType); } if (node.body) { - if (!node.type) { + if (!returnTypeNode) { // There are some checks that are only performed in getReturnTypeFromBody, that may produce errors // we need. An example is the noImplicitAny errors resulting from widening the return expression // of a function. Because checking of function expression bodies is deferred, there was never an @@ -42052,7 +42122,7 @@ var ts; } function checkReferenceExpression(expr, invalidReferenceMessage) { // References are combinations of identifiers, parentheses, and property accesses. - var node = ts.skipParentheses(expr); + var node = ts.skipOuterExpressions(expr, 2 /* Assertions */ | 1 /* Parentheses */); if (node.kind !== 71 /* Identifier */ && node.kind !== 179 /* PropertyAccessExpression */ && node.kind !== 180 /* ElementAccessExpression */) { error(expr, invalidReferenceMessage); return false; @@ -42691,8 +42761,9 @@ var ts; // There is no point in doing an assignability check if the function // has no explicit return type because the return type is directly computed // from the yield expressions. - if (func.type) { - var signatureElementType = getIteratedTypeOfGenerator(getTypeFromTypeNode(func.type), (functionFlags & 2 /* Async */) !== 0) || anyType; + var returnType = ts.getEffectiveReturnTypeNode(func); + if (returnType) { + var signatureElementType = getIteratedTypeOfGenerator(getTypeFromTypeNode(returnType), (functionFlags & 2 /* Async */) !== 0) || anyType; if (nodeIsYieldStar) { checkTypeAssignableTo(functionFlags & 2 /* Async */ ? getAwaitedType(expressionElementType, node.expression, ts.Diagnostics.Type_of_iterated_elements_of_a_yield_Asterisk_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member) @@ -42825,7 +42896,7 @@ var ts; if (signature && signature.typeParameters) { var contextualType = getApparentTypeOfContextualType(node); if (contextualType) { - var contextualSignature = getSingleCallSignature(contextualType); + var contextualSignature = getSingleCallSignature(getNonNullableType(contextualType)); if (contextualSignature && !contextualSignature.typeParameters) { return getOrCreateTypeFromSignature(instantiateSignatureInContextOf(signature, contextualSignature, getContextualMapper(node))); } @@ -43156,12 +43227,14 @@ var ts; } checkTypeParameters(node.typeParameters); ts.forEach(node.parameters, checkParameter); + // TODO(rbuckton): Should we start checking JSDoc types? if (node.type) { checkSourceElement(node.type); } if (produceDiagnostics) { checkCollisionWithArgumentsInGeneratedCode(node); - if (noImplicitAny && !node.type) { + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); + if (noImplicitAny && !returnTypeNode) { switch (node.kind) { case 156 /* ConstructSignature */: error(node, ts.Diagnostics.Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type); @@ -43171,12 +43244,12 @@ var ts; break; } } - if (node.type) { + if (returnTypeNode) { var functionFlags_1 = ts.getFunctionFlags(node); if ((functionFlags_1 & (4 /* Invalid */ | 1 /* Generator */)) === 1 /* Generator */) { - var returnType = getTypeFromTypeNode(node.type); + var returnType = getTypeFromTypeNode(returnTypeNode); if (returnType === voidType) { - error(node.type, ts.Diagnostics.A_generator_cannot_have_a_void_type_annotation); + error(returnTypeNode, ts.Diagnostics.A_generator_cannot_have_a_void_type_annotation); } else { var generatorElementType = getIteratedTypeOfGenerator(returnType, (functionFlags_1 & 2 /* Async */) !== 0) || anyType; @@ -43189,7 +43262,7 @@ var ts; // interface BadGenerator extends Iterable, Iterator { } // function* g(): BadGenerator { } // Iterable and Iterator have different types! // - checkTypeAssignableTo(iterableIteratorInstantiation, returnType, node.type); + checkTypeAssignableTo(iterableIteratorInstantiation, returnType, returnTypeNode); } } else if ((functionFlags_1 & 3 /* AsyncGenerator */) === 2 /* Async */) { @@ -44103,7 +44176,8 @@ var ts; // then(...): Promise; // } // - var returnType = getTypeFromTypeNode(node.type); + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); + var returnType = getTypeFromTypeNode(returnTypeNode); if (languageVersion >= 2 /* ES2015 */) { if (returnType === unknownType) { return unknownType; @@ -44112,29 +44186,29 @@ var ts; if (globalPromiseType !== emptyGenericType && !isReferenceToType(returnType, globalPromiseType)) { // The promise type was not a valid type reference to the global promise type, so we // report an error and return the unknown type. - error(node.type, ts.Diagnostics.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type); + error(returnTypeNode, ts.Diagnostics.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type); return unknownType; } } else { // Always mark the type node as referenced if it points to a value - markTypeNodeAsReferenced(node.type); + markTypeNodeAsReferenced(returnTypeNode); if (returnType === unknownType) { return unknownType; } - var promiseConstructorName = ts.getEntityNameFromTypeNode(node.type); + var promiseConstructorName = ts.getEntityNameFromTypeNode(returnTypeNode); if (promiseConstructorName === undefined) { - error(node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, typeToString(returnType)); + error(returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, typeToString(returnType)); return unknownType; } var promiseConstructorSymbol = resolveEntityName(promiseConstructorName, 107455 /* Value */, /*ignoreErrors*/ true); var promiseConstructorType = promiseConstructorSymbol ? getTypeOfSymbol(promiseConstructorSymbol) : unknownType; if (promiseConstructorType === unknownType) { if (promiseConstructorName.kind === 71 /* Identifier */ && promiseConstructorName.text === "Promise" && getTargetType(returnType) === getGlobalPromiseType(/*reportErrors*/ false)) { - error(node.type, ts.Diagnostics.An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option); + error(returnTypeNode, ts.Diagnostics.An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option); } else { - error(node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); + error(returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); } return unknownType; } @@ -44142,10 +44216,10 @@ var ts; if (globalPromiseConstructorLikeType === emptyObjectType) { // If we couldn't resolve the global PromiseConstructorLike type we cannot verify // compatibility with __awaiter. - error(node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); + error(returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); return unknownType; } - if (!checkTypeAssignableTo(promiseConstructorType, globalPromiseConstructorLikeType, node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value)) { + if (!checkTypeAssignableTo(promiseConstructorType, globalPromiseConstructorLikeType, returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value)) { return unknownType; } // Verify there is no local declaration that could collide with the promise constructor. @@ -44262,7 +44336,8 @@ var ts; } } function getParameterTypeNodeForDecoratorCheck(node) { - return node.dotDotDotToken ? ts.getRestParameterElementType(node.type) : node.type; + var typeNode = ts.getEffectiveTypeAnnotationNode(node); + return ts.isRestParameter(node) ? ts.getRestParameterElementType(typeNode) : typeNode; } /** Check the decorators of a node */ function checkDecorators(node) { @@ -44302,13 +44377,13 @@ var ts; var parameter = _c[_b]; markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(parameter)); } - markDecoratorMedataDataTypeNodeAsReferenced(node.type); + markDecoratorMedataDataTypeNodeAsReferenced(ts.getEffectiveReturnTypeNode(node)); break; case 149 /* PropertyDeclaration */: - markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(node)); + markDecoratorMedataDataTypeNodeAsReferenced(ts.getEffectiveTypeAnnotationNode(node)); break; case 146 /* Parameter */: - markDecoratorMedataDataTypeNodeAsReferenced(node.type); + markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(node)); break; } } @@ -44316,7 +44391,8 @@ var ts; } function checkFunctionDeclaration(node) { if (produceDiagnostics) { - checkFunctionOrMethodDeclaration(node) || checkGrammarForGenerator(node); + checkFunctionOrMethodDeclaration(node); + checkGrammarForGenerator(node); checkCollisionWithCapturedSuperVariable(node, node.name); checkCollisionWithCapturedThisVariable(node, node.name); checkCollisionWithCapturedNewTargetVariable(node, node.name); @@ -44362,13 +44438,14 @@ var ts; } } checkSourceElement(node.body); + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); if ((functionFlags & 1 /* Generator */) === 0) { - var returnOrPromisedType = node.type && (functionFlags & 2 /* Async */ + var returnOrPromisedType = returnTypeNode && (functionFlags & 2 /* Async */ ? checkAsyncFunctionReturnType(node) // Async function - : getTypeFromTypeNode(node.type)); // normal function + : getTypeFromTypeNode(returnTypeNode)); // normal function checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, returnOrPromisedType); } - if (produceDiagnostics && !node.type) { + if (produceDiagnostics && !returnTypeNode) { // Report an implicit any error if there is no body, no explicit return type, and node is not a private method // in an ambient context if (noImplicitAny && ts.nodeIsMissing(node.body) && !isPrivateWithinAmbient(node)) { @@ -44467,9 +44544,7 @@ var ts; function errorUnusedLocal(node, name) { if (isIdentifierThatStartsWithUnderScore(node)) { var declaration = ts.getRootDeclaration(node.parent); - if (declaration.kind === 226 /* VariableDeclaration */ && - (declaration.parent.parent.kind === 215 /* ForInStatement */ || - declaration.parent.parent.kind === 216 /* ForOfStatement */)) { + if (declaration.kind === 226 /* VariableDeclaration */ && ts.isForInOrOfStatement(declaration.parent.parent)) { return; } } @@ -45376,7 +45451,8 @@ var ts; // TODO: Check that target label is valid } function isGetAccessorWithAnnotatedSetAccessor(node) { - return !!(node.kind === 153 /* GetAccessor */ && ts.getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(node.symbol, 154 /* SetAccessor */))); + return node.kind === 153 /* GetAccessor */ + && ts.getEffectiveSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(node.symbol, 154 /* SetAccessor */)) !== undefined; } function isUnwrappedReturnTypeVoidOrAny(func, returnType) { var unwrappedReturnType = (ts.getFunctionFlags(func) & 3 /* AsyncGenerator */) === 2 /* Async */ @@ -45416,7 +45492,7 @@ var ts; error(node, ts.Diagnostics.Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class); } } - else if (func.type || isGetAccessorWithAnnotatedSetAccessor(func)) { + else if (ts.getEffectiveReturnTypeNode(func) || isGetAccessorWithAnnotatedSetAccessor(func)) { if (functionFlags & 2 /* Async */) { var promisedType = getPromisedTypeOfPromise(returnType); var awaitedType = checkAwaitedType(exprType, node, ts.Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member); @@ -46444,7 +46520,10 @@ var ts; error(node, message, symbolToString(symbol)); } // Don't allow to re-export something with no value side when `--isolatedModules` is set. - if (node.kind === 246 /* ExportSpecifier */ && compilerOptions.isolatedModules && !(target.flags & 107455 /* Value */)) { + if (compilerOptions.isolatedModules + && node.kind === 246 /* ExportSpecifier */ + && !(target.flags & 107455 /* Value */) + && !ts.isInAmbientContext(node)) { error(node, ts.Diagnostics.Cannot_re_export_a_type_when_the_isolatedModules_flag_is_provided); } } @@ -47129,6 +47208,11 @@ var ts; var parameter = ts.getParameterFromJSDoc(entityName.parent); return parameter && parameter.symbol; } + if (entityName.parent.kind === 145 /* TypeParameter */ && entityName.parent.parent.kind === 290 /* JSDocTemplateTag */) { + ts.Debug.assert(!ts.isInJavaScriptFile(entityName)); // Otherwise `isDeclarationName` would have been true. + var typeParameter = ts.getTypeParameterFromJsDoc(entityName.parent); + return typeParameter && typeParameter.symbol; + } if (ts.isPartOfExpression(entityName)) { if (ts.nodeIsMissing(entityName)) { // Missing entity name. @@ -49175,10 +49259,7 @@ var ts; switch (name.parent.kind) { case 242 /* ImportSpecifier */: case 246 /* ExportSpecifier */: - if (name.parent.propertyName) { - return true; - } - // falls through + return true; default: return ts.isDeclarationName(name); } @@ -49341,9 +49422,9 @@ var ts; case 149 /* PropertyDeclaration */: return ts.updateProperty(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.type, visitor, ts.isTypeNode), visitNode(node.initializer, visitor, ts.isExpression)); case 150 /* MethodSignature */: - return ts.updateMethodSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken)); + return ts.updateMethodSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken)); case 151 /* MethodDeclaration */: - return ts.updateMethod(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateMethod(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 152 /* Constructor */: return ts.updateConstructor(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitFunctionBody(node.body, visitor, context)); case 153 /* GetAccessor */: @@ -49351,9 +49432,9 @@ var ts; case 154 /* SetAccessor */: return ts.updateSetAccessor(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isPropertyName), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitFunctionBody(node.body, visitor, context)); case 155 /* CallSignature */: - return ts.updateCallSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateCallSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 156 /* ConstructSignature */: - return ts.updateConstructSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateConstructSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 157 /* IndexSignature */: return ts.updateIndexSignature(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); // Types @@ -49362,9 +49443,9 @@ var ts; case 159 /* TypeReference */: return ts.updateTypeReferenceNode(node, visitNode(node.typeName, visitor, ts.isEntityName), nodesVisitor(node.typeArguments, visitor, ts.isTypeNode)); case 160 /* FunctionType */: - return ts.updateFunctionTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateFunctionTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 161 /* ConstructorType */: - return ts.updateConstructorTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateConstructorTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 162 /* TypeQuery */: return ts.updateTypeQueryNode(node, visitNode(node.exprName, visitor, ts.isEntityName)); case 163 /* TypeLiteral */: @@ -49384,7 +49465,7 @@ var ts; case 171 /* IndexedAccessType */: return ts.updateIndexedAccessTypeNode(node, visitNode(node.objectType, visitor, ts.isTypeNode), visitNode(node.indexType, visitor, ts.isTypeNode)); case 172 /* MappedType */: - return ts.updateMappedTypeNode(node, visitNode(node.readonlyToken, tokenVisitor, ts.isToken), visitNode(node.typeParameter, visitor, ts.isTypeParameter), visitNode(node.questionToken, tokenVisitor, ts.isToken), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateMappedTypeNode(node, visitNode(node.readonlyToken, tokenVisitor, ts.isToken), visitNode(node.typeParameter, visitor, ts.isTypeParameterDeclaration), visitNode(node.questionToken, tokenVisitor, ts.isToken), visitNode(node.type, visitor, ts.isTypeNode)); case 173 /* LiteralType */: return ts.updateLiteralTypeNode(node, visitNode(node.literal, visitor, ts.isExpression)); // Binding patterns @@ -49414,9 +49495,9 @@ var ts; case 185 /* ParenthesizedExpression */: return ts.updateParen(node, visitNode(node.expression, visitor, ts.isExpression)); case 186 /* FunctionExpression */: - return ts.updateFunctionExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateFunctionExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 187 /* ArrowFunction */: - return ts.updateArrowFunction(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateArrowFunction(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 188 /* DeleteExpression */: return ts.updateDelete(node, visitNode(node.expression, visitor, ts.isExpression)); case 189 /* TypeOfExpression */: @@ -49440,7 +49521,7 @@ var ts; case 198 /* SpreadElement */: return ts.updateSpread(node, visitNode(node.expression, visitor, ts.isExpression)); case 199 /* ClassExpression */: - return ts.updateClassExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); + return ts.updateClassExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); case 201 /* ExpressionWithTypeArguments */: return ts.updateExpressionWithTypeArguments(node, nodesVisitor(node.typeArguments, visitor, ts.isTypeNode), visitNode(node.expression, visitor, ts.isExpression)); case 202 /* AsExpression */: @@ -49492,13 +49573,13 @@ var ts; case 227 /* VariableDeclarationList */: return ts.updateVariableDeclarationList(node, nodesVisitor(node.declarations, visitor, ts.isVariableDeclaration)); case 228 /* FunctionDeclaration */: - return ts.updateFunctionDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateFunctionDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 229 /* ClassDeclaration */: - return ts.updateClassDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); + return ts.updateClassDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); case 230 /* InterfaceDeclaration */: - return ts.updateInterfaceDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isTypeElement)); + return ts.updateInterfaceDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isTypeElement)); case 231 /* TypeAliasDeclaration */: - return ts.updateTypeAliasDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateTypeAliasDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 232 /* EnumDeclaration */: return ts.updateEnumDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.members, visitor, ts.isEnumMember)); case 233 /* ModuleDeclaration */: @@ -50101,35 +50182,7 @@ var ts; } var Debug; (function (Debug) { - if (Debug.isDebugging) { - // Add additional properties in debug mode to assist with debugging. - Object.defineProperties(ts.objectAllocator.getSymbolConstructor().prototype, { - "__debugFlags": { get: function () { return ts.formatSymbolFlags(this.flags); } } - }); - Object.defineProperties(ts.objectAllocator.getTypeConstructor().prototype, { - "__debugFlags": { get: function () { return ts.formatTypeFlags(this.flags); } }, - "__debugObjectFlags": { get: function () { return this.flags & 32768 /* Object */ ? ts.formatObjectFlags(this.objectFlags) : ""; } }, - "__debugTypeToString": { value: function () { return this.checker.typeToString(this); } }, - }); - for (var _i = 0, _a = [ts.objectAllocator.getNodeConstructor(), ts.objectAllocator.getIdentifierConstructor(), ts.objectAllocator.getTokenConstructor(), ts.objectAllocator.getSourceFileConstructor()]; _i < _a.length; _i++) { - var ctor = _a[_i]; - if (!ctor.prototype.hasOwnProperty("__debugKind")) { - Object.defineProperties(ctor.prototype, { - "__debugKind": { get: function () { return ts.formatSyntaxKind(this.kind); } }, - "__debugModifierFlags": { get: function () { return ts.formatModifierFlags(ts.getModifierFlagsNoCache(this)); } }, - "__debugTransformFlags": { get: function () { return ts.formatTransformFlags(this.transformFlags); } }, - "__debugEmitFlags": { get: function () { return ts.formatEmitFlags(ts.getEmitFlags(this)); } }, - "__debugGetText": { value: function (includeTrivia) { - if (ts.nodeIsSynthesized(this)) - return ""; - var parseNode = ts.getParseTreeNode(this); - var sourceFile = parseNode && ts.getSourceFileOfNode(parseNode); - return sourceFile ? ts.getSourceTextOfNodeFromSourceFile(sourceFile, parseNode, includeTrivia) : ""; - } } - }); - } - } - } + var isDebugInfoEnabled = false; Debug.failBadSyntaxKind = Debug.shouldAssert(1 /* Normal */) ? function (node, message) { return Debug.fail((message || "Unexpected node.") + "\r\nNode " + ts.formatSyntaxKind(node.kind) + " was unexpected.", Debug.failBadSyntaxKind); } : ts.noop; @@ -50148,6 +50201,50 @@ var ts; Debug.assertMissingNode = Debug.shouldAssert(1 /* Normal */) ? function (node, message) { return Debug.assert(node === undefined, message || "Unexpected node.", function () { return "Node " + ts.formatSyntaxKind(node.kind) + " was unexpected'."; }, Debug.assertMissingNode); } : ts.noop; + /** + * Injects debug information into frequently used types. + */ + function enableDebugInfo() { + if (isDebugInfoEnabled) + return; + // Add additional properties in debug mode to assist with debugging. + Object.defineProperties(ts.objectAllocator.getSymbolConstructor().prototype, { + "__debugFlags": { get: function () { return ts.formatSymbolFlags(this.flags); } } + }); + Object.defineProperties(ts.objectAllocator.getTypeConstructor().prototype, { + "__debugFlags": { get: function () { return ts.formatTypeFlags(this.flags); } }, + "__debugObjectFlags": { get: function () { return this.flags & 32768 /* Object */ ? ts.formatObjectFlags(this.objectFlags) : ""; } }, + "__debugTypeToString": { value: function () { return this.checker.typeToString(this); } }, + }); + var nodeConstructors = [ + ts.objectAllocator.getNodeConstructor(), + ts.objectAllocator.getIdentifierConstructor(), + ts.objectAllocator.getTokenConstructor(), + ts.objectAllocator.getSourceFileConstructor() + ]; + for (var _i = 0, nodeConstructors_1 = nodeConstructors; _i < nodeConstructors_1.length; _i++) { + var ctor = nodeConstructors_1[_i]; + if (!ctor.prototype.hasOwnProperty("__debugKind")) { + Object.defineProperties(ctor.prototype, { + "__debugKind": { get: function () { return ts.formatSyntaxKind(this.kind); } }, + "__debugModifierFlags": { get: function () { return ts.formatModifierFlags(ts.getModifierFlagsNoCache(this)); } }, + "__debugTransformFlags": { get: function () { return ts.formatTransformFlags(this.transformFlags); } }, + "__debugEmitFlags": { get: function () { return ts.formatEmitFlags(ts.getEmitFlags(this)); } }, + "__debugGetText": { + value: function (includeTrivia) { + if (ts.nodeIsSynthesized(this)) + return ""; + var parseNode = ts.getParseTreeNode(this); + var sourceFile = parseNode && ts.getSourceFileOfNode(parseNode); + return sourceFile ? ts.getSourceTextOfNodeFromSourceFile(sourceFile, parseNode, includeTrivia) : ""; + } + } + }); + } + } + isDebugInfoEnabled = true; + } + Debug.enableDebugInfo = enableDebugInfo; })(Debug = ts.Debug || (ts.Debug = {})); })(ts || (ts = {})); /// @@ -58601,7 +58698,7 @@ var ts; if (variables.length === 0) { return undefined; } - return ts.createStatement(ts.inlineExpressions(ts.map(variables, transformInitializedVariable))); + return ts.setSourceMapRange(ts.createStatement(ts.inlineExpressions(ts.map(variables, transformInitializedVariable))), node); } } /** @@ -59113,7 +59210,7 @@ var ts; return undefined; } function transformInitializedVariable(node) { - return ts.createAssignment(ts.getSynthesizedClone(node.name), ts.visitNode(node.initializer, visitor, ts.isExpression)); + return ts.setSourceMapRange(ts.createAssignment(ts.setSourceMapRange(ts.getSynthesizedClone(node.name), node.name), ts.visitNode(node.initializer, visitor, ts.isExpression)), node); } function transformAndEmitIfStatement(node) { if (containsYield(node)) { @@ -63621,7 +63718,7 @@ var ts; function hoistVariableDeclaration(name) { ts.Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization."); ts.Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed."); - var decl = ts.createVariableDeclaration(name); + var decl = ts.setEmitFlags(ts.createVariableDeclaration(name), 64 /* NoNestedSourceMaps */); if (!lexicalEnvironmentVariableDeclarations) { lexicalEnvironmentVariableDeclarations = [decl]; } @@ -64991,7 +65088,7 @@ var ts; currentIdentifiers = node.identifiers; isCurrentFileExternalModule = ts.isExternalModule(node); enclosingDeclaration = node; - ts.emitDetachedComments(currentText, currentLineMap, writer, ts.writeCommentRange, node, newLine, /*removeComents*/ true); + ts.emitDetachedComments(currentText, currentLineMap, writer, ts.writeCommentRange, node, newLine, /*removeComments*/ true); emitLines(node.statements); } // Return a temp variable name to be used in `export default`/`export class ... extends` statements. @@ -70140,7 +70237,7 @@ var ts; } var sourceFileWithAddedExtension = ts.forEach(supportedExtensions, function (extension) { return getSourceFile(fileName + extension); }); if (fail && !sourceFileWithAddedExtension) - fail(ts.Diagnostics.File_0_not_found, fileName + ".ts"); + fail(ts.Diagnostics.File_0_not_found, fileName + ".ts" /* Ts */); return sourceFileWithAddedExtension; } } @@ -70573,15 +70670,15 @@ var ts; function getResolutionDiagnostic(options, _a) { var extension = _a.extension; switch (extension) { - case ts.Extension.Ts: - case ts.Extension.Dts: + case ".ts" /* Ts */: + case ".d.ts" /* Dts */: // These are always allowed. return undefined; - case ts.Extension.Tsx: + case ".tsx" /* Tsx */: return needJsx(); - case ts.Extension.Jsx: + case ".jsx" /* Jsx */: return needJsx() || needAllowJs(); - case ts.Extension.Js: + case ".js" /* Js */: return needAllowJs(); } function needJsx() { @@ -71206,6 +71303,12 @@ var ts; category: ts.Diagnostics.Advanced_Options, description: ts.Diagnostics.The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files }, + { + name: "noStrictGenericChecks", + type: "boolean", + category: ts.Diagnostics.Advanced_Options, + description: ts.Diagnostics.Disable_strict_checking_of_generic_signatures_in_function_types, + }, { // A list of plugins to load in the language service name: "plugins", @@ -72544,6 +72647,10 @@ var ts; else if (isNamespaceReference(node)) { return 4 /* Namespace */; } + else if (ts.isTypeParameterDeclaration(node.parent)) { + ts.Debug.assert(ts.isJSDocTemplateTag(node.parent.parent)); // Else would be handled by isDeclarationName + return 2 /* Type */; + } else { return 1 /* Value */; } @@ -73102,7 +73209,7 @@ var ts; } } ts.findNextToken = findNextToken; - function findPrecedingToken(position, sourceFile, startNode) { + function findPrecedingToken(position, sourceFile, startNode, includeJsDoc) { return find(startNode || sourceFile); function findRightmostToken(n) { if (ts.isToken(n)) { @@ -73128,7 +73235,7 @@ var ts; // NOTE: JsxText is a weird kind of node that can contain only whitespaces (since they are not counted as trivia). // if this is the case - then we should assume that token in question is located in previous child. if (position < child.end && (nodeHasTokens(child) || child.kind === 10 /* JsxText */)) { - var start = child.getStart(sourceFile); + var start = (includeJsDoc && child.jsDoc ? child.jsDoc[0] : child).getStart(sourceFile); var lookInPreviousChild = (start >= position) || (child.kind === 10 /* JsxText */ && start === child.end); // whitespace only JsxText if (lookInPreviousChild) { @@ -73142,7 +73249,7 @@ var ts; } } } - ts.Debug.assert(startNode !== undefined || n.kind === 265 /* SourceFile */); + ts.Debug.assert(startNode !== undefined || n.kind === 265 /* SourceFile */ || ts.isJSDocCommentContainingNode(n)); // Here we know that none of child token nodes embrace the position, // the only known case is when position is at the end of the file. // Try to find the rightmost token in the file without filtering. @@ -74376,8 +74483,8 @@ var ts; if (tag.pos !== pos) { pushCommentRange(pos, tag.pos - pos); } - pushClassification(tag.atToken.pos, tag.atToken.end - tag.atToken.pos, 10 /* punctuation */); - pushClassification(tag.tagName.pos, tag.tagName.end - tag.tagName.pos, 18 /* docCommentTagName */); + pushClassification(tag.atToken.pos, tag.atToken.end - tag.atToken.pos, 10 /* punctuation */); // "@" + pushClassification(tag.tagName.pos, tag.tagName.end - tag.tagName.pos, 18 /* docCommentTagName */); // e.g. "param" pos = tag.tagName.end; switch (tag.kind) { case 287 /* JSDocParameterTag */: @@ -74453,7 +74560,7 @@ var ts; * False will mean that node is not classified and traverse routine should recurse into node contents. */ function tryClassifyNode(node) { - if (ts.isJSDocNode(node)) { + if (ts.isJSDoc(node)) { return true; } if (ts.nodeIsMissing(node)) { @@ -75472,7 +75579,7 @@ var ts; } } start = ts.timestamp(); - var previousToken = ts.findPrecedingToken(position, sourceFile); + var previousToken = ts.findPrecedingToken(position, sourceFile, /*startNode*/ undefined, /*includeJsDoc*/ true); log("getCompletionData: Get previous token 1: " + (ts.timestamp() - start)); // The decision to provide completion depends on the contextToken, which is determined through the previousToken. // Note: 'previousToken' (and thus 'contextToken') can be undefined if we are the beginning of the file @@ -75481,7 +75588,7 @@ var ts; // Skip this partial identifier and adjust the contextToken to the token that precedes it. if (contextToken && position <= contextToken.end && ts.isWord(contextToken.kind)) { var start_2 = ts.timestamp(); - contextToken = ts.findPrecedingToken(contextToken.getFullStart(), sourceFile); + contextToken = ts.findPrecedingToken(contextToken.getFullStart(), sourceFile, /*startNode*/ undefined, /*includeJsDoc*/ true); log("getCompletionData: Get previous token 2: " + (ts.timestamp() - start_2)); } // Find the node where completion is requested on. @@ -75835,41 +75942,36 @@ var ts; typeMembers = typeChecker.getAllPossiblePropertiesOfType(typeForObject); existingMembers = objectLikeContainer.properties; } - else if (objectLikeContainer.kind === 174 /* ObjectBindingPattern */) { + else { + ts.Debug.assert(objectLikeContainer.kind === 174 /* ObjectBindingPattern */); // We are *only* completing on properties from the type being destructured. isNewIdentifierLocation = false; var rootDeclaration = ts.getRootDeclaration(objectLikeContainer.parent); - if (ts.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 - // through type declaration or inference. - // Also proceed if rootDeclaration is a parameter and if its containing function expression/arrow function is contextually typed - - // type of parameter will flow in from the contextual type of the function - var canGetType = !!(rootDeclaration.initializer || rootDeclaration.type); - if (!canGetType && rootDeclaration.kind === 146 /* Parameter */) { - if (ts.isExpression(rootDeclaration.parent)) { - canGetType = !!typeChecker.getContextualType(rootDeclaration.parent); - } - else if (rootDeclaration.parent.kind === 151 /* MethodDeclaration */ || rootDeclaration.parent.kind === 154 /* SetAccessor */) { - canGetType = ts.isExpression(rootDeclaration.parent.parent) && !!typeChecker.getContextualType(rootDeclaration.parent.parent); - } + if (!ts.isVariableLike(rootDeclaration)) + throw ts.Debug.fail("Root declaration is not variable-like."); + // We don't want to complete using the type acquired by the shape + // of the binding pattern; we are only interested in types acquired + // through type declaration or inference. + // Also proceed if rootDeclaration is a parameter and if its containing function expression/arrow function is contextually typed - + // type of parameter will flow in from the contextual type of the function + var canGetType = rootDeclaration.initializer || rootDeclaration.type || rootDeclaration.parent.parent.kind === 216 /* ForOfStatement */; + if (!canGetType && rootDeclaration.kind === 146 /* Parameter */) { + if (ts.isExpression(rootDeclaration.parent)) { + canGetType = !!typeChecker.getContextualType(rootDeclaration.parent); } - if (canGetType) { - var typeForObject = typeChecker.getTypeAtLocation(objectLikeContainer); - if (!typeForObject) - return false; - // In a binding pattern, get only known properties. Everywhere else we will get all possible properties. - typeMembers = typeChecker.getPropertiesOfType(typeForObject); - existingMembers = objectLikeContainer.elements; + else if (rootDeclaration.parent.kind === 151 /* MethodDeclaration */ || rootDeclaration.parent.kind === 154 /* SetAccessor */) { + canGetType = ts.isExpression(rootDeclaration.parent.parent) && !!typeChecker.getContextualType(rootDeclaration.parent.parent); } } - else { - ts.Debug.fail("Root declaration is not variable-like."); + if (canGetType) { + var typeForObject = typeChecker.getTypeAtLocation(objectLikeContainer); + if (!typeForObject) + return false; + // In a binding pattern, get only known properties. Everywhere else we will get all possible properties. + typeMembers = typeChecker.getPropertiesOfType(typeForObject); + existingMembers = objectLikeContainer.elements; } } - else { - ts.Debug.fail("Expected object literal or binding pattern, got " + objectLikeContainer.kind); - } if (typeMembers && typeMembers.length > 0) { // Add filtered items to the completion list symbols = filterObjectMembersList(typeMembers, existingMembers); @@ -75968,7 +76070,7 @@ var ts; case 17 /* OpenBraceToken */: // const x = { | case 26 /* CommaToken */:// const x = { a: 0, | var parent = contextToken.parent; - if (parent && (parent.kind === 178 /* ObjectLiteralExpression */ || parent.kind === 174 /* ObjectBindingPattern */)) { + if (ts.isObjectLiteralExpression(parent) || ts.isObjectBindingPattern(parent)) { return parent; } break; @@ -76464,15 +76566,24 @@ var ts; (function (DocumentHighlights) { function getDocumentHighlights(program, cancellationToken, sourceFile, position, sourceFilesToSearch) { var node = ts.getTouchingWord(sourceFile, position, /*includeJsDocComment*/ true); - return node && (getSemanticDocumentHighlights(node, program, cancellationToken, sourceFilesToSearch) || getSyntacticDocumentHighlights(node, sourceFile)); + if (!node) + return undefined; + if (ts.isJsxOpeningElement(node.parent) && node.parent.tagName === node || ts.isJsxClosingElement(node.parent)) { + // For a JSX element, just highlight the matching tag, not all references. + var _a = node.parent.parent, openingElement = _a.openingElement, closingElement = _a.closingElement; + var highlightSpans = [openingElement, closingElement].map(function (_a) { + var tagName = _a.tagName; + return getHighlightSpanForNode(tagName, sourceFile); + }); + return [{ fileName: sourceFile.fileName, highlightSpans: highlightSpans }]; + } + return getSemanticDocumentHighlights(node, program, cancellationToken, sourceFilesToSearch) || getSyntacticDocumentHighlights(node, sourceFile); } DocumentHighlights.getDocumentHighlights = getDocumentHighlights; function getHighlightSpanForNode(node, sourceFile) { - var start = node.getStart(sourceFile); - var end = node.getEnd(); return { fileName: sourceFile.fileName, - textSpan: ts.createTextSpanFromBounds(start, end), + textSpan: ts.createTextSpanFromNode(node, sourceFile), kind: "none" /* none */ }; } @@ -78231,11 +78342,8 @@ var ts; // So we must search the whole source file. (Because we will mark the source file as seen, we we won't return to it when searching for imports.) return parent ? scope.getSourceFile() : scope; } - function getPossibleSymbolReferencePositions(sourceFile, symbolName, container, fullStart) { + function getPossibleSymbolReferencePositions(sourceFile, symbolName, container) { if (container === void 0) { container = sourceFile; } - if (fullStart === void 0) { fullStart = false; } - var start = fullStart ? container.getFullStart() : container.getStart(sourceFile); - var end = container.getEnd(); var positions = []; /// TODO: Cache symbol existence for files to save text search // Also, need to make this work for unicode escapes. @@ -78246,10 +78354,10 @@ var ts; var text = sourceFile.text; var sourceLength = text.length; var symbolNameLength = symbolName.length; - var position = text.indexOf(symbolName, start); + var position = text.indexOf(symbolName, container.pos); while (position >= 0) { // If we are past the end, stop looking - if (position > end) + if (position > container.end) break; // 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). @@ -78302,8 +78410,7 @@ var ts; return references.length ? [{ definition: { type: "keyword", node: references[0].node }, references: references }] : undefined; } function addReferencesForKeywordInFile(sourceFile, kind, searchText, references) { - // Want fullStart so we can find the symbol in JSDoc comments - var possiblePositions = getPossibleSymbolReferencePositions(sourceFile, searchText, sourceFile, /*fullStart*/ true); + var possiblePositions = getPossibleSymbolReferencePositions(sourceFile, searchText, sourceFile); for (var _i = 0, possiblePositions_2 = possiblePositions; _i < possiblePositions_2.length; _i++) { var position = possiblePositions_2[_i]; var referenceLocation = ts.getTouchingPropertyName(sourceFile, position, /*includeJsDocComment*/ true); @@ -78325,8 +78432,7 @@ var ts; if (!state.markSearchedSymbol(sourceFile, search.symbol)) { return; } - var fullStart = state.options.findInComments || container.jsDoc !== undefined || ts.forEach(search.symbol.declarations, function (d) { return d.kind === 291 /* JSDocTypedefTag */; }); - for (var _i = 0, _a = getPossibleSymbolReferencePositions(sourceFile, search.text, container, fullStart); _i < _a.length; _i++) { + for (var _i = 0, _a = getPossibleSymbolReferencePositions(sourceFile, search.text, container); _i < _a.length; _i++) { var position = _a[_i]; getReferencesAtLocation(sourceFile, position, search, state); } @@ -79959,7 +80065,7 @@ var ts; var rawItems = []; var _loop_4 = function (sourceFile) { cancellationToken.throwIfCancellationRequested(); - if (excludeDtsFiles && ts.fileExtensionIs(sourceFile.fileName, ".d.ts")) { + if (excludeDtsFiles && ts.fileExtensionIs(sourceFile.fileName, ".d.ts" /* Dts */)) { return "continue"; } ts.forEachEntry(sourceFile.getNamedDeclarations(), function (declarations, name) { @@ -88125,7 +88231,7 @@ var ts; /* @internal */ var ruleProvider; function createNode(kind, pos, end, parent) { - var node = kind >= 143 /* FirstNode */ ? new NodeObject(kind, pos, end) : + var node = ts.isNodeKind(kind) ? new NodeObject(kind, pos, end) : kind === 71 /* Identifier */ ? new IdentifierObject(71 /* Identifier */, pos, end) : new TokenObject(kind, pos, end); node.parent = parent; @@ -88170,10 +88276,10 @@ var ts; } return sourceFile.text.substring(this.getStart(sourceFile), this.getEnd()); }; - NodeObject.prototype.addSyntheticNodes = function (nodes, pos, end, useJSDocScanner) { + NodeObject.prototype.addSyntheticNodes = function (nodes, pos, end) { ts.scanner.setTextPos(pos); while (pos < end) { - var token = useJSDocScanner ? ts.scanner.scanJSDocToken() : ts.scanner.scan(); + var token = ts.scanner.scan(); ts.Debug.assert(token !== 1 /* EndOfFileToken */); // Else it would infinitely loop var textPos = ts.scanner.getTextPos(); if (textPos <= end) { @@ -88202,55 +88308,49 @@ var ts; }; NodeObject.prototype.createChildren = function (sourceFile) { var _this = this; - if (this.kind === 283 /* JSDocComment */ || ts.isJSDocTag(this)) { + if (!ts.isNodeKind(this.kind)) { + this._children = ts.emptyArray; + return; + } + if (ts.isJSDocCommentContainingNode(this)) { /** Don't add trivia for "tokens" since this is in a comment. */ var children_3 = []; this.forEachChild(function (child) { children_3.push(child); }); this._children = children_3; + return; } - else if (this.kind >= 143 /* FirstNode */) { - var children_4 = []; - ts.scanner.setText((sourceFile || this.getSourceFile()).text); - var pos_3 = this.pos; - var useJSDocScanner_1 = ts.isJSDocNode(this); - var processNode = function (node) { - var isJSDocTagNode = ts.isJSDocNode(node); - if (!isJSDocTagNode && pos_3 < node.pos) { - pos_3 = _this.addSyntheticNodes(children_4, pos_3, node.pos, useJSDocScanner_1); - } - children_4.push(node); - if (!isJSDocTagNode) { - pos_3 = node.end; - } - }; - var processNodes = function (nodes) { - if (pos_3 < nodes.pos) { - pos_3 = _this.addSyntheticNodes(children_4, pos_3, nodes.pos, useJSDocScanner_1); - } - children_4.push(_this.createSyntaxList(nodes)); - pos_3 = nodes.end; - }; - // jsDocComments need to be the first children - if (this.jsDoc) { - for (var _i = 0, _a = this.jsDoc; _i < _a.length; _i++) { - var jsDocComment = _a[_i]; - processNode(jsDocComment); - } + var children = []; + ts.scanner.setText((sourceFile || this.getSourceFile()).text); + var pos = this.pos; + var processNode = function (node) { + pos = _this.addSyntheticNodes(children, pos, node.pos); + children.push(node); + pos = node.end; + }; + var processNodes = function (nodes) { + if (pos < nodes.pos) { + pos = _this.addSyntheticNodes(children, pos, nodes.pos); } - // For syntactic classifications, all trivia are classcified together, including jsdoc comments. - // For that to work, the jsdoc comments should still be the leading trivia of the first child. - // Restoring the scanner position ensures that. - pos_3 = this.pos; - ts.forEachChild(this, processNode, processNodes); - if (pos_3 < this.end) { - this.addSyntheticNodes(children_4, pos_3, this.end); + children.push(_this.createSyntaxList(nodes)); + pos = nodes.end; + }; + // jsDocComments need to be the first children + if (this.jsDoc) { + for (var _i = 0, _a = this.jsDoc; _i < _a.length; _i++) { + var jsDocComment = _a[_i]; + processNode(jsDocComment); } - ts.scanner.setText(undefined); - this._children = children_4; } - else { - this._children = ts.emptyArray; + // For syntactic classifications, all trivia are classcified together, including jsdoc comments. + // For that to work, the jsdoc comments should still be the leading trivia of the first child. + // Restoring the scanner position ensures that. + pos = this.pos; + ts.forEachChild(this, processNode, processNodes); + if (pos < this.end) { + this.addSyntheticNodes(children, pos, this.end); } + ts.scanner.setText(undefined); + this._children = children; }; NodeObject.prototype.getChildCount = function (sourceFile) { if (!this._children) @@ -91109,7 +91209,7 @@ var ts; var compilerOptions = JSON.parse(compilerOptionsJson); var result = ts.resolveModuleName(moduleName, ts.normalizeSlashes(fileName), compilerOptions, _this.host); var resolvedFileName = result.resolvedModule ? result.resolvedModule.resolvedFileName : undefined; - if (result.resolvedModule && result.resolvedModule.extension !== ts.Extension.Ts && result.resolvedModule.extension !== ts.Extension.Tsx && result.resolvedModule.extension !== ts.Extension.Dts) { + if (result.resolvedModule && result.resolvedModule.extension !== ".ts" /* Ts */ && result.resolvedModule.extension !== ".tsx" /* Tsx */ && result.resolvedModule.extension !== ".d.ts" /* Dts */) { resolvedFileName = undefined; } return { diff --git a/lib/typescriptServices.d.ts b/lib/typescriptServices.d.ts index 6b7eb038e56..802f936d9de 100644 --- a/lib/typescriptServices.d.ts +++ b/lib/typescriptServices.d.ts @@ -1147,6 +1147,7 @@ declare namespace ts { condition?: Expression; incrementor?: Expression; } + type ForInOrOfStatement = ForInStatement | ForOfStatement; interface ForInStatement extends IterationStatement { kind: SyntaxKind.ForInStatement; initializer: ForInitializer; @@ -1220,7 +1221,7 @@ declare namespace ts { variableDeclaration: VariableDeclaration; block: Block; } - type DeclarationWithTypeParameters = SignatureDeclaration | ClassLikeDeclaration | InterfaceDeclaration | TypeAliasDeclaration; + type DeclarationWithTypeParameters = SignatureDeclaration | ClassLikeDeclaration | InterfaceDeclaration | TypeAliasDeclaration | JSDocTemplateTag; interface ClassLikeDeclaration extends NamedDeclaration { name?: Identifier; typeParameters?: NodeArray; @@ -2183,6 +2184,7 @@ declare namespace ts { noImplicitAny?: boolean; noImplicitReturns?: boolean; noImplicitThis?: boolean; + noStrictGenericChecks?: boolean; noUnusedLocals?: boolean; noUnusedParameters?: boolean; noImplicitUseStrict?: boolean; @@ -2331,12 +2333,11 @@ declare namespace ts { extension: Extension; } enum Extension { - Ts = 0, - Tsx = 1, - Dts = 2, - Js = 3, - Jsx = 4, - LastTypeScriptExtension = 2, + Ts = ".ts", + Tsx = ".tsx", + Dts = ".d.ts", + Js = ".js", + Jsx = ".jsx", } interface ResolvedModuleWithFailedLookupLocations { resolvedModule: ResolvedModuleFull | undefined; @@ -2592,7 +2593,7 @@ declare namespace ts { } declare namespace ts { /** The version of the TypeScript compiler release */ - const version = "2.4.0"; + const version = "2.4.1"; } declare function setTimeout(handler: (...args: any[]) => void, timeout: number): any; declare function clearTimeout(handle: any): void; @@ -2627,6 +2628,10 @@ declare namespace ts { getDirectories(path: string): string[]; readDirectory(path: string, extensions?: string[], exclude?: string[], include?: string[]): string[]; getModifiedTime?(path: string): Date; + /** + * This should be cryptographically secure. + * A good implementation is node.js' `crypto.createHash`. (https://nodejs.org/api/crypto.html#crypto_crypto_createhash_algorithm) + */ createHash?(data: string): string; getMemoryUsage?(): number; exit(exitCode?: number): void; @@ -2785,7 +2790,7 @@ declare namespace ts { function isIdentifier(node: Node): node is Identifier; function isQualifiedName(node: Node): node is QualifiedName; function isComputedPropertyName(node: Node): node is ComputedPropertyName; - function isTypeParameter(node: Node): node is TypeParameterDeclaration; + function isTypeParameterDeclaration(node: Node): node is TypeParameterDeclaration; function isParameter(node: Node): node is ParameterDeclaration; function isDecorator(node: Node): node is Decorator; function isPropertySignature(node: Node): node is PropertySignature; @@ -2967,6 +2972,8 @@ declare namespace ts { function isIterationStatement(node: Node, lookInLabeledStatements: boolean): node is IterationStatement; function isJsxOpeningLikeElement(node: Node): node is JsxOpeningLikeElement; function isCaseOrDefaultClause(node: Node): node is CaseOrDefaultClause; + /** True if node is of a kind that may contain comment text. */ + function isJSDocCommentContainingNode(node: Node): boolean; } declare namespace ts { /** diff --git a/lib/typescriptServices.js b/lib/typescriptServices.js index 712abadd7b1..96a530f4517 100644 --- a/lib/typescriptServices.js +++ b/lib/typescriptServices.js @@ -1064,12 +1064,11 @@ var ts; })(CharacterCodes = ts.CharacterCodes || (ts.CharacterCodes = {})); var Extension; (function (Extension) { - Extension[Extension["Ts"] = 0] = "Ts"; - Extension[Extension["Tsx"] = 1] = "Tsx"; - Extension[Extension["Dts"] = 2] = "Dts"; - Extension[Extension["Js"] = 3] = "Js"; - Extension[Extension["Jsx"] = 4] = "Jsx"; - Extension[Extension["LastTypeScriptExtension"] = 2] = "LastTypeScriptExtension"; + Extension["Ts"] = ".ts"; + Extension["Tsx"] = ".tsx"; + Extension["Dts"] = ".d.ts"; + Extension["Js"] = ".js"; + Extension["Jsx"] = ".jsx"; })(Extension = ts.Extension || (ts.Extension = {})); /* @internal */ var TransformFlags; @@ -1318,7 +1317,7 @@ var ts; var ts; (function (ts) { /** The version of the TypeScript compiler release */ - ts.version = "2.4.0"; + ts.version = "2.4.1"; })(ts || (ts = {})); /* @internal */ (function (ts) { @@ -3292,13 +3291,13 @@ var ts; function getScriptKindFromFileName(fileName) { var ext = fileName.substr(fileName.lastIndexOf(".")); switch (ext.toLowerCase()) { - case ".js": + case ".js" /* Js */: return 1 /* JS */; - case ".jsx": + case ".jsx" /* Jsx */: return 2 /* JSX */; - case ".ts": + case ".ts" /* Ts */: return 3 /* TS */; - case ".tsx": + case ".tsx" /* Tsx */: return 4 /* TSX */; default: return 0 /* Unknown */; @@ -3308,10 +3307,10 @@ var ts; /** * List of supported extensions in order of file resolution precedence. */ - ts.supportedTypeScriptExtensions = [".ts", ".tsx", ".d.ts"]; + ts.supportedTypeScriptExtensions = [".ts" /* Ts */, ".tsx" /* Tsx */, ".d.ts" /* Dts */]; /** Must have ".d.ts" first because if ".ts" goes first, that will be detected as the extension instead of ".d.ts". */ - ts.supportedTypescriptExtensionsForExtractExtension = [".d.ts", ".ts", ".tsx"]; - ts.supportedJavascriptExtensions = [".js", ".jsx"]; + ts.supportedTypescriptExtensionsForExtractExtension = [".d.ts" /* Dts */, ".ts" /* Ts */, ".tsx" /* Tsx */]; + ts.supportedJavascriptExtensions = [".js" /* Js */, ".jsx" /* Jsx */]; var allSupportedExtensions = ts.supportedTypeScriptExtensions.concat(ts.supportedJavascriptExtensions); function getSupportedExtensions(options, extraFileExtensions) { var needAllExtensions = options && options.allowJs; @@ -3399,7 +3398,7 @@ var ts; } } ts.getNextLowestExtensionPriority = getNextLowestExtensionPriority; - var extensionsToRemove = [".d.ts", ".ts", ".js", ".tsx", ".jsx"]; + var extensionsToRemove = [".d.ts" /* Dts */, ".ts" /* Ts */, ".js" /* Js */, ".tsx" /* Tsx */, ".jsx" /* Jsx */]; function removeFileExtension(path) { for (var _i = 0, extensionsToRemove_1 = extensionsToRemove; _i < extensionsToRemove_1.length; _i++) { var ext = extensionsToRemove_1[_i]; @@ -3636,7 +3635,7 @@ var ts; ts.positionIsSynthesized = positionIsSynthesized; /** True if an extension is one of the supported TypeScript extensions. */ function extensionIsTypeScript(ext) { - return ext <= ts.Extension.LastTypeScriptExtension; + return ext === ".ts" /* Ts */ || ext === ".tsx" /* Tsx */ || ext === ".d.ts" /* Dts */; } ts.extensionIsTypeScript = extensionIsTypeScript; /** @@ -3652,21 +3651,7 @@ var ts; } ts.extensionFromPath = extensionFromPath; function tryGetExtensionFromPath(path) { - if (fileExtensionIs(path, ".d.ts")) { - return ts.Extension.Dts; - } - if (fileExtensionIs(path, ".ts")) { - return ts.Extension.Ts; - } - if (fileExtensionIs(path, ".tsx")) { - return ts.Extension.Tsx; - } - if (fileExtensionIs(path, ".js")) { - return ts.Extension.Js; - } - if (fileExtensionIs(path, ".jsx")) { - return ts.Extension.Jsx; - } + return find(ts.supportedTypescriptExtensionsForExtractExtension, function (e) { return fileExtensionIs(path, e); }) || find(ts.supportedJavascriptExtensions, function (e) { return fileExtensionIs(path, e); }); } ts.tryGetExtensionFromPath = tryGetExtensionFromPath; function isCheckJsEnabledForFile(sourceFile, compilerOptions) { @@ -4902,6 +4887,7 @@ var ts; Scoped_package_detected_looking_in_0: { code: 6182, category: ts.DiagnosticCategory.Message, key: "Scoped_package_detected_looking_in_0_6182", message: "Scoped package detected, looking in '{0}'" }, Reusing_resolution_of_module_0_to_file_1_from_old_program: { code: 6183, category: ts.DiagnosticCategory.Message, key: "Reusing_resolution_of_module_0_to_file_1_from_old_program_6183", message: "Reusing resolution of module '{0}' to file '{1}' from old program." }, Reusing_module_resolutions_originating_in_0_since_resolutions_are_unchanged_from_old_program: { code: 6184, category: ts.DiagnosticCategory.Message, key: "Reusing_module_resolutions_originating_in_0_since_resolutions_are_unchanged_from_old_program_6184", message: "Reusing module resolutions originating in '{0}' since resolutions are unchanged from old program." }, + Disable_strict_checking_of_generic_signatures_in_function_types: { code: 6185, category: ts.DiagnosticCategory.Message, key: "Disable_strict_checking_of_generic_signatures_in_function_types_6185", message: "Disable strict checking of generic signatures in function types." }, Variable_0_implicitly_has_an_1_type: { code: 7005, category: ts.DiagnosticCategory.Error, key: "Variable_0_implicitly_has_an_1_type_7005", message: "Variable '{0}' implicitly has an '{1}' type." }, Parameter_0_implicitly_has_an_1_type: { code: 7006, category: ts.DiagnosticCategory.Error, key: "Parameter_0_implicitly_has_an_1_type_7006", message: "Parameter '{0}' implicitly has an '{1}' type." }, Member_0_implicitly_has_an_1_type: { code: 7008, category: ts.DiagnosticCategory.Error, key: "Member_0_implicitly_has_an_1_type_7008", message: "Member '{0}' implicitly has an '{1}' type." }, @@ -8241,6 +8227,12 @@ var ts; }); } ts.getParameterFromJSDoc = getParameterFromJSDoc; + function getTypeParameterFromJsDoc(node) { + var name = node.name.text; + var typeParameters = node.parent.parent.parent.typeParameters; + return ts.find(typeParameters, function (p) { return p.name.text === name; }); + } + ts.getTypeParameterFromJsDoc = getTypeParameterFromJsDoc; function getJSDocType(node) { var tag = getFirstJSDocTag(node, 289 /* JSDocTypeTag */); if (!tag && node.kind === 146 /* Parameter */) { @@ -8264,6 +8256,11 @@ var ts; return getFirstJSDocTag(node, 288 /* JSDocReturnTag */); } ts.getJSDocReturnTag = getJSDocReturnTag; + function getJSDocReturnType(node) { + var returnTag = getJSDocReturnTag(node); + return returnTag && returnTag.typeExpression && returnTag.typeExpression.type; + } + ts.getJSDocReturnType = getJSDocReturnType; function getJSDocTemplateTag(node) { return getFirstJSDocTag(node, 290 /* JSDocTemplateTag */); } @@ -9124,7 +9121,7 @@ var ts; var path = outputDir ? getSourceFilePathInNewDir(sourceFile, host, outputDir) : sourceFile.fileName; - return ts.removeFileExtension(path) + ".d.ts"; + return ts.removeFileExtension(path) + ".d.ts" /* Dts */; } ts.getDeclarationEmitOutputFilePath = getDeclarationEmitOutputFilePath; /** @@ -9174,7 +9171,7 @@ var ts; if (sourceFiles.length) { var jsFilePath = options.outFile || options.out; var sourceMapFilePath = getSourceMapFilePath(jsFilePath, options); - var declarationFilePath = options.declaration ? ts.removeFileExtension(jsFilePath) + ".d.ts" : ""; + var declarationFilePath = options.declaration ? ts.removeFileExtension(jsFilePath) + ".d.ts" /* Dts */ : ""; action({ jsFilePath: jsFilePath, sourceMapFilePath: sourceMapFilePath, declarationFilePath: declarationFilePath }, ts.createBundle(sourceFiles), emitOnlyDtsFiles); } } @@ -9198,16 +9195,16 @@ var ts; function getOutputExtension(sourceFile, options) { if (options.jsx === 1 /* Preserve */) { if (isSourceFileJavaScript(sourceFile)) { - if (ts.fileExtensionIs(sourceFile.fileName, ".jsx")) { - return ".jsx"; + if (ts.fileExtensionIs(sourceFile.fileName, ".jsx" /* Jsx */)) { + return ".jsx" /* Jsx */; } } else if (sourceFile.languageVariant === 1 /* JSX */) { // TypeScript source file preserving JSX syntax - return ".jsx"; + return ".jsx" /* Jsx */; } } - return ".js"; + return ".js" /* Js */; } function getSourceFilePathInNewDir(sourceFile, host, newDirPath) { var sourceFilePath = ts.getNormalizedAbsolutePath(sourceFile.fileName, host.getCurrentDirectory()); @@ -9239,13 +9236,17 @@ var ts; }); } ts.getFirstConstructorWithBody = getFirstConstructorWithBody; - /** Get the type annotaion for the value parameter. */ - function getSetAccessorTypeAnnotationNode(accessor) { + function getSetAccessorValueParameter(accessor) { if (accessor && accessor.parameters.length > 0) { var hasThis = accessor.parameters.length === 2 && parameterIsThisKeyword(accessor.parameters[0]); - return accessor.parameters[hasThis ? 1 : 0].type; + return accessor.parameters[hasThis ? 1 : 0]; } } + /** Get the type annotation for the value parameter. */ + function getSetAccessorTypeAnnotationNode(accessor) { + var parameter = getSetAccessorValueParameter(accessor); + return parameter && parameter.type; + } ts.getSetAccessorTypeAnnotationNode = getSetAccessorTypeAnnotationNode; function getThisParameter(signature) { if (signature.parameters.length) { @@ -9316,6 +9317,55 @@ var ts; }; } ts.getAllAccessorDeclarations = getAllAccessorDeclarations; + /** + * Gets the effective type annotation of a variable, parameter, or property. If the node was + * parsed in a JavaScript file, gets the type annotation from JSDoc. + */ + function getEffectiveTypeAnnotationNode(node) { + if (node.type) { + return node.type; + } + if (node.flags & 65536 /* JavaScriptFile */) { + return getJSDocType(node); + } + } + ts.getEffectiveTypeAnnotationNode = getEffectiveTypeAnnotationNode; + /** + * Gets the effective return type annotation of a signature. If the node was parsed in a + * JavaScript file, gets the return type annotation from JSDoc. + */ + function getEffectiveReturnTypeNode(node) { + if (node.type) { + return node.type; + } + if (node.flags & 65536 /* JavaScriptFile */) { + return getJSDocReturnType(node); + } + } + ts.getEffectiveReturnTypeNode = getEffectiveReturnTypeNode; + /** + * Gets the effective type parameters. If the node was parsed in a + * JavaScript file, gets the type parameters from the `@template` tag from JSDoc. + */ + function getEffectiveTypeParameterDeclarations(node) { + if (node.typeParameters) { + return node.typeParameters; + } + if (node.flags & 65536 /* JavaScriptFile */) { + var templateTag = getJSDocTemplateTag(node); + return templateTag && templateTag.typeParameters; + } + } + ts.getEffectiveTypeParameterDeclarations = getEffectiveTypeParameterDeclarations; + /** + * Gets the effective type annotation of the value parameter of a set accessor. If the node + * was parsed in a JavaScript file, gets the type annotation from JSDoc. + */ + function getEffectiveSetAccessorTypeAnnotationNode(node) { + var parameter = getSetAccessorValueParameter(node); + return parameter && getEffectiveTypeAnnotationNode(parameter); + } + ts.getEffectiveSetAccessorTypeAnnotationNode = getEffectiveSetAccessorTypeAnnotationNode; function emitNewLineBeforeLeadingComments(lineMap, writer, node, leadingComments) { emitNewLineBeforeLeadingCommentsOfPosition(lineMap, writer, node.pos, leadingComments); } @@ -10556,10 +10606,10 @@ var ts; } ts.isComputedPropertyName = isComputedPropertyName; // Signature elements - function isTypeParameter(node) { + function isTypeParameterDeclaration(node) { return node.kind === 145 /* TypeParameter */; } - ts.isTypeParameter = isTypeParameter; + ts.isTypeParameterDeclaration = isTypeParameterDeclaration; function isParameter(node) { return node.kind === 146 /* Parameter */; } @@ -11167,6 +11217,16 @@ var ts; // All node tests in the following list should *not* reference parent pointers so that // they may be used with transformations. (function (ts) { + /* @internal */ + function isNode(node) { + return isNodeKind(node.kind); + } + ts.isNode = isNode; + /* @internal */ + function isNodeKind(kind) { + return kind >= 143 /* FirstNode */; + } + ts.isNodeKind = isNodeKind; /** * True if node is of some token syntax kind. * For example, this is true for an IfKeyword but not for an IfStatement. @@ -11564,6 +11624,11 @@ var ts; return false; } ts.isIterationStatement = isIterationStatement; + /* @internal */ + function isForInOrOfStatement(node) { + return node.kind === 215 /* ForInStatement */ || node.kind === 216 /* ForOfStatement */; + } + ts.isForInOrOfStatement = isForInOrOfStatement; // Element /* @internal */ function isConciseBody(node) { @@ -11688,6 +11753,9 @@ var ts; } /* @internal */ function isDeclaration(node) { + if (node.kind === 145 /* TypeParameter */) { + return node.parent.kind !== 290 /* JSDocTemplateTag */ || ts.isInJavaScriptFile(node); + } return isDeclarationKind(node.kind); } ts.isDeclaration = isDeclaration; @@ -11773,6 +11841,11 @@ var ts; return node.kind >= 267 /* FirstJSDocNode */ && node.kind <= 294 /* LastJSDocNode */; } ts.isJSDocNode = isJSDocNode; + /** True if node is of a kind that may contain comment text. */ + function isJSDocCommentContainingNode(node) { + return node.kind === 283 /* JSDocComment */ || isJSDocTag(node); + } + ts.isJSDocCommentContainingNode = isJSDocCommentContainingNode; // TODO: determine what this does before making it public. /* @internal */ function isJSDocTag(node) { @@ -15842,7 +15915,7 @@ var ts; else if (kind === 71 /* Identifier */) { return new (IdentifierConstructor || (IdentifierConstructor = ts.objectAllocator.getIdentifierConstructor()))(kind, pos, end); } - else if (kind < 143 /* FirstNode */) { + else if (!ts.isNodeKind(kind)) { return new (TokenConstructor || (TokenConstructor = ts.objectAllocator.getTokenConstructor()))(kind, pos, end); } else { @@ -16555,7 +16628,7 @@ var ts; sourceFile.languageVersion = languageVersion; sourceFile.fileName = ts.normalizePath(fileName); sourceFile.languageVariant = getLanguageVariant(scriptKind); - sourceFile.isDeclarationFile = ts.fileExtensionIs(sourceFile.fileName, ".d.ts"); + sourceFile.isDeclarationFile = ts.fileExtensionIs(sourceFile.fileName, ".d.ts" /* Dts */); sourceFile.scriptKind = scriptKind; return sourceFile; } @@ -16832,7 +16905,7 @@ var ts; if (!(pos >= 0)) { pos = scanner.getStartPos(); } - return kind >= 143 /* FirstNode */ ? new NodeConstructor(kind, pos, pos) : + return ts.isNodeKind(kind) ? new NodeConstructor(kind, pos, pos) : kind === 71 /* Identifier */ ? new IdentifierConstructor(kind, pos, pos) : new TokenConstructor(kind, pos, pos); } @@ -21889,7 +21962,7 @@ var ts; jsDocNamespaceNode.flags |= flags; jsDocNamespaceNode.name = typeNameOrNamespaceName; jsDocNamespaceNode.body = parseJSDocTypeNameWithNamespace(4 /* NestedNamespace */); - return jsDocNamespaceNode; + return finishNode(jsDocNamespaceNode); } if (typeNameOrNamespaceName && flags & 4 /* NestedNamespace */) { typeNameOrNamespaceName.isInJSDocNamespace = true; @@ -23690,7 +23763,7 @@ var ts; } function bindVariableDeclarationFlow(node) { bindEachChild(node); - if (node.initializer || node.parent.parent.kind === 215 /* ForInStatement */ || node.parent.parent.kind === 216 /* ForOfStatement */) { + if (node.initializer || ts.isForInOrOfStatement(node.parent.parent)) { bindInitializedVariableFlow(node); } } @@ -23861,7 +23934,7 @@ var ts; // All the children of these container types are never visible through another // symbol (i.e. through another symbol's 'exports' or 'members'). Instead, // they're only accessed 'lexically' (i.e. from code that exists underneath - // their container in the tree. To accomplish this, we simply add their declared + // their container in the tree). To accomplish this, we simply add their declared // symbol to the 'locals' of the container. These symbols can then be found as // the type checker walks up the containers, checking them for matching names. return declareSymbol(container.locals, /*parent*/ undefined, node, symbolFlags, symbolExcludes); @@ -24335,7 +24408,10 @@ var ts; case 158 /* TypePredicate */: return checkTypePredicate(node); case 145 /* TypeParameter */: - return declareSymbolAndAddToSymbolTable(node, 262144 /* TypeParameter */, 530920 /* TypeParameterExcludes */); + if (node.parent.kind !== 290 /* JSDocTemplateTag */ || ts.isInJavaScriptFile(node)) { + return declareSymbolAndAddToSymbolTable(node, 262144 /* TypeParameter */, 530920 /* TypeParameterExcludes */); + } + return; case 146 /* Parameter */: return bindParameter(node); case 226 /* VariableDeclaration */: @@ -24412,7 +24488,10 @@ var ts; case 232 /* EnumDeclaration */: return bindEnumDeclaration(node); case 233 /* ModuleDeclaration */: - return bindModuleDeclaration(node); + if (node.parent.kind !== 291 /* JSDocTypedefTag */ || ts.isInJavaScriptFile(node)) { + return bindModuleDeclaration(node); + } + return undefined; // Jsx-attributes case 254 /* JsxAttributes */: return bindJsxAttributes(node); @@ -26340,14 +26419,14 @@ var ts; } switch (extensions) { case Extensions.DtsOnly: - return tryExtension(".d.ts", ts.Extension.Dts); + return tryExtension(".d.ts" /* Dts */); case Extensions.TypeScript: - return tryExtension(".ts", ts.Extension.Ts) || tryExtension(".tsx", ts.Extension.Tsx) || tryExtension(".d.ts", ts.Extension.Dts); + return tryExtension(".ts" /* Ts */) || tryExtension(".tsx" /* Tsx */) || tryExtension(".d.ts" /* Dts */); case Extensions.JavaScript: - return tryExtension(".js", ts.Extension.Js) || tryExtension(".jsx", ts.Extension.Jsx); + return tryExtension(".js" /* Js */) || tryExtension(".jsx" /* Jsx */); } - function tryExtension(ext, extension) { - var path = tryFile(candidate + ext, failedLookupLocations, onlyRecordFailures, state); + function tryExtension(extension) { + var path = tryFile(candidate + extension, failedLookupLocations, onlyRecordFailures, state); return path && { path: path, extension: extension }; } } @@ -26423,11 +26502,11 @@ var ts; function extensionIsOk(extensions, extension) { switch (extensions) { case Extensions.JavaScript: - return extension === ts.Extension.Js || extension === ts.Extension.Jsx; + return extension === ".js" /* Js */ || extension === ".jsx" /* Jsx */; case Extensions.TypeScript: - return extension === ts.Extension.Ts || extension === ts.Extension.Tsx || extension === ts.Extension.Dts; + return extension === ".ts" /* Ts */ || extension === ".tsx" /* Tsx */ || extension === ".d.ts" /* Dts */; case Extensions.DtsOnly: - return extension === ts.Extension.Dts; + return extension === ".d.ts" /* Dts */; } } function pathToPackageJson(directory) { @@ -27350,15 +27429,8 @@ var ts; } break; } - switch (declaration.parent.parent.kind) { - case 215 /* ForInStatement */: - case 216 /* ForOfStatement */: - // ForIn/ForOf case - use site should not be used in expression part - if (isSameScopeDescendentOf(usage, declaration.parent.parent.expression, container)) { - return true; - } - } - return false; + // ForIn/ForOf case - use site should not be used in expression part + return ts.isForInOrOfStatement(declaration.parent.parent) && isSameScopeDescendentOf(usage, declaration.parent.parent.expression, container); } function isUsedInFunctionOrInstanceProperty(usage, declaration, container) { return !!ts.findAncestor(usage, function (current) { @@ -30410,15 +30482,6 @@ var ts; } // Return the inferred type for a variable, parameter, or property declaration function getTypeForVariableLikeDeclaration(declaration, includeOptionality) { - if (declaration.flags & 65536 /* JavaScriptFile */) { - // If this is a variable in a JavaScript file, then use the JSDoc type (if it has - // one as its type), otherwise fallback to the below standard TS codepaths to - // try to figure it out. - var type = getTypeForDeclarationFromJSDocComment(declaration); - if (type && type !== unknownType) { - return type; - } - } // A variable declared in a for..in statement is of type string, or of type keyof T when the // right hand expression is of a type parameter type. if (declaration.parent.parent.kind === 215 /* ForInStatement */) { @@ -30437,8 +30500,9 @@ var ts; return getTypeForBindingElement(declaration); } // Use type from type annotation if one is present - if (declaration.type) { - var declaredType = getTypeFromTypeNode(declaration.type); + var typeNode = ts.getEffectiveTypeAnnotationNode(declaration); + if (typeNode) { + var declaredType = getTypeFromTypeNode(typeNode); return addOptionality(declaredType, /*optional*/ declaration.questionToken && includeOptionality); } if ((noImplicitAny || declaration.flags & 65536 /* JavaScriptFile */) && @@ -30705,10 +30769,11 @@ var ts; function getAnnotatedAccessorType(accessor) { if (accessor) { if (accessor.kind === 153 /* GetAccessor */) { - return accessor.type && getTypeFromTypeNode(accessor.type); + var getterTypeAnnotation = ts.getEffectiveReturnTypeNode(accessor); + return getterTypeAnnotation && getTypeFromTypeNode(getterTypeAnnotation); } else { - var setterTypeAnnotation = ts.getSetAccessorTypeAnnotationNode(accessor); + var setterTypeAnnotation = ts.getEffectiveSetAccessorTypeAnnotationNode(accessor); return setterTypeAnnotation && getTypeFromTypeNode(setterTypeAnnotation); } } @@ -30846,7 +30911,7 @@ var ts; } function reportCircularityError(symbol) { // Check if variable has type annotation that circularly references the variable itself - if (symbol.valueDeclaration.type) { + if (ts.getEffectiveTypeAnnotationNode(symbol.valueDeclaration)) { error(symbol.valueDeclaration, ts.Diagnostics._0_is_referenced_directly_or_indirectly_in_its_own_type_annotation, symbolToString(symbol)); return unknownType; } @@ -31401,13 +31466,17 @@ var ts; // A variable-like declaration is considered independent (free of this references) if it has a type annotation // that specifies an independent type, or if it has no type annotation and no initializer (and thus of type any). function isIndependentVariableLikeDeclaration(node) { - return node.type && isIndependentType(node.type) || !node.type && !node.initializer; + var typeNode = ts.getEffectiveTypeAnnotationNode(node); + return typeNode ? isIndependentType(typeNode) : !node.initializer; } // A function-like declaration is considered independent (free of this references) if it has a return type // annotation that is considered independent and if each parameter is considered independent. function isIndependentFunctionLikeDeclaration(node) { - if (node.kind !== 152 /* Constructor */ && (!node.type || !isIndependentType(node.type))) { - return false; + if (node.kind !== 152 /* Constructor */) { + var typeNode = ts.getEffectiveReturnTypeNode(node); + if (!typeNode || !isIndependentType(typeNode)) { + return false; + } } for (var _i = 0, _a = node.parameters; _i < _a.length; _i++) { var parameter = _a[_i]; @@ -32087,7 +32156,7 @@ var ts; typeParameter.default = targetDefault ? instantiateType(targetDefault, typeParameter.mapper) : noConstraintType; } else { - var defaultDeclaration = typeParameter.symbol && ts.forEach(typeParameter.symbol.declarations, function (decl) { return ts.isTypeParameter(decl) && decl.default; }); + var defaultDeclaration = typeParameter.symbol && ts.forEach(typeParameter.symbol.declarations, function (decl) { return ts.isTypeParameterDeclaration(decl) && decl.default; }); typeParameter.default = defaultDeclaration ? getTypeFromTypeNode(defaultDeclaration) : noConstraintType; } } @@ -32274,22 +32343,16 @@ var ts; } return undefined; } - function getTypeParametersFromJSDocTemplate(declaration) { - if (declaration.flags & 65536 /* JavaScriptFile */) { - var templateTag = ts.getJSDocTemplateTag(declaration); - if (templateTag) { - return getTypeParametersFromDeclaration(templateTag.typeParameters); - } - } - return undefined; - } // Return list of type parameters with duplicates removed (duplicate identifier errors are generated in the actual // type checking functions). - function getTypeParametersFromDeclaration(typeParameterDeclarations) { - var result = []; - ts.forEach(typeParameterDeclarations, function (node) { + function getTypeParametersFromDeclaration(declaration) { + var result; + ts.forEach(ts.getEffectiveTypeParameterDeclarations(declaration), function (node) { var tp = getDeclaredTypeOfTypeParameter(node.symbol); if (!ts.contains(result, tp)) { + if (!result) { + result = []; + } result.push(tp); } }); @@ -32468,9 +32531,7 @@ var ts; var classType = declaration.kind === 152 /* Constructor */ ? getDeclaredTypeOfClassOrInterface(getMergedSymbol(declaration.parent.symbol)) : undefined; - var typeParameters = classType ? classType.localTypeParameters : - declaration.typeParameters ? getTypeParametersFromDeclaration(declaration.typeParameters) : - getTypeParametersFromJSDocTemplate(declaration); + var typeParameters = classType ? classType.localTypeParameters : getTypeParametersFromDeclaration(declaration); var returnType = getSignatureReturnTypeFromDeclaration(declaration, isJSConstructSignature, classType); var typePredicate = declaration.type && declaration.type.kind === 158 /* TypePredicate */ ? createTypePredicateFromTypePredicateNode(declaration.type) : @@ -32495,14 +32556,9 @@ var ts; else if (classType) { return classType; } - else if (declaration.type) { - return getTypeFromTypeNode(declaration.type); - } - if (declaration.flags & 65536 /* JavaScriptFile */) { - var type = getReturnTypeFromJSDocComment(declaration); - if (type && type !== unknownType) { - return type; - } + var typeNode = ts.getEffectiveReturnTypeNode(declaration); + if (typeNode) { + return getTypeFromTypeNode(typeNode); } // TypeScript 1.0 spec (April 2014): // If only one accessor includes a type annotation, the other behaves as if it had the same type annotation. @@ -32868,30 +32924,48 @@ var ts; } return undefined; } - function resolveTypeReferenceName(typeReferenceName) { + function resolveTypeReferenceName(typeReferenceName, meaning) { if (!typeReferenceName) { return unknownSymbol; } - return resolveEntityName(typeReferenceName, 793064 /* Type */) || unknownSymbol; + return resolveEntityName(typeReferenceName, meaning) || unknownSymbol; } function getTypeReferenceType(node, symbol) { var typeArguments = typeArgumentsFromTypeReferenceNode(node); // Do unconditionally so we mark type arguments as referenced. if (symbol === unknownSymbol) { return unknownType; } + var type = getTypeReferenceTypeWorker(node, symbol, typeArguments); + if (type) { + return type; + } + if (symbol.flags & 107455 /* Value */ && node.kind === 277 /* JSDocTypeReference */) { + // A JSDocTypeReference may have resolved to a value (as opposed to a type). If + // the symbol is a constructor function, return the inferred class type; otherwise, + // the type of this reference is just the type of the value we resolved to. + var valueType = getTypeOfSymbol(symbol); + if (valueType.symbol && !isInferredClassType(valueType)) { + var referenceType = getTypeReferenceTypeWorker(node, valueType.symbol, typeArguments); + if (referenceType) { + return referenceType; + } + } + // Resolve the type reference as a Type for the purpose of reporting errors. + resolveTypeReferenceName(getTypeReferenceName(node), 793064 /* Type */); + return valueType; + } + return getTypeFromNonGenericTypeReference(node, symbol); + } + function getTypeReferenceTypeWorker(node, symbol, typeArguments) { if (symbol.flags & (32 /* Class */ | 64 /* Interface */)) { return getTypeFromClassOrInterfaceReference(node, symbol, typeArguments); } if (symbol.flags & 524288 /* TypeAlias */) { return getTypeFromTypeAliasReference(node, symbol, typeArguments); } - if (symbol.flags & 107455 /* Value */ && node.kind === 277 /* JSDocTypeReference */) { - // A JSDocTypeReference may have resolved to a value (as opposed to a type). In - // that case, the type of this reference is just the type of the value we resolved - // to. - return getTypeOfSymbol(symbol); + if (symbol.flags & 16 /* Function */ && node.kind === 277 /* JSDocTypeReference */ && (symbol.members || ts.getJSDocClassTag(symbol.valueDeclaration))) { + return getInferredClassType(symbol); } - return getTypeFromNonGenericTypeReference(node, symbol); } function getPrimitiveTypeFromJSDocTypeReference(node) { if (ts.isIdentifier(node.name)) { @@ -32931,22 +33005,13 @@ var ts; if (!links.resolvedType) { var symbol = void 0; var type = void 0; + var meaning = 793064 /* Type */; if (node.kind === 277 /* JSDocTypeReference */) { type = getPrimitiveTypeFromJSDocTypeReference(node); - if (!type) { - var typeReferenceName = getTypeReferenceName(node); - symbol = resolveTypeReferenceName(typeReferenceName); - type = getTypeReferenceType(node, symbol); - } + meaning |= 107455 /* Value */; } - else { - // We only support expressions that are simple qualified names. For other expressions this produces undefined. - var typeNameOrExpression = node.kind === 159 /* TypeReference */ - ? node.typeName - : ts.isEntityNameExpression(node.expression) - ? node.expression - : undefined; - symbol = typeNameOrExpression && resolveEntityName(typeNameOrExpression, 793064 /* Type */) || unknownSymbol; + if (!type) { + symbol = resolveTypeReferenceName(getTypeReferenceName(node), meaning); type = getTypeReferenceType(node, symbol); } // Cache both the resolved symbol and the resolved type. The resolved symbol is needed in when we check the @@ -33328,10 +33393,13 @@ var ts; else if (type.flags & 1 /* Any */) { typeSet.containsAny = true; } + else if (type.flags & 8192 /* Never */) { + typeSet.containsNever = true; + } else if (getObjectFlags(type) & 16 /* Anonymous */ && isEmptyObjectType(type)) { typeSet.containsEmptyObject = true; } - else if (!(type.flags & 8192 /* Never */) && (strictNullChecks || !(type.flags & 6144 /* Nullable */)) && !ts.contains(typeSet, type)) { + else if ((strictNullChecks || !(type.flags & 6144 /* Nullable */)) && !ts.contains(typeSet, type)) { if (type.flags & 32768 /* Object */) { typeSet.containsObjectType = true; } @@ -33368,6 +33436,9 @@ var ts; } var typeSet = []; addTypesToIntersection(typeSet, types); + if (typeSet.containsNever) { + return neverType; + } if (typeSet.containsAny) { return anyType; } @@ -33970,7 +34041,8 @@ var ts; if (signature.typePredicate) { freshTypePredicate = cloneTypePredicate(signature.typePredicate, mapper); } - var result = createSignature(signature.declaration, freshTypeParameters, signature.thisParameter && instantiateSymbol(signature.thisParameter, mapper), instantiateList(signature.parameters, mapper, instantiateSymbol), instantiateType(signature.resolvedReturnType, mapper), freshTypePredicate, signature.minArgumentCount, signature.hasRestParameter, signature.hasLiteralTypes); + var result = createSignature(signature.declaration, freshTypeParameters, signature.thisParameter && instantiateSymbol(signature.thisParameter, mapper), instantiateList(signature.parameters, mapper, instantiateSymbol), + /*resolvedReturnType*/ undefined, freshTypePredicate, signature.minArgumentCount, signature.hasRestParameter, signature.hasLiteralTypes); result.target = signature; result.mapper = mapper; return result; @@ -34069,10 +34141,10 @@ var ts; case 199 /* ClassExpression */: case 230 /* InterfaceDeclaration */: case 231 /* TypeAliasDeclaration */: - var declaration = node; - if (declaration.typeParameters) { - for (var _i = 0, _a = declaration.typeParameters; _i < _a.length; _i++) { - var d = _a[_i]; + var typeParameters = ts.getEffectiveTypeParameterDeclarations(node); + if (typeParameters) { + for (var _i = 0, typeParameters_1 = typeParameters; _i < typeParameters_1.length; _i++) { + var d = typeParameters_1[_i]; if (ts.contains(mappedTypes, getDeclaredTypeOfTypeParameter(getSymbolOfNode(d)))) { return true; } @@ -34092,8 +34164,8 @@ var ts; break; case 279 /* JSDocFunctionType */: var func = node; - for (var _b = 0, _c = func.parameters; _b < _c.length; _b++) { - var p = _c[_b]; + for (var _a = 0, _b = func.parameters; _a < _b.length; _a++) { + var p = _b[_a]; if (ts.contains(mappedTypes, getTypeOfNode(p))) { return true; } @@ -34221,7 +34293,7 @@ var ts; return false; } // Functions with any parameters that lack type annotations are context sensitive. - if (ts.forEach(node.parameters, function (p) { return !p.type; })) { + if (ts.forEach(node.parameters, function (p) { return !ts.getEffectiveTypeAnnotationNode(p); })) { return true; } // For arrow functions we now know we're not context sensitive. @@ -34321,10 +34393,9 @@ var ts; if (!target.hasRestParameter && source.minArgumentCount > target.parameters.length) { return 0 /* False */; } - // Spec 1.0 Section 3.8.3 & 3.8.4: - // M and N (the signatures) are instantiated using type Any as the type argument for all type parameters declared by M and N - source = getErasedSignature(source); - target = getErasedSignature(target); + if (source.typeParameters) { + source = instantiateSignatureInContextOf(source, target); + } var result = -1 /* True */; var sourceThisType = getThisTypeOfSignature(source); if (sourceThisType && sourceThisType !== voidType) { @@ -34800,7 +34871,9 @@ var ts; reportError(ts.Diagnostics.Property_0_does_not_exist_on_type_1, symbolToString(prop), typeToString(target)); } else { - errorNode = prop.valueDeclaration; + if (prop.valueDeclaration) { + errorNode = prop.valueDeclaration; + } reportError(ts.Diagnostics.Object_literal_may_only_specify_known_properties_and_0_does_not_exist_in_type_1, symbolToString(prop), typeToString(target)); } } @@ -35307,17 +35380,27 @@ var ts; var result = -1 /* True */; var saveErrorInfo = errorInfo; if (getObjectFlags(source) & 64 /* Instantiated */ && getObjectFlags(target) & 64 /* Instantiated */ && source.symbol === target.symbol) { - // We instantiations of the same anonymous type (which typically will be the type of a method). - // Simply do a pairwise comparison of the signatures in the two signature lists instead of the - // much more expensive N * M comparison matrix we explore below. + // We have instantiations of the same anonymous type (which typically will be the type of a + // method). Simply do a pairwise comparison of the signatures in the two signature lists instead + // of the much more expensive N * M comparison matrix we explore below. We erase type parameters + // as they are known to always be the same. for (var i = 0; i < targetSignatures.length; i++) { - var related = signatureRelatedTo(sourceSignatures[i], targetSignatures[i], reportErrors); + var related = signatureRelatedTo(sourceSignatures[i], targetSignatures[i], /*erase*/ true, reportErrors); if (!related) { return 0 /* False */; } result &= related; } } + else if (sourceSignatures.length === 1 && targetSignatures.length === 1) { + // For simple functions (functions with a single signature) we only erase type parameters for + // the comparable relation. Otherwise, if the source signature is generic, we instantiate it + // in the context of the target signature before checking the relationship. Ideally we'd do + // this regardless of the number of signatures, but the potential costs are prohibitive due + // to the quadratic nature of the logic below. + var eraseGenerics = relation === comparableRelation || compilerOptions.noStrictGenericChecks; + result = signatureRelatedTo(sourceSignatures[0], targetSignatures[0], eraseGenerics, reportErrors); + } else { outer: for (var _i = 0, targetSignatures_1 = targetSignatures; _i < targetSignatures_1.length; _i++) { var t = targetSignatures_1[_i]; @@ -35325,7 +35408,7 @@ var ts; var shouldElaborateErrors = reportErrors; for (var _a = 0, sourceSignatures_1 = sourceSignatures; _a < sourceSignatures_1.length; _a++) { var s = sourceSignatures_1[_a]; - var related = signatureRelatedTo(s, t, shouldElaborateErrors); + var related = signatureRelatedTo(s, t, /*erase*/ true, shouldElaborateErrors); if (related) { result &= related; errorInfo = saveErrorInfo; @@ -35344,8 +35427,9 @@ var ts; /** * See signatureAssignableTo, compareSignaturesIdentical */ - function signatureRelatedTo(source, target, reportErrors) { - return compareSignaturesRelated(source, target, /*checkAsCallback*/ false, /*ignoreReturnTypes*/ false, reportErrors, reportError, isRelatedTo); + function signatureRelatedTo(source, target, erase, reportErrors) { + return compareSignaturesRelated(erase ? getErasedSignature(source) : source, erase ? getErasedSignature(target) : target, + /*checkAsCallback*/ false, /*ignoreReturnTypes*/ false, reportErrors, reportError, isRelatedTo); } function signaturesIdenticalTo(source, target, kind) { var sourceSignatures = getSignaturesOfType(source, kind); @@ -38313,8 +38397,15 @@ var ts; function getContextualTypeForInitializerExpression(node) { var declaration = node.parent; if (node === declaration.initializer) { - if (declaration.type) { - return getTypeFromTypeNode(declaration.type); + var typeNode = ts.getEffectiveTypeAnnotationNode(declaration); + if (typeNode) { + return getTypeFromTypeNode(typeNode); + } + if (ts.isInJavaScriptFile(declaration)) { + var jsDocType = getTypeForDeclarationFromJSDocComment(declaration); + if (jsDocType) { + return jsDocType; + } } if (declaration.kind === 146 /* Parameter */) { var type = getContextuallyTypedParameterType(declaration); @@ -38328,12 +38419,13 @@ var ts; if (ts.isBindingPattern(declaration.parent)) { var parentDeclaration = declaration.parent.parent; var name = declaration.propertyName || declaration.name; - if (parentDeclaration.kind !== 176 /* BindingElement */ && - parentDeclaration.type && - !ts.isBindingPattern(name)) { - var text = ts.getTextOfPropertyName(name); - if (text) { - return getTypeOfPropertyOfType(getTypeFromTypeNode(parentDeclaration.type), text); + if (parentDeclaration.kind !== 176 /* BindingElement */) { + var parentTypeNode = ts.getEffectiveTypeAnnotationNode(parentDeclaration); + if (parentTypeNode && !ts.isBindingPattern(name)) { + var text = ts.getTextOfPropertyName(name); + if (text) { + return getTypeOfPropertyOfType(getTypeFromTypeNode(parentTypeNode), text); + } } } } @@ -38379,9 +38471,9 @@ var ts; function getContextualReturnType(functionDecl) { // If the containing function has a return type annotation, is a constructor, or is a get accessor whose // corresponding set accessor has a type annotation, return statements in the function are contextually typed - if (functionDecl.type || - functionDecl.kind === 152 /* Constructor */ || - functionDecl.kind === 153 /* GetAccessor */ && ts.getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(functionDecl.symbol, 154 /* SetAccessor */))) { + if (functionDecl.kind === 152 /* Constructor */ || + ts.getEffectiveReturnTypeNode(functionDecl) || + isGetAccessorWithAnnotatedSetAccessor(functionDecl)) { return getReturnTypeOfSignature(getSignatureFromDeclaration(functionDecl)); } // Otherwise, if the containing function is contextually typed by a function type with exactly one call signature @@ -39658,9 +39750,13 @@ var ts; } /** * Check if a property with the given name is known anywhere in the given type. In an object type, a property - * is considered known if the object type is empty and the check is for assignability, if the object type has - * index signatures, or if the property is actually declared in the object type. In a union or intersection - * type, a property is considered known if it is known in any constituent type. + * is considered known if + * 1. the object type is empty and the check is for assignability, or + * 2. if the object type has index signatures, or + * 3. if the property is actually declared in the object type + * (this means that 'toString', for example, is not usually a known property). + * 4. In a union or intersection type, + * a property is considered known if it is known in any constituent type. * @param targetType a type to search a given name in * @param name a property name to search * @param isComparingJsxAttributes a boolean flag indicating whether we are searching in JsxAttributesType @@ -39670,7 +39766,7 @@ var ts; var resolved = resolveStructuredTypeMembers(targetType); if (resolved.stringIndexInfo || resolved.numberIndexInfo && isNumericLiteralName(name) || - getPropertyOfType(targetType, name) || + getPropertyOfObjectType(targetType, name) || isComparingJsxAttributes && !isUnhyphenatedJsxName(name)) { // For JSXAttributes, if the attribute has a hyphenated name, consider that the attribute to be known. return true; @@ -40341,8 +40437,11 @@ var ts; var context = createInferenceContext(signature, 1 /* InferUnionTypes */); forEachMatchingParameterType(contextualSignature, signature, function (source, target) { // Type parameters from outer context referenced by source type are fixed by instantiation of the source type - inferTypes(context.inferences, instantiateType(source, contextualMapper), target); + inferTypes(context.inferences, instantiateType(source, contextualMapper || identityMapper), target); }); + if (!contextualMapper) { + inferTypes(context.inferences, getReturnTypeOfSignature(contextualSignature), getReturnTypeOfSignature(signature), 4 /* ReturnType */); + } return getSignatureInstantiation(signature, getInferredTypes(context)); } function inferTypeArguments(node, signature, args, excludeArgument, context) { @@ -40378,10 +40477,10 @@ var ts; // outer call expression. Effectively we just want a snapshot of whatever has been // inferred for any outer call expression so far. var instantiatedType = instantiateType(contextualType, cloneTypeMapper(getContextualMapper(node))); - // If the contextual type is a generic pure function type, we instantiate the type with - // its own type parameters and type arguments. This ensures that the type parameters are - // not erased to type any during type inference such that they can be inferred as actual - // types from the contextual type. For example: + // If the contextual type is a generic function type with a single call signature, we + // instantiate the type with its own type parameters and type arguments. This ensures that + // the type parameters are not erased to type any during type inference such that they can + // be inferred as actual types from the contextual type. For example: // declare function arrayMap(f: (x: T) => U): (a: T[]) => U[]; // const boxElements: (a: A[]) => { value: A }[] = arrayMap(value => ({ value })); // Above, the type of the 'value' parameter is inferred to be 'A'. @@ -41422,6 +41521,11 @@ var ts; } return links.inferredClassType; } + function isInferredClassType(type) { + return type.symbol + && getObjectFlags(type) & 16 /* Anonymous */ + && getSymbolLinks(type.symbol).inferredClassType === type; + } /** * Syntactically and semantically checks a call or new expression. * @param node The call/new expression to be checked. @@ -41570,37 +41674,42 @@ var ts; function getTypeOfFirstParameterOfSignature(signature) { return signature.parameters.length > 0 ? getTypeAtPosition(signature, 0) : neverType; } - function assignContextualParameterTypes(signature, context, mapper, checkMode) { + function inferFromAnnotatedParameters(signature, context, mapper) { var len = signature.parameters.length - (signature.hasRestParameter ? 1 : 0); - if (checkMode === 2 /* Inferential */) { - for (var i = 0; i < len; i++) { - var declaration = signature.parameters[i].valueDeclaration; - if (declaration.type) { - inferTypes(mapper.inferences, getTypeFromTypeNode(declaration.type), getTypeAtPosition(context, i)); + for (var i = 0; i < len; i++) { + var declaration = signature.parameters[i].valueDeclaration; + if (declaration.type) { + var typeNode = ts.getEffectiveTypeAnnotationNode(declaration); + if (typeNode) { + inferTypes(mapper.inferences, getTypeFromTypeNode(typeNode), getTypeAtPosition(context, i)); } } } + } + function assignContextualParameterTypes(signature, context) { + signature.typeParameters = context.typeParameters; if (context.thisParameter) { var parameter = signature.thisParameter; if (!parameter || parameter.valueDeclaration && !parameter.valueDeclaration.type) { if (!parameter) { signature.thisParameter = createSymbolWithType(context.thisParameter, /*type*/ undefined); } - assignTypeToParameterAndFixTypeParameters(signature.thisParameter, getTypeOfSymbol(context.thisParameter), mapper, checkMode); + assignTypeToParameterAndFixTypeParameters(signature.thisParameter, getTypeOfSymbol(context.thisParameter)); } } + var len = signature.parameters.length - (signature.hasRestParameter ? 1 : 0); for (var i = 0; i < len; i++) { var parameter = signature.parameters[i]; - if (!parameter.valueDeclaration.type) { + if (!ts.getEffectiveTypeAnnotationNode(parameter.valueDeclaration)) { var contextualParameterType = getTypeAtPosition(context, i); - assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType, mapper, checkMode); + assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType); } } if (signature.hasRestParameter && isRestParameterIndex(context, signature.parameters.length - 1)) { var parameter = ts.lastOrUndefined(signature.parameters); - if (!parameter.valueDeclaration.type) { + if (!ts.getEffectiveTypeAnnotationNode(parameter.valueDeclaration)) { var contextualParameterType = getTypeOfSymbol(ts.lastOrUndefined(context.parameters)); - assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType, mapper, checkMode); + assignTypeToParameterAndFixTypeParameters(parameter, contextualParameterType); } } } @@ -41619,10 +41728,10 @@ var ts; } } } - function assignTypeToParameterAndFixTypeParameters(parameter, contextualType, mapper, checkMode) { + function assignTypeToParameterAndFixTypeParameters(parameter, contextualType) { var links = getSymbolLinks(parameter); if (!links.type) { - links.type = instantiateType(contextualType, mapper); + links.type = contextualType; var name = ts.getNameOfDeclaration(parameter.valueDeclaration); // if inference didn't come up with anything but {}, fall back to the binding pattern if present. if (links.type === emptyObjectType && @@ -41631,45 +41740,6 @@ var ts; } assignBindingElementTypes(parameter.valueDeclaration); } - else if (checkMode === 2 /* Inferential */) { - // Even if the parameter already has a type, it might be because it was given a type while - // processing the function as an argument to a prior signature during overload resolution. - // If this was the case, it may have caused some type parameters to be fixed. So here, - // we need to ensure that type parameters at the same positions get fixed again. This is - // done by calling instantiateType to attach the mapper to the contextualType, and then - // calling inferTypes to force a walk of contextualType so that all the correct fixing - // happens. The choice to pass in links.type may seem kind of arbitrary, but it serves - // to make sure that all the correct positions in contextualType are reached by the walk. - // Here is an example: - // - // interface Base { - // baseProp; - // } - // interface Derived extends Base { - // toBase(): Base; - // } - // - // var derived: Derived; - // - // declare function foo(x: T, func: (p: T) => T): T; - // declare function foo(x: T, func: (p: T) => T): T; - // - // var result = foo(derived, d => d.toBase()); - // - // We are typing d while checking the second overload. But we've already given d - // a type (Derived) from the first overload. However, we still want to fix the - // T in the second overload so that we do not infer Base as a candidate for T - // (inferring Base would make type argument inference inconsistent between the two - // overloads). - inferTypes(mapper.inferences, links.type, instantiateType(contextualType, mapper)); - } - } - function getReturnTypeFromJSDocComment(func) { - var returnTag = ts.getJSDocReturnTag(func); - if (returnTag && returnTag.typeExpression) { - return getTypeFromTypeNode(returnTag.typeExpression.type); - } - return undefined; } function createPromiseType(promisedType) { // creates a `Promise` type where `T` is the promisedType argument @@ -41875,16 +41945,16 @@ var ts; } var hasExplicitReturn = func.flags & 256 /* HasExplicitReturn */; if (returnType && returnType.flags & 8192 /* Never */) { - error(func.type, ts.Diagnostics.A_function_returning_never_cannot_have_a_reachable_end_point); + error(ts.getEffectiveReturnTypeNode(func), ts.Diagnostics.A_function_returning_never_cannot_have_a_reachable_end_point); } else if (returnType && !hasExplicitReturn) { // minimal check: function has syntactic return type annotation and no explicit return statements in the body // this function does not conform to the specification. // NOTE: having returnType !== undefined is a precondition for entering this branch so func.type will always be present - error(func.type, ts.Diagnostics.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value); + error(ts.getEffectiveReturnTypeNode(func), ts.Diagnostics.A_function_whose_declared_type_is_neither_void_nor_any_must_return_a_value); } else if (returnType && strictNullChecks && !isTypeAssignableTo(undefinedType, returnType)) { - error(func.type, ts.Diagnostics.Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined); + error(ts.getEffectiveReturnTypeNode(func), ts.Diagnostics.Function_lacks_ending_return_statement_and_return_type_does_not_include_undefined); } else if (compilerOptions.noImplicitReturns) { if (!returnType) { @@ -41899,7 +41969,7 @@ var ts; return; } } - error(func.type || func, ts.Diagnostics.Not_all_code_paths_return_a_value); + error(ts.getEffectiveReturnTypeNode(func) || func, ts.Diagnostics.Not_all_code_paths_return_a_value); } } function checkFunctionExpressionOrObjectLiteralMethod(node, checkMode) { @@ -41916,35 +41986,34 @@ var ts; } var links = getNodeLinks(node); var type = getTypeOfSymbol(node.symbol); - var contextSensitive = isContextSensitive(node); - var mightFixTypeParameters = contextSensitive && checkMode === 2 /* Inferential */; // Check if function expression is contextually typed and assign parameter types if so. - // See the comment in assignTypeToParameterAndFixTypeParameters to understand why we need to - // check mightFixTypeParameters. - if (mightFixTypeParameters || !(links.flags & 1024 /* ContextChecked */)) { + if (!(links.flags & 1024 /* ContextChecked */)) { var contextualSignature = getContextualSignature(node); // If a type check is started at a function expression that is an argument of a function call, obtaining the // contextual type may recursively get back to here during overload resolution of the call. If so, we will have // already assigned contextual types. - var contextChecked = !!(links.flags & 1024 /* ContextChecked */); - if (mightFixTypeParameters || !contextChecked) { + if (!(links.flags & 1024 /* ContextChecked */)) { links.flags |= 1024 /* ContextChecked */; if (contextualSignature) { var signature = getSignaturesOfType(type, 0 /* Call */)[0]; - if (contextSensitive) { - assignContextualParameterTypes(signature, contextualSignature, getContextualMapper(node), checkMode); + if (isContextSensitive(node)) { + var contextualMapper = getContextualMapper(node); + if (checkMode === 2 /* Inferential */) { + inferFromAnnotatedParameters(signature, contextualSignature, contextualMapper); + } + var instantiatedContextualSignature = contextualMapper === identityMapper ? + contextualSignature : instantiateSignature(contextualSignature, contextualMapper); + assignContextualParameterTypes(signature, instantiatedContextualSignature); } - if (mightFixTypeParameters || !node.type && !signature.resolvedReturnType) { + if (!ts.getEffectiveReturnTypeNode(node) && !signature.resolvedReturnType) { var returnType = getReturnTypeFromBody(node, checkMode); if (!signature.resolvedReturnType) { signature.resolvedReturnType = returnType; } } } - if (!contextChecked) { - checkSignatureDeclaration(node); - checkNodeDeferred(node); - } + checkSignatureDeclaration(node); + checkNodeDeferred(node); } } if (produceDiagnostics && node.kind !== 151 /* MethodDeclaration */) { @@ -41957,16 +42026,17 @@ var ts; function checkFunctionExpressionOrObjectLiteralMethodDeferred(node) { ts.Debug.assert(node.kind !== 151 /* MethodDeclaration */ || ts.isObjectLiteralMethod(node)); var functionFlags = ts.getFunctionFlags(node); - var returnOrPromisedType = node.type && + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); + var returnOrPromisedType = returnTypeNode && ((functionFlags & 3 /* AsyncGenerator */) === 2 /* Async */ ? checkAsyncFunctionReturnType(node) : - getTypeFromTypeNode(node.type)); // AsyncGenerator function, Generator function, or normal function + getTypeFromTypeNode(returnTypeNode)); // AsyncGenerator function, Generator function, or normal function if ((functionFlags & 1 /* Generator */) === 0) { // return is not necessary in the body of generators checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, returnOrPromisedType); } if (node.body) { - if (!node.type) { + if (!returnTypeNode) { // There are some checks that are only performed in getReturnTypeFromBody, that may produce errors // we need. An example is the noImplicitAny errors resulting from widening the return expression // of a function. Because checking of function expression bodies is deferred, there was never an @@ -42052,7 +42122,7 @@ var ts; } function checkReferenceExpression(expr, invalidReferenceMessage) { // References are combinations of identifiers, parentheses, and property accesses. - var node = ts.skipParentheses(expr); + var node = ts.skipOuterExpressions(expr, 2 /* Assertions */ | 1 /* Parentheses */); if (node.kind !== 71 /* Identifier */ && node.kind !== 179 /* PropertyAccessExpression */ && node.kind !== 180 /* ElementAccessExpression */) { error(expr, invalidReferenceMessage); return false; @@ -42691,8 +42761,9 @@ var ts; // There is no point in doing an assignability check if the function // has no explicit return type because the return type is directly computed // from the yield expressions. - if (func.type) { - var signatureElementType = getIteratedTypeOfGenerator(getTypeFromTypeNode(func.type), (functionFlags & 2 /* Async */) !== 0) || anyType; + var returnType = ts.getEffectiveReturnTypeNode(func); + if (returnType) { + var signatureElementType = getIteratedTypeOfGenerator(getTypeFromTypeNode(returnType), (functionFlags & 2 /* Async */) !== 0) || anyType; if (nodeIsYieldStar) { checkTypeAssignableTo(functionFlags & 2 /* Async */ ? getAwaitedType(expressionElementType, node.expression, ts.Diagnostics.Type_of_iterated_elements_of_a_yield_Asterisk_operand_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member) @@ -42825,7 +42896,7 @@ var ts; if (signature && signature.typeParameters) { var contextualType = getApparentTypeOfContextualType(node); if (contextualType) { - var contextualSignature = getSingleCallSignature(contextualType); + var contextualSignature = getSingleCallSignature(getNonNullableType(contextualType)); if (contextualSignature && !contextualSignature.typeParameters) { return getOrCreateTypeFromSignature(instantiateSignatureInContextOf(signature, contextualSignature, getContextualMapper(node))); } @@ -43156,12 +43227,14 @@ var ts; } checkTypeParameters(node.typeParameters); ts.forEach(node.parameters, checkParameter); + // TODO(rbuckton): Should we start checking JSDoc types? if (node.type) { checkSourceElement(node.type); } if (produceDiagnostics) { checkCollisionWithArgumentsInGeneratedCode(node); - if (noImplicitAny && !node.type) { + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); + if (noImplicitAny && !returnTypeNode) { switch (node.kind) { case 156 /* ConstructSignature */: error(node, ts.Diagnostics.Construct_signature_which_lacks_return_type_annotation_implicitly_has_an_any_return_type); @@ -43171,12 +43244,12 @@ var ts; break; } } - if (node.type) { + if (returnTypeNode) { var functionFlags_1 = ts.getFunctionFlags(node); if ((functionFlags_1 & (4 /* Invalid */ | 1 /* Generator */)) === 1 /* Generator */) { - var returnType = getTypeFromTypeNode(node.type); + var returnType = getTypeFromTypeNode(returnTypeNode); if (returnType === voidType) { - error(node.type, ts.Diagnostics.A_generator_cannot_have_a_void_type_annotation); + error(returnTypeNode, ts.Diagnostics.A_generator_cannot_have_a_void_type_annotation); } else { var generatorElementType = getIteratedTypeOfGenerator(returnType, (functionFlags_1 & 2 /* Async */) !== 0) || anyType; @@ -43189,7 +43262,7 @@ var ts; // interface BadGenerator extends Iterable, Iterator { } // function* g(): BadGenerator { } // Iterable and Iterator have different types! // - checkTypeAssignableTo(iterableIteratorInstantiation, returnType, node.type); + checkTypeAssignableTo(iterableIteratorInstantiation, returnType, returnTypeNode); } } else if ((functionFlags_1 & 3 /* AsyncGenerator */) === 2 /* Async */) { @@ -44103,7 +44176,8 @@ var ts; // then(...): Promise; // } // - var returnType = getTypeFromTypeNode(node.type); + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); + var returnType = getTypeFromTypeNode(returnTypeNode); if (languageVersion >= 2 /* ES2015 */) { if (returnType === unknownType) { return unknownType; @@ -44112,29 +44186,29 @@ var ts; if (globalPromiseType !== emptyGenericType && !isReferenceToType(returnType, globalPromiseType)) { // The promise type was not a valid type reference to the global promise type, so we // report an error and return the unknown type. - error(node.type, ts.Diagnostics.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type); + error(returnTypeNode, ts.Diagnostics.The_return_type_of_an_async_function_or_method_must_be_the_global_Promise_T_type); return unknownType; } } else { // Always mark the type node as referenced if it points to a value - markTypeNodeAsReferenced(node.type); + markTypeNodeAsReferenced(returnTypeNode); if (returnType === unknownType) { return unknownType; } - var promiseConstructorName = ts.getEntityNameFromTypeNode(node.type); + var promiseConstructorName = ts.getEntityNameFromTypeNode(returnTypeNode); if (promiseConstructorName === undefined) { - error(node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, typeToString(returnType)); + error(returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, typeToString(returnType)); return unknownType; } var promiseConstructorSymbol = resolveEntityName(promiseConstructorName, 107455 /* Value */, /*ignoreErrors*/ true); var promiseConstructorType = promiseConstructorSymbol ? getTypeOfSymbol(promiseConstructorSymbol) : unknownType; if (promiseConstructorType === unknownType) { if (promiseConstructorName.kind === 71 /* Identifier */ && promiseConstructorName.text === "Promise" && getTargetType(returnType) === getGlobalPromiseType(/*reportErrors*/ false)) { - error(node.type, ts.Diagnostics.An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option); + error(returnTypeNode, ts.Diagnostics.An_async_function_or_method_in_ES5_SlashES3_requires_the_Promise_constructor_Make_sure_you_have_a_declaration_for_the_Promise_constructor_or_include_ES2015_in_your_lib_option); } else { - error(node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); + error(returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); } return unknownType; } @@ -44142,10 +44216,10 @@ var ts; if (globalPromiseConstructorLikeType === emptyObjectType) { // If we couldn't resolve the global PromiseConstructorLike type we cannot verify // compatibility with __awaiter. - error(node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); + error(returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value, ts.entityNameToString(promiseConstructorName)); return unknownType; } - if (!checkTypeAssignableTo(promiseConstructorType, globalPromiseConstructorLikeType, node.type, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value)) { + if (!checkTypeAssignableTo(promiseConstructorType, globalPromiseConstructorLikeType, returnTypeNode, ts.Diagnostics.Type_0_is_not_a_valid_async_function_return_type_in_ES5_SlashES3_because_it_does_not_refer_to_a_Promise_compatible_constructor_value)) { return unknownType; } // Verify there is no local declaration that could collide with the promise constructor. @@ -44262,7 +44336,8 @@ var ts; } } function getParameterTypeNodeForDecoratorCheck(node) { - return node.dotDotDotToken ? ts.getRestParameterElementType(node.type) : node.type; + var typeNode = ts.getEffectiveTypeAnnotationNode(node); + return ts.isRestParameter(node) ? ts.getRestParameterElementType(typeNode) : typeNode; } /** Check the decorators of a node */ function checkDecorators(node) { @@ -44302,13 +44377,13 @@ var ts; var parameter = _c[_b]; markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(parameter)); } - markDecoratorMedataDataTypeNodeAsReferenced(node.type); + markDecoratorMedataDataTypeNodeAsReferenced(ts.getEffectiveReturnTypeNode(node)); break; case 149 /* PropertyDeclaration */: - markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(node)); + markDecoratorMedataDataTypeNodeAsReferenced(ts.getEffectiveTypeAnnotationNode(node)); break; case 146 /* Parameter */: - markDecoratorMedataDataTypeNodeAsReferenced(node.type); + markDecoratorMedataDataTypeNodeAsReferenced(getParameterTypeNodeForDecoratorCheck(node)); break; } } @@ -44316,7 +44391,8 @@ var ts; } function checkFunctionDeclaration(node) { if (produceDiagnostics) { - checkFunctionOrMethodDeclaration(node) || checkGrammarForGenerator(node); + checkFunctionOrMethodDeclaration(node); + checkGrammarForGenerator(node); checkCollisionWithCapturedSuperVariable(node, node.name); checkCollisionWithCapturedThisVariable(node, node.name); checkCollisionWithCapturedNewTargetVariable(node, node.name); @@ -44362,13 +44438,14 @@ var ts; } } checkSourceElement(node.body); + var returnTypeNode = ts.getEffectiveReturnTypeNode(node); if ((functionFlags & 1 /* Generator */) === 0) { - var returnOrPromisedType = node.type && (functionFlags & 2 /* Async */ + var returnOrPromisedType = returnTypeNode && (functionFlags & 2 /* Async */ ? checkAsyncFunctionReturnType(node) // Async function - : getTypeFromTypeNode(node.type)); // normal function + : getTypeFromTypeNode(returnTypeNode)); // normal function checkAllCodePathsInNonVoidFunctionReturnOrThrow(node, returnOrPromisedType); } - if (produceDiagnostics && !node.type) { + if (produceDiagnostics && !returnTypeNode) { // Report an implicit any error if there is no body, no explicit return type, and node is not a private method // in an ambient context if (noImplicitAny && ts.nodeIsMissing(node.body) && !isPrivateWithinAmbient(node)) { @@ -44467,9 +44544,7 @@ var ts; function errorUnusedLocal(node, name) { if (isIdentifierThatStartsWithUnderScore(node)) { var declaration = ts.getRootDeclaration(node.parent); - if (declaration.kind === 226 /* VariableDeclaration */ && - (declaration.parent.parent.kind === 215 /* ForInStatement */ || - declaration.parent.parent.kind === 216 /* ForOfStatement */)) { + if (declaration.kind === 226 /* VariableDeclaration */ && ts.isForInOrOfStatement(declaration.parent.parent)) { return; } } @@ -45376,7 +45451,8 @@ var ts; // TODO: Check that target label is valid } function isGetAccessorWithAnnotatedSetAccessor(node) { - return !!(node.kind === 153 /* GetAccessor */ && ts.getSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(node.symbol, 154 /* SetAccessor */))); + return node.kind === 153 /* GetAccessor */ + && ts.getEffectiveSetAccessorTypeAnnotationNode(ts.getDeclarationOfKind(node.symbol, 154 /* SetAccessor */)) !== undefined; } function isUnwrappedReturnTypeVoidOrAny(func, returnType) { var unwrappedReturnType = (ts.getFunctionFlags(func) & 3 /* AsyncGenerator */) === 2 /* Async */ @@ -45416,7 +45492,7 @@ var ts; error(node, ts.Diagnostics.Return_type_of_constructor_signature_must_be_assignable_to_the_instance_type_of_the_class); } } - else if (func.type || isGetAccessorWithAnnotatedSetAccessor(func)) { + else if (ts.getEffectiveReturnTypeNode(func) || isGetAccessorWithAnnotatedSetAccessor(func)) { if (functionFlags & 2 /* Async */) { var promisedType = getPromisedTypeOfPromise(returnType); var awaitedType = checkAwaitedType(exprType, node, ts.Diagnostics.The_return_type_of_an_async_function_must_either_be_a_valid_promise_or_must_not_contain_a_callable_then_member); @@ -46444,7 +46520,10 @@ var ts; error(node, message, symbolToString(symbol)); } // Don't allow to re-export something with no value side when `--isolatedModules` is set. - if (node.kind === 246 /* ExportSpecifier */ && compilerOptions.isolatedModules && !(target.flags & 107455 /* Value */)) { + if (compilerOptions.isolatedModules + && node.kind === 246 /* ExportSpecifier */ + && !(target.flags & 107455 /* Value */) + && !ts.isInAmbientContext(node)) { error(node, ts.Diagnostics.Cannot_re_export_a_type_when_the_isolatedModules_flag_is_provided); } } @@ -47129,6 +47208,11 @@ var ts; var parameter = ts.getParameterFromJSDoc(entityName.parent); return parameter && parameter.symbol; } + if (entityName.parent.kind === 145 /* TypeParameter */ && entityName.parent.parent.kind === 290 /* JSDocTemplateTag */) { + ts.Debug.assert(!ts.isInJavaScriptFile(entityName)); // Otherwise `isDeclarationName` would have been true. + var typeParameter = ts.getTypeParameterFromJsDoc(entityName.parent); + return typeParameter && typeParameter.symbol; + } if (ts.isPartOfExpression(entityName)) { if (ts.nodeIsMissing(entityName)) { // Missing entity name. @@ -49175,10 +49259,7 @@ var ts; switch (name.parent.kind) { case 242 /* ImportSpecifier */: case 246 /* ExportSpecifier */: - if (name.parent.propertyName) { - return true; - } - // falls through + return true; default: return ts.isDeclarationName(name); } @@ -49341,9 +49422,9 @@ var ts; case 149 /* PropertyDeclaration */: return ts.updateProperty(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.type, visitor, ts.isTypeNode), visitNode(node.initializer, visitor, ts.isExpression)); case 150 /* MethodSignature */: - return ts.updateMethodSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken)); + return ts.updateMethodSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken)); case 151 /* MethodDeclaration */: - return ts.updateMethod(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateMethod(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isPropertyName), visitNode(node.questionToken, tokenVisitor, ts.isToken), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 152 /* Constructor */: return ts.updateConstructor(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitFunctionBody(node.body, visitor, context)); case 153 /* GetAccessor */: @@ -49351,9 +49432,9 @@ var ts; case 154 /* SetAccessor */: return ts.updateSetAccessor(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isPropertyName), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitFunctionBody(node.body, visitor, context)); case 155 /* CallSignature */: - return ts.updateCallSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateCallSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 156 /* ConstructSignature */: - return ts.updateConstructSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateConstructSignature(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 157 /* IndexSignature */: return ts.updateIndexSignature(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); // Types @@ -49362,9 +49443,9 @@ var ts; case 159 /* TypeReference */: return ts.updateTypeReferenceNode(node, visitNode(node.typeName, visitor, ts.isEntityName), nodesVisitor(node.typeArguments, visitor, ts.isTypeNode)); case 160 /* FunctionType */: - return ts.updateFunctionTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateFunctionTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 161 /* ConstructorType */: - return ts.updateConstructorTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateConstructorTypeNode(node, nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.parameters, visitor, ts.isParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 162 /* TypeQuery */: return ts.updateTypeQueryNode(node, visitNode(node.exprName, visitor, ts.isEntityName)); case 163 /* TypeLiteral */: @@ -49384,7 +49465,7 @@ var ts; case 171 /* IndexedAccessType */: return ts.updateIndexedAccessTypeNode(node, visitNode(node.objectType, visitor, ts.isTypeNode), visitNode(node.indexType, visitor, ts.isTypeNode)); case 172 /* MappedType */: - return ts.updateMappedTypeNode(node, visitNode(node.readonlyToken, tokenVisitor, ts.isToken), visitNode(node.typeParameter, visitor, ts.isTypeParameter), visitNode(node.questionToken, tokenVisitor, ts.isToken), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateMappedTypeNode(node, visitNode(node.readonlyToken, tokenVisitor, ts.isToken), visitNode(node.typeParameter, visitor, ts.isTypeParameterDeclaration), visitNode(node.questionToken, tokenVisitor, ts.isToken), visitNode(node.type, visitor, ts.isTypeNode)); case 173 /* LiteralType */: return ts.updateLiteralTypeNode(node, visitNode(node.literal, visitor, ts.isExpression)); // Binding patterns @@ -49414,9 +49495,9 @@ var ts; case 185 /* ParenthesizedExpression */: return ts.updateParen(node, visitNode(node.expression, visitor, ts.isExpression)); case 186 /* FunctionExpression */: - return ts.updateFunctionExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateFunctionExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 187 /* ArrowFunction */: - return ts.updateArrowFunction(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateArrowFunction(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 188 /* DeleteExpression */: return ts.updateDelete(node, visitNode(node.expression, visitor, ts.isExpression)); case 189 /* TypeOfExpression */: @@ -49440,7 +49521,7 @@ var ts; case 198 /* SpreadElement */: return ts.updateSpread(node, visitNode(node.expression, visitor, ts.isExpression)); case 199 /* ClassExpression */: - return ts.updateClassExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); + return ts.updateClassExpression(node, nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); case 201 /* ExpressionWithTypeArguments */: return ts.updateExpressionWithTypeArguments(node, nodesVisitor(node.typeArguments, visitor, ts.isTypeNode), visitNode(node.expression, visitor, ts.isExpression)); case 202 /* AsExpression */: @@ -49492,13 +49573,13 @@ var ts; case 227 /* VariableDeclarationList */: return ts.updateVariableDeclarationList(node, nodesVisitor(node.declarations, visitor, ts.isVariableDeclaration)); case 228 /* FunctionDeclaration */: - return ts.updateFunctionDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); + return ts.updateFunctionDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.asteriskToken, tokenVisitor, ts.isToken), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitParameterList(node.parameters, visitor, context, nodesVisitor), visitNode(node.type, visitor, ts.isTypeNode), visitFunctionBody(node.body, visitor, context)); case 229 /* ClassDeclaration */: - return ts.updateClassDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); + return ts.updateClassDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isClassElement)); case 230 /* InterfaceDeclaration */: - return ts.updateInterfaceDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isTypeElement)); + return ts.updateInterfaceDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), nodesVisitor(node.heritageClauses, visitor, ts.isHeritageClause), nodesVisitor(node.members, visitor, ts.isTypeElement)); case 231 /* TypeAliasDeclaration */: - return ts.updateTypeAliasDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameter), visitNode(node.type, visitor, ts.isTypeNode)); + return ts.updateTypeAliasDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.typeParameters, visitor, ts.isTypeParameterDeclaration), visitNode(node.type, visitor, ts.isTypeNode)); case 232 /* EnumDeclaration */: return ts.updateEnumDeclaration(node, nodesVisitor(node.decorators, visitor, ts.isDecorator), nodesVisitor(node.modifiers, visitor, ts.isModifier), visitNode(node.name, visitor, ts.isIdentifier), nodesVisitor(node.members, visitor, ts.isEnumMember)); case 233 /* ModuleDeclaration */: @@ -50101,35 +50182,7 @@ var ts; } var Debug; (function (Debug) { - if (Debug.isDebugging) { - // Add additional properties in debug mode to assist with debugging. - Object.defineProperties(ts.objectAllocator.getSymbolConstructor().prototype, { - "__debugFlags": { get: function () { return ts.formatSymbolFlags(this.flags); } } - }); - Object.defineProperties(ts.objectAllocator.getTypeConstructor().prototype, { - "__debugFlags": { get: function () { return ts.formatTypeFlags(this.flags); } }, - "__debugObjectFlags": { get: function () { return this.flags & 32768 /* Object */ ? ts.formatObjectFlags(this.objectFlags) : ""; } }, - "__debugTypeToString": { value: function () { return this.checker.typeToString(this); } }, - }); - for (var _i = 0, _a = [ts.objectAllocator.getNodeConstructor(), ts.objectAllocator.getIdentifierConstructor(), ts.objectAllocator.getTokenConstructor(), ts.objectAllocator.getSourceFileConstructor()]; _i < _a.length; _i++) { - var ctor = _a[_i]; - if (!ctor.prototype.hasOwnProperty("__debugKind")) { - Object.defineProperties(ctor.prototype, { - "__debugKind": { get: function () { return ts.formatSyntaxKind(this.kind); } }, - "__debugModifierFlags": { get: function () { return ts.formatModifierFlags(ts.getModifierFlagsNoCache(this)); } }, - "__debugTransformFlags": { get: function () { return ts.formatTransformFlags(this.transformFlags); } }, - "__debugEmitFlags": { get: function () { return ts.formatEmitFlags(ts.getEmitFlags(this)); } }, - "__debugGetText": { value: function (includeTrivia) { - if (ts.nodeIsSynthesized(this)) - return ""; - var parseNode = ts.getParseTreeNode(this); - var sourceFile = parseNode && ts.getSourceFileOfNode(parseNode); - return sourceFile ? ts.getSourceTextOfNodeFromSourceFile(sourceFile, parseNode, includeTrivia) : ""; - } } - }); - } - } - } + var isDebugInfoEnabled = false; Debug.failBadSyntaxKind = Debug.shouldAssert(1 /* Normal */) ? function (node, message) { return Debug.fail((message || "Unexpected node.") + "\r\nNode " + ts.formatSyntaxKind(node.kind) + " was unexpected.", Debug.failBadSyntaxKind); } : ts.noop; @@ -50148,6 +50201,50 @@ var ts; Debug.assertMissingNode = Debug.shouldAssert(1 /* Normal */) ? function (node, message) { return Debug.assert(node === undefined, message || "Unexpected node.", function () { return "Node " + ts.formatSyntaxKind(node.kind) + " was unexpected'."; }, Debug.assertMissingNode); } : ts.noop; + /** + * Injects debug information into frequently used types. + */ + function enableDebugInfo() { + if (isDebugInfoEnabled) + return; + // Add additional properties in debug mode to assist with debugging. + Object.defineProperties(ts.objectAllocator.getSymbolConstructor().prototype, { + "__debugFlags": { get: function () { return ts.formatSymbolFlags(this.flags); } } + }); + Object.defineProperties(ts.objectAllocator.getTypeConstructor().prototype, { + "__debugFlags": { get: function () { return ts.formatTypeFlags(this.flags); } }, + "__debugObjectFlags": { get: function () { return this.flags & 32768 /* Object */ ? ts.formatObjectFlags(this.objectFlags) : ""; } }, + "__debugTypeToString": { value: function () { return this.checker.typeToString(this); } }, + }); + var nodeConstructors = [ + ts.objectAllocator.getNodeConstructor(), + ts.objectAllocator.getIdentifierConstructor(), + ts.objectAllocator.getTokenConstructor(), + ts.objectAllocator.getSourceFileConstructor() + ]; + for (var _i = 0, nodeConstructors_1 = nodeConstructors; _i < nodeConstructors_1.length; _i++) { + var ctor = nodeConstructors_1[_i]; + if (!ctor.prototype.hasOwnProperty("__debugKind")) { + Object.defineProperties(ctor.prototype, { + "__debugKind": { get: function () { return ts.formatSyntaxKind(this.kind); } }, + "__debugModifierFlags": { get: function () { return ts.formatModifierFlags(ts.getModifierFlagsNoCache(this)); } }, + "__debugTransformFlags": { get: function () { return ts.formatTransformFlags(this.transformFlags); } }, + "__debugEmitFlags": { get: function () { return ts.formatEmitFlags(ts.getEmitFlags(this)); } }, + "__debugGetText": { + value: function (includeTrivia) { + if (ts.nodeIsSynthesized(this)) + return ""; + var parseNode = ts.getParseTreeNode(this); + var sourceFile = parseNode && ts.getSourceFileOfNode(parseNode); + return sourceFile ? ts.getSourceTextOfNodeFromSourceFile(sourceFile, parseNode, includeTrivia) : ""; + } + } + }); + } + } + isDebugInfoEnabled = true; + } + Debug.enableDebugInfo = enableDebugInfo; })(Debug = ts.Debug || (ts.Debug = {})); })(ts || (ts = {})); /// @@ -58601,7 +58698,7 @@ var ts; if (variables.length === 0) { return undefined; } - return ts.createStatement(ts.inlineExpressions(ts.map(variables, transformInitializedVariable))); + return ts.setSourceMapRange(ts.createStatement(ts.inlineExpressions(ts.map(variables, transformInitializedVariable))), node); } } /** @@ -59113,7 +59210,7 @@ var ts; return undefined; } function transformInitializedVariable(node) { - return ts.createAssignment(ts.getSynthesizedClone(node.name), ts.visitNode(node.initializer, visitor, ts.isExpression)); + return ts.setSourceMapRange(ts.createAssignment(ts.setSourceMapRange(ts.getSynthesizedClone(node.name), node.name), ts.visitNode(node.initializer, visitor, ts.isExpression)), node); } function transformAndEmitIfStatement(node) { if (containsYield(node)) { @@ -63621,7 +63718,7 @@ var ts; function hoistVariableDeclaration(name) { ts.Debug.assert(state > 0 /* Uninitialized */, "Cannot modify the lexical environment during initialization."); ts.Debug.assert(state < 2 /* Completed */, "Cannot modify the lexical environment after transformation has completed."); - var decl = ts.createVariableDeclaration(name); + var decl = ts.setEmitFlags(ts.createVariableDeclaration(name), 64 /* NoNestedSourceMaps */); if (!lexicalEnvironmentVariableDeclarations) { lexicalEnvironmentVariableDeclarations = [decl]; } @@ -64991,7 +65088,7 @@ var ts; currentIdentifiers = node.identifiers; isCurrentFileExternalModule = ts.isExternalModule(node); enclosingDeclaration = node; - ts.emitDetachedComments(currentText, currentLineMap, writer, ts.writeCommentRange, node, newLine, /*removeComents*/ true); + ts.emitDetachedComments(currentText, currentLineMap, writer, ts.writeCommentRange, node, newLine, /*removeComments*/ true); emitLines(node.statements); } // Return a temp variable name to be used in `export default`/`export class ... extends` statements. @@ -70140,7 +70237,7 @@ var ts; } var sourceFileWithAddedExtension = ts.forEach(supportedExtensions, function (extension) { return getSourceFile(fileName + extension); }); if (fail && !sourceFileWithAddedExtension) - fail(ts.Diagnostics.File_0_not_found, fileName + ".ts"); + fail(ts.Diagnostics.File_0_not_found, fileName + ".ts" /* Ts */); return sourceFileWithAddedExtension; } } @@ -70573,15 +70670,15 @@ var ts; function getResolutionDiagnostic(options, _a) { var extension = _a.extension; switch (extension) { - case ts.Extension.Ts: - case ts.Extension.Dts: + case ".ts" /* Ts */: + case ".d.ts" /* Dts */: // These are always allowed. return undefined; - case ts.Extension.Tsx: + case ".tsx" /* Tsx */: return needJsx(); - case ts.Extension.Jsx: + case ".jsx" /* Jsx */: return needJsx() || needAllowJs(); - case ts.Extension.Js: + case ".js" /* Js */: return needAllowJs(); } function needJsx() { @@ -71206,6 +71303,12 @@ var ts; category: ts.Diagnostics.Advanced_Options, description: ts.Diagnostics.The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files }, + { + name: "noStrictGenericChecks", + type: "boolean", + category: ts.Diagnostics.Advanced_Options, + description: ts.Diagnostics.Disable_strict_checking_of_generic_signatures_in_function_types, + }, { // A list of plugins to load in the language service name: "plugins", @@ -72544,6 +72647,10 @@ var ts; else if (isNamespaceReference(node)) { return 4 /* Namespace */; } + else if (ts.isTypeParameterDeclaration(node.parent)) { + ts.Debug.assert(ts.isJSDocTemplateTag(node.parent.parent)); // Else would be handled by isDeclarationName + return 2 /* Type */; + } else { return 1 /* Value */; } @@ -73102,7 +73209,7 @@ var ts; } } ts.findNextToken = findNextToken; - function findPrecedingToken(position, sourceFile, startNode) { + function findPrecedingToken(position, sourceFile, startNode, includeJsDoc) { return find(startNode || sourceFile); function findRightmostToken(n) { if (ts.isToken(n)) { @@ -73128,7 +73235,7 @@ var ts; // NOTE: JsxText is a weird kind of node that can contain only whitespaces (since they are not counted as trivia). // if this is the case - then we should assume that token in question is located in previous child. if (position < child.end && (nodeHasTokens(child) || child.kind === 10 /* JsxText */)) { - var start = child.getStart(sourceFile); + var start = (includeJsDoc && child.jsDoc ? child.jsDoc[0] : child).getStart(sourceFile); var lookInPreviousChild = (start >= position) || (child.kind === 10 /* JsxText */ && start === child.end); // whitespace only JsxText if (lookInPreviousChild) { @@ -73142,7 +73249,7 @@ var ts; } } } - ts.Debug.assert(startNode !== undefined || n.kind === 265 /* SourceFile */); + ts.Debug.assert(startNode !== undefined || n.kind === 265 /* SourceFile */ || ts.isJSDocCommentContainingNode(n)); // Here we know that none of child token nodes embrace the position, // the only known case is when position is at the end of the file. // Try to find the rightmost token in the file without filtering. @@ -74376,8 +74483,8 @@ var ts; if (tag.pos !== pos) { pushCommentRange(pos, tag.pos - pos); } - pushClassification(tag.atToken.pos, tag.atToken.end - tag.atToken.pos, 10 /* punctuation */); - pushClassification(tag.tagName.pos, tag.tagName.end - tag.tagName.pos, 18 /* docCommentTagName */); + pushClassification(tag.atToken.pos, tag.atToken.end - tag.atToken.pos, 10 /* punctuation */); // "@" + pushClassification(tag.tagName.pos, tag.tagName.end - tag.tagName.pos, 18 /* docCommentTagName */); // e.g. "param" pos = tag.tagName.end; switch (tag.kind) { case 287 /* JSDocParameterTag */: @@ -74453,7 +74560,7 @@ var ts; * False will mean that node is not classified and traverse routine should recurse into node contents. */ function tryClassifyNode(node) { - if (ts.isJSDocNode(node)) { + if (ts.isJSDoc(node)) { return true; } if (ts.nodeIsMissing(node)) { @@ -75472,7 +75579,7 @@ var ts; } } start = ts.timestamp(); - var previousToken = ts.findPrecedingToken(position, sourceFile); + var previousToken = ts.findPrecedingToken(position, sourceFile, /*startNode*/ undefined, /*includeJsDoc*/ true); log("getCompletionData: Get previous token 1: " + (ts.timestamp() - start)); // The decision to provide completion depends on the contextToken, which is determined through the previousToken. // Note: 'previousToken' (and thus 'contextToken') can be undefined if we are the beginning of the file @@ -75481,7 +75588,7 @@ var ts; // Skip this partial identifier and adjust the contextToken to the token that precedes it. if (contextToken && position <= contextToken.end && ts.isWord(contextToken.kind)) { var start_2 = ts.timestamp(); - contextToken = ts.findPrecedingToken(contextToken.getFullStart(), sourceFile); + contextToken = ts.findPrecedingToken(contextToken.getFullStart(), sourceFile, /*startNode*/ undefined, /*includeJsDoc*/ true); log("getCompletionData: Get previous token 2: " + (ts.timestamp() - start_2)); } // Find the node where completion is requested on. @@ -75835,41 +75942,36 @@ var ts; typeMembers = typeChecker.getAllPossiblePropertiesOfType(typeForObject); existingMembers = objectLikeContainer.properties; } - else if (objectLikeContainer.kind === 174 /* ObjectBindingPattern */) { + else { + ts.Debug.assert(objectLikeContainer.kind === 174 /* ObjectBindingPattern */); // We are *only* completing on properties from the type being destructured. isNewIdentifierLocation = false; var rootDeclaration = ts.getRootDeclaration(objectLikeContainer.parent); - if (ts.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 - // through type declaration or inference. - // Also proceed if rootDeclaration is a parameter and if its containing function expression/arrow function is contextually typed - - // type of parameter will flow in from the contextual type of the function - var canGetType = !!(rootDeclaration.initializer || rootDeclaration.type); - if (!canGetType && rootDeclaration.kind === 146 /* Parameter */) { - if (ts.isExpression(rootDeclaration.parent)) { - canGetType = !!typeChecker.getContextualType(rootDeclaration.parent); - } - else if (rootDeclaration.parent.kind === 151 /* MethodDeclaration */ || rootDeclaration.parent.kind === 154 /* SetAccessor */) { - canGetType = ts.isExpression(rootDeclaration.parent.parent) && !!typeChecker.getContextualType(rootDeclaration.parent.parent); - } + if (!ts.isVariableLike(rootDeclaration)) + throw ts.Debug.fail("Root declaration is not variable-like."); + // We don't want to complete using the type acquired by the shape + // of the binding pattern; we are only interested in types acquired + // through type declaration or inference. + // Also proceed if rootDeclaration is a parameter and if its containing function expression/arrow function is contextually typed - + // type of parameter will flow in from the contextual type of the function + var canGetType = rootDeclaration.initializer || rootDeclaration.type || rootDeclaration.parent.parent.kind === 216 /* ForOfStatement */; + if (!canGetType && rootDeclaration.kind === 146 /* Parameter */) { + if (ts.isExpression(rootDeclaration.parent)) { + canGetType = !!typeChecker.getContextualType(rootDeclaration.parent); } - if (canGetType) { - var typeForObject = typeChecker.getTypeAtLocation(objectLikeContainer); - if (!typeForObject) - return false; - // In a binding pattern, get only known properties. Everywhere else we will get all possible properties. - typeMembers = typeChecker.getPropertiesOfType(typeForObject); - existingMembers = objectLikeContainer.elements; + else if (rootDeclaration.parent.kind === 151 /* MethodDeclaration */ || rootDeclaration.parent.kind === 154 /* SetAccessor */) { + canGetType = ts.isExpression(rootDeclaration.parent.parent) && !!typeChecker.getContextualType(rootDeclaration.parent.parent); } } - else { - ts.Debug.fail("Root declaration is not variable-like."); + if (canGetType) { + var typeForObject = typeChecker.getTypeAtLocation(objectLikeContainer); + if (!typeForObject) + return false; + // In a binding pattern, get only known properties. Everywhere else we will get all possible properties. + typeMembers = typeChecker.getPropertiesOfType(typeForObject); + existingMembers = objectLikeContainer.elements; } } - else { - ts.Debug.fail("Expected object literal or binding pattern, got " + objectLikeContainer.kind); - } if (typeMembers && typeMembers.length > 0) { // Add filtered items to the completion list symbols = filterObjectMembersList(typeMembers, existingMembers); @@ -75968,7 +76070,7 @@ var ts; case 17 /* OpenBraceToken */: // const x = { | case 26 /* CommaToken */:// const x = { a: 0, | var parent = contextToken.parent; - if (parent && (parent.kind === 178 /* ObjectLiteralExpression */ || parent.kind === 174 /* ObjectBindingPattern */)) { + if (ts.isObjectLiteralExpression(parent) || ts.isObjectBindingPattern(parent)) { return parent; } break; @@ -76464,15 +76566,24 @@ var ts; (function (DocumentHighlights) { function getDocumentHighlights(program, cancellationToken, sourceFile, position, sourceFilesToSearch) { var node = ts.getTouchingWord(sourceFile, position, /*includeJsDocComment*/ true); - return node && (getSemanticDocumentHighlights(node, program, cancellationToken, sourceFilesToSearch) || getSyntacticDocumentHighlights(node, sourceFile)); + if (!node) + return undefined; + if (ts.isJsxOpeningElement(node.parent) && node.parent.tagName === node || ts.isJsxClosingElement(node.parent)) { + // For a JSX element, just highlight the matching tag, not all references. + var _a = node.parent.parent, openingElement = _a.openingElement, closingElement = _a.closingElement; + var highlightSpans = [openingElement, closingElement].map(function (_a) { + var tagName = _a.tagName; + return getHighlightSpanForNode(tagName, sourceFile); + }); + return [{ fileName: sourceFile.fileName, highlightSpans: highlightSpans }]; + } + return getSemanticDocumentHighlights(node, program, cancellationToken, sourceFilesToSearch) || getSyntacticDocumentHighlights(node, sourceFile); } DocumentHighlights.getDocumentHighlights = getDocumentHighlights; function getHighlightSpanForNode(node, sourceFile) { - var start = node.getStart(sourceFile); - var end = node.getEnd(); return { fileName: sourceFile.fileName, - textSpan: ts.createTextSpanFromBounds(start, end), + textSpan: ts.createTextSpanFromNode(node, sourceFile), kind: "none" /* none */ }; } @@ -78231,11 +78342,8 @@ var ts; // So we must search the whole source file. (Because we will mark the source file as seen, we we won't return to it when searching for imports.) return parent ? scope.getSourceFile() : scope; } - function getPossibleSymbolReferencePositions(sourceFile, symbolName, container, fullStart) { + function getPossibleSymbolReferencePositions(sourceFile, symbolName, container) { if (container === void 0) { container = sourceFile; } - if (fullStart === void 0) { fullStart = false; } - var start = fullStart ? container.getFullStart() : container.getStart(sourceFile); - var end = container.getEnd(); var positions = []; /// TODO: Cache symbol existence for files to save text search // Also, need to make this work for unicode escapes. @@ -78246,10 +78354,10 @@ var ts; var text = sourceFile.text; var sourceLength = text.length; var symbolNameLength = symbolName.length; - var position = text.indexOf(symbolName, start); + var position = text.indexOf(symbolName, container.pos); while (position >= 0) { // If we are past the end, stop looking - if (position > end) + if (position > container.end) break; // 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). @@ -78302,8 +78410,7 @@ var ts; return references.length ? [{ definition: { type: "keyword", node: references[0].node }, references: references }] : undefined; } function addReferencesForKeywordInFile(sourceFile, kind, searchText, references) { - // Want fullStart so we can find the symbol in JSDoc comments - var possiblePositions = getPossibleSymbolReferencePositions(sourceFile, searchText, sourceFile, /*fullStart*/ true); + var possiblePositions = getPossibleSymbolReferencePositions(sourceFile, searchText, sourceFile); for (var _i = 0, possiblePositions_2 = possiblePositions; _i < possiblePositions_2.length; _i++) { var position = possiblePositions_2[_i]; var referenceLocation = ts.getTouchingPropertyName(sourceFile, position, /*includeJsDocComment*/ true); @@ -78325,8 +78432,7 @@ var ts; if (!state.markSearchedSymbol(sourceFile, search.symbol)) { return; } - var fullStart = state.options.findInComments || container.jsDoc !== undefined || ts.forEach(search.symbol.declarations, function (d) { return d.kind === 291 /* JSDocTypedefTag */; }); - for (var _i = 0, _a = getPossibleSymbolReferencePositions(sourceFile, search.text, container, fullStart); _i < _a.length; _i++) { + for (var _i = 0, _a = getPossibleSymbolReferencePositions(sourceFile, search.text, container); _i < _a.length; _i++) { var position = _a[_i]; getReferencesAtLocation(sourceFile, position, search, state); } @@ -79959,7 +80065,7 @@ var ts; var rawItems = []; var _loop_4 = function (sourceFile) { cancellationToken.throwIfCancellationRequested(); - if (excludeDtsFiles && ts.fileExtensionIs(sourceFile.fileName, ".d.ts")) { + if (excludeDtsFiles && ts.fileExtensionIs(sourceFile.fileName, ".d.ts" /* Dts */)) { return "continue"; } ts.forEachEntry(sourceFile.getNamedDeclarations(), function (declarations, name) { @@ -88125,7 +88231,7 @@ var ts; /* @internal */ var ruleProvider; function createNode(kind, pos, end, parent) { - var node = kind >= 143 /* FirstNode */ ? new NodeObject(kind, pos, end) : + var node = ts.isNodeKind(kind) ? new NodeObject(kind, pos, end) : kind === 71 /* Identifier */ ? new IdentifierObject(71 /* Identifier */, pos, end) : new TokenObject(kind, pos, end); node.parent = parent; @@ -88170,10 +88276,10 @@ var ts; } return sourceFile.text.substring(this.getStart(sourceFile), this.getEnd()); }; - NodeObject.prototype.addSyntheticNodes = function (nodes, pos, end, useJSDocScanner) { + NodeObject.prototype.addSyntheticNodes = function (nodes, pos, end) { ts.scanner.setTextPos(pos); while (pos < end) { - var token = useJSDocScanner ? ts.scanner.scanJSDocToken() : ts.scanner.scan(); + var token = ts.scanner.scan(); ts.Debug.assert(token !== 1 /* EndOfFileToken */); // Else it would infinitely loop var textPos = ts.scanner.getTextPos(); if (textPos <= end) { @@ -88202,55 +88308,49 @@ var ts; }; NodeObject.prototype.createChildren = function (sourceFile) { var _this = this; - if (this.kind === 283 /* JSDocComment */ || ts.isJSDocTag(this)) { + if (!ts.isNodeKind(this.kind)) { + this._children = ts.emptyArray; + return; + } + if (ts.isJSDocCommentContainingNode(this)) { /** Don't add trivia for "tokens" since this is in a comment. */ var children_3 = []; this.forEachChild(function (child) { children_3.push(child); }); this._children = children_3; + return; } - else if (this.kind >= 143 /* FirstNode */) { - var children_4 = []; - ts.scanner.setText((sourceFile || this.getSourceFile()).text); - var pos_3 = this.pos; - var useJSDocScanner_1 = ts.isJSDocNode(this); - var processNode = function (node) { - var isJSDocTagNode = ts.isJSDocNode(node); - if (!isJSDocTagNode && pos_3 < node.pos) { - pos_3 = _this.addSyntheticNodes(children_4, pos_3, node.pos, useJSDocScanner_1); - } - children_4.push(node); - if (!isJSDocTagNode) { - pos_3 = node.end; - } - }; - var processNodes = function (nodes) { - if (pos_3 < nodes.pos) { - pos_3 = _this.addSyntheticNodes(children_4, pos_3, nodes.pos, useJSDocScanner_1); - } - children_4.push(_this.createSyntaxList(nodes)); - pos_3 = nodes.end; - }; - // jsDocComments need to be the first children - if (this.jsDoc) { - for (var _i = 0, _a = this.jsDoc; _i < _a.length; _i++) { - var jsDocComment = _a[_i]; - processNode(jsDocComment); - } + var children = []; + ts.scanner.setText((sourceFile || this.getSourceFile()).text); + var pos = this.pos; + var processNode = function (node) { + pos = _this.addSyntheticNodes(children, pos, node.pos); + children.push(node); + pos = node.end; + }; + var processNodes = function (nodes) { + if (pos < nodes.pos) { + pos = _this.addSyntheticNodes(children, pos, nodes.pos); } - // For syntactic classifications, all trivia are classcified together, including jsdoc comments. - // For that to work, the jsdoc comments should still be the leading trivia of the first child. - // Restoring the scanner position ensures that. - pos_3 = this.pos; - ts.forEachChild(this, processNode, processNodes); - if (pos_3 < this.end) { - this.addSyntheticNodes(children_4, pos_3, this.end); + children.push(_this.createSyntaxList(nodes)); + pos = nodes.end; + }; + // jsDocComments need to be the first children + if (this.jsDoc) { + for (var _i = 0, _a = this.jsDoc; _i < _a.length; _i++) { + var jsDocComment = _a[_i]; + processNode(jsDocComment); } - ts.scanner.setText(undefined); - this._children = children_4; } - else { - this._children = ts.emptyArray; + // For syntactic classifications, all trivia are classcified together, including jsdoc comments. + // For that to work, the jsdoc comments should still be the leading trivia of the first child. + // Restoring the scanner position ensures that. + pos = this.pos; + ts.forEachChild(this, processNode, processNodes); + if (pos < this.end) { + this.addSyntheticNodes(children, pos, this.end); } + ts.scanner.setText(undefined); + this._children = children; }; NodeObject.prototype.getChildCount = function (sourceFile) { if (!this._children) @@ -91109,7 +91209,7 @@ var ts; var compilerOptions = JSON.parse(compilerOptionsJson); var result = ts.resolveModuleName(moduleName, ts.normalizeSlashes(fileName), compilerOptions, _this.host); var resolvedFileName = result.resolvedModule ? result.resolvedModule.resolvedFileName : undefined; - if (result.resolvedModule && result.resolvedModule.extension !== ts.Extension.Ts && result.resolvedModule.extension !== ts.Extension.Tsx && result.resolvedModule.extension !== ts.Extension.Dts) { + if (result.resolvedModule && result.resolvedModule.extension !== ".ts" /* Ts */ && result.resolvedModule.extension !== ".tsx" /* Tsx */ && result.resolvedModule.extension !== ".d.ts" /* Dts */) { resolvedFileName = undefined; } return { diff --git a/lib/typingsInstaller.js b/lib/typingsInstaller.js index 519a2d59562..415649d053f 100644 --- a/lib/typingsInstaller.js +++ b/lib/typingsInstaller.js @@ -90,15 +90,6 @@ var ts; ModuleKind[ModuleKind["ES2015"] = 5] = "ES2015"; ModuleKind[ModuleKind["ESNext"] = 6] = "ESNext"; })(ModuleKind = ts.ModuleKind || (ts.ModuleKind = {})); - var Extension; - (function (Extension) { - Extension[Extension["Ts"] = 0] = "Ts"; - Extension[Extension["Tsx"] = 1] = "Tsx"; - Extension[Extension["Dts"] = 2] = "Dts"; - Extension[Extension["Js"] = 3] = "Js"; - Extension[Extension["Jsx"] = 4] = "Jsx"; - Extension[Extension["LastTypeScriptExtension"] = 2] = "LastTypeScriptExtension"; - })(Extension = ts.Extension || (ts.Extension = {})); })(ts || (ts = {})); var ts; (function (ts) { @@ -161,7 +152,7 @@ var ts; })(ts || (ts = {})); var ts; (function (ts) { - ts.version = "2.4.0"; + ts.version = "2.4.1"; })(ts || (ts = {})); (function (ts) { ts.collator = typeof Intl === "object" && typeof Intl.Collator === "function" ? new Intl.Collator(undefined, { usage: "sort", sensitivity: "accent" }) : undefined; @@ -2142,7 +2133,7 @@ var ts; } ts.positionIsSynthesized = positionIsSynthesized; function extensionIsTypeScript(ext) { - return ext <= ts.Extension.LastTypeScriptExtension; + return ext === ".ts" || ext === ".tsx" || ext === ".d.ts"; } ts.extensionIsTypeScript = extensionIsTypeScript; function extensionFromPath(path) { @@ -2154,21 +2145,7 @@ var ts; } ts.extensionFromPath = extensionFromPath; function tryGetExtensionFromPath(path) { - if (fileExtensionIs(path, ".d.ts")) { - return ts.Extension.Dts; - } - if (fileExtensionIs(path, ".ts")) { - return ts.Extension.Ts; - } - if (fileExtensionIs(path, ".tsx")) { - return ts.Extension.Tsx; - } - if (fileExtensionIs(path, ".js")) { - return ts.Extension.Js; - } - if (fileExtensionIs(path, ".jsx")) { - return ts.Extension.Jsx; - } + return find(ts.supportedTypescriptExtensionsForExtractExtension, function (e) { return fileExtensionIs(path, e); }) || find(ts.supportedJavascriptExtensions, function (e) { return fileExtensionIs(path, e); }); } ts.tryGetExtensionFromPath = tryGetExtensionFromPath; function isCheckJsEnabledForFile(sourceFile, compilerOptions) { @@ -3368,6 +3345,7 @@ var ts; Scoped_package_detected_looking_in_0: { code: 6182, category: ts.DiagnosticCategory.Message, key: "Scoped_package_detected_looking_in_0_6182", message: "Scoped package detected, looking in '{0}'" }, Reusing_resolution_of_module_0_to_file_1_from_old_program: { code: 6183, category: ts.DiagnosticCategory.Message, key: "Reusing_resolution_of_module_0_to_file_1_from_old_program_6183", message: "Reusing resolution of module '{0}' to file '{1}' from old program." }, Reusing_module_resolutions_originating_in_0_since_resolutions_are_unchanged_from_old_program: { code: 6184, category: ts.DiagnosticCategory.Message, key: "Reusing_module_resolutions_originating_in_0_since_resolutions_are_unchanged_from_old_program_6184", message: "Reusing module resolutions originating in '{0}' since resolutions are unchanged from old program." }, + Disable_strict_checking_of_generic_signatures_in_function_types: { code: 6185, category: ts.DiagnosticCategory.Message, key: "Disable_strict_checking_of_generic_signatures_in_function_types_6185", message: "Disable strict checking of generic signatures in function types." }, Variable_0_implicitly_has_an_1_type: { code: 7005, category: ts.DiagnosticCategory.Error, key: "Variable_0_implicitly_has_an_1_type_7005", message: "Variable '{0}' implicitly has an '{1}' type." }, Parameter_0_implicitly_has_an_1_type: { code: 7006, category: ts.DiagnosticCategory.Error, key: "Parameter_0_implicitly_has_an_1_type_7006", message: "Parameter '{0}' implicitly has an '{1}' type." }, Member_0_implicitly_has_an_1_type: { code: 7008, category: ts.DiagnosticCategory.Error, key: "Member_0_implicitly_has_an_1_type_7008", message: "Member '{0}' implicitly has an '{1}' type." }, @@ -5639,6 +5617,12 @@ var ts; category: ts.Diagnostics.Advanced_Options, description: ts.Diagnostics.The_maximum_dependency_depth_to_search_under_node_modules_and_load_JavaScript_files }, + { + name: "noStrictGenericChecks", + type: "boolean", + category: ts.Diagnostics.Advanced_Options, + description: ts.Diagnostics.Disable_strict_checking_of_generic_signatures_in_function_types, + }, { name: "plugins", type: "list", @@ -7189,14 +7173,14 @@ var ts; } switch (extensions) { case Extensions.DtsOnly: - return tryExtension(".d.ts", ts.Extension.Dts); + return tryExtension(".d.ts"); case Extensions.TypeScript: - return tryExtension(".ts", ts.Extension.Ts) || tryExtension(".tsx", ts.Extension.Tsx) || tryExtension(".d.ts", ts.Extension.Dts); + return tryExtension(".ts") || tryExtension(".tsx") || tryExtension(".d.ts"); case Extensions.JavaScript: - return tryExtension(".js", ts.Extension.Js) || tryExtension(".jsx", ts.Extension.Jsx); + return tryExtension(".js") || tryExtension(".jsx"); } - function tryExtension(ext, extension) { - var path = tryFile(candidate + ext, failedLookupLocations, onlyRecordFailures, state); + function tryExtension(extension) { + var path = tryFile(candidate + extension, failedLookupLocations, onlyRecordFailures, state); return path && { path: path, extension: extension }; } } @@ -7266,11 +7250,11 @@ var ts; function extensionIsOk(extensions, extension) { switch (extensions) { case Extensions.JavaScript: - return extension === ts.Extension.Js || extension === ts.Extension.Jsx; + return extension === ".js" || extension === ".jsx"; case Extensions.TypeScript: - return extension === ts.Extension.Ts || extension === ts.Extension.Tsx || extension === ts.Extension.Dts; + return extension === ".ts" || extension === ".tsx" || extension === ".d.ts"; case Extensions.DtsOnly: - return extension === ts.Extension.Dts; + return extension === ".d.ts"; } } function pathToPackageJson(directory) {