diff --git a/.gitignore b/.gitignore index 8e2c10d7b3..57e8804d7c 100644 --- a/.gitignore +++ b/.gitignore @@ -43,3 +43,4 @@ scripts/word2md.js scripts/ior.js scripts/*.js.map coverage/ +internal/ diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index a4509599e3..b531090b16 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -3408,9 +3408,9 @@ module ts { // TYPE CHECKING - var subtypeRelation: Map = {}; - var assignableRelation: Map = {}; - var identityRelation: Map = {}; + var subtypeRelation: Map = {}; + var assignableRelation: Map = {}; + var identityRelation: Map = {}; function isTypeIdenticalTo(source: Type, target: Type): boolean { return checkTypeRelatedTo(source, target, identityRelation, /*errorNode*/ undefined); @@ -3445,7 +3445,7 @@ module ts { function checkTypeRelatedTo( source: Type, target: Type, - relation: Map, + relation: Map, errorNode: Node, headMessage?: DiagnosticMessage, containingMessageChain?: DiagnosticMessageChain): boolean { @@ -3453,7 +3453,7 @@ module ts { var errorInfo: DiagnosticMessageChain; var sourceStack: ObjectType[]; var targetStack: ObjectType[]; - var maybeStack: Map[]; + var maybeStack: Map[]; var expandingFlags: number; var depth = 0; var overflow = false; @@ -3465,6 +3465,14 @@ module ts { error(errorNode, Diagnostics.Excessive_stack_depth_comparing_types_0_and_1, typeToString(source), typeToString(target)); } else if (errorInfo) { + // If we already computed this relation, but in a context where we didn't want to report errors (e.g. overload resolution), + // then we'll only have a top-level error (e.g. 'Class X does not implement interface Y') without any details. If this happened, + // request a recompuation to get a complete error message. This will be skipped if we've already done this computation in a context + // where errors were being reported. + if (errorInfo.next === undefined) { + errorInfo = undefined; + isRelatedTo(source, target, errorNode !== undefined, headMessage, /* elaborateErrors */ true); + } if (containingMessageChain) { errorInfo = concatenateDiagnosticMessageChains(containingMessageChain, errorInfo); } @@ -3480,7 +3488,7 @@ module ts { // Ternary.True if they are related with no assumptions, // Ternary.Maybe if they are related with assumptions of other relationships, or // Ternary.False if they are not related. - function isRelatedTo(source: Type, target: Type, reportErrors?: boolean, headMessage?: DiagnosticMessage): Ternary { + function isRelatedTo(source: Type, target: Type, reportErrors?: boolean, headMessage?: DiagnosticMessage, elaborateErrors = false): Ternary { var result: Ternary; // both types are the same - covers 'they are the same primitive type or both are Any' or the same type parameter cases if (source === target) return Ternary.True; @@ -3547,7 +3555,7 @@ module ts { // identity relation does not use apparent type var sourceOrApparentType = relation === identityRelation ? source : getApparentType(source); if (sourceOrApparentType.flags & TypeFlags.ObjectType && target.flags & TypeFlags.ObjectType && - (result = objectTypeRelatedTo(sourceOrApparentType, target, reportStructuralErrors))) { + (result = objectTypeRelatedTo(sourceOrApparentType, target, reportStructuralErrors, elaborateErrors))) { errorInfo = saveErrorInfo; return result; } @@ -3638,14 +3646,19 @@ module ts { // Third, check if both types are part of deeply nested chains of generic type instantiations and if so assume the types are // equal and infinitely expanding. Fourth, if we have reached a depth of 100 nested comparisons, assume we have runaway recursion // and issue an error. Otherwise, actually compare the structure of the two types. - function objectTypeRelatedTo(source: ObjectType, target: ObjectType, reportErrors: boolean): Ternary { + function objectTypeRelatedTo(source: ObjectType, target: ObjectType, reportErrors: boolean, elaborateErrors = false): Ternary { if (overflow) { return Ternary.False; } var id = relation !== identityRelation || source.id < target.id ? source.id + "," + target.id : target.id + "," + source.id; var related = relation[id]; + //var related: RelationComparisonResult = undefined; // relation[id]; if (related !== undefined) { - return related ? Ternary.True : Ternary.False; + // If we computed this relation already and it was failed and reported, or if we're not being asked to elaborate + // errors, we can use the cached value. Otherwise, recompute the relation + if (!elaborateErrors || (related === RelationComparisonResult.FailedAndReported)) { + return related === RelationComparisonResult.Succeeded ? Ternary.True : Ternary.False; + } } if (depth > 0) { for (var i = 0; i < depth; i++) { @@ -3668,7 +3681,7 @@ module ts { sourceStack[depth] = source; targetStack[depth] = target; maybeStack[depth] = {}; - maybeStack[depth][id] = true; + maybeStack[depth][id] = RelationComparisonResult.Succeeded; depth++; var saveExpandingFlags = expandingFlags; if (!(expandingFlags & 1) && isDeeplyNestedGeneric(source, sourceStack)) expandingFlags |= 1; @@ -3696,13 +3709,13 @@ module ts { if (result) { var maybeCache = maybeStack[depth]; // If result is definitely true, copy assumptions to global cache, else copy to next level up - var destinationCache = result === Ternary.True || depth === 0 ? relation : maybeStack[depth - 1]; - copyMap(/*source*/maybeCache, /*target*/destinationCache); + var destinationCache = (result === Ternary.True || depth === 0) ? relation : maybeStack[depth - 1]; + copyMap(maybeCache, destinationCache); } else { // A false result goes straight into global cache (when something is false under assumptions it // will also be false without assumptions) - relation[id] = false; + relation[id] = reportErrors ? RelationComparisonResult.FailedAndReported : RelationComparisonResult.Failed; } return result; } @@ -5966,7 +5979,7 @@ module ts { return typeArgumentsAreAssignable; } - function checkApplicableSignature(node: CallLikeExpression, args: Node[], signature: Signature, relation: Map, excludeArgument: boolean[], reportErrors: boolean) { + function checkApplicableSignature(node: CallLikeExpression, args: Node[], signature: Signature, relation: Map, excludeArgument: boolean[], reportErrors: boolean) { for (var i = 0; i < args.length; i++) { var arg = args[i]; var argType: Type; @@ -6026,11 +6039,41 @@ module ts { return args; } + /** + * In a 'super' call, type arguments are not provided within the CallExpression node itself. + * Instead, they must be fetched from the class declaration's base type node. + * + * If 'node' is a 'super' call (e.g. super(...), new super(...)), then we attempt to fetch + * the type arguments off the containing class's first heritage clause (if one exists). Note that if + * type arguments are supplied on the 'super' call, they are ignored (though this is syntactically incorrect). + * + * In all other cases, the call's explicit type arguments are returned. + */ + function getEffectiveTypeArguments(callExpression: CallExpression): TypeNode[] { + if (callExpression.expression.kind === SyntaxKind.SuperKeyword) { + var containingClass = getAncestor(callExpression, SyntaxKind.ClassDeclaration); + var baseClassTypeNode = containingClass && getClassBaseTypeNode(containingClass); + return baseClassTypeNode && baseClassTypeNode.typeArguments; + } + else { + // Ordinary case - simple function invocation. + return callExpression.typeArguments; + } + } + function resolveCall(node: CallLikeExpression, signatures: Signature[], candidatesOutArray: Signature[]): Signature { var isTaggedTemplate = node.kind === SyntaxKind.TaggedTemplateExpression; - var typeArguments = isTaggedTemplate ? undefined : (node).typeArguments; - forEach(typeArguments, checkSourceElement); + var typeArguments: TypeNode[]; + + if (!isTaggedTemplate) { + typeArguments = getEffectiveTypeArguments(node); + + // We already perform checking on the type arguments on the class declaration itself. + if ((node).expression.kind !== SyntaxKind.SuperKeyword) { + forEach(typeArguments, checkSourceElement); + } + } var candidates = candidatesOutArray || []; // collectCandidates fills up the candidates array directly @@ -6160,7 +6203,7 @@ module ts { return resolveErrorCall(node); - function chooseOverload(candidates: Signature[], relation: Map) { + function chooseOverload(candidates: Signature[], relation: Map) { for (var i = 0; i < candidates.length; i++) { if (!hasCorrectArity(node, args, candidates[i])) { continue; @@ -6296,7 +6339,7 @@ module ts { // Another error has already been reported return resolveErrorCall(node); } - + // Technically, this signatures list may be incomplete. We are taking the apparent type, // but we are not including call signatures that may have been added to the Object or // Function interface, since they have none by default. This is a bit of a leap of faith diff --git a/src/compiler/emitter.ts b/src/compiler/emitter.ts index 92051f4edb..e57e367544 100644 --- a/src/compiler/emitter.ts +++ b/src/compiler/emitter.ts @@ -2427,28 +2427,20 @@ module ts { } function emitMethod(node: MethodDeclaration) { - if (!isObjectLiteralMethod(node)) { - return; - } - emitLeadingComments(node); emit(node.name); if (languageVersion < ScriptTarget.ES6) { write(": function "); } emitSignatureAndBody(node); - emitTrailingComments(node); } function emitPropertyAssignment(node: PropertyDeclaration) { - emitLeadingComments(node); emit(node.name); write(": "); emit(node.initializer); - emitTrailingComments(node); } function emitShorthandPropertyAssignment(node: ShorthandPropertyAssignment) { - emitLeadingComments(node); emit(node.name); // If short-hand property has a prefix, then regardless of the target version, we will emit it as normal property assignment. For example: // module m { @@ -2465,7 +2457,6 @@ module ts { // Short-hand, { x }, is equivalent of normal form { x: x } emitExpressionIdentifier(node.name); } - emitTrailingComments(node); } function tryEmitConstantValue(node: PropertyAccessExpression | ElementAccessExpression): boolean { @@ -2685,14 +2676,11 @@ module ts { } function emitExpressionStatement(node: ExpressionStatement) { - emitLeadingComments(node); emitParenthesized(node.expression, /*parenthesized*/ node.expression.kind === SyntaxKind.ArrowFunction); write(";"); - emitTrailingComments(node); } function emitIfStatement(node: IfStatement) { - emitLeadingComments(node); var endPos = emitToken(SyntaxKind.IfKeyword, node.pos); write(" "); endPos = emitToken(SyntaxKind.OpenParenToken, endPos); @@ -2710,7 +2698,6 @@ module ts { emitEmbeddedStatement(node.elseStatement); } } - emitTrailingComments(node); } function emitDoStatement(node: DoStatement) { @@ -2798,11 +2785,9 @@ module ts { } function emitReturnStatement(node: ReturnStatement) { - emitLeadingComments(node); emitToken(SyntaxKind.ReturnKeyword, node.pos); emitOptional(" ", node.expression); write(";"); - emitTrailingComments(node); } function emitWithStatement(node: WhileStatement) { @@ -3126,7 +3111,6 @@ module ts { } function emitVariableDeclaration(node: VariableDeclaration) { - emitLeadingComments(node); if (isBindingPattern(node.name)) { if (languageVersion < ScriptTarget.ES6) { emitDestructuring(node); @@ -3140,11 +3124,9 @@ module ts { emitModuleMemberName(node); emitOptional(" = ", node.initializer); } - emitTrailingComments(node); } function emitVariableStatement(node: VariableStatement) { - emitLeadingComments(node); if (!(node.flags & NodeFlags.Export)) { if (isLet(node.declarationList)) { write("let "); @@ -3158,11 +3140,9 @@ module ts { } emitCommaList(node.declarationList.declarations); write(";"); - emitTrailingComments(node); } function emitParameter(node: ParameterDeclaration) { - emitLeadingComments(node); if (languageVersion < ScriptTarget.ES6) { if (isBindingPattern(node.name)) { var name = createTempVariable(node); @@ -3183,7 +3163,6 @@ module ts { emit(node.name); emitOptional(" = ", node.initializer); } - emitTrailingComments(node); } function emitDefaultValueAssignments(node: FunctionLikeDeclaration) { @@ -3256,11 +3235,9 @@ module ts { } function emitAccessor(node: AccessorDeclaration) { - emitLeadingComments(node); write(node.kind === SyntaxKind.GetAccessor ? "get " : "set "); emit(node.name); emitSignatureAndBody(node); - emitTrailingComments(node); } function shouldEmitAsArrowFunction(node: FunctionLikeDeclaration): boolean { @@ -3364,7 +3341,10 @@ module ts { write(" "); emitStart(node.body); write("return "); - emitNode(node.body); + + // Don't emit comments on this body. We'll have already taken care of it above + // when we called emitDetachedComments. + emitNode(node.body, /*disableComments:*/ true); emitEnd(node.body); write(";"); emitTempDeclarations(/*newLine*/ false); @@ -3381,7 +3361,7 @@ module ts { writeLine(); emitLeadingComments(node.body); write("return "); - emit(node.body); + emit(node.body, /*disableComments:*/ true); write(";"); emitTrailingComments(node.body); } @@ -3562,7 +3542,6 @@ module ts { } function emitClassDeclaration(node: ClassDeclaration) { - emitLeadingComments(node); write("var "); emit(node.name); write(" = (function ("); @@ -3612,7 +3591,6 @@ module ts { emitEnd(node); write(";"); } - emitTrailingComments(node); function emitConstructorOfClass() { var saveTempCount = tempCount; @@ -3691,13 +3669,17 @@ module ts { emitPinnedOrTripleSlashComments(node); } + function shouldEmitEnumDeclaration(node: EnumDeclaration) { + var isConstEnum = isConst(node); + return !isConstEnum || compilerOptions.preserveConstEnums; + } + function emitEnumDeclaration(node: EnumDeclaration) { // const enums are completely erased during compilation. - var isConstEnum = isConst(node); - if (isConstEnum && !compilerOptions.preserveConstEnums) { + if (!shouldEmitEnumDeclaration(node)) { return; } - emitLeadingComments(node); + if (!(node.flags & NodeFlags.Export)) { emitStart(node); write("var "); @@ -3714,7 +3696,7 @@ module ts { write(") {"); increaseIndent(); scopeEmitStart(node); - emitEnumMemberDeclarations(isConstEnum); + emitLines(node.members); decreaseIndent(); writeLine(); emitToken(SyntaxKind.CloseBraceToken, node.members.end); @@ -3735,32 +3717,27 @@ module ts { emitEnd(node); write(";"); } - emitTrailingComments(node); + } - function emitEnumMemberDeclarations(isConstEnum: boolean) { - forEach(node.members, member => { - writeLine(); - emitLeadingComments(member); - emitStart(member); - write(resolver.getLocalNameOfContainer(node)); - write("["); - write(resolver.getLocalNameOfContainer(node)); - write("["); - emitExpressionForPropertyName(member.name); - write("] = "); - if (member.initializer && !isConstEnum) { - emit(member.initializer); - } - else { - write(resolver.getEnumMemberValue(member).toString()); - } - write("] = "); - emitExpressionForPropertyName(member.name); - emitEnd(member); - write(";"); - emitTrailingComments(member); - }); + function emitEnumMember(node: EnumMember) { + var enumParent = node.parent; + emitStart(node); + write(resolver.getLocalNameOfContainer(enumParent)); + write("["); + write(resolver.getLocalNameOfContainer(enumParent)); + write("["); + emitExpressionForPropertyName(node.name); + write("] = "); + if (node.initializer && !isConst(enumParent)) { + emit(node.initializer); } + else { + write(resolver.getEnumMemberValue(node).toString()); + } + write("] = "); + emitExpressionForPropertyName(node.name); + emitEnd(node); + write(";"); } function getInnerMostModuleDeclarationFromDottedModule(moduleDeclaration: ModuleDeclaration): ModuleDeclaration { @@ -3770,14 +3747,18 @@ module ts { } } + function shouldEmitModuleDeclaration(node: ModuleDeclaration) { + return isInstantiatedModule(node, compilerOptions.preserveConstEnums); + } + function emitModuleDeclaration(node: ModuleDeclaration) { // Emit only if this module is non-ambient. - var shouldEmit = isInstantiatedModule(node, compilerOptions.preserveConstEnums); + var shouldEmit = shouldEmitModuleDeclaration(node); if (!shouldEmit) { return emitPinnedOrTripleSlashComments(node); } - emitLeadingComments(node); + emitStart(node); write("var "); emit(node.name); @@ -3822,7 +3803,6 @@ module ts { emitModuleMemberName(node); write(" = {}));"); emitEnd(node); - emitTrailingComments(node); } function emitImportDeclaration(node: ImportDeclaration) { @@ -4012,7 +3992,7 @@ module ts { emitLeadingComments(node.endOfFileToken); } - function emitNode(node: Node): void { + function emitNode(node: Node, disableComments?:boolean): void { if (!node) { return; } @@ -4020,6 +4000,46 @@ module ts { if (node.flags & NodeFlags.Ambient) { return emitPinnedOrTripleSlashComments(node); } + + var emitComments = !disableComments && shouldEmitLeadingAndTrailingComments(node); + if (emitComments) { + emitLeadingComments(node); + } + + emitJavaScriptWorker(node); + + if (emitComments) { + emitTrailingComments(node); + } + } + + function shouldEmitLeadingAndTrailingComments(node: Node) { + switch (node.kind) { + // All of these entities are emitted in a specialized fashion. As such, we allow + // the specilized methods for each to handle the comments on the nodes. + case SyntaxKind.InterfaceDeclaration: + case SyntaxKind.FunctionDeclaration: + case SyntaxKind.ImportDeclaration: + case SyntaxKind.TypeAliasDeclaration: + case SyntaxKind.ExportAssignment: + return false; + + case SyntaxKind.ModuleDeclaration: + // Only emit the leading/trailing comments for a module if we're actually + // emitting the module as well. + return shouldEmitModuleDeclaration(node); + + case SyntaxKind.EnumDeclaration: + // Only emit the leading/trailing comments for an enum if we're actually + // emitting the module as well. + return shouldEmitEnumDeclaration(node); + } + + // Emit comments for everything else. + return true; + } + + function emitJavaScriptWorker(node: Node) { // Check if the node can be emitted regardless of the ScriptTarget switch (node.kind) { case SyntaxKind.Identifier: @@ -4157,6 +4177,8 @@ module ts { return emitInterfaceDeclaration(node); case SyntaxKind.EnumDeclaration: return emitEnumDeclaration(node); + case SyntaxKind.EnumMember: + return emitEnumMember(node); case SyntaxKind.ModuleDeclaration: return emitModuleDeclaration(node); case SyntaxKind.ImportDeclaration: @@ -4186,17 +4208,19 @@ module ts { function getLeadingCommentsToEmit(node: Node) { // Emit the leading comments only if the parent's pos doesn't match because parent should take care of emitting these comments - if (node.parent.kind === SyntaxKind.SourceFile || node.pos !== node.parent.pos) { - var leadingComments: CommentRange[]; - if (hasDetachedComments(node.pos)) { - // get comments without detached comments - leadingComments = getLeadingCommentsWithoutDetachedComments(); + if (node.parent) { + if (node.parent.kind === SyntaxKind.SourceFile || node.pos !== node.parent.pos) { + var leadingComments: CommentRange[]; + if (hasDetachedComments(node.pos)) { + // get comments without detached comments + leadingComments = getLeadingCommentsWithoutDetachedComments(); + } + else { + // get the leading comments from the node + leadingComments = getLeadingCommentRangesOfNode(node, currentSourceFile); + } + return leadingComments; } - else { - // get the leading comments from the node - leadingComments = getLeadingCommentRangesOfNode(node, currentSourceFile); - } - return leadingComments; } } @@ -4209,10 +4233,12 @@ module ts { function emitTrailingDeclarationComments(node: Node) { // Emit the trailing comments only if the parent's end doesn't match - if (node.parent.kind === SyntaxKind.SourceFile || node.end !== node.parent.end) { - var trailingComments = getTrailingCommentRanges(currentSourceFile.text, node.end); - // trailing comments are emitted at space/*trailing comment1 */space/*trailing comment*/ - emitComments(currentSourceFile, writer, trailingComments, /*trailingSeparator*/ false, newLine, writeComment); + if (node.parent) { + if (node.parent.kind === SyntaxKind.SourceFile || node.end !== node.parent.end) { + var trailingComments = getTrailingCommentRanges(currentSourceFile.text, node.end); + // trailing comments are emitted at space/*trailing comment1 */space/*trailing comment*/ + emitComments(currentSourceFile, writer, trailingComments, /*trailingSeparator*/ false, newLine, writeComment); + } } } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 9b9b969bdf..2dd14d079a 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -332,6 +332,12 @@ module ts { HasAggregatedChildData = 1 << 6 } + export const enum RelationComparisonResult { + Succeeded = 1, // Should be truthy + Failed = 2, + FailedAndReported = 3 + } + export interface Node extends TextRange { kind: SyntaxKind; flags: NodeFlags; diff --git a/src/services/compiler/diagnostics.ts b/src/services/compiler/diagnostics.ts deleted file mode 100644 index 5114f83f9e..0000000000 --- a/src/services/compiler/diagnostics.ts +++ /dev/null @@ -1,27 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -/// - -module TypeScript { - export interface Logger { - log(s: string): void; - } - - export class NullLogger implements Logger { - public log(s: string): void { - } - } -} \ No newline at end of file diff --git a/src/services/compiler/emitter.ts b/src/services/compiler/emitter.ts deleted file mode 100644 index 8de5e64dbb..0000000000 --- a/src/services/compiler/emitter.ts +++ /dev/null @@ -1,3797 +0,0 @@ -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -/// - -module TypeScript { - export enum EmitContainer { - Prog, - Module, - DynamicModule, - Class, - Constructor, - Function, - Args, - Interface, - } - - export class EmitState { - public column: number; - public line: number; - public container: EmitContainer; - - constructor() { - this.column = 0; - this.line = 0; - this.container = EmitContainer.Prog; - } - } - - export class EmitOptions { - private _diagnostic: Diagnostic = null; - - private _settings: ImmutableCompilationSettings = null; - private _commonDirectoryPath = ""; - private _sharedOutputFile = ""; - private _sourceRootDirectory = ""; - private _sourceMapRootDirectory = ""; - private _outputDirectory = ""; - - public diagnostic(): Diagnostic { return this._diagnostic; } - - public commonDirectoryPath() { return this._commonDirectoryPath; } - public sharedOutputFile() { return this._sharedOutputFile; } - public sourceRootDirectory() { return this._sourceRootDirectory; } - public sourceMapRootDirectory() { return this._sourceMapRootDirectory; } - public outputDirectory() { return this._outputDirectory; } - - public compilationSettings() { return this._settings; } - - constructor(compiler: TypeScriptCompiler, public resolvePath: (path: string) => string) { - var settings = compiler.compilationSettings(); - this._settings = settings; - - // If the document is an external module, then report if the the user has not - // provided the right command line option. - if (settings.moduleGenTarget() === ModuleGenTarget.Unspecified) { - var fileNames = compiler.fileNames(); - for (var i = 0, n = fileNames.length; i < n; i++) { - var document = compiler.getDocument(fileNames[i]); - if (!document.isDeclareFile() && document.syntaxTree().isExternalModule()) { - var errorSpan = externalModuleIndicatorSpan(document.syntaxTree()); - this._diagnostic = new Diagnostic(document.fileName, document.lineMap(), errorSpan.start(), errorSpan.length(), - DiagnosticCode.Cannot_compile_external_modules_unless_the_module_flag_is_provided); - - return; - } - } - } - - if (!settings.mapSourceFiles()) { - // Error to specify --mapRoot or --sourceRoot without mapSourceFiles - if (settings.mapRoot()) { - if (settings.sourceRoot()) { - this._diagnostic = new Diagnostic(null, null, 0, 0, DiagnosticCode.Options_mapRoot_and_sourceRoot_cannot_be_specified_without_specifying_sourcemap_option, null); - return; - } - else { - this._diagnostic = new Diagnostic(null, null, 0, 0, DiagnosticCode.Option_mapRoot_cannot_be_specified_without_specifying_sourcemap_option, null); - return; - } - } - else if (settings.sourceRoot()) { - this._diagnostic = new Diagnostic(null, null, 0, 0, DiagnosticCode.Option_sourceRoot_cannot_be_specified_without_specifying_sourcemap_option, null); - return; - } - } - - this._sourceMapRootDirectory = convertToDirectoryPath(switchToForwardSlashes(settings.mapRoot())); - this._sourceRootDirectory = convertToDirectoryPath(switchToForwardSlashes(settings.sourceRoot())); - - if (settings.outFileOption() || - settings.outDirOption() || - settings.mapRoot() || - settings.sourceRoot()) { - - if (settings.outFileOption()) { - this._sharedOutputFile = switchToForwardSlashes(resolvePath(settings.outFileOption())); - } - - if (settings.outDirOption()) { - this._outputDirectory = convertToDirectoryPath(switchToForwardSlashes(resolvePath(settings.outDirOption()))); - } - - // Parse the directory structure - if (this._outputDirectory || this._sourceMapRootDirectory || this.sourceRootDirectory) { - this.determineCommonDirectoryPath(compiler); - } - } - } - - private determineCommonDirectoryPath(compiler: TypeScriptCompiler): void { - var commonComponents: string[] = []; - var commonComponentsLength = -1; - - var fileNames = compiler.fileNames(); - for (var i = 0, len = fileNames.length; i < len; i++) { - var fileName = fileNames[i]; - var document = compiler.getDocument(fileNames[i]); - var sourceUnit = document.sourceUnit(); - - if (!document.isDeclareFile()) { - var fileComponents = filePathComponents(fileName); - if (commonComponentsLength === -1) { - // First time at finding common path - // So common path = directory of file - commonComponents = fileComponents; - commonComponentsLength = commonComponents.length; - } - else { - var updatedPath = false; - for (var j = 0; j < commonComponentsLength && j < fileComponents.length; j++) { - if (commonComponents[j] !== fileComponents[j]) { - // The new components = 0 ... j -1 - commonComponentsLength = j; - updatedPath = true; - - if (j === 0) { - var isDynamicModuleCompilation = ArrayUtilities.any(fileNames, fileName => { - document = compiler.getDocument(fileName); - return !document.isDeclareFile() && document.syntaxTree().isExternalModule(); - }); - - if (this._outputDirectory || // there is --outDir specified - this._sourceRootDirectory || // there is --sourceRoot specified - (this._sourceMapRootDirectory && // there is --map Specified and there would be multiple js files generated - (!this._sharedOutputFile || isDynamicModuleCompilation))) { - // Its error to not have common path - this._diagnostic = new Diagnostic(null, null, 0, 0, DiagnosticCode.Cannot_find_the_common_subdirectory_path_for_the_input_files, null); - return; - } - - return; - } - - break; - } - } - - // If the fileComponent path completely matched and less than already found update the length - if (!updatedPath && fileComponents.length < commonComponentsLength) { - commonComponentsLength = fileComponents.length; - } - } - } - } - - this._commonDirectoryPath = commonComponents.slice(0, commonComponentsLength).join("/") + "/"; - } - } - - export class Indenter { - static indentStep: number = 4; - static indentStepString: string = " "; - static indentStrings: string[] = []; - public indentAmt: number = 0; - - public increaseIndent() { - this.indentAmt += Indenter.indentStep; - } - - public decreaseIndent() { - this.indentAmt -= Indenter.indentStep; - } - - public getIndent() { - var indentString = Indenter.indentStrings[this.indentAmt]; - if (indentString === undefined) { - indentString = ""; - for (var i = 0; i < this.indentAmt; i = i + Indenter.indentStep) { - indentString += Indenter.indentStepString; - } - Indenter.indentStrings[this.indentAmt] = indentString; - } - return indentString; - } - } - - export function lastParameterIsRest(parameters: ParameterSyntax[]): boolean { - return parameters.length > 0 && (parameters[parameters.length - 1]).dotDotDotToken !== null; - } - - export class Emitter { - public globalThisCapturePrologueEmitted = false; - public extendsPrologueEmitted = false; - public thisClassNode: ClassDeclarationSyntax = null; - public inArrowFunction: boolean = false; - public moduleName = ""; - public emitState = new EmitState(); - public indenter = new Indenter(); - public sourceMapper: SourceMapper = null; - public captureThisStmtString = "var _this = this;"; - private currentVariableDeclaration: VariableDeclarationSyntax; - private declStack: PullDecl[] = []; - private exportAssignment: ExportAssignmentSyntax = null; - private inWithBlock = false; - - public document: Document = null; - - // If we choose to detach comments from an element (for example, the Copyright comments), - // then keep track of that element so that we don't emit all on the comments on it when - // we visit it. - private detachedCommentsElement: ISyntaxElement = null; - - constructor(public emittingFileName: string, - public outfile: TextWriter, - public emitOptions: EmitOptions, - private semanticInfoChain: SemanticInfoChain) { - } - - private pushDecl(decl: PullDecl) { - if (decl) { - this.declStack[this.declStack.length] = decl; - } - } - - private popDecl(decl: PullDecl) { - if (decl) { - this.declStack.length--; - } - } - - private getEnclosingDecl() { - var declStackLen = this.declStack.length; - var enclosingDecl = declStackLen > 0 ? this.declStack[declStackLen - 1] : null; - return enclosingDecl; - } - - public setExportAssignment(exportAssignment: ExportAssignmentSyntax) { - this.exportAssignment = exportAssignment; - } - - public getExportAssignment() { - return this.exportAssignment; - } - - public setDocument(document: Document) { - this.document = document; - } - - public shouldEmitImportDeclaration(importDeclAST: ImportDeclarationSyntax) { - var isExternalModuleReference = importDeclAST.moduleReference.kind() === SyntaxKind.ExternalModuleReference; - var importDecl = this.semanticInfoChain.getDeclForAST(importDeclAST); - var isExported = hasFlag(importDecl.flags, PullElementFlags.Exported); - var isAmdCodeGen = this.emitOptions.compilationSettings().moduleGenTarget() === ModuleGenTarget.Asynchronous; - - // 1) Any internal reference needs to check if the emit can happen - // 2) External module reference with export modifier always needs to be emitted - // 3) commonjs needs the var declaration for the import declaration - if (isExternalModuleReference && !isExported && isAmdCodeGen) { - return false; - } - - var importSymbol = importDecl.getSymbol(this.semanticInfoChain); - if (importSymbol.isUsedAsValue()) { - return true; - } - - if (importDeclAST.moduleReference.kind() !== SyntaxKind.ExternalModuleReference) { - var canBeUsedExternally = isExported || importSymbol.typeUsedExternally() || importSymbol.isUsedInExportedAlias(); - if (!canBeUsedExternally && !this.document.syntaxTree().isExternalModule()) { - // top level import in non-external module are visible across the whole global module - canBeUsedExternally = hasFlag(importDecl.getParentDecl().kind, PullElementKind.Script | PullElementKind.DynamicModule); - } - - if (canBeUsedExternally) { - if (importSymbol.getExportAssignedValueSymbol()) { - return true; - } - - var containerSymbol = importSymbol.getExportAssignedContainerSymbol(); - if (containerSymbol && containerSymbol.getInstanceSymbol()) { - return true; - } - } - } - - return false; - } - - public emitImportDeclaration(importDeclAST: ImportDeclarationSyntax) { - var isExternalModuleReference = importDeclAST.moduleReference.kind() === SyntaxKind.ExternalModuleReference; - var importDecl = this.semanticInfoChain.getDeclForAST(importDeclAST); - var isExported = hasFlag(importDecl.flags, PullElementFlags.Exported); - var isAmdCodeGen = this.emitOptions.compilationSettings().moduleGenTarget() === ModuleGenTarget.Asynchronous; - - this.emitComments(importDeclAST, true); - - var importSymbol = importDecl.getSymbol(this.semanticInfoChain); - - var parentSymbol = importSymbol.getContainer(); - var parentKind = parentSymbol ? parentSymbol.kind : PullElementKind.None; - var associatedParentSymbol = parentSymbol ? parentSymbol.getAssociatedContainerType() : null; - var associatedParentSymbolKind = associatedParentSymbol ? associatedParentSymbol.kind : PullElementKind.None; - - var needsPropertyAssignment = false; - var usePropertyAssignmentInsteadOfVarDecl = false; - var moduleNamePrefix: string; - - if (isExported && - (parentKind === PullElementKind.Container || - parentKind === PullElementKind.DynamicModule || - associatedParentSymbolKind === PullElementKind.Container || - associatedParentSymbolKind === PullElementKind.DynamicModule)) { - if (importSymbol.getExportAssignedTypeSymbol() || importSymbol.getExportAssignedContainerSymbol()) { - // Type or container assignment that is exported - needsPropertyAssignment = true; - } - else { - var valueSymbol = importSymbol.getExportAssignedValueSymbol(); - if (valueSymbol && - (valueSymbol.kind === PullElementKind.Method || valueSymbol.kind === PullElementKind.Function)) { - needsPropertyAssignment = true; - } - else { - usePropertyAssignmentInsteadOfVarDecl = true; - } - } - - // Calculate what name prefix to use - if (this.emitState.container === EmitContainer.DynamicModule) { - moduleNamePrefix = "exports." - } - else { - moduleNamePrefix = this.moduleName + "."; - } - } - - if (isAmdCodeGen && isExternalModuleReference) { - // For amdCode gen of exported external module reference, do not emit var declaration - // Emit the property assignment since it is exported - needsPropertyAssignment = true; - } - else { - this.recordSourceMappingStart(importDeclAST); - if (usePropertyAssignmentInsteadOfVarDecl) { - this.writeToOutput(moduleNamePrefix); - } - else { - this.writeToOutput("var "); - } - this.writeToOutput(importDeclAST.identifier.text() + " = "); - var aliasAST = importDeclAST.moduleReference; - - if (isExternalModuleReference) { - this.writeToOutput("require(" + (aliasAST).stringLiteral.text() + ")"); - } - else { - this.emitJavascript((aliasAST).moduleName, false); - } - - this.recordSourceMappingEnd(importDeclAST); - this.writeToOutput(";"); - - if (needsPropertyAssignment) { - this.writeLineToOutput(""); - this.emitIndent(); - } - } - - if (needsPropertyAssignment) { - this.writeToOutputWithSourceMapRecord(moduleNamePrefix + importDeclAST.identifier.text() + " = " + importDeclAST.identifier.text(), importDeclAST); - this.writeToOutput(";"); - } - this.emitComments(importDeclAST, false); - } - - public createSourceMapper(document: Document, jsFileName: string, jsFile: TextWriter, sourceMapOut: TextWriter, resolvePath: (path: string) => string) { - this.sourceMapper = new SourceMapper(jsFile, sourceMapOut, document, jsFileName, this.emitOptions, resolvePath); - } - - public setSourceMapperNewSourceFile(document: Document) { - this.sourceMapper.setNewSourceFile(document, this.emitOptions); - } - - private updateLineAndColumn(s: string) { - var lineNumbers = TextUtilities.parseLineStarts(s); - if (lineNumbers.length > 1) { - // There are new lines in the string, update the line and column number accordingly - this.emitState.line += lineNumbers.length - 1; - this.emitState.column = s.length - lineNumbers[lineNumbers.length - 1]; - } - else { - // No new lines in the string - this.emitState.column += s.length; - } - } - - public writeToOutputWithSourceMapRecord(s: string, astSpan: ISyntaxElement) { - if (astSpan) { - this.recordSourceMappingStart(astSpan); - } - - this.writeToOutput(s); - - if (astSpan) { - this.recordSourceMappingEnd(astSpan); - } - } - - public writeToOutput(s: string) { - this.outfile.Write(s); - this.updateLineAndColumn(s); - } - - public writeLineToOutput(s: string, force = false) { - // No need to print a newline if we're already at the start of the line. - if (!force && s === "" && this.emitState.column === 0) { - return; - } - - this.outfile.WriteLine(s); - this.updateLineAndColumn(s); - this.emitState.column = 0; - this.emitState.line++; - } - - public writeCaptureThisStatement(ast: ISyntaxElement) { - this.emitIndent(); - this.writeToOutputWithSourceMapRecord(this.captureThisStmtString, ast); - this.writeLineToOutput(""); - } - - public setContainer(c: number): number { - var temp = this.emitState.container; - this.emitState.container = c; - return temp; - } - - private getIndentString() { - return this.indenter.getIndent(); - } - - public emitIndent() { - this.writeToOutput(this.getIndentString()); - } - - public emitComment(comment: Comment, trailing: boolean, first: boolean, noLeadingSpace = false) { - if (this.emitOptions.compilationSettings().removeComments()) { - return; - } - - var text = getTrimmedTextLines(comment); - var emitColumn = this.emitState.column; - - if (emitColumn === 0) { - this.emitIndent(); - } - else if (trailing && first && !noLeadingSpace) { - this.writeToOutput(" "); - } - - if (comment.kind() === SyntaxKind.MultiLineCommentTrivia) { - this.recordSourceMappingCommentStart(comment); - this.writeToOutput(text[0]); - - if (text.length > 1 || comment.endsLine) { - for (var i = 1; i < text.length; i++) { - this.writeLineToOutput(""); - this.emitIndent(); - this.writeToOutput(text[i]); - } - this.recordSourceMappingCommentEnd(comment); - this.writeLineToOutput(""); - // Fall through - } - else { - this.recordSourceMappingCommentEnd(comment); - this.writeToOutput(" "); - return; - } - } - else { - this.recordSourceMappingCommentStart(comment); - this.writeToOutput(text[0]); - this.recordSourceMappingCommentEnd(comment); - this.writeLineToOutput(""); - // Fall through - } - - if (!trailing && emitColumn !== 0) { - // If we were indented before, stay indented after. - this.emitIndent(); - } - } - - private text(): ISimpleText { - return this.document.syntaxTree().text; - } - - public emitComments(ast: ISyntaxElement, pre: boolean, onlyPinnedOrTripleSlashComments: boolean = false) { - // Emitting the comments for the exprssion inside an arrow function is handled specially - // in emitFunctionBodyStatements. We don't want to emit those comments a second time. - if (ast && !isShared(ast) && ast.kind() !== SyntaxKind.Block) { - if (ast.parent.kind() === SyntaxKind.SimpleArrowFunctionExpression || ast.parent.kind() === SyntaxKind.ParenthesizedArrowFunctionExpression) { - return; - } - } - - if (pre) { - var preComments = TypeScript.ASTHelpers.preComments(ast, this.text()); - - if (preComments && ast === this.detachedCommentsElement) { - // We're emitting the comments for the first script element. Skip any - // copyright comments, as we'll already have emitted those. - var detachedComments = this.getDetachedComments(ast); - preComments = preComments.slice(detachedComments.length); - this.detachedCommentsElement = null; - } - - // We're emitting comments on an elided element. Only keep the comment if it is - // a triple slash or pinned comment. - if (preComments && onlyPinnedOrTripleSlashComments) { - preComments = ArrayUtilities.where(preComments, c => this.isPinnedOrTripleSlash(c)); - } - - this.emitCommentsArray(preComments, /*trailing:*/ false); - } - else { - this.emitCommentsArray(ASTHelpers.postComments(ast, this.text()), /*trailing:*/ true); - } - } - - private isPinnedOrTripleSlash(comment: Comment): boolean { - var fullText = comment.fullText(); - if (fullText.match(tripleSlashReferenceRegExp)) { - return true; - } - else { - return fullText.indexOf("/*!") === 0; - } - } - - private emitCommentsArray(comments: Comment[], trailing: boolean, noLeadingSpace = false): void { - if (!this.emitOptions.compilationSettings().removeComments() && comments) { - for (var i = 0, n = comments.length; i < n; i++) { - this.emitComment(comments[i], trailing, /*first:*/ i === 0, noLeadingSpace); - } - } - } - - public emitObjectLiteralExpression(objectLiteral: ObjectLiteralExpressionSyntax) { - this.recordSourceMappingStart(objectLiteral); - - // Try to preserve the newlines between elements that the user had. - this.writeToken(objectLiteral.openBraceToken); - this.emitCommaSeparatedList(objectLiteral, objectLiteral.propertyAssignments, /*buffer:*/ " ", /*preserveNewLines:*/ true); - this.writeToken(objectLiteral.closeBraceToken); - - this.recordSourceMappingEnd(objectLiteral); - } - - public emitArrayLiteralExpression(arrayLiteral: ArrayLiteralExpressionSyntax) { - this.recordSourceMappingStart(arrayLiteral); - - // Try to preserve the newlines between elements that the user had. - this.writeToken(arrayLiteral.openBracketToken); - this.emitCommaSeparatedList(arrayLiteral, arrayLiteral.expressions, /*buffer:*/ "", /*preserveNewLines:*/ true); - this.writeToken(arrayLiteral.closeBracketToken); - - this.recordSourceMappingEnd(arrayLiteral); - } - - public emitObjectCreationExpression(objectCreationExpression: ObjectCreationExpressionSyntax) { - this.recordSourceMappingStart(objectCreationExpression); - this.writeToken(objectCreationExpression.newKeyword); - this.writeToOutput(" "); - var target = objectCreationExpression.expression; - - this.emit(target); - if (objectCreationExpression.argumentList) { - this.recordSourceMappingStart(objectCreationExpression.argumentList); - this.writeToken(objectCreationExpression.argumentList.openParenToken); - this.emitCommaSeparatedList(objectCreationExpression.argumentList, objectCreationExpression.argumentList.arguments, /*buffer:*/ "", /*preserveNewLines:*/ false); - this.writeToken(objectCreationExpression.argumentList.closeParenToken); - this.recordSourceMappingEnd(objectCreationExpression.argumentList); - } - - this.recordSourceMappingEnd(objectCreationExpression); - } - - public getConstantDecl(dotExpr: MemberAccessExpressionSyntax): PullEnumElementDecl { - var pullSymbol = this.semanticInfoChain.getSymbolForAST(dotExpr); - if (pullSymbol && pullSymbol.kind === PullElementKind.EnumMember) { - var pullDecls = pullSymbol.getDeclarations(); - if (pullDecls.length === 1) { - var pullDecl = pullDecls[0]; - if (pullDecl.kind === PullElementKind.EnumMember) { - return pullDecl; - } - } - } - - return null; - } - - public tryEmitConstant(dotExpr: MemberAccessExpressionSyntax) { - var propertyName = dotExpr.name; - var boundDecl = this.getConstantDecl(dotExpr); - if (boundDecl) { - var value = boundDecl.constantValue; - if (value !== null) { - this.recordSourceMappingStart(dotExpr); - this.writeToOutput(value.toString()); - var comment = " /* "; - comment += propertyName.text(); - comment += " */"; - this.writeToOutput(comment); - this.recordSourceMappingEnd(dotExpr); - return true; - } - } - - return false; - } - - public emitInvocationExpression(callNode: InvocationExpressionSyntax) { - this.recordSourceMappingStart(callNode); - var target = callNode.expression; - var args = callNode.argumentList.arguments; - - if (target.kind() === SyntaxKind.MemberAccessExpression && (target).expression.kind() === SyntaxKind.SuperKeyword) { - this.emit(target); - this.writeToOutput(".call"); - this.recordSourceMappingStart(args); - this.writeToken(callNode.argumentList.openParenToken); - this.emitThis(); - if (args && args.length > 0) { - this.writeToOutput(", "); - this.emitCommaSeparatedList(callNode.argumentList, args, /*buffer:*/ "", /*preserveNewLines:*/ false); - } - } - else { - if (callNode.expression.kind() === SyntaxKind.SuperKeyword && this.emitState.container === EmitContainer.Constructor) { - this.writeToOutput("_super.call"); - } - else { - this.emitJavascript(target, false); - } - this.recordSourceMappingStart(args); - this.writeToken(callNode.argumentList.openParenToken); - if (callNode.expression.kind() === SyntaxKind.SuperKeyword && this.emitState.container === EmitContainer.Constructor) { - this.writeToOutput("this"); - if (args && args.length > 0) { - this.writeToOutput(", "); - } - } - this.emitCommaSeparatedList(callNode.argumentList, args, /*buffer:*/ "", /*preserveNewLines:*/ false); - } - - this.writeToken(callNode.argumentList.closeParenToken); - this.recordSourceMappingEnd(args); - this.recordSourceMappingEnd(callNode); - } - - private emitParameterList(list: ParameterListSyntax): void { - this.writeToken(list.openParenToken); - this.emitCommentsArray(ASTHelpers.convertTokenTrailingComments(list.openParenToken, this.text()), /*trailing:*/ true, /*noLeadingSpace:*/ true); - this.emitFunctionParameters(list.parameters, list.parameters); - this.writeToken(list.closeParenToken); - } - - private emitFunctionParameters(ast: ISyntaxElement, parameters: ParameterSyntax[]): void { - var argsLen = 0; - - if (parameters) { - this.emitComments(ast, true); - - var tempContainer = this.setContainer(EmitContainer.Args); - argsLen = parameters.length; - var printLen = argsLen; - if (lastParameterIsRest(parameters)) { - printLen--; - } - for (var i = 0; i < printLen; i++) { - var arg = parameters[i]; - this.emit(arg); - - if (i < (printLen - 1)) { - this.writeToOutput(", "); - if (parameters) { - this.emitCommentsArray(ASTHelpers.convertTokenTrailingComments(parameters.separatorAt(i), this.text()), /*trailing:*/ true, /*noLeadingSpace:*/ true); - } - } - } - this.setContainer(tempContainer); - - this.emitComments(ast, false); - } - } - - private emitFunctionBodyStatements(name: string, funcDecl: ISyntaxElement, parameters: ParameterSyntax[], block: BlockSyntax, bodyExpression: ISyntaxElement): void { - this.writeLineToOutput(" {"); - if (name) { - this.recordSourceMappingNameStart(name); - } - - this.indenter.increaseIndent(); - - if (block) { - // We want any detached statements at the start of hte block to stay at the start. - // This is important for features like VSDoc which place their comments inside a - // block, but can't have them preceded by things like "var _this = this" when we - // emit. - - this.emitDetachedComments(block.statements); - } - - // Parameter list parameters with defaults could capture this - if (this.shouldCaptureThis(funcDecl)) { - this.writeCaptureThisStatement(funcDecl); - } - - if (parameters) { - this.emitDefaultValueAssignments(parameters); - this.emitRestParameterInitializer(parameters); - } - - if (block) { - this.emitList(block.statements); - this.emitCommentsArray(ASTHelpers.convertTokenLeadingComments(block.closeBraceToken, this.text()), /*trailing:*/ false); - } - else { - // Copy any comments before the body of the arrow function to the return statement. - // This is necessary for emitting correctness so we don't emit something like this: - // - // return - // // foo - // this.foo(); - // - // Because of ASI, this gets parsed as "return;" which is *not* what we want for - // proper semantics. - //var preComments = bodyExpression.preComments(); - //var postComments = bodyExpression.postComments(); - - //bodyExpression.setPreComments(null); - //bodyExpression.setPostComments(null); - - this.emitIndent(); - this.emitCommentsArray(ASTHelpers.preComments(bodyExpression, this.text()), /*trailing:*/ false); - this.writeToOutput("return "); - this.emit(bodyExpression); - this.writeLineToOutput(";"); - this.emitCommentsArray(ASTHelpers.preComments(bodyExpression, this.text()), /*trailing:*/ true); - - //bodyExpression.setPreComments(preComments); - //bodyExpression.setPostComments(postComments); - } - - this.indenter.decreaseIndent(); - this.emitIndent(); - - if (block) { - this.writeToken(block.closeBraceToken); - } - else { - this.writeToOutputWithSourceMapRecord("}", bodyExpression); - } - - if (name) { - this.recordSourceMappingNameEnd(); - } - } - - private emitDefaultValueAssignments(parameters: ParameterSyntax[]): void { - var n = parameters.length; - if (lastParameterIsRest(parameters)) { - n--; - } - - for (var i = 0; i < n; i++) { - var arg = parameters[i]; - var id = arg.identifier; - var equalsValueClause = arg.equalsValueClause; - if (equalsValueClause) { - this.emitIndent(); - this.recordSourceMappingStart(arg); - this.writeToOutput("if (typeof " + id.text() + " === \"undefined\") { ");// - this.writeToken(id); - this.emitJavascript(equalsValueClause, false); - this.writeLineToOutput("; }"); - this.recordSourceMappingEnd(arg); - } - } - } - - private emitRestParameterInitializer(parameters: ParameterSyntax[]): void { - if (lastParameterIsRest(parameters)) { - var n = parameters.length; - var lastArg = parameters[n - 1]; - var id = lastArg.identifier; - this.emitIndent(); - this.recordSourceMappingStart(lastArg); - this.writeToOutput("var "); - this.writeToken(id); - this.writeLineToOutput(" = [];"); - this.recordSourceMappingEnd(lastArg); - this.emitIndent(); - this.writeToOutput("for ("); - this.writeToOutputWithSourceMapRecord("var _i = 0;", lastArg); - this.writeToOutput(" "); - this.writeToOutputWithSourceMapRecord("_i < (arguments.length - " + (n - 1) + ")", lastArg); - this.writeToOutput("; "); - this.writeToOutputWithSourceMapRecord("_i++", lastArg); - this.writeLineToOutput(") {"); - this.indenter.increaseIndent(); - this.emitIndent(); - - this.writeToOutputWithSourceMapRecord(id.text() + "[_i] = arguments[_i + " + (n - 1) + "];", lastArg); - this.writeLineToOutput(""); - this.indenter.decreaseIndent(); - this.emitIndent(); - this.writeLineToOutput("}"); - } - } - - private getImportDecls(fileName: string): PullDecl[] { - var topLevelDecl = this.semanticInfoChain.topLevelDecl(this.document.fileName); - var result: PullDecl[] = []; - - var dynamicModuleDecl = topLevelDecl.getChildDecls()[0]; // Dynamic module declaration has to be present - var queue: PullDecl[] = dynamicModuleDecl.getChildDecls(); - - for (var i = 0, n = queue.length; i < n; i++) { - var decl = queue[i]; - - if (decl.kind & PullElementKind.TypeAlias) { - var importStatementAST = this.semanticInfoChain.getASTForDecl(decl); - if (importStatementAST.moduleReference.kind() === SyntaxKind.ExternalModuleReference) { // external module - var symbol = decl.getSymbol(this.semanticInfoChain); - var typeSymbol = symbol && symbol.type; - if (typeSymbol && typeSymbol !== this.semanticInfoChain.anyTypeSymbol && !typeSymbol.isError()) { - result.push(decl); - } - } - } - } - - return result; - } - - public getModuleImportAndDependencyList(sourceUnit: SourceUnitSyntax) { - var importList = ""; - var dependencyList = ""; - - var importDecls = this.getImportDecls(this.document.fileName); - - // all dependencies are quoted - if (importDecls.length) { - for (var i = 0; i < importDecls.length; i++) { - var importStatementDecl = importDecls[i]; - var importStatementSymbol = importStatementDecl.getSymbol(this.semanticInfoChain); - var importStatementAST = this.semanticInfoChain.getASTForDecl(importStatementDecl); - - if (importStatementSymbol.isUsedAsValue()) { - if (i <= importDecls.length - 1) { - dependencyList += ", "; - importList += ", "; - } - - importList += importStatementDecl.name; - dependencyList += (importStatementAST.moduleReference).stringLiteral.text(); - } - } - } - - // emit any potential amd dependencies - var amdDependencies = this.document.syntaxTree().amdDependencies(); - for (var i = 0; i < amdDependencies.length; i++) { - dependencyList += ", \"" + amdDependencies[i] + "\""; - } - - return { - importList: importList, - dependencyList: dependencyList - }; - } - - public shouldCaptureThis(ast: ISyntaxElement) { - if (ast.kind() === SyntaxKind.SourceUnit) { - var scriptDecl = this.semanticInfoChain.topLevelDecl(this.document.fileName); - return hasFlag(scriptDecl.flags, PullElementFlags.MustCaptureThis); - } - - var decl = this.semanticInfoChain.getDeclForAST(ast); - if (decl) { - return hasFlag(decl.flags, PullElementFlags.MustCaptureThis); - } - - return false; - } - - public emitEnum(moduleDecl: EnumDeclarationSyntax) { - var pullDecl = this.semanticInfoChain.getDeclForAST(moduleDecl); - this.pushDecl(pullDecl); - - var svModuleName = this.moduleName; - this.moduleName = moduleDecl.identifier.text(); - - var temp = this.setContainer(EmitContainer.Module); - var isExported = hasFlag(pullDecl.flags, PullElementFlags.Exported); - - if (!isExported) { - this.recordSourceMappingStart(moduleDecl); - this.writeToOutput("var "); - this.writeToOutputWithSourceMapRecord(this.moduleName, moduleDecl.identifier); - this.writeLineToOutput(";"); - this.recordSourceMappingEnd(moduleDecl); - this.emitIndent(); - } - - this.writeToOutput("("); - this.recordSourceMappingStart(moduleDecl); - this.writeToOutput("function ("); - this.writeToOutputWithSourceMapRecord(this.moduleName, moduleDecl.identifier); - this.writeLineToOutput(") {"); - - this.recordSourceMappingNameStart(this.moduleName); - - this.indenter.increaseIndent(); - - if (this.shouldCaptureThis(moduleDecl)) { - this.writeCaptureThisStatement(moduleDecl); - } - - this.emitSeparatedList(moduleDecl.enumElements); - this.indenter.decreaseIndent(); - this.emitIndent(); - - var parentIsDynamic = temp === EmitContainer.DynamicModule; - if (temp === EmitContainer.Prog && isExported) { - this.writeToOutput("}"); - this.recordSourceMappingNameEnd(); - this.writeToOutput(")(this." + this.moduleName + " || (this." + this.moduleName + " = {}));"); - } - else if (isExported || temp === EmitContainer.Prog) { - var dotMod = svModuleName !== "" ? (parentIsDynamic ? "exports" : svModuleName) + "." : svModuleName; - this.writeToOutput("}"); - this.recordSourceMappingNameEnd(); - this.writeToOutput(")(" + dotMod + this.moduleName + " || (" + dotMod + this.moduleName + " = {}));"); - } - else if (!isExported && temp !== EmitContainer.Prog) { - this.writeToOutput("}"); - this.recordSourceMappingNameEnd(); - this.writeToOutput(")(" + this.moduleName + " || (" + this.moduleName + " = {}));"); - } - else { - this.writeToOutput("}"); - this.recordSourceMappingNameEnd(); - this.writeToOutput(")();"); - } - - this.recordSourceMappingEnd(moduleDecl); - if (temp !== EmitContainer.Prog && isExported) { - this.recordSourceMappingStart(moduleDecl); - if (parentIsDynamic) { - this.writeLineToOutput(""); - this.emitIndent(); - this.writeToOutput("var " + this.moduleName + " = exports." + this.moduleName + ";"); - } - else { - this.writeLineToOutput(""); - this.emitIndent(); - this.writeToOutput("var " + this.moduleName + " = " + svModuleName + "." + this.moduleName + ";"); - } - this.recordSourceMappingEnd(moduleDecl); - } - - this.setContainer(temp); - this.moduleName = svModuleName; - - this.popDecl(pullDecl); - } - - private getModuleDeclToVerifyChildNameCollision(moduleDecl: PullDecl, changeNameIfAnyDeclarationInContext: boolean) { - if (ArrayUtilities.contains(this.declStack, moduleDecl)) { - // Given decl is in the scope, we would need to check for child name collision - return moduleDecl; - } - else if (changeNameIfAnyDeclarationInContext) { - // Check if any other declaration of the given symbol is in scope - // (eg. when emitting expression of type defined from different declaration in reopened module) - var symbol = moduleDecl.getSymbol(this.semanticInfoChain); - if (symbol) { - var otherDecls = symbol.getDeclarations(); - for (var i = 0; i < otherDecls.length; i++) { - // If the other decl is in the scope, use this decl to determine which name to display - if (ArrayUtilities.contains(this.declStack, otherDecls[i])) { - return otherDecls[i]; - } - } - } - } - - return null; - } - - private hasChildNameCollision(moduleName: string, parentDecl: PullDecl) { - var childDecls = parentDecl.getChildDecls(); - return ArrayUtilities.any(childDecls, (childDecl: PullDecl) => { - var childAST = this.semanticInfoChain.getASTForDecl(childDecl); - // Enum member it can never conflict with module name as it is property of the enum - // Only if this child would be emitted we need to look further in - if (childDecl.kind != PullElementKind.EnumMember && this.shouldEmit(childAST)) { - // same name child - if (childDecl.name === moduleName) { - // collision if the parent was not class - if (parentDecl.kind != PullElementKind.Class) { - return true; - } - - // If the parent was class, we would find name collision if this was not a property/method/accessor - if (!(childDecl.kind == PullElementKind.Method || - childDecl.kind == PullElementKind.Property || - childDecl.kind == PullElementKind.SetAccessor || - childDecl.kind == PullElementKind.GetAccessor)) { - return true; - } - } - - // Check if the name collision exists in any of the children - if (this.hasChildNameCollision(moduleName, childDecl)) { - return true; - } - } - return false; - }); - } - - // Get the moduleName to write in js file - // If changeNameIfAnyDeclarationInContext is true, verify if any of the declarations for the symbol would need rename. - private getModuleName(moduleDecl: PullDecl, changeNameIfAnyDeclarationInContext?: boolean) { - var moduleName = moduleDecl.name; - var moduleDisplayName = moduleDecl.getDisplayName(); - - // If the decl is in stack it may need name change in the js file - moduleDecl = this.getModuleDeclToVerifyChildNameCollision(moduleDecl, changeNameIfAnyDeclarationInContext); - if (moduleDecl && moduleDecl.kind != PullElementKind.Enum) { - // If there is any child that would be emitted with same name as module, js files would need to use rename for the module - while (this.hasChildNameCollision(moduleName, moduleDecl)) { - // there was name collision with member which could result in faulty codegen, try rename with prepend of '_' - moduleName = "_" + moduleName; - moduleDisplayName = "_" + moduleDisplayName; - } - } - - return moduleDisplayName; - } - - private emitModuleDeclarationWorker(moduleDecl: ModuleDeclarationSyntax) { - if (moduleDecl.stringLiteral) { - this.emitSingleModuleDeclaration(moduleDecl, moduleDecl.stringLiteral); - } - else { - var moduleNames = ASTHelpers.getModuleNames(moduleDecl.name); - this.emitSingleModuleDeclaration(moduleDecl, moduleNames[0]); - } - } - - private writeToken(token: ISyntaxToken) { - if (token) { - this.writeToOutputWithSourceMapRecord(token.text(), token); - } - } - - public emitSingleModuleDeclaration(moduleDecl: ModuleDeclarationSyntax, moduleName: ISyntaxToken) { - var isLastName = ASTHelpers.isLastNameOfModule(moduleDecl, moduleName); - - if (isLastName) { - // Doc Comments on the ast belong to the innermost module being emitted. - this.emitComments(moduleDecl, true); - } - - var pullDecl = this.semanticInfoChain.getDeclForAST(moduleName); - this.pushDecl(pullDecl); - - var svModuleName = this.moduleName; - - if (moduleDecl.stringLiteral) { - this.moduleName = tokenValueText(moduleDecl.stringLiteral); - if (isTSFile(this.moduleName)) { - this.moduleName = this.moduleName.substring(0, this.moduleName.length - ".ts".length); - } - } - else { - this.moduleName = moduleName.text(); - } - - var temp = this.setContainer(EmitContainer.Module); - var isExported = hasFlag(pullDecl.flags, PullElementFlags.Exported); - - // prologue - - if (!isExported) { - this.recordSourceMappingStart(moduleDecl); - this.writeToOutput("var "); - this.writeToOutputWithSourceMapRecord(this.moduleName, moduleName); - this.writeLineToOutput(";"); - this.recordSourceMappingEnd(moduleDecl); - this.emitIndent(); - } - - this.writeToOutput("("); - this.recordSourceMappingStart(moduleDecl); - this.writeToOutput("function ("); - // Use the name that doesnt conflict with its members, - // this.moduleName needs to be updated to make sure that export member declaration is emitted correctly - this.moduleName = this.getModuleName(pullDecl); - this.writeToOutputWithSourceMapRecord(this.moduleName, moduleName); - this.writeLineToOutput(") {"); - - this.recordSourceMappingNameStart(moduleName.text()); - - this.indenter.increaseIndent(); - - if (this.shouldCaptureThis(moduleDecl)) { - this.writeCaptureThisStatement(moduleDecl); - } - - if (moduleName === moduleDecl.stringLiteral) { - this.emitList(moduleDecl.moduleElements); - } - else { - var moduleNames = ASTHelpers.getModuleNames(moduleDecl.name); - var nameIndex = moduleNames.indexOf(moduleName); - - Debug.assert(nameIndex >= 0); - - if (isLastName) { - // If we're on the innermost module, we can emit the module elements. - this.emitList(moduleDecl.moduleElements); - } - else { - // otherwise, just recurse and emit the next module in the A.B.C module name. - this.emitIndent(); - this.emitSingleModuleDeclaration(moduleDecl, moduleNames[nameIndex + 1]); - this.writeLineToOutput(""); - } - } - - this.moduleName = moduleName.text(); - this.indenter.decreaseIndent(); - this.emitIndent(); - - // epilogue - var parentIsDynamic = temp === EmitContainer.DynamicModule; - this.recordSourceMappingStart(moduleDecl.closeBraceToken); - if (temp === EmitContainer.Prog && isExported) { - this.writeToOutput("}"); - this.recordSourceMappingNameEnd(); - this.recordSourceMappingEnd(moduleDecl.closeBraceToken); - this.writeToOutput(")(this." + this.moduleName + " || (this." + this.moduleName + " = {}));"); - } - else if (isExported || temp === EmitContainer.Prog) { - var dotMod = svModuleName !== "" ? (parentIsDynamic ? "exports" : svModuleName) + "." : svModuleName; - this.writeToOutput("}"); - this.recordSourceMappingNameEnd(); - this.recordSourceMappingEnd(moduleDecl.closeBraceToken); - this.writeToOutput(")(" + dotMod + this.moduleName + " || (" + dotMod + this.moduleName + " = {}));"); - } - else if (!isExported && temp !== EmitContainer.Prog) { - this.writeToOutput("}"); - this.recordSourceMappingNameEnd(); - this.recordSourceMappingEnd(moduleDecl.closeBraceToken); - this.writeToOutput(")(" + this.moduleName + " || (" + this.moduleName + " = {}));"); - } - else { - this.writeToOutput("}"); - this.recordSourceMappingNameEnd(); - this.recordSourceMappingEnd(moduleDecl.closeBraceToken); - this.writeToOutput(")();"); - } - - this.recordSourceMappingEnd(moduleDecl); - if (temp !== EmitContainer.Prog && isExported) { - this.recordSourceMappingStart(moduleDecl); - if (parentIsDynamic) { - this.writeLineToOutput(""); - this.emitIndent(); - this.writeToOutput("var " + this.moduleName + " = exports." + this.moduleName + ";"); - } - else { - this.writeLineToOutput(""); - this.emitIndent(); - this.writeToOutput("var " + this.moduleName + " = " + svModuleName + "." + this.moduleName + ";"); - } - this.recordSourceMappingEnd(moduleDecl); - } - - this.setContainer(temp); - this.moduleName = svModuleName; - - this.popDecl(pullDecl); - - if (isLastName) { - // Comments on the module ast belong to the innermost module being emitted. - this.emitComments(moduleDecl, false); - } - } - - public emitEnumElement(varDecl: EnumElementSyntax): void { - // [[""] = ] = ""; - var pullDecl = this.semanticInfoChain.getDeclForAST(varDecl); - Debug.assert(pullDecl && pullDecl.kind === PullElementKind.EnumMember); - - this.emitComments(varDecl, true); - this.recordSourceMappingStart(varDecl); - - var representation = (varDecl.propertyName.kind() === SyntaxKind.StringLiteral) - ? varDecl.propertyName.text() - : ('"' + tokenValueText(varDecl.propertyName) + '"'); - - this.writeToOutput(this.moduleName); - this.writeToOutput('['); - this.writeToOutput(this.moduleName); - this.writeToOutput('['); - this.writeToOutput(representation); - this.writeToOutput(']'); - - if (varDecl.equalsValueClause) { - this.emit(varDecl.equalsValueClause); - } - else if (pullDecl.constantValue !== null) { - this.writeToOutput(' = '); - this.writeToOutput(pullDecl.constantValue.toString()); - } - else { - this.writeToOutput(' = null'); - } - - this.writeToOutput('] = '); - this.writeToOutput(representation); - this.recordSourceMappingEnd(varDecl); - this.emitComments(varDecl, false); - this.writeToOutput(';'); - } - - public emitElementAccessExpression(expression: ElementAccessExpressionSyntax) { - this.recordSourceMappingStart(expression); - this.emit(expression.expression); - this.writeToken(expression.openBracketToken); - this.emit(expression.argumentExpression); - this.writeToken(expression.closeBracketToken); - this.recordSourceMappingEnd(expression); - } - - public emitSimpleArrowFunctionExpression(arrowFunction: SimpleArrowFunctionExpressionSyntax): void { - this.emitAnyArrowFunctionExpression(arrowFunction, arrowFunction.block, arrowFunction.expression); - } - - public emitParenthesizedArrowFunctionExpression(arrowFunction: ParenthesizedArrowFunctionExpressionSyntax): void { - this.emitAnyArrowFunctionExpression(arrowFunction, arrowFunction.block, arrowFunction.expression); - } - - private emitAnyArrowFunctionExpression(arrowFunction: ISyntaxElement, block: BlockSyntax, expression: ISyntaxElement): void { - var savedInArrowFunction = this.inArrowFunction; - this.inArrowFunction = true; - - var temp = this.setContainer(EmitContainer.Function); - - this.recordSourceMappingStart(arrowFunction); - - // Start - var pullDecl = this.semanticInfoChain.getDeclForAST(arrowFunction); - this.pushDecl(pullDecl); - - this.emitComments(arrowFunction, true); - - this.recordSourceMappingStart(arrowFunction); - this.writeToOutput("function "); - - var parameters: ParameterSyntax[] = null; - if (arrowFunction.kind() === SyntaxKind.ParenthesizedArrowFunctionExpression) { - var parenthesizedArrowFunction = arrowFunction; - - parameters = parenthesizedArrowFunction.callSignature.parameterList.parameters; - this.emitParameterList(parenthesizedArrowFunction.callSignature.parameterList); - } - else { - var parameter = (arrowFunction).parameter; - parameters = [parameter]; - this.writeToOutput("("); - this.emitFunctionParameters(parameter, parameters); - this.writeToOutput(")"); - } - - this.emitFunctionBodyStatements(/*funcName:*/ null, arrowFunction, parameters, block, expression); - - this.recordSourceMappingEnd(arrowFunction); - - // The extra call is to make sure the caller's funcDecl end is recorded, since caller wont be able to record it - this.recordSourceMappingEnd(arrowFunction); - - this.emitComments(arrowFunction, false); - - this.popDecl(pullDecl); - this.setContainer(temp); - this.inArrowFunction = savedInArrowFunction; - } - - public emitConstructor(funcDecl: ConstructorDeclarationSyntax) { - if (!funcDecl.block) { - return; - } - var temp = this.setContainer(EmitContainer.Constructor); - - this.recordSourceMappingStart(funcDecl); - - var pullDecl = this.semanticInfoChain.getDeclForAST(funcDecl); - this.pushDecl(pullDecl); - - this.emitComments(funcDecl, true); - - this.recordSourceMappingStart(funcDecl); - this.writeToOutput("function "); - this.writeToOutput(this.thisClassNode.identifier.text()); - - this.emitParameterList(funcDecl.callSignature.parameterList); - this.writeLineToOutput(" {"); - - this.recordSourceMappingNameStart("constructor"); - this.indenter.increaseIndent(); - - var parameters = funcDecl.callSignature.parameterList.parameters; - this.emitDefaultValueAssignments(parameters); - this.emitRestParameterInitializer(parameters); - - if (this.shouldCaptureThis(funcDecl)) { - this.writeCaptureThisStatement(funcDecl); - } - - this.emitConstructorStatements(funcDecl); - this.emitCommentsArray(ASTHelpers.convertTokenLeadingComments(funcDecl.block.closeBraceToken, this.text()), /*trailing:*/ false); - - this.indenter.decreaseIndent(); - this.emitIndent(); - this.writeToken(funcDecl.block.closeBraceToken); - - this.recordSourceMappingNameEnd(); - this.recordSourceMappingEnd(funcDecl); - - // The extra call is to make sure the caller's funcDecl end is recorded, since caller wont be able to record it - this.recordSourceMappingEnd(funcDecl); - - this.emitComments(funcDecl, false); - - this.popDecl(pullDecl); - this.setContainer(temp); - } - - public emitGetAccessor(accessor: GetAccessorSyntax): void { - this.recordSourceMappingStart(accessor); - this.writeToOutput("get "); - - var temp = this.setContainer(EmitContainer.Function); - - this.recordSourceMappingStart(accessor); - - var pullDecl = this.semanticInfoChain.getDeclForAST(accessor); - this.pushDecl(pullDecl); - - this.recordSourceMappingStart(accessor); - - var accessorSymbol = PullHelpers.getAccessorSymbol(accessor, this.semanticInfoChain); - var container = accessorSymbol.getContainer(); - var containerKind = container.kind; - - this.recordSourceMappingNameStart(accessor.propertyName.text()); - this.writeToOutput(accessor.propertyName.text()); - this.emitParameterList(accessor.callSignature.parameterList); - - this.emitFunctionBodyStatements(null, accessor, accessor.callSignature.parameterList.parameters, accessor.block, /*bodyExpression:*/ null); - - this.recordSourceMappingEnd(accessor); - - // The extra call is to make sure the caller's funcDecl end is recorded, since caller wont be able to record it - this.recordSourceMappingEnd(accessor); - - this.popDecl(pullDecl); - this.setContainer(temp); - this.recordSourceMappingEnd(accessor); - } - - public emitSetAccessor(accessor: SetAccessorSyntax): void { - this.recordSourceMappingStart(accessor); - this.writeToOutput("set "); - - var temp = this.setContainer(EmitContainer.Function); - - this.recordSourceMappingStart(accessor); - - var pullDecl = this.semanticInfoChain.getDeclForAST(accessor); - this.pushDecl(pullDecl); - - this.recordSourceMappingStart(accessor); - - var accessorSymbol = PullHelpers.getAccessorSymbol(accessor, this.semanticInfoChain); - var container = accessorSymbol.getContainer(); - var containerKind = container.kind; - - this.recordSourceMappingNameStart(accessor.propertyName.text()); - this.writeToOutput(accessor.propertyName.text()); - - this.emitParameterList(accessor.callSignature.parameterList); - - this.emitFunctionBodyStatements(null, accessor, accessor.callSignature.parameterList.parameters, accessor.block, /*bodyExpression:*/ null); - - this.recordSourceMappingEnd(accessor); - - // The extra call is to make sure the caller's funcDecl end is recorded, since caller wont be able to record it - this.recordSourceMappingEnd(accessor); - - this.popDecl(pullDecl); - this.setContainer(temp); - this.recordSourceMappingEnd(accessor); - } - - public emitFunctionExpression(funcDecl: FunctionExpressionSyntax): void { - var savedInArrowFunction = this.inArrowFunction; - this.inArrowFunction = false; - - var temp = this.setContainer(EmitContainer.Function); - - var funcName = funcDecl.identifier ? funcDecl.identifier.text() : null;//.getNameText(); - - this.recordSourceMappingStart(funcDecl); - - var pullDecl = this.semanticInfoChain.getDeclForAST(funcDecl); - this.pushDecl(pullDecl); - - this.recordSourceMappingStart(funcDecl); - this.writeToken(funcDecl.functionKeyword); - this.writeToOutput(" "); - - //var id = funcDecl.getNameText(); - if (funcDecl.identifier) { - this.writeToOutputWithSourceMapRecord(funcDecl.identifier.text(), funcDecl.identifier); - } - - this.emitParameterList(funcDecl.callSignature.parameterList); - this.emitFunctionBodyStatements(funcName, funcDecl, funcDecl.callSignature.parameterList.parameters, funcDecl.block, /*bodyExpression:*/ null); - - this.recordSourceMappingEnd(funcDecl); - - // The extra call is to make sure the caller's funcDecl end is recorded, since caller wont be able to record it - this.recordSourceMappingEnd(funcDecl); - - this.emitComments(funcDecl, false); - - this.popDecl(pullDecl); - - this.setContainer(temp); - this.inArrowFunction = savedInArrowFunction; - } - - public emitFunction(funcDecl: FunctionDeclarationSyntax) { - if (funcDecl.block === null) { - return; - } - var savedInArrowFunction = this.inArrowFunction; - this.inArrowFunction = false; - - var temp = this.setContainer(EmitContainer.Function); - - var funcName = funcDecl.identifier.text(); - - this.recordSourceMappingStart(funcDecl); - - var printName = funcDecl.identifier !== null - var pullDecl = this.semanticInfoChain.getDeclForAST(funcDecl); - this.pushDecl(pullDecl); - - this.emitComments(funcDecl, true); - - this.recordSourceMappingStart(funcDecl); - this.writeToken(funcDecl.functionKeyword); - this.writeToOutput(" "); - - if (printName) { - var id = funcDecl.identifier.text(); - if (id) { - if (funcDecl.identifier) { - this.recordSourceMappingStart(funcDecl.identifier); - } - this.writeToOutput(id); - if (funcDecl.identifier) { - this.recordSourceMappingEnd(funcDecl.identifier); - } - } - } - - this.emitParameterList(funcDecl.callSignature.parameterList); - - var parameters = funcDecl.callSignature.parameterList.parameters; - this.emitFunctionBodyStatements(funcDecl.identifier.text(), funcDecl, parameters, funcDecl.block, /*bodyExpression:*/ null); - - this.recordSourceMappingEnd(funcDecl); - - // The extra call is to make sure the caller's funcDecl end is recorded, since caller wont be able to record it - this.recordSourceMappingEnd(funcDecl); - - this.emitComments(funcDecl, false); - - this.popDecl(pullDecl); - - this.setContainer(temp); - this.inArrowFunction = savedInArrowFunction; - - if (funcDecl.block) { - var pullFunctionDecl = this.semanticInfoChain.getDeclForAST(funcDecl); - if ((this.emitState.container === EmitContainer.Module || this.emitState.container === EmitContainer.DynamicModule) && pullFunctionDecl && hasFlag(pullFunctionDecl.flags, PullElementFlags.Exported)) { - this.writeLineToOutput(""); - this.emitIndent(); - var modName = this.emitState.container === EmitContainer.Module ? this.moduleName : "exports"; - this.recordSourceMappingStart(funcDecl); - this.writeToOutput(modName + "." + funcName + " = " + funcName + ";"); - this.recordSourceMappingEnd(funcDecl); - } - } - } - - public emitAmbientVarDecl(varDecl: VariableDeclaratorSyntax) { - this.recordSourceMappingStart(this.currentVariableDeclaration); - if (varDecl.equalsValueClause) { - this.emitComments(varDecl, true); - this.recordSourceMappingStart(varDecl); - this.writeToOutputWithSourceMapRecord(varDecl.propertyName.text(), varDecl.propertyName); - this.emitJavascript(varDecl.equalsValueClause, false); - this.recordSourceMappingEnd(varDecl); - this.emitComments(varDecl, false); - } - } - - // Emits "var " if it is allowed - public emitVarDeclVar() { - if (this.currentVariableDeclaration) { - this.writeToOutput("var "); - } - } - - public emitVariableDeclaration(declaration: VariableDeclarationSyntax) { - var varDecl = declaration.variableDeclarators[0]; - - var symbol = this.semanticInfoChain.getSymbolForAST(varDecl); - - var parentSymbol = symbol ? symbol.getContainer() : null; - var parentKind = parentSymbol ? parentSymbol.kind : PullElementKind.None; - - this.emitComments(declaration, true); - - var pullVarDecl = this.semanticInfoChain.getDeclForAST(varDecl); - var isAmbientWithoutInit = pullVarDecl && hasFlag(pullVarDecl.flags, PullElementFlags.Ambient) && varDecl.equalsValueClause === null; - if (!isAmbientWithoutInit) { - var prevVariableDeclaration = this.currentVariableDeclaration; - this.currentVariableDeclaration = declaration; - - for (var i = 0, n = declaration.variableDeclarators.length; i < n; i++) { - var declarator = declaration.variableDeclarators[i]; - - if (i > 0) { - this.writeToOutput(", "); - } - - this.emit(declarator); - } - this.currentVariableDeclaration = prevVariableDeclaration; - - // Declarator emit would take care of emitting start of the variable declaration start - this.recordSourceMappingEnd(declaration); - } - - this.emitComments(declaration, false); - } - - private emitMemberVariableDeclaration(varDecl: MemberVariableDeclarationSyntax) { - Debug.assert(!hasModifier(varDecl.modifiers, PullElementFlags.Static) && varDecl.variableDeclarator.equalsValueClause); - - var pullDecl = this.semanticInfoChain.getDeclForAST(varDecl); - this.pushDecl(pullDecl); - - this.emitComments(varDecl, true); - this.recordSourceMappingStart(varDecl); - - var varDeclName = varDecl.variableDeclarator.propertyName.text(); - var quotedOrNumber = isQuoted(varDeclName) || varDecl.variableDeclarator.propertyName.kind() !== SyntaxKind.IdentifierName; - - var symbol = this.semanticInfoChain.getSymbolForAST(varDecl); - var parentSymbol = symbol ? symbol.getContainer() : null; - var parentDecl = pullDecl && pullDecl.getParentDecl(); - - if (quotedOrNumber) { - this.writeToOutput("this["); - } - else { - this.writeToOutput("this."); - } - - this.writeToOutputWithSourceMapRecord(varDecl.variableDeclarator.propertyName.text(), varDecl.variableDeclarator.propertyName); - - if (quotedOrNumber) { - this.writeToOutput("]"); - } - - if (varDecl.variableDeclarator.equalsValueClause) { - // Ensure we have a fresh var list count when recursing into the variable - // initializer. We don't want our current list of variables to affect how we - // emit nested variable lists. - var prevVariableDeclaration = this.currentVariableDeclaration; - this.emit(varDecl.variableDeclarator.equalsValueClause); - this.currentVariableDeclaration = prevVariableDeclaration; - } - - // class - if (this.emitState.container !== EmitContainer.Args) { - this.writeToOutput(";"); - } - - this.recordSourceMappingEnd(varDecl); - this.emitComments(varDecl, false); - - this.popDecl(pullDecl); - } - - public emitVariableDeclarator(varDecl: VariableDeclaratorSyntax) { - var pullDecl = this.semanticInfoChain.getDeclForAST(varDecl); - this.pushDecl(pullDecl); - if (pullDecl && (pullDecl.flags & PullElementFlags.Ambient) === PullElementFlags.Ambient) { - this.emitAmbientVarDecl(varDecl); - } - else { - this.emitComments(varDecl, true); - this.recordSourceMappingStart(this.currentVariableDeclaration); - this.recordSourceMappingStart(varDecl); - - var varDeclName = varDecl.propertyName.text(); - - var symbol = this.semanticInfoChain.getSymbolForAST(varDecl); - var parentSymbol = symbol ? symbol.getContainer() : null; - var parentDecl = pullDecl && pullDecl.getParentDecl(); - var parentIsModule = parentDecl && (parentDecl.flags & PullElementFlags.SomeInitializedModule); - - if (parentIsModule) { - // module - if (!hasFlag(pullDecl.flags, PullElementFlags.Exported)/* && !varDecl.isProperty() */) { - this.emitVarDeclVar(); - } - else { - if (this.emitState.container === EmitContainer.DynamicModule) { - this.writeToOutput("exports."); - } - else { - this.writeToOutput(this.moduleName + "."); - } - } - } - else { - this.emitVarDeclVar(); - } - - this.writeToOutputWithSourceMapRecord(varDecl.propertyName.text(), varDecl.propertyName); - - if (varDecl.equalsValueClause) { - // Ensure we have a fresh var list count when recursing into the variable - // initializer. We don't want our current list of variables to affect how we - // emit nested variable lists. - var prevVariableDeclaration = this.currentVariableDeclaration; - this.emit(varDecl.equalsValueClause); - this.currentVariableDeclaration = prevVariableDeclaration; - } - - this.recordSourceMappingEnd(varDecl); - this.emitComments(varDecl, false); - } - this.currentVariableDeclaration = undefined; - this.popDecl(pullDecl); - } - - private symbolIsUsedInItsEnclosingContainer(symbol: PullSymbol, dynamic = false) { - var symDecls = symbol.getDeclarations(); - - if (symDecls.length) { - var enclosingDecl = this.getEnclosingDecl(); - if (enclosingDecl) { - var parentDecl = symDecls[0].getParentDecl(); - if (parentDecl) { - var symbolDeclarationEnclosingContainer = parentDecl; - var enclosingContainer = enclosingDecl; - - // compute the closing container of the symbol's declaration - while (symbolDeclarationEnclosingContainer) { - if (symbolDeclarationEnclosingContainer.kind === (dynamic ? PullElementKind.DynamicModule : PullElementKind.Container)) { - break; - } - symbolDeclarationEnclosingContainer = symbolDeclarationEnclosingContainer.getParentDecl(); - } - - // if the symbol in question is not a global, compute the nearest - // enclosing declaration from the point of usage - if (symbolDeclarationEnclosingContainer) { - while (enclosingContainer) { - if (enclosingContainer.kind === (dynamic ? PullElementKind.DynamicModule : PullElementKind.Container)) { - break; - } - - enclosingContainer = enclosingContainer.getParentDecl(); - } - } - - if (symbolDeclarationEnclosingContainer && enclosingContainer) { - var same = symbolDeclarationEnclosingContainer === enclosingContainer; - - // initialized module object variables are bound to their parent's decls - if (!same && symbol.anyDeclHasFlag(PullElementFlags.InitializedModule)) { - same = symbolDeclarationEnclosingContainer === enclosingContainer.getParentDecl(); - } - - return same; - } - } - } - } - - return false; - } - - // In some cases, when emitting a name, the emitter needs to qualify a symbol - // name by first emitting its parent's name. This generally happens when the - // name referenced is in scope in TypeScript, but not in Javascript. This is true - // in any of the following 3 cases: - // - It is an enum member, even if accessed from within the enum declaration in which it is defined - // - It is an exported var, even if accessed from within the module declaration in which it is defined - // - It is an exported member of the current module, but is never defined in this particular module - // declaration (i.e. it is only defined in other components of the same merged module) - private shouldQualifySymbolNameWithParentName(symbol: PullSymbol): boolean { - var enclosingContextDeclPath = this.declStack; - var symbolDeclarations = symbol.getDeclarations(); - for (var i = 0; i < symbolDeclarations.length; i++) { - var currentDecl = symbolDeclarations[i]; - var declParent = currentDecl.getParentDecl(); - - if (currentDecl.kind === PullElementKind.EnumMember) { - return true; - } - - // All decls of the same symbol must agree on whether they are exported - // If one decl is not exported, none of them are, and it is safe to - // assume it is just a local - if (!hasFlag(currentDecl.flags, PullElementFlags.Exported)) { - return false; - } - - // Section 10.6: - // When a variable is exported, all references to the variable in the body of the - // module are replaced with - // .< VariableName> - if (currentDecl.kind === PullElementKind.Variable && !hasFlag(currentDecl.flags, PullElementFlags.ImplicitVariable)) { - return true; - } - - if (ArrayUtilities.contains(this.declStack, declParent)) { - return false; - } - } - - return true; - } - - // Get the symbol information to be used for emitting the ast - private getSymbolForEmit(ast: ISyntaxElement) { - var pullSymbol = this.semanticInfoChain.getSymbolForAST(ast); - var pullSymbolAlias = this.semanticInfoChain.getAliasSymbolForAST(ast); - if (pullSymbol && pullSymbolAlias) { - var symbolToCompare = isTypesOnlyLocation(ast) ? - pullSymbolAlias.getExportAssignedTypeSymbol() : - pullSymbolAlias.getExportAssignedValueSymbol(); - - if (pullSymbol === symbolToCompare) { - pullSymbol = pullSymbolAlias; - pullSymbolAlias = null; - } - } - return { symbol: pullSymbol, aliasSymbol: pullSymbolAlias }; - } - - public emitName(name: ISyntaxToken, addThis: boolean) { - this.emitComments(name, true); - this.recordSourceMappingStart(name); - if (name.text().length > 0) { - var symbolForEmit = this.getSymbolForEmit(name); - var pullSymbol = symbolForEmit.symbol; - if (!pullSymbol) { - pullSymbol = this.semanticInfoChain.anyTypeSymbol; - } - var pullSymbolAlias = symbolForEmit.aliasSymbol; - var pullSymbolKind = pullSymbol.kind; - var isLocalAlias = pullSymbolAlias && (pullSymbolAlias.getDeclarations()[0].getParentDecl() === this.getEnclosingDecl()); - if (addThis && (this.emitState.container !== EmitContainer.Args) && pullSymbol) { - var pullSymbolContainer = pullSymbol.getContainer(); - - if (pullSymbolContainer) { - var pullSymbolContainerKind = pullSymbolContainer.kind; - - if (PullHelpers.symbolIsModule(pullSymbolContainer) || pullSymbolContainerKind === PullElementKind.Enum || - pullSymbolContainer.anyDeclHasFlag(PullElementFlags.InitializedModule | PullElementFlags.Enum)) { - var needToEmitParentName = this.shouldQualifySymbolNameWithParentName(pullSymbol); - if (needToEmitParentName) { - var parentDecl = pullSymbol.getDeclarations()[0].getParentDecl(); - Debug.assert(parentDecl && !parentDecl.isRootDecl()); - this.writeToOutput(this.getModuleName(parentDecl, /* changeNameIfAnyDeclarationInContext */ true) + "."); - } - } - else if (pullSymbolContainerKind === PullElementKind.DynamicModule || - pullSymbolContainer.anyDeclHasFlag(PullElementFlags.InitializedDynamicModule)) { - if (pullSymbolKind === PullElementKind.Property) { - // If dynamic module - this.writeToOutput("exports."); - } - else if (pullSymbol.anyDeclHasFlag(PullElementFlags.Exported) && - !isLocalAlias && - !pullSymbol.anyDeclHasFlag(PullElementFlags.ImplicitVariable) && - pullSymbol.kind !== PullElementKind.ConstructorMethod && - pullSymbol.kind !== PullElementKind.Class && - pullSymbol.kind !== PullElementKind.Enum) { - this.writeToOutput("exports."); - } - } - } - } - - this.writeToOutput(name.text()); - } - - this.recordSourceMappingEnd(name); - this.emitComments(name, false); - } - - public recordSourceMappingNameStart(name: string) { - if (this.sourceMapper) { - var nameIndex = -1; - if (name) { - if (this.sourceMapper.currentNameIndex.length > 0) { - var parentNameIndex = this.sourceMapper.currentNameIndex[this.sourceMapper.currentNameIndex.length - 1]; - if (parentNameIndex !== -1) { - name = this.sourceMapper.names[parentNameIndex] + "." + name; - } - } - - // Look if there already exists name - var nameIndex = this.sourceMapper.names.length - 1; - for (nameIndex; nameIndex >= 0; nameIndex--) { - if (this.sourceMapper.names[nameIndex] === name) { - break; - } - } - - if (nameIndex === -1) { - nameIndex = this.sourceMapper.names.length; - this.sourceMapper.names.push(name); - } - } - this.sourceMapper.currentNameIndex.push(nameIndex); - } - } - - public recordSourceMappingNameEnd() { - if (this.sourceMapper) { - this.sourceMapper.currentNameIndex.pop(); - } - } - - private recordSourceMappingStart(ast: ISyntaxElement) { - if (this.sourceMapper && ASTHelpers.isValidAstNode(ast)) { - var text = this.text(); - this.recordSourceMappingSpanStart(ast, start(ast, text), end(ast, text)); - } - } - - private recordSourceMappingCommentStart(comment: Comment) { - this.recordSourceMappingSpanStart(comment, comment.start(), comment.end()); - } - - private recordSourceMappingSpanStart(ast: any, start: number, end: number) { - if (this.sourceMapper && ast && start !== -1 && end !== -1) { - var lineCol = { line: -1, character: -1 }; - var sourceMapping = new SourceMapping(); - sourceMapping.start.emittedColumn = this.emitState.column; - sourceMapping.start.emittedLine = this.emitState.line; - // REVIEW: check time consumed by this binary search (about two per leaf statement) - var lineMap = this.document.lineMap(); - lineMap.fillLineAndCharacterFromPosition(start, lineCol); - sourceMapping.start.sourceColumn = lineCol.character; - sourceMapping.start.sourceLine = lineCol.line + 1; - lineMap.fillLineAndCharacterFromPosition(end, lineCol); - sourceMapping.end.sourceColumn = lineCol.character; - sourceMapping.end.sourceLine = lineCol.line + 1; - - Debug.assert(!isNaN(sourceMapping.start.emittedColumn)); - Debug.assert(!isNaN(sourceMapping.start.emittedLine)); - Debug.assert(!isNaN(sourceMapping.start.sourceColumn)); - Debug.assert(!isNaN(sourceMapping.start.sourceLine)); - Debug.assert(!isNaN(sourceMapping.end.sourceColumn)); - Debug.assert(!isNaN(sourceMapping.end.sourceLine)); - - if (this.sourceMapper.currentNameIndex.length > 0) { - sourceMapping.nameIndex = this.sourceMapper.currentNameIndex[this.sourceMapper.currentNameIndex.length - 1]; - } - // Set parent and child relationship - var siblings = this.sourceMapper.currentMappings[this.sourceMapper.currentMappings.length - 1]; - siblings.push(sourceMapping); - this.sourceMapper.currentMappings.push(sourceMapping.childMappings); - this.sourceMapper.increaseMappingLevel(ast); - } - } - - private recordSourceMappingEnd(ast: ISyntaxElement) { - if (this.sourceMapper && ASTHelpers.isValidAstNode(ast)) { - var text = this.text(); - this.recordSourceMappingSpanEnd(ast, start(ast, text), end(ast, text)); - } - } - - private recordSourceMappingCommentEnd(ast: Comment) { - if (this.sourceMapper && ASTHelpers.isValidSpan(ast)) { - this.recordSourceMappingSpanEnd(ast, ast.start(), ast.end()); - } - } - - private recordSourceMappingSpanEnd(ast: any, start: number, end: number) { - if (this.sourceMapper && ast && start !== -1 && end !== -1) { - // Pop source mapping childs - this.sourceMapper.currentMappings.pop(); - - // Get the last source mapping from sibling list = which is the one we are recording end for - var siblings = this.sourceMapper.currentMappings[this.sourceMapper.currentMappings.length - 1]; - var sourceMapping = siblings[siblings.length - 1]; - - sourceMapping.end.emittedColumn = this.emitState.column; - sourceMapping.end.emittedLine = this.emitState.line; - - Debug.assert(!isNaN(sourceMapping.end.emittedColumn)); - Debug.assert(!isNaN(sourceMapping.end.emittedLine)); - - this.sourceMapper.decreaseMappingLevel(ast); - } - } - - // Note: may throw exception. - public getOutputFiles(): OutputFile[] { - // Output a source mapping. As long as we haven't gotten any errors yet. - var result: OutputFile[] = []; - if (this.sourceMapper !== null) { - this.sourceMapper.emitSourceMapping(); - result.push(this.sourceMapper.getOutputFile()); - } - - result.push(this.outfile.getOutputFile()); - return result; - } - - private emitParameterPropertyAndMemberVariableAssignments(): void { - // emit any parameter properties first - var constructorDecl = getLastConstructor(this.thisClassNode); - - if (constructorDecl) { - for (var i = 0, n = constructorDecl.callSignature.parameterList.parameters.length; i < n; i++) { - var parameter = constructorDecl.callSignature.parameterList.parameters[i]; - - var parameterDecl = this.semanticInfoChain.getDeclForAST(parameter); - if (hasFlag(parameterDecl.flags, PullElementFlags.PropertyParameter)) { - this.emitIndent(); - this.recordSourceMappingStart(parameter); - this.writeToOutputWithSourceMapRecord("this." + parameter.identifier.text(), parameter.identifier); - this.writeToOutput(" = "); - this.writeToOutputWithSourceMapRecord(parameter.identifier.text(), parameter.identifier); - this.writeLineToOutput(";"); - this.recordSourceMappingEnd(parameter); - } - } - } - - for (var i = 0, n = this.thisClassNode.classElements.length; i < n; i++) { - if (this.thisClassNode.classElements[i].kind() === SyntaxKind.MemberVariableDeclaration) { - var varDecl = this.thisClassNode.classElements[i]; - if (!hasModifier(varDecl.modifiers, PullElementFlags.Static) && varDecl.variableDeclarator.equalsValueClause) { - this.emitIndent(); - this.emitMemberVariableDeclaration(varDecl); - this.writeLineToOutput(""); - } - } - } - } - - private isOnSameLine(pos1: number, pos2: number): boolean { - if (pos1 < 0 || pos2 < 0) { - // Missing element. Assume it's on the same line as the other element. - return true; - } - - var lineMap = this.document.lineMap(); - return lineMap.getLineNumberFromPosition(pos1) === lineMap.getLineNumberFromPosition(pos2); - } - - private emitCommaSeparatedList(parent: ISyntaxElement, list: T[], buffer: string, preserveNewLines: boolean): void { - if (list === null || list.length === 0) { - return; - } - - // If the first element isn't on hte same line as the parent node, then we need to - // start with a newline. - var text = this.text(); - var startLine = preserveNewLines && !this.isOnSameLine(end(parent, text), end(list[0], text)); - - if (preserveNewLines) { - // Any elements on a new line will have to be indented. - this.indenter.increaseIndent(); - } - - // If we're starting on a newline, then emit an actual newline. Otherwise write out - // the buffer character before hte first element. - if (startLine) { - this.writeLineToOutput(""); - } - else { - this.writeToOutput(buffer); - } - - for (var i = 0, n = list.length; i < n; i++) { - var emitNode = list[i]; - - // Write out the element, emitting an indent if we're on a new line. - this.emitJavascript(emitNode, startLine); - - if (i < (n - 1)) { - // If the next element start on a different line than this element ended on, - // then we want to start on a newline. Emit the comma with a newline. - // Otherwise, emit the comma with the space. - startLine = preserveNewLines && !this.isOnSameLine(end(emitNode, text), start(list[i + 1], text)); - if (startLine) { - this.writeLineToOutput(","); - } - else { - this.writeToOutput(", "); - } - } - } - - if (preserveNewLines) { - // We're done with all the elements. Return the indent back to where it was. - this.indenter.decreaseIndent(); - } - - // If the last element isn't on the same line as the parent, then emit a newline - // after the last element and emit our indent so the list's terminator will be - // on the right line. Otherwise, emit the buffer string between the last value - // and the terminator. - if (preserveNewLines && !this.isOnSameLine(end(parent, text), end(list[list.length - 1], text))) { - this.writeLineToOutput(""); - this.emitIndent(); - } - else { - this.writeToOutput(buffer); - } - } - - public emitList(list: T[], useNewLineSeparator = true, startInclusive = 0, endExclusive = list.length) { - if (list === null) { - return; - } - - this.emitComments(list, true); - var lastEmittedNode: ISyntaxElement = null; - - for (var i = startInclusive; i < endExclusive; i++) { - var node = list[i]; - - if (this.shouldEmit(node)) { - this.emitSpaceBetweenConstructs(lastEmittedNode, node); - - this.emitJavascript(node, true); - if (useNewLineSeparator) { - this.writeLineToOutput(""); - } - - lastEmittedNode = node; - } - } - - this.emitComments(list, false); - } - - public emitSeparatedList(list: T[], useNewLineSeparator = true, startInclusive = 0, endExclusive = list.length) { - if (list === null) { - return; - } - - this.emitComments(list, true); - var lastEmittedNode: ISyntaxElement = null; - - for (var i = startInclusive; i < endExclusive; i++) { - var node = list[i]; - - if (this.shouldEmit(node)) { - this.emitSpaceBetweenConstructs(lastEmittedNode, node); - - this.emitJavascript(node, true); - if (useNewLineSeparator) { - this.writeLineToOutput(""); - } - - lastEmittedNode = node; - } - } - - this.emitComments(list, false); - } - - private isDirectivePrologueElement(node: ISyntaxElement) { - if (node.kind() === SyntaxKind.ExpressionStatement) { - var exprStatement = node; - return exprStatement.expression.kind() === SyntaxKind.StringLiteral; - } - - return false; - } - - // If these two constructs had more than one line between them originally, then emit at - // least one blank line between them. - public emitSpaceBetweenConstructs(node1: ISyntaxElement, node2: ISyntaxElement): void { - if (node1 === null || node2 === null) { - return; - } - - var text = this.text(); - if (start(node1, text) === -1 || end(node1, text) === -1 || start(node2, text) === -1 || end(node2, text) === -1) { - return; - } - - var lineMap = this.document.lineMap(); - var node1EndLine = lineMap.getLineNumberFromPosition(end(node1, text)); - var node2StartLine = lineMap.getLineNumberFromPosition(start(node2, text)); - - if ((node2StartLine - node1EndLine) > 1) { - this.writeLineToOutput("", /*force:*/ true); - } - } - - // We consider a sequence of comments to be a detached from an ast if there are no blank lines - // between them, and there is a blank line after the last one and the node they're attached - // to. - private getDetachedComments(element: ISyntaxElement): Comment[] { - var text = this.text(); - var preComments = TypeScript.ASTHelpers.preComments(element, text); - if (preComments) { - var lineMap = this.document.lineMap(); - - var detachedComments: Comment[] = []; - var lastComment: Comment = null; - - for (var i = 0, n = preComments.length; i < n; i++) { - var comment = preComments[i]; - - if (lastComment) { - var lastCommentLine = lineMap.getLineNumberFromPosition(lastComment.end()); - var commentLine = lineMap.getLineNumberFromPosition(comment.start()); - - if (commentLine >= lastCommentLine + 2) { - // There was a blank line between the last comment and this comment. This - // comment is not part of the copyright comments. Return what we have so - // far. - return detachedComments; - } - } - - detachedComments.push(comment); - lastComment = comment; - } - - // All comments look like they could have been part of the copyright header. Make - // sure there is at least one blank line between it and the node. If not, it's not - // a copyright header. - var lastCommentLine = lineMap.getLineNumberFromPosition(ArrayUtilities.last(detachedComments).end()); - var astLine = lineMap.getLineNumberFromPosition(start(element, text)); - if (astLine >= lastCommentLine + 2) { - return detachedComments; - } - } - - // No usable copyright comments found. - return []; - } - - private emitPossibleCopyrightHeaders(script: SourceUnitSyntax): void { - this.emitDetachedComments(script.moduleElements); - } - - private emitDetachedComments(list: ISyntaxNodeOrToken[]): void { - if (list.length > 0) { - var firstElement = childAt(list, 0); - - this.detachedCommentsElement = firstElement; - this.emitCommentsArray(this.getDetachedComments(this.detachedCommentsElement), /*trailing:*/ false); - } - } - - public emitScriptElements(sourceUnit: SourceUnitSyntax) { - var list = sourceUnit.moduleElements; - - this.emitPossibleCopyrightHeaders(sourceUnit); - - // First, emit all the prologue elements. - for (var i = 0, n = list.length; i < n; i++) { - var node = list[i]; - - if (!this.isDirectivePrologueElement(node)) { - break; - } - - this.emitJavascript(node, true); - this.writeLineToOutput(""); - } - - // Now emit __extends or a _this capture if necessary. - this.emitPrologue(sourceUnit); - - var isExternalModule = this.document.syntaxTree().isExternalModule(); - var isNonElidedExternalModule = isExternalModule && !ASTHelpers.scriptIsElided(sourceUnit); - if (isNonElidedExternalModule) { - this.recordSourceMappingStart(sourceUnit); - - if (this.emitOptions.compilationSettings().moduleGenTarget() === ModuleGenTarget.Asynchronous) { // AMD - var dependencyList = "[\"require\", \"exports\""; - var importList = "require, exports"; - - var importAndDependencyList = this.getModuleImportAndDependencyList(sourceUnit); - importList += importAndDependencyList.importList; - dependencyList += importAndDependencyList.dependencyList + "]"; - - this.writeLineToOutput("define(" + dependencyList + "," + " function(" + importList + ") {"); - } - } - - if (isExternalModule) { - var temp = this.setContainer(EmitContainer.DynamicModule); - - var svModuleName = this.moduleName; - this.moduleName = syntaxTree(sourceUnit).fileName(); - if (TypeScript.isTSFile(this.moduleName)) { - this.moduleName = this.moduleName.substring(0, this.moduleName.length - ".ts".length); - } - - // if the external module has an "export =" identifier, we'll - // set it in the ExportAssignment emit method - this.setExportAssignment(null); - - if(this.emitOptions.compilationSettings().moduleGenTarget() === ModuleGenTarget.Asynchronous) { - this.indenter.increaseIndent(); - } - - var externalModule = this.semanticInfoChain.getDeclForAST(this.document.sourceUnit()); - - if (hasFlag(externalModule.flags, PullElementFlags.MustCaptureThis)) { - this.writeCaptureThisStatement(sourceUnit); - } - - this.pushDecl(externalModule); - } - - this.emitList(list, /*useNewLineSeparator:*/ true, /*startInclusive:*/ i, /*endExclusive:*/ n); - - if (isExternalModule) { - if (this.emitOptions.compilationSettings().moduleGenTarget() === ModuleGenTarget.Asynchronous) { - this.indenter.decreaseIndent(); - } - - if (isNonElidedExternalModule) { - var exportAssignment = this.getExportAssignment(); - var exportAssignmentIdentifierText = exportAssignment ? exportAssignment.identifier.text() : null; - var exportAssignmentValueSymbol = (externalModule.getSymbol(this.semanticInfoChain)).getExportAssignedValueSymbol(); - - if (this.emitOptions.compilationSettings().moduleGenTarget() === ModuleGenTarget.Asynchronous) { // AMD - if (exportAssignmentIdentifierText && exportAssignmentValueSymbol && !(exportAssignmentValueSymbol.kind & PullElementKind.SomeTypeReference)) { - // indent was decreased for AMD above - this.indenter.increaseIndent(); - this.emitIndent(); - this.writeToOutputWithSourceMapRecord("return " + exportAssignmentIdentifierText, exportAssignment); - this.writeLineToOutput(";"); - this.indenter.decreaseIndent(); - } - this.writeToOutput("});"); - } - else if (exportAssignmentIdentifierText && exportAssignmentValueSymbol && !(exportAssignmentValueSymbol.kind & PullElementKind.SomeTypeReference)) { - this.emitIndent(); - this.writeToOutputWithSourceMapRecord("module.exports = " + exportAssignmentIdentifierText, exportAssignment); - this.writeToOutput(";"); - } - - this.recordSourceMappingEnd(sourceUnit); - this.writeLineToOutput(""); - } - - this.setContainer(temp); - this.moduleName = svModuleName; - this.popDecl(externalModule); - } - } - - public emitConstructorStatements(funcDecl: ConstructorDeclarationSyntax) { - var list = funcDecl.block.statements; - - if (list === null) { - return; - } - - this.emitComments(list, true); - - var emitPropertyAssignmentsAfterSuperCall = ASTHelpers.getExtendsHeritageClause(this.thisClassNode.heritageClauses) !== null; - var propertyAssignmentIndex = emitPropertyAssignmentsAfterSuperCall ? 1 : 0; - var lastEmittedNode: ISyntaxElement = null; - - for (var i = 0, n = list.length; i < n; i++) { - // In some circumstances, class property initializers must be emitted immediately after the 'super' constructor - // call which, in these cases, must be the first statement in the constructor body - if (i === propertyAssignmentIndex) { - this.emitParameterPropertyAndMemberVariableAssignments(); - } - - var node = list[i]; - - if (this.shouldEmit(node)) { - this.emitSpaceBetweenConstructs(lastEmittedNode, node); - - this.emitJavascript(node, true); - this.writeLineToOutput(""); - - lastEmittedNode = node; - } - } - - if (i === propertyAssignmentIndex) { - this.emitParameterPropertyAndMemberVariableAssignments(); - } - - this.emitComments(list, false); - } - - // tokenId is the id the preceding token - public emitJavascript(ast: ISyntaxElement, startLine: boolean) { - if (ast === null) { - return; - } - - if (startLine && - this.indenter.indentAmt > 0) { - - this.emitIndent(); - } - - this.emit(ast); - } - - public emitAccessorMemberDeclaration(funcDecl: ISyntaxElement, name: ISyntaxToken, className: string, isProto: boolean) { - if (funcDecl.kind() !== SyntaxKind.GetAccessor) { - var accessorSymbol = PullHelpers.getAccessorSymbol(funcDecl, this.semanticInfoChain); - if (accessorSymbol.getGetter()) { - return; - } - } - - this.emitIndent(); - this.recordSourceMappingStart(funcDecl); - - this.writeToOutput("Object.defineProperty(" + className); - if (isProto) { - this.writeToOutput(".prototype, "); - } - else { - this.writeToOutput(", "); - } - - var functionName = name.text(); - if (isQuoted(functionName)) { - this.writeToOutput(functionName); - } - else { - this.writeToOutput('"' + functionName + '"'); - } - - this.writeLineToOutput(", {"); - - this.indenter.increaseIndent(); - - var accessors = PullHelpers.getGetterAndSetterFunction(funcDecl, this.semanticInfoChain); - if (accessors.getter) { - this.emitIndent(); - this.recordSourceMappingStart(accessors.getter); - this.emitComments(accessors.getter, true); - this.writeToOutput("get: "); - this.emitAccessorBody(accessors.getter, accessors.getter.callSignature.parameterList, accessors.getter.block); - this.writeLineToOutput(","); - } - - if (accessors.setter) { - this.emitIndent(); - this.recordSourceMappingStart(accessors.setter); - this.emitComments(accessors.setter, true); - this.writeToOutput("set: "); - this.emitAccessorBody(accessors.setter, accessors.setter.callSignature.parameterList, accessors.setter.block); - this.writeLineToOutput(","); - } - - this.emitIndent(); - this.writeLineToOutput("enumerable: true,"); - this.emitIndent(); - this.writeLineToOutput("configurable: true"); - this.indenter.decreaseIndent(); - this.emitIndent(); - this.writeLineToOutput("});"); - this.recordSourceMappingEnd(funcDecl); - } - - private emitAccessorBody(funcDecl: ISyntaxElement, parameterList: ParameterListSyntax, block: BlockSyntax): void { - var pullDecl = this.semanticInfoChain.getDeclForAST(funcDecl); - this.pushDecl(pullDecl); - - this.recordSourceMappingStart(funcDecl); - this.writeToOutput("function "); - this.emitParameterList(parameterList); - - var parameters = parameterList.parameters; - this.emitFunctionBodyStatements(null, funcDecl, parameters, block, /*bodyExpression:*/ null); - - this.recordSourceMappingEnd(funcDecl); - - // The extra call is to make sure the caller's funcDecl end is recorded, since caller wont be able to record it - this.recordSourceMappingEnd(funcDecl); - this.popDecl(pullDecl); - } - - public emitClass(classDecl: ClassDeclarationSyntax) { - var pullDecl = this.semanticInfoChain.getDeclForAST(classDecl); - this.pushDecl(pullDecl); - - var svClassNode = this.thisClassNode; - this.thisClassNode = classDecl; - var className = classDecl.identifier.text(); - this.emitComments(classDecl, true); - var temp = this.setContainer(EmitContainer.Class); - - this.recordSourceMappingStart(classDecl); - this.writeToOutput("var " + className); - - var hasBaseClass = ASTHelpers.getExtendsHeritageClause(classDecl.heritageClauses) !== null; - var baseTypeReference: ISyntaxElement = null; - var varDecl: VariableDeclaratorSyntax = null; - - if (hasBaseClass) { - this.writeLineToOutput(" = (function (_super) {"); - } - else { - this.writeLineToOutput(" = (function () {"); - } - - this.recordSourceMappingNameStart(className); - this.indenter.increaseIndent(); - - if (hasBaseClass) { - baseTypeReference = ASTHelpers.getExtendsHeritageClause(classDecl.heritageClauses).typeNames[0]; - this.emitIndent(); - this.writeToOutputWithSourceMapRecord("__extends(" + className + ", _super)", baseTypeReference); - this.writeLineToOutput(";"); - } - - this.emitIndent(); - - var constrDecl = getLastConstructor(classDecl); - - // output constructor - if (constrDecl) { - // declared constructor - this.emit(constrDecl); - this.writeLineToOutput(""); - } - else { - this.recordSourceMappingStart(classDecl); - // default constructor - this.indenter.increaseIndent(); - this.writeLineToOutput("function " + classDecl.identifier.text() + "() {"); - this.recordSourceMappingNameStart("constructor"); - if (hasBaseClass) { - this.emitIndent(); - this.writeToOutputWithSourceMapRecord("_super.apply(this, arguments)", baseTypeReference); - this.writeLineToOutput(";"); - } - - if (this.shouldCaptureThis(classDecl)) { - this.writeCaptureThisStatement(classDecl); - } - - this.emitParameterPropertyAndMemberVariableAssignments(); - - this.indenter.decreaseIndent(); - this.emitIndent(); - this.writeToken(classDecl.closeBraceToken); - this.writeLineToOutput(""); - - this.recordSourceMappingNameEnd(); - this.recordSourceMappingEnd(classDecl); - } - - this.emitClassMembers(classDecl); - - this.emitIndent(); - this.writeToOutputWithSourceMapRecord("return " + className + ";", classDecl.closeBraceToken); - this.writeLineToOutput(""); - this.indenter.decreaseIndent(); - this.emitIndent(); - this.writeToken(classDecl.closeBraceToken); - this.recordSourceMappingNameEnd(); - this.recordSourceMappingStart(classDecl); - this.writeToOutput(")("); - if (hasBaseClass) { - this.emitJavascript(baseTypeReference, /*startLine:*/ false); - } - this.writeToOutput(");"); - this.recordSourceMappingEnd(classDecl); - - if ((temp === EmitContainer.Module || temp === EmitContainer.DynamicModule) && hasFlag(pullDecl.flags, PullElementFlags.Exported)) { - this.writeLineToOutput(""); - this.emitIndent(); - var modName = temp === EmitContainer.Module ? this.moduleName : "exports"; - this.writeToOutputWithSourceMapRecord(modName + "." + className + " = " + className + ";", classDecl); - } - - this.recordSourceMappingEnd(classDecl); - this.emitComments(classDecl, false); - this.setContainer(temp); - this.thisClassNode = svClassNode; - - this.popDecl(pullDecl); - } - - private emitClassMembers(classDecl: ClassDeclarationSyntax): void { - // First, emit all the functions. - var lastEmittedMember: ISyntaxElement = null; - - for (var i = 0, n = classDecl.classElements.length; i < n; i++) { - var memberDecl = classDecl.classElements[i]; - - if (memberDecl.kind() === SyntaxKind.GetAccessor) { - this.emitSpaceBetweenConstructs(lastEmittedMember, memberDecl); - var getter = memberDecl; - this.emitAccessorMemberDeclaration(getter, getter.propertyName, classDecl.identifier.text(), - !hasModifier(getter.modifiers, PullElementFlags.Static)); - lastEmittedMember = memberDecl; - } - else if (memberDecl.kind() === SyntaxKind.SetAccessor) { - this.emitSpaceBetweenConstructs(lastEmittedMember, memberDecl); - var setter = memberDecl; - this.emitAccessorMemberDeclaration(setter, setter.propertyName, classDecl.identifier.text(), - !hasModifier(setter.modifiers, PullElementFlags.Static)); - lastEmittedMember = memberDecl; - } - else if (memberDecl.kind() === SyntaxKind.MemberFunctionDeclaration) { - - var memberFunction = memberDecl; - - if (memberFunction.block) { - this.emitSpaceBetweenConstructs(lastEmittedMember, memberDecl); - - this.emitClassMemberFunctionDeclaration(classDecl, memberFunction); - lastEmittedMember = memberDecl; - } - } - } - - // Now emit all the statics. - for (var i = 0, n = classDecl.classElements.length; i < n; i++) { - var memberDecl = classDecl.classElements[i]; - - if (memberDecl.kind() === SyntaxKind.MemberVariableDeclaration) { - var varDecl = memberDecl; - - if (hasModifier(varDecl.modifiers, PullElementFlags.Static) && varDecl.variableDeclarator.equalsValueClause) { - this.emitSpaceBetweenConstructs(lastEmittedMember, varDecl); - - this.emitIndent(); - this.recordSourceMappingStart(varDecl); - - this.emitComments(varDecl, true); - var varDeclName = varDecl.variableDeclarator.propertyName.text(); - if (isQuoted(varDeclName) || varDecl.variableDeclarator.propertyName.kind() !== SyntaxKind.IdentifierName) { - this.writeToOutput(classDecl.identifier.text() + "[" + varDeclName + "]"); - } - else { - this.writeToOutput(classDecl.identifier.text() + "." + varDeclName); - } - - this.emit(varDecl.variableDeclarator.equalsValueClause); - - this.recordSourceMappingEnd(varDecl); - this.writeLineToOutput(";"); - - lastEmittedMember = varDecl; - } - } - } - } - - private emitClassMemberFunctionDeclaration(classDecl: ClassDeclarationSyntax, funcDecl: MemberFunctionDeclarationSyntax): void { - this.emitIndent(); - this.recordSourceMappingStart(funcDecl); - this.emitComments(funcDecl, true); - var functionName = funcDecl.propertyName.text(); - - this.writeToOutput(classDecl.identifier.text()); - - if (!hasModifier(funcDecl.modifiers, PullElementFlags.Static)) { - this.writeToOutput(".prototype"); - } - - if (isQuoted(functionName) || funcDecl.propertyName.kind() !== SyntaxKind.IdentifierName) { - this.writeToOutput("[" + functionName + "] = "); - } - else { - this.writeToOutput("." + functionName + " = "); - } - - var pullDecl = this.semanticInfoChain.getDeclForAST(funcDecl); - this.pushDecl(pullDecl); - - this.recordSourceMappingStart(funcDecl); - this.writeToOutput("function "); - - this.emitParameterList(funcDecl.callSignature.parameterList); - - var parameters = funcDecl.callSignature.parameterList.parameters; - this.emitFunctionBodyStatements(funcDecl.propertyName.text(), funcDecl, parameters, funcDecl.block, /*bodyExpression:*/ null); - - this.recordSourceMappingEnd(funcDecl); - - this.emitComments(funcDecl, false); - - this.recordSourceMappingEnd(funcDecl); - this.popDecl(pullDecl); - - this.writeLineToOutput(";"); - } - - private requiresExtendsBlock(moduleElements: IModuleElementSyntax[]): boolean { - for (var i = 0, n = moduleElements.length; i < n; i++) { - var moduleElement = moduleElements[i]; - - if (moduleElement.kind() === SyntaxKind.ModuleDeclaration) { - var moduleAST = moduleElement; - - if (!hasModifier(moduleAST.modifiers, PullElementFlags.Ambient) && this.requiresExtendsBlock(moduleAST.moduleElements)) { - return true; - } - } - else if (moduleElement.kind() === SyntaxKind.ClassDeclaration) { - var classDeclaration = moduleElement; - - if (!hasModifier(classDeclaration.modifiers, PullElementFlags.Ambient) && ASTHelpers.getExtendsHeritageClause(classDeclaration.heritageClauses) !== null) { - return true; - } - } - } - - return false; - } - - public emitPrologue(sourceUnit: SourceUnitSyntax) { - if (!this.extendsPrologueEmitted) { - if (this.requiresExtendsBlock(sourceUnit.moduleElements)) { - this.extendsPrologueEmitted = true; - this.writeLineToOutput("var __extends = this.__extends || function (d, b) {"); - this.writeLineToOutput(" for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p];"); - this.writeLineToOutput(" function __() { this.constructor = d; }"); - this.writeLineToOutput(" __.prototype = b.prototype;"); - this.writeLineToOutput(" d.prototype = new __();"); - this.writeLineToOutput("};"); - } - } - - if (!this.globalThisCapturePrologueEmitted) { - if (this.shouldCaptureThis(sourceUnit)) { - this.globalThisCapturePrologueEmitted = true; - this.writeLineToOutput(this.captureThisStmtString); - } - } - } - - public emitThis() { - if (!this.inWithBlock && this.inArrowFunction) { - this.writeToOutput("_this"); - } - else { - this.writeToOutput("this"); - } - } - - public emitBlockOrStatement(node: ISyntaxElement): void { - if (node.kind() === SyntaxKind.Block) { - this.emit(node); - } - else { - this.writeLineToOutput(""); - this.indenter.increaseIndent(); - this.emitJavascript(node, true); - this.indenter.decreaseIndent(); - } - } - - public emitLiteralExpression(expression: ISyntaxToken): void { - switch (expression.kind()) { - case SyntaxKind.NullKeyword: - this.writeToken(expression); - break; - case SyntaxKind.FalseKeyword: - this.writeToken(expression); - break; - case SyntaxKind.TrueKeyword: - this.writeToken(expression); - break; - default: - throw Errors.abstract(); - } - } - - public emitThisExpression(expression: ISyntaxToken): void { - if (!this.inWithBlock && this.inArrowFunction) { - this.writeToOutputWithSourceMapRecord("_this", expression); - } - else { - this.writeToken(expression); - } - } - - public emitSuperExpression(expression: ISyntaxToken): void { - if (PullHelpers.isInStaticMemberContext(expression, this.semanticInfoChain)) { - this.writeToOutputWithSourceMapRecord("_super", expression); - } - else { - this.writeToOutputWithSourceMapRecord("_super.prototype", expression); - } - } - - private hasTrailingComment(token: ISyntaxToken) { - return token.hasTrailingTrivia() && token.trailingTrivia().hasComment(); - } - - public emitParenthesizedExpression(parenthesizedExpression: ParenthesizedExpressionSyntax): void { - var omitParentheses = false; - - if (parenthesizedExpression.expression.kind() === SyntaxKind.CastExpression && !this.hasTrailingComment(parenthesizedExpression.openParenToken)) { - var castedExpression = (parenthesizedExpression.expression).expression; - - // Make sure we consider all nested cast expressions, e.g.: - // (-A).x; - while (castedExpression.kind() == SyntaxKind.CastExpression) { - castedExpression = (castedExpression).expression; - } - - // We have an expression of the form: (SubExpr) - // Emitting this as (SubExpr) is really not desirable. Just emit the subexpr as is. - // We cannot generalize this rule however, as omitting the parentheses could cause change in the semantics of the generated - // code if the casted expression has a lower precedence than the rest of the expression, e.g.: - // (new A).foo should be emitted as (new A).foo and not new A.foo - // (typeof A).toString() should be emitted as (typeof A).toString() and not typeof A.toString() - // (function foo() { })() should be emitted as an IIF (function foo(){})() and not declaration function foo(){} () - // Parenthesis can be safelly removed from: - // Literals - // MemberAccessExpressions - // ElementAccessExpressions - // InvocationExpression, only if they are not part of an object creation (new) expression; e.g.: - // new (A()) removing the parentheses would result in calling A as a constructor, instead of calling the - // result of the function invocation A() as a constructor - switch (castedExpression.kind()) { - case SyntaxKind.ParenthesizedExpression: - case SyntaxKind.IdentifierName: - case SyntaxKind.NullKeyword: - case SyntaxKind.ThisKeyword: - case SyntaxKind.StringLiteral: - case SyntaxKind.NumericLiteral: - case SyntaxKind.RegularExpressionLiteral: - case SyntaxKind.TrueKeyword: - case SyntaxKind.FalseKeyword: - case SyntaxKind.ArrayLiteralExpression: - case SyntaxKind.ObjectLiteralExpression: - case SyntaxKind.MemberAccessExpression: - case SyntaxKind.ElementAccessExpression: - omitParentheses = true; - break; - - case SyntaxKind.InvocationExpression: - if (parenthesizedExpression.parent.kind() !== SyntaxKind.ObjectCreationExpression) { - omitParentheses = true; - } - - break; - } - } - - if (omitParentheses) { - this.emit(parenthesizedExpression.expression); - } - else { - this.recordSourceMappingStart(parenthesizedExpression); - this.writeToken(parenthesizedExpression.openParenToken); - this.emitCommentsArray(ASTHelpers.convertTokenTrailingComments(parenthesizedExpression.openParenToken, this.text()), /*trailing:*/ false); - this.emit(parenthesizedExpression.expression); - this.writeToken(parenthesizedExpression.closeParenToken); - this.recordSourceMappingEnd(parenthesizedExpression); - } - } - - public emitCastExpression(expression: CastExpressionSyntax): void { - this.emit(expression.expression); - } - - public emitPrefixUnaryExpression(expression: PrefixUnaryExpressionSyntax): void { - var nodeType = expression.kind(); - - this.recordSourceMappingStart(expression); - switch (nodeType) { - case SyntaxKind.LogicalNotExpression: - this.writeToken(expression.operatorToken); - this.emit(expression.operand); - break; - case SyntaxKind.BitwiseNotExpression: - this.writeToken(expression.operatorToken); - this.emit(expression.operand); - break; - case SyntaxKind.NegateExpression: - this.writeToken(expression.operatorToken); - if (expression.operand.kind() === SyntaxKind.NegateExpression || expression.operand.kind() === SyntaxKind.PreDecrementExpression) { - this.writeToOutput(" "); - } - this.emit(expression.operand); - break; - case SyntaxKind.PlusExpression: - this.writeToken(expression.operatorToken); - if (expression.operand.kind() === SyntaxKind.PlusExpression || expression.operand.kind() === SyntaxKind.PreIncrementExpression) { - this.writeToOutput(" "); - } - this.emit(expression.operand); - break; - case SyntaxKind.PreIncrementExpression: - this.writeToOutputWithSourceMapRecord("++", expression.operatorToken); - this.emit(expression.operand); - break; - case SyntaxKind.PreDecrementExpression: - this.writeToOutputWithSourceMapRecord("--", expression.operatorToken); - this.emit(expression.operand); - break; - default: - throw Errors.abstract(); - } - - this.recordSourceMappingEnd(expression); - } - - public emitPostfixUnaryExpression(expression: PostfixUnaryExpressionSyntax): void { - var nodeType = expression.kind(); - - this.recordSourceMappingStart(expression); - switch (nodeType) { - case SyntaxKind.PostIncrementExpression: - this.emit(expression.operand); - this.writeToOutputWithSourceMapRecord("++", expression.operatorToken); - break; - case SyntaxKind.PostDecrementExpression: - this.emit(expression.operand); - this.writeToOutputWithSourceMapRecord("--", expression.operatorToken); - break; - default: - throw Errors.abstract(); - } - - this.recordSourceMappingEnd(expression); - } - - public emitTypeOfExpression(expression: TypeOfExpressionSyntax): void { - this.recordSourceMappingStart(expression); - this.writeToken(expression.typeOfKeyword); - this.writeToOutput(" "); - this.emit(expression.expression); - this.recordSourceMappingEnd(expression); - } - - public emitDeleteExpression(expression: DeleteExpressionSyntax): void { - this.recordSourceMappingStart(expression); - this.writeToken(expression.deleteKeyword); - this.writeToOutput(" "); - this.emit(expression.expression); - this.recordSourceMappingEnd(expression); - } - - public emitVoidExpression(expression: VoidExpressionSyntax): void { - this.recordSourceMappingStart(expression); - this.writeToken(expression.voidKeyword); - this.writeToOutput(" "); - this.emit(expression.expression); - this.recordSourceMappingEnd(expression); - } - - private canEmitDottedNameMemberAccessExpression(expression: MemberAccessExpressionSyntax) { - var memberExpressionNodeType = expression.expression.kind(); - - // If the memberAccess is of Name or another member access, we could potentially emit the symbol using the this memberAccessSymol - if (memberExpressionNodeType === SyntaxKind.IdentifierName || memberExpressionNodeType == SyntaxKind.MemberAccessExpression) { - var memberAccessSymbol = this.getSymbolForEmit(expression).symbol; - var memberAccessExpressionSymbol = this.getSymbolForEmit(expression.expression).symbol; - if (memberAccessSymbol && memberAccessExpressionSymbol // We have symbols resolved for this expression and access - && !this.semanticInfoChain.getAliasSymbolForAST(expression.expression) // The access is not off alias - && (PullHelpers.symbolIsModule(memberAccessExpressionSymbol) || memberAccessExpressionSymbol.kind === PullElementKind.Enum || - memberAccessExpressionSymbol.anyDeclHasFlag(PullElementFlags.InitializedModule | PullElementFlags.Enum))) { // container is module - - // If the memberAccess is in the context of the container, we could use the symbol to emit this expression - var memberAccessSymbolKind = memberAccessSymbol.kind; - if (memberAccessSymbolKind === PullElementKind.Property - || memberAccessSymbolKind === PullElementKind.EnumMember - || (memberAccessSymbol.anyDeclHasFlag(PullElementFlags.Exported) && memberAccessSymbolKind === PullElementKind.Variable && !memberAccessSymbol.anyDeclHasFlag(PullElementFlags.InitializedModule | PullElementFlags.Enum)) - || ((memberAccessSymbol.anyDeclHasFlag(PullElementFlags.Exported) && !this.symbolIsUsedInItsEnclosingContainer(memberAccessSymbol)))) { - - // If the expression is member access, we need to verify it as well - if (memberExpressionNodeType === SyntaxKind.MemberAccessExpression) { - return this.canEmitDottedNameMemberAccessExpression(expression.expression); - } - - return true; - } - } - } - - return false; - } - - // Emit the member access expression using the declPath - private emitDottedNameMemberAccessExpression(expression: MemberAccessExpressionSyntax) { - this.recordSourceMappingStart(expression); - if (expression.expression.kind() === SyntaxKind.MemberAccessExpression) { - // Emit the dotted name access expression - this.emitDottedNameMemberAccessExpressionRecurse(expression.expression); - } - else { // Name - this.emitName(expression.expression, /*addThis*/ true); - } - - this.writeToken(expression.dotToken); - this.emitName(expression.name, /*addThis*/ false); - - this.recordSourceMappingEnd(expression); - } - - // Set the right indices for the recursive member access expression before emitting it using the decl path - private emitDottedNameMemberAccessExpressionRecurse(expression: MemberAccessExpressionSyntax) { - this.emitComments(expression, true); - this.emitDottedNameMemberAccessExpression(expression); - this.emitComments(expression, false); - } - - public emitMemberAccessExpression(expression: MemberAccessExpressionSyntax): void { - if (!this.tryEmitConstant(expression)) { - // If the expression is dotted name of the modules, emit it using decl path so the name could be resolved correctly. - if (this.canEmitDottedNameMemberAccessExpression(expression)) { - this.emitDottedNameMemberAccessExpression(expression); - } - else { - this.recordSourceMappingStart(expression); - this.emit(expression.expression); - this.writeToken(expression.dotToken); - this.emitName(expression.name, false); - this.recordSourceMappingEnd(expression); - } - } - } - - public emitQualifiedName(name: QualifiedNameSyntax): void { - this.recordSourceMappingStart(name); - - this.emit(name.left); - this.writeToken(name.dotToken); - this.emitName(name.right, false); - - this.recordSourceMappingEnd(name); - } - - public emitBinaryExpression(expression: BinaryExpressionSyntax): void { - this.recordSourceMappingStart(expression); - switch (expression.kind()) { - case SyntaxKind.CommaExpression: - this.emit(expression.left); - this.writeToken(expression.operatorToken); - this.writeToOutput(" "); - this.emit(expression.right); - break; - default: - { - this.emit(expression.left); - var binOp = SyntaxFacts.getText(SyntaxFacts.getOperatorTokenFromBinaryExpression(expression.kind())); - this.writeToOutput(" "); - this.writeToOutputWithSourceMapRecord(binOp, expression.operatorToken); - this.writeToOutput(" "); - this.emit(expression.right); - } - } - this.recordSourceMappingEnd(expression); - } - - public emitSimplePropertyAssignment(property: SimplePropertyAssignmentSyntax): void { - this.recordSourceMappingStart(property); - this.emit(property.propertyName); - - this.writeToken(property.colonToken); - this.writeToOutput(" "); - this.emitCommentsArray(ASTHelpers.convertTokenTrailingComments(property.colonToken, this.text()), /*trailing:*/ true, /*noLeadingSpace:*/ true); - - this.emit(property.expression); - this.recordSourceMappingEnd(property); - } - - public emitFunctionPropertyAssignment(funcProp: FunctionPropertyAssignmentSyntax): void { - this.recordSourceMappingStart(funcProp); - - this.emit(funcProp.propertyName); - this.writeToOutput(": "); - - var pullFunctionDecl = this.semanticInfoChain.getDeclForAST(funcProp); - - var savedInArrowFunction = this.inArrowFunction; - this.inArrowFunction = false; - - var temp = this.setContainer(EmitContainer.Function); - var funcName = funcProp.propertyName; - - var pullDecl = this.semanticInfoChain.getDeclForAST(funcProp); - this.pushDecl(pullDecl); - - this.recordSourceMappingStart(funcProp); - this.writeToOutput("function "); - - //this.recordSourceMappingStart(funcProp.propertyName); - //this.writeToOutput(funcProp.propertyName.actualText); - //this.recordSourceMappingEnd(funcProp.propertyName); - - this.emitParameterList(funcProp.callSignature.parameterList); - - this.emitFunctionBodyStatements(funcProp.propertyName.text(), funcProp, - funcProp.callSignature.parameterList.parameters, funcProp.block, /*bodyExpression:*/ null); - - this.recordSourceMappingEnd(funcProp); - - // The extra call is to make sure the caller's funcDecl end is recorded, since caller wont be able to record it - this.recordSourceMappingEnd(funcProp); - - this.emitComments(funcProp, false); - - this.popDecl(pullDecl); - - this.setContainer(temp); - this.inArrowFunction = savedInArrowFunction; - } - - public emitConditionalExpression(expression: ConditionalExpressionSyntax): void { - this.emit(expression.condition); - this.writeToOutput(" "); - this.writeToken(expression.questionToken); - this.writeToOutput(" "); - this.emit(expression.whenTrue); - this.writeToOutput(" "); - this.writeToken(expression.colonToken); - this.writeToOutput(" "); - this.emit(expression.whenFalse); - } - - public emitThrowStatement(statement: ThrowStatementSyntax): void { - this.recordSourceMappingStart(statement); - this.writeToken(statement.throwKeyword); - this.writeToOutput(" "); - this.emit(statement.expression); - this.writeToOutputWithSourceMapRecord(";", statement.semicolonToken); - this.recordSourceMappingEnd(statement); - } - - public emitExpressionStatement(statement: ExpressionStatementSyntax): void { - var isArrowExpression = statement.expression.kind() === SyntaxKind.SimpleArrowFunctionExpression || statement.expression.kind() === SyntaxKind.ParenthesizedArrowFunctionExpression; - - this.recordSourceMappingStart(statement); - if (isArrowExpression) { - this.writeToOutput("("); - } - - this.emit(statement.expression); - - if (isArrowExpression) { - this.writeToOutput(")"); - } - - this.writeToOutputWithSourceMapRecord(";", statement.semicolonToken); - this.recordSourceMappingEnd(statement); - } - - public emitLabeledStatement(statement: LabeledStatementSyntax): void { - this.writeToOutputWithSourceMapRecord(statement.identifier.text(), statement.identifier); - this.writeToken(statement.colonToken); - this.writeLineToOutput(""); - this.emitJavascript(statement.statement, /*startLine:*/ true); - } - - public emitBlock(block: BlockSyntax): void { - this.recordSourceMappingStart(block); - this.writeLineToOutput(" {"); - this.indenter.increaseIndent(); - if (block.statements) { - this.emitList(block.statements); - } - this.emitCommentsArray(ASTHelpers.convertTokenLeadingComments(block.closeBraceToken, this.text()), /*trailing:*/ false); - this.indenter.decreaseIndent(); - this.emitIndent(); - this.writeToken(block.closeBraceToken); - this.recordSourceMappingEnd(block); - } - - public emitBreakStatement(jump: BreakStatementSyntax): void { - this.recordSourceMappingStart(jump); - this.writeToken(jump.breakKeyword); - - if (jump.identifier) { - this.writeToOutput(" "); - this.writeToOutputWithSourceMapRecord(jump.identifier.text(), jump.identifier); - } - - this.writeToOutputWithSourceMapRecord(";", jump.semicolonToken); - this.recordSourceMappingEnd(jump); - } - - public emitContinueStatement(jump: ContinueStatementSyntax): void { - this.recordSourceMappingStart(jump); - this.writeToken(jump.continueKeyword); - - if (jump.identifier) { - this.writeToOutput(" "); - this.writeToOutputWithSourceMapRecord(jump.identifier.text(), jump.identifier); - } - - this.writeToOutputWithSourceMapRecord(";", jump.semicolonToken); - this.recordSourceMappingEnd(jump); - } - - public emitWhileStatement(statement: WhileStatementSyntax): void { - this.recordSourceMappingStart(statement); - this.writeToken(statement.whileKeyword); - this.writeToOutput(" "); - this.writeToken(statement.openParenToken); - this.emit(statement.condition); - this.writeToken(statement.closeParenToken); - this.emitBlockOrStatement(statement.statement); - this.recordSourceMappingEnd(statement); - } - - public emitDoStatement(statement: DoStatementSyntax): void { - this.recordSourceMappingStart(statement); - this.writeToken(statement.doKeyword); - this.emitBlockOrStatement(statement.statement); - this.writeToOutput(" "); - this.writeToken(statement.whileKeyword); - this.writeToken(statement.openParenToken); - this.emit(statement.condition); - this.writeToken(statement.closeParenToken); - this.writeToOutputWithSourceMapRecord(";", statement.semicolonToken); - this.recordSourceMappingEnd(statement); - } - - public emitIfStatement(statement: IfStatementSyntax): void { - this.recordSourceMappingStart(statement); - this.writeToken(statement.ifKeyword); - this.writeToOutput(" "); - this.writeToken(statement.openParenToken); - this.emit(statement.condition); - this.writeToken(statement.closeParenToken); - - this.emitBlockOrStatement(statement.statement); - - if (statement.elseClause) { - if (statement.statement.kind() !== SyntaxKind.Block) { - this.writeLineToOutput(""); - this.emitIndent(); - } - else { - this.writeToOutput(" "); - } - - this.emit(statement.elseClause); - } - this.recordSourceMappingEnd(statement); - } - - public emitElseClause(elseClause: ElseClauseSyntax): void { - this.writeToken(elseClause.elseKeyword); - if (elseClause.statement.kind() === SyntaxKind.IfStatement) { - this.writeToOutput(" "); - this.emit(elseClause.statement); - } - else { - this.emitBlockOrStatement(elseClause.statement); - } - } - - public emitReturnStatement(statement: ReturnStatementSyntax): void { - this.recordSourceMappingStart(statement); - this.writeToken(statement.returnKeyword); - if (statement.expression) { - this.writeToOutput(" "); - this.emit(statement.expression); - } - - this.writeToOutputWithSourceMapRecord(";", statement.semicolonToken); - this.recordSourceMappingEnd(statement); - } - - public emitForInStatement(statement: ForInStatementSyntax): void { - this.recordSourceMappingStart(statement); - this.writeToken(statement.forKeyword); - this.writeToOutput(" "); - this.writeToken(statement.openParenToken); - - if (statement.left) { - this.emit(statement.left); - } - else { - this.emit(statement.variableDeclaration); - } - this.writeToOutput(" "); - this.writeToken(statement.inKeyword); - this.writeToOutput(" "); - this.emit(statement.expression); - this.writeToken(statement.closeParenToken); - this.emitBlockOrStatement(statement.statement); - this.recordSourceMappingEnd(statement); - } - - public emitForStatement(statement: ForStatementSyntax): void { - this.recordSourceMappingStart(statement); - this.writeToken(statement.forKeyword); - this.writeToOutput(" "); - this.writeToken(statement.openParenToken); - - if (statement.variableDeclaration) { - this.emit(statement.variableDeclaration); - } - else if (statement.initializer) { - this.emit(statement.initializer); - } - - this.writeToken(statement.firstSemicolonToken); - this.writeToOutput(" "); - this.emitJavascript(statement.condition, false); - this.writeToken(statement.secondSemicolonToken); - if (statement.incrementor) { - this.writeToOutput(" "); - this.emitJavascript(statement.incrementor, false); - } - this.writeToken(statement.closeParenToken); - this.emitBlockOrStatement(statement.statement); - this.recordSourceMappingEnd(statement); - } - - public emitWithStatement(statement: WithStatementSyntax): void { - this.recordSourceMappingStart(statement); - this.writeToken(statement.withKeyword); - this.writeToOutput(" "); - this.writeToken(statement.openParenToken); - if (statement.condition) { - this.emit(statement.condition); - } - - this.writeToken(statement.closeParenToken); - var prevInWithBlock = this.inWithBlock; - this.inWithBlock = true; - this.emitBlockOrStatement(statement.statement); - this.inWithBlock = prevInWithBlock; - this.recordSourceMappingEnd(statement); - } - - public emitSwitchStatement(statement: SwitchStatementSyntax): void { - this.recordSourceMappingStart(statement); - this.writeToken(statement.switchKeyword); - this.writeToOutput(" "); - this.writeToken(statement.openParenToken); - this.emit(statement.expression); - this.writeToken(statement.closeParenToken); - this.writeLineToOutput(" {"); - this.indenter.increaseIndent(); - this.emitList(statement.switchClauses, /*useNewLineSeparator:*/ false); - this.indenter.decreaseIndent(); - this.emitIndent(); - this.writeToken(statement.closeBraceToken); - this.recordSourceMappingEnd(statement); - } - - public emitCaseSwitchClause(clause: CaseSwitchClauseSyntax): void { - this.recordSourceMappingStart(clause); - this.writeToken(clause.caseKeyword); - this.writeToOutput(" "); - this.emit(clause.expression); - this.writeToken(clause.colonToken); - - this.emitSwitchClauseBody(clause.colonToken, clause.statements); - this.recordSourceMappingEnd(clause); - } - - private emitSwitchClauseBody(colonToken: ISyntaxToken, body: IStatementSyntax[]): void { - var text = this.text(); - if (body.length === 1 && childAt(body, 0).kind() === SyntaxKind.Block) { - // The case statement was written with curly braces, so emit it with the appropriate formatting - this.emit(childAt(body, 0)); - this.writeLineToOutput(""); - } - else if (body.length === 1 && this.isOnSameLine(end(colonToken, text), start(body[0], text))) { - this.writeToOutput(" "); - this.emit(childAt(body, 0)); - this.writeLineToOutput(""); - } - else { - // No curly braces. Format in the expected way - this.writeLineToOutput(""); - this.indenter.increaseIndent(); - this.emit(body); - this.indenter.decreaseIndent(); - } - } - - public emitDefaultSwitchClause(clause: DefaultSwitchClauseSyntax): void { - this.recordSourceMappingStart(clause); - this.writeToken(clause.defaultKeyword); - this.writeToken(clause.colonToken); - - this.emitSwitchClauseBody(clause.colonToken, clause.statements); - this.recordSourceMappingEnd(clause); - } - - public emitTryStatement(statement: TryStatementSyntax): void { - this.recordSourceMappingStart(statement); - this.writeToken(statement.tryKeyword); - this.writeToOutput(" "); - this.emit(statement.block); - this.emitJavascript(statement.catchClause, false); - - if (statement.finallyClause) { - this.emit(statement.finallyClause); - } - this.recordSourceMappingEnd(statement); - } - - public emitCatchClause(clause: CatchClauseSyntax): void { - this.writeToOutput(" "); - this.recordSourceMappingStart(clause); - this.writeToken(clause.catchKeyword); - this.writeToOutput(" "); - this.writeToken(clause.openParenToken); - this.emit(clause.identifier); - this.writeToken(clause.closeParenToken); - this.emit(clause.block); - this.recordSourceMappingEnd(clause); - } - - public emitFinallyClause(clause: FinallyClauseSyntax): void { - this.writeToOutput(" "); - this.writeToken(clause.finallyKeyword); - this.emit(clause.block); - } - - public emitDebuggerStatement(statement: DebuggerStatementSyntax): void { - this.writeToken(statement.debuggerKeyword); - this.writeToOutputWithSourceMapRecord(";", statement.semicolonToken); - } - - public emitNumericLiteral(literal: ISyntaxToken): void { - this.writeToOutputWithSourceMapRecord(literal.text(), literal); - } - - public emitRegularExpressionLiteral(literal: ISyntaxToken): void { - this.writeToOutputWithSourceMapRecord(literal.text(), literal); - } - - public emitStringLiteral(literal: ISyntaxToken): void { - this.writeToOutputWithSourceMapRecord(literal.text(), literal); - } - - public emitEqualsValueClause(clause: EqualsValueClauseSyntax): void { - this.writeToOutput(" "); - this.writeToken(clause.equalsToken); - this.writeToOutput(" "); - this.emitCommentsArray(ASTHelpers.convertTokenTrailingComments(clause.equalsToken, this.text()), /*trailing:*/ true, /*noLeadingSpace:*/ true); - - this.emit(clause.value); - } - - private emitParameter(parameter: ParameterSyntax): void { - this.writeToOutputWithSourceMapRecord(parameter.identifier.text(), parameter); - } - - public emitConstructorDeclaration(declaration: ConstructorDeclarationSyntax): void { - if (declaration.block) { - this.emitConstructor(declaration); - } - else { - this.emitComments(declaration, /*pre:*/ true, /*onlyPinnedOrTripleSlashComments:*/ true); - } - } - - public shouldEmitFunctionDeclaration(declaration: FunctionDeclarationSyntax): boolean { - return ASTHelpers.preComments(declaration, this.text()) !== null || (!hasModifier(declaration.modifiers, PullElementFlags.Ambient) && declaration.block !== null); - } - - public emitFunctionDeclaration(declaration: FunctionDeclarationSyntax): void { - if (!hasModifier(declaration.modifiers, PullElementFlags.Ambient) && declaration.block !== null) { - this.emitFunction(declaration); - } - else { - this.emitComments(declaration, /*pre:*/ true, /*onlyPinnedOrTripleSlashComments:*/ true); - } - } - - private emitSourceUnit(sourceUnit: SourceUnitSyntax): void { - if (!this.document.isDeclareFile()) { - var pullDecl = this.semanticInfoChain.getDeclForAST(sourceUnit); - this.pushDecl(pullDecl); - this.emitScriptElements(sourceUnit); - this.popDecl(pullDecl); - - this.emitCommentsArray(ASTHelpers.convertTokenLeadingComments(sourceUnit.endOfFileToken, this.text()), /*trailing:*/ false); - } - } - - public shouldEmitEnumDeclaration(declaration: EnumDeclarationSyntax): boolean { - return ASTHelpers.preComments(declaration, this.text()) !== null || !ASTHelpers.enumIsElided(declaration); - } - - public emitEnumDeclaration(declaration: EnumDeclarationSyntax): void { - if (!ASTHelpers.enumIsElided(declaration)) { - this.emitComments(declaration, true); - this.emitEnum(declaration); - this.emitComments(declaration, false); - } - else { - this.emitComments(declaration, true, /*onlyPinnedOrTripleSlashComments:*/ true); - } - } - - public shouldEmitModuleDeclaration(declaration: ModuleDeclarationSyntax): boolean { - return ASTHelpers.preComments(declaration, this.text()) !== null || !ASTHelpers.moduleIsElided(declaration); - } - - private emitModuleDeclaration(declaration: ModuleDeclarationSyntax): void { - if (!ASTHelpers.moduleIsElided(declaration)) { - this.emitModuleDeclarationWorker(declaration); - } - else { - this.emitComments(declaration, true, /*onlyPinnedOrTripleSlashComments:*/ true); - } - } - - public shouldEmitClassDeclaration(declaration: ClassDeclarationSyntax): boolean { - return ASTHelpers.preComments(declaration, this.text()) !== null || !hasModifier(declaration.modifiers, PullElementFlags.Ambient); - } - - public emitClassDeclaration(declaration: ClassDeclarationSyntax): void { - if (!hasModifier(declaration.modifiers, PullElementFlags.Ambient)) { - this.emitClass(declaration); - } - else { - this.emitComments(declaration, /*pre:*/ true, /*onlyPinnedOrTripleSlashComments:*/ true); - } - } - - public shouldEmitInterfaceDeclaration(declaration: InterfaceDeclarationSyntax): boolean { - return ASTHelpers.preComments(declaration, this.text()) !== null; - } - - public emitInterfaceDeclaration(declaration: InterfaceDeclarationSyntax): void { - this.emitComments(declaration, /*pre:*/ true, /*onlyPinnedOrTripleSlashComments:*/ true); - } - - private firstVariableDeclarator(statement: VariableStatementSyntax): VariableDeclaratorSyntax { - return statement.variableDeclaration.variableDeclarators[0]; - } - - private isNotAmbientOrHasInitializer(variableStatement: VariableStatementSyntax): boolean { - return !hasModifier(variableStatement.modifiers, PullElementFlags.Ambient) || this.firstVariableDeclarator(variableStatement).equalsValueClause !== null; - } - - public shouldEmitVariableStatement(statement: VariableStatementSyntax): boolean { - return ASTHelpers.preComments(statement, this.text()) !== null || this.isNotAmbientOrHasInitializer(statement); - } - - public emitVariableStatement(statement: VariableStatementSyntax): void { - if (this.isNotAmbientOrHasInitializer(statement)) { - this.emitComments(statement, true); - this.emit(statement.variableDeclaration); - this.writeToOutputWithSourceMapRecord(";", statement.semicolonToken); - this.emitComments(statement, false); - } - else { - this.emitComments(statement, /*pre:*/ true, /*onlyPinnedOrTripleSlashComments:*/ true); - } - } - - public emitGenericType(type: GenericTypeSyntax): void { - this.emit(type.name); - } - - private shouldEmit(ast: ISyntaxElement): boolean { - if (!ast) { - return false; - } - - switch (ast.kind()) { - case SyntaxKind.ImportDeclaration: - return this.shouldEmitImportDeclaration(ast); - case SyntaxKind.ClassDeclaration: - return this.shouldEmitClassDeclaration(ast); - case SyntaxKind.InterfaceDeclaration: - return this.shouldEmitInterfaceDeclaration(ast); - case SyntaxKind.FunctionDeclaration: - return this.shouldEmitFunctionDeclaration(ast); - case SyntaxKind.ModuleDeclaration: - return this.shouldEmitModuleDeclaration(ast); - case SyntaxKind.VariableStatement: - return this.shouldEmitVariableStatement(ast); - case SyntaxKind.OmittedExpression: - return false; - case SyntaxKind.EnumDeclaration: - return this.shouldEmitEnumDeclaration(ast); - } - - return true; - } - - private emit(ast: ISyntaxElement): void { - if (!ast) { - return; - } - - switch (ast.kind()) { - case SyntaxKind.SeparatedList: - return this.emitSeparatedList(ast); - case SyntaxKind.List: - return this.emitList(ast); - case SyntaxKind.SourceUnit: - return this.emitSourceUnit(ast); - case SyntaxKind.ImportDeclaration: - return this.emitImportDeclaration(ast); - case SyntaxKind.ExportAssignment: - return this.setExportAssignment(ast); - case SyntaxKind.ClassDeclaration: - return this.emitClassDeclaration(ast); - case SyntaxKind.InterfaceDeclaration: - return this.emitInterfaceDeclaration(ast); - case SyntaxKind.IdentifierName: - return this.emitName(ast, true); - case SyntaxKind.VariableDeclarator: - return this.emitVariableDeclarator(ast); - case SyntaxKind.SimpleArrowFunctionExpression: - return this.emitSimpleArrowFunctionExpression(ast); - case SyntaxKind.ParenthesizedArrowFunctionExpression: - return this.emitParenthesizedArrowFunctionExpression(ast); - case SyntaxKind.FunctionDeclaration: - return this.emitFunctionDeclaration(ast); - case SyntaxKind.ModuleDeclaration: - return this.emitModuleDeclaration(ast); - case SyntaxKind.VariableDeclaration: - return this.emitVariableDeclaration(ast); - case SyntaxKind.GenericType: - return this.emitGenericType(ast); - case SyntaxKind.ConstructorDeclaration: - return this.emitConstructorDeclaration(ast); - case SyntaxKind.EnumDeclaration: - return this.emitEnumDeclaration(ast); - case SyntaxKind.EnumElement: - return this.emitEnumElement(ast); - case SyntaxKind.FunctionExpression: - return this.emitFunctionExpression(ast); - case SyntaxKind.VariableStatement: - return this.emitVariableStatement(ast); - } - - this.emitComments(ast, true); - this.emitWorker(ast); - this.emitComments(ast, false); - } - - private emitWorker(ast: ISyntaxElement): void { - if (!ast) { - return; - } - - switch (ast.kind()) { - case SyntaxKind.NumericLiteral: - return this.emitNumericLiteral(ast); - case SyntaxKind.RegularExpressionLiteral: - return this.emitRegularExpressionLiteral(ast); - case SyntaxKind.StringLiteral: - return this.emitStringLiteral(ast); - case SyntaxKind.FalseKeyword: - case SyntaxKind.NullKeyword: - case SyntaxKind.TrueKeyword: - return this.emitLiteralExpression(ast); - case SyntaxKind.ThisKeyword: - return this.emitThisExpression(ast); - case SyntaxKind.SuperKeyword: - return this.emitSuperExpression(ast); - case SyntaxKind.ParenthesizedExpression: - return this.emitParenthesizedExpression(ast); - case SyntaxKind.ArrayLiteralExpression: - return this.emitArrayLiteralExpression(ast); - case SyntaxKind.PostDecrementExpression: - case SyntaxKind.PostIncrementExpression: - return this.emitPostfixUnaryExpression(ast); - case SyntaxKind.LogicalNotExpression: - case SyntaxKind.BitwiseNotExpression: - case SyntaxKind.NegateExpression: - case SyntaxKind.PlusExpression: - case SyntaxKind.PreIncrementExpression: - case SyntaxKind.PreDecrementExpression: - return this.emitPrefixUnaryExpression(ast); - case SyntaxKind.InvocationExpression: - return this.emitInvocationExpression(ast); - case SyntaxKind.ElementAccessExpression: - return this.emitElementAccessExpression(ast); - case SyntaxKind.MemberAccessExpression: - return this.emitMemberAccessExpression(ast); - case SyntaxKind.QualifiedName: - return this.emitQualifiedName(ast); - case SyntaxKind.CommaExpression: - case SyntaxKind.AssignmentExpression: - case SyntaxKind.AddAssignmentExpression: - case SyntaxKind.SubtractAssignmentExpression: - case SyntaxKind.MultiplyAssignmentExpression: - case SyntaxKind.DivideAssignmentExpression: - case SyntaxKind.ModuloAssignmentExpression: - case SyntaxKind.AndAssignmentExpression: - case SyntaxKind.ExclusiveOrAssignmentExpression: - case SyntaxKind.OrAssignmentExpression: - case SyntaxKind.LeftShiftAssignmentExpression: - case SyntaxKind.SignedRightShiftAssignmentExpression: - case SyntaxKind.UnsignedRightShiftAssignmentExpression: - case SyntaxKind.LogicalOrExpression: - case SyntaxKind.LogicalAndExpression: - case SyntaxKind.BitwiseOrExpression: - case SyntaxKind.BitwiseExclusiveOrExpression: - case SyntaxKind.BitwiseAndExpression: - case SyntaxKind.EqualsWithTypeConversionExpression: - case SyntaxKind.NotEqualsWithTypeConversionExpression: - case SyntaxKind.EqualsExpression: - case SyntaxKind.NotEqualsExpression: - case SyntaxKind.LessThanExpression: - case SyntaxKind.GreaterThanExpression: - case SyntaxKind.LessThanOrEqualExpression: - case SyntaxKind.GreaterThanOrEqualExpression: - case SyntaxKind.InstanceOfExpression: - case SyntaxKind.InExpression: - case SyntaxKind.LeftShiftExpression: - case SyntaxKind.SignedRightShiftExpression: - case SyntaxKind.UnsignedRightShiftExpression: - case SyntaxKind.MultiplyExpression: - case SyntaxKind.DivideExpression: - case SyntaxKind.ModuloExpression: - case SyntaxKind.AddExpression: - case SyntaxKind.SubtractExpression: - return this.emitBinaryExpression(ast); - case SyntaxKind.ConditionalExpression: - return this.emitConditionalExpression(ast); - case SyntaxKind.EqualsValueClause: - return this.emitEqualsValueClause(ast); - case SyntaxKind.Parameter: - return this.emitParameter(ast); - case SyntaxKind.Block: - return this.emitBlock(ast); - case SyntaxKind.ElseClause: - return this.emitElseClause(ast); - case SyntaxKind.IfStatement: - return this.emitIfStatement(ast); - case SyntaxKind.ExpressionStatement: - return this.emitExpressionStatement(ast); - case SyntaxKind.GetAccessor: - return this.emitGetAccessor(ast); - case SyntaxKind.SetAccessor: - return this.emitSetAccessor(ast); - case SyntaxKind.ThrowStatement: - return this.emitThrowStatement(ast); - case SyntaxKind.ReturnStatement: - return this.emitReturnStatement(ast); - case SyntaxKind.ObjectCreationExpression: - return this.emitObjectCreationExpression(ast); - case SyntaxKind.SwitchStatement: - return this.emitSwitchStatement(ast); - case SyntaxKind.CaseSwitchClause: - return this.emitCaseSwitchClause(ast); - case SyntaxKind.DefaultSwitchClause: - return this.emitDefaultSwitchClause(ast); - case SyntaxKind.BreakStatement: - return this.emitBreakStatement(ast); - case SyntaxKind.ContinueStatement: - return this.emitContinueStatement(ast); - case SyntaxKind.ForStatement: - return this.emitForStatement(ast); - case SyntaxKind.ForInStatement: - return this.emitForInStatement(ast); - case SyntaxKind.WhileStatement: - return this.emitWhileStatement(ast); - case SyntaxKind.WithStatement: - return this.emitWithStatement(ast); - case SyntaxKind.CastExpression: - return this.emitCastExpression(ast); - case SyntaxKind.ObjectLiteralExpression: - return this.emitObjectLiteralExpression(ast); - case SyntaxKind.SimplePropertyAssignment: - return this.emitSimplePropertyAssignment(ast); - case SyntaxKind.FunctionPropertyAssignment: - return this.emitFunctionPropertyAssignment(ast); - case SyntaxKind.EmptyStatement: - return this.writeToken((ast).semicolonToken); - case SyntaxKind.TryStatement: - return this.emitTryStatement(ast); - case SyntaxKind.CatchClause: - return this.emitCatchClause(ast); - case SyntaxKind.FinallyClause: - return this.emitFinallyClause(ast); - case SyntaxKind.LabeledStatement: - return this.emitLabeledStatement(ast); - case SyntaxKind.DoStatement: - return this.emitDoStatement(ast); - case SyntaxKind.TypeOfExpression: - return this.emitTypeOfExpression(ast); - case SyntaxKind.DeleteExpression: - return this.emitDeleteExpression(ast); - case SyntaxKind.VoidExpression: - return this.emitVoidExpression(ast); - case SyntaxKind.DebuggerStatement: - return this.emitDebuggerStatement(ast); - } - } - } - - export function getLastConstructor(classDecl: ClassDeclarationSyntax): ConstructorDeclarationSyntax { - for (var i = classDecl.classElements.length - 1; i >= 0; i--) { - var child = classDecl.classElements[i]; - - if (child.kind() === SyntaxKind.ConstructorDeclaration) { - return child; - } - } - - return null; - } - - export function getTrimmedTextLines(comment: Comment): string[] { - if (comment.kind() === SyntaxKind.MultiLineCommentTrivia) { - return comment.fullText().split("\n").map(s => s.trim()); - } - else { - return [comment.fullText().trim()]; - } - } -} \ No newline at end of file diff --git a/src/services/compiler/optionsParser.ts b/src/services/compiler/optionsParser.ts deleted file mode 100644 index 6c2a15813d..0000000000 --- a/src/services/compiler/optionsParser.ts +++ /dev/null @@ -1,266 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -/// - -module TypeScript { - export interface IOptions { - name?: string; - flag?: boolean; - short?: string; - usage?: { - locCode: string; // DiagnosticCode - args: string[] - }; - set?: (s: string) => void; - type?: string; // DiagnosticCode - experimental?: boolean; - } - - export class OptionsParser { - private DEFAULT_SHORT_FLAG = "-"; - private DEFAULT_LONG_FLAG = "--"; - - private printedVersion: boolean = false; - - // Find the option record for the given string. Returns null if not found. - private findOption(arg: string) { - var upperCaseArg = arg && arg.toUpperCase(); - - for (var i = 0; i < this.options.length; i++) { - var current = this.options[i]; - - if (upperCaseArg === (current.short && current.short.toUpperCase()) || - upperCaseArg === (current.name && current.name.toUpperCase())) { - return current; - } - } - - return null; - } - - public unnamed: string[] = []; - - public options: IOptions[] = []; - - constructor(public host: IEnvironment, public version: string) { - } - - public printUsage() { - this.printVersion(); - - var optionsWord = getLocalizedText(DiagnosticCode.options, null); - var fileWord = getLocalizedText(DiagnosticCode.file1, null); - var tscSyntax = "tsc [" + optionsWord + "] [" + fileWord + " ..]"; - var syntaxHelp = getLocalizedText(DiagnosticCode.Syntax_0, [tscSyntax]); - this.host.standardOut.WriteLine(syntaxHelp); - this.host.standardOut.WriteLine(""); - this.host.standardOut.WriteLine(getLocalizedText(DiagnosticCode.Examples, null) + " tsc hello.ts"); - this.host.standardOut.WriteLine(" tsc --out foo.js foo.ts"); - this.host.standardOut.WriteLine(" tsc @args.txt"); - this.host.standardOut.WriteLine(""); - this.host.standardOut.WriteLine(getLocalizedText(DiagnosticCode.Options, null)); - - var output: string[][] = []; - var maxLength = 0; - var i = 0; - - this.options = this.options.sort(function (a, b) { - var aName = a.name.toLowerCase(); - var bName = b.name.toLowerCase(); - - if (aName > bName) { - return 1; - } else if (aName < bName) { - return -1; - } else { - return 0; - } - }); - - // Build up output array - for (i = 0; i < this.options.length; i++) { - var option = this.options[i]; - - if (option.experimental) { - continue; - } - - if (!option.usage) { - break; - } - - var usageString = " "; - var type = option.type ? (" " + TypeScript.getLocalizedText(option.type, null)) : ""; - - if (option.short) { - usageString += this.DEFAULT_SHORT_FLAG + option.short + type + ", "; - } - - usageString += this.DEFAULT_LONG_FLAG + option.name + type; - - output.push([usageString, TypeScript.getLocalizedText(option.usage.locCode, option.usage.args)]); - - if (usageString.length > maxLength) { - maxLength = usageString.length; - } - } - - var fileDescription = getLocalizedText(DiagnosticCode.Insert_command_line_options_and_files_from_a_file, null); - output.push([" @<" + fileWord + ">", fileDescription]); - - // Print padded output - for (i = 0; i < output.length; i++) { - this.host.standardOut.WriteLine(output[i][0] + (new Array(maxLength - output[i][0].length + 3)).join(" ") + output[i][1]); - } - } - - public printVersion() { - if (!this.printedVersion) { - this.host.standardOut.WriteLine(getLocalizedText(DiagnosticCode.Version_0, [this.version])); - this.printedVersion = true; - } - } - - public option(name: string, config: IOptions, short?: string) { - if (!config) { - config = short; - short = null; - } - - config.name = name; - config.short = short; - config.flag = false; - - this.options.push(config); - } - - public flag(name: string, config: IOptions, short?: string) { - if (!config) { - config = short; - short = null; - } - - config.name = name; - config.short = short; - config.flag = true; - - this.options.push(config); - } - - // Parse an arguments string - public parseString(argString: string) { - var position = 0; - var tokens = argString.match(/\s+|"|[^\s"]+/g); - - function peek() { - return tokens[position]; - } - - function consume() { - return tokens[position++]; - } - - function consumeQuotedString() { - var value = ''; - consume(); // skip opening quote. - - var token = peek(); - - while (token && token !== '"') { - consume(); - - value += token; - - token = peek(); - } - - consume(); // skip ending quote; - - return value; - } - - var args: string[] = []; - var currentArg = ''; - - while (position < tokens.length) { - var token = peek(); - - if (token === '"') { - currentArg += consumeQuotedString(); - } else if (token.match(/\s/)) { - if (currentArg.length > 0) { - args.push(currentArg); - currentArg = ''; - } - - consume(); - } else { - consume(); - currentArg += token; - } - } - - if (currentArg.length > 0) { - args.push(currentArg); - } - - this.parse(args); - } - - // Parse arguments as they come from the platform: split into arguments. - public parse(args: string[]) { - var position = 0; - - function consume() { - return args[position++]; - } - - while (position < args.length) { - var current = consume(); - var match = current.match(/^(--?|@)(.*)/); - var value: any = null; - - if (match) { - if (match[1] === '@') { - this.parseString(this.host.readFile(match[2], null).contents); - } else { - var arg = match[2]; - var option = this.findOption(arg); - - if (option === null) { - this.host.standardOut.WriteLine(getDiagnosticMessage(DiagnosticCode.Unknown_compiler_option_0, [arg])); - this.host.standardOut.WriteLine(getLocalizedText(DiagnosticCode.Use_the_0_flag_to_see_options, ["--help"])); - } else { - if (!option.flag) { - value = consume(); - if (value === undefined) { - // No value provided - this.host.standardOut.WriteLine(getDiagnosticMessage(DiagnosticCode.Option_0_specified_without_1, [arg, getLocalizedText(option.type, null)])); - this.host.standardOut.WriteLine(getLocalizedText(DiagnosticCode.Use_the_0_flag_to_see_options, ["--help"])); - continue; - } - } - - option.set(value); - } - } - } else { - this.unnamed.push(current); - } - } - } - } -} \ No newline at end of file diff --git a/src/services/compiler/tsc.ts b/src/services/compiler/tsc.ts deleted file mode 100644 index acd4fb40e6..0000000000 --- a/src/services/compiler/tsc.ts +++ /dev/null @@ -1,736 +0,0 @@ -// -// Copyright (c) Microsoft Corporation. All rights reserved. -// -// Licensed under the Apache License, Version 2.0 (the "License"); -// you may not use this file except in compliance with the License. -// You may obtain a copy of the License at -// http://www.apache.org/licenses/LICENSE-2.0 -// -// Unless required by applicable law or agreed to in writing, software -// distributed under the License is distributed on an "AS IS" BASIS, -// WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. -// See the License for the specific language governing permissions and -// limitations under the License. -// - -/// -/// -/// - -module TypeScript { - class SourceFile { - constructor(public scriptSnapshot: IScriptSnapshot, public byteOrderMark: ByteOrderMark) { - } - } - - class DiagnosticsLogger implements ILogger { - constructor(public ioHost: IEnvironment) { - } - public information(): boolean { return false; } - public debug(): boolean { return false; } - public warning(): boolean { return false; } - public error(): boolean { return false; } - public fatal(): boolean { return false; } - public log(s: string): void { - this.ioHost.standardOut.WriteLine(s); - } - } - - export class BatchCompiler implements IReferenceResolverHost { - public compilerVersion = "1.0.1.0"; - private inputFiles: string[] = []; - private compilationSettings: ImmutableCompilationSettings; - private resolvedFiles: IResolvedFile[] = []; - private fileNameToSourceFile = new StringHashTable(); - private hasErrors: boolean = false; - private logger: ILogger = null; - - constructor(private ioHost: IEnvironment) { - } - - // Begin batch compilation - public batchCompile() { - // Parse command line options - if (this.parseOptions()) { - var start = new Date().getTime(); - - if (this.compilationSettings.gatherDiagnostics()) { - this.logger = new DiagnosticsLogger(this.ioHost); - } else { - this.logger = new NullLogger(); - } - - if (this.compilationSettings.watch()) { - // Watch will cause the program to stick around as long as the files exist - this.watchFiles(); - return; - } - - // Resolve the compilation environemnt - this.resolve(); - - this.compile(); - - if (this.compilationSettings.gatherDiagnostics()) { - this.logger.log(""); - this.logger.log("File resolution time: " + TypeScript.fileResolutionTime); - this.logger.log(" file read: " + TypeScript.fileResolutionIOTime); - this.logger.log(" scan imports: " + TypeScript.fileResolutionScanImportsTime); - this.logger.log(" import search: " + TypeScript.fileResolutionImportFileSearchTime); - this.logger.log(" get lib.d.ts: " + TypeScript.fileResolutionGetDefaultLibraryTime); - - this.logger.log("SyntaxTree parse time: " + TypeScript.syntaxTreeParseTime); - this.logger.log("Syntax Diagnostics time: " + TypeScript.syntaxDiagnosticsTime); - this.logger.log("Create declarations time: " + TypeScript.createDeclarationsTime); - this.logger.log(""); - this.logger.log("Type check time: " + TypeScript.typeCheckTime); - this.logger.log(""); - this.logger.log("Emit time: " + TypeScript.emitTime); - this.logger.log("Declaration emit time: " + TypeScript.declarationEmitTime); - - this.logger.log("Total number of symbols created: " + TypeScript.pullSymbolID); - this.logger.log("Specialized types created: " + TypeScript.nSpecializationsCreated); - this.logger.log("Specialized signatures created: " + TypeScript.nSpecializedSignaturesCreated); - - this.logger.log(" IsExternallyVisibleTime: " + TypeScript.declarationEmitIsExternallyVisibleTime); - this.logger.log(" TypeSignatureTime: " + TypeScript.declarationEmitTypeSignatureTime); - this.logger.log(" GetBoundDeclTypeTime: " + TypeScript.declarationEmitGetBoundDeclTypeTime); - this.logger.log(" IsOverloadedCallSignatureTime: " + TypeScript.declarationEmitIsOverloadedCallSignatureTime); - this.logger.log(" FunctionDeclarationGetSymbolTime: " + TypeScript.declarationEmitFunctionDeclarationGetSymbolTime); - this.logger.log(" GetBaseTypeTime: " + TypeScript.declarationEmitGetBaseTypeTime); - this.logger.log(" GetAccessorFunctionTime: " + TypeScript.declarationEmitGetAccessorFunctionTime); - this.logger.log(" GetTypeParameterSymbolTime: " + TypeScript.declarationEmitGetTypeParameterSymbolTime); - this.logger.log(" GetImportDeclarationSymbolTime: " + TypeScript.declarationEmitGetImportDeclarationSymbolTime); - - this.logger.log("Emit write file time: " + TypeScript.emitWriteFileTime); - - this.logger.log("Compiler resolve path time: " + TypeScript.compilerResolvePathTime); - this.logger.log("Compiler directory name time: " + TypeScript.compilerDirectoryNameTime); - this.logger.log("Compiler directory exists time: " + TypeScript.compilerDirectoryExistsTime); - this.logger.log("Compiler file exists time: " + TypeScript.compilerFileExistsTime); - - this.logger.log("IO host resolve path time: " + TypeScript.ioHostResolvePathTime); - this.logger.log("IO host directory name time: " + TypeScript.ioHostDirectoryNameTime); - this.logger.log("IO host create directory structure time: " + TypeScript.ioHostCreateDirectoryStructureTime); - this.logger.log("IO host write file time: " + TypeScript.ioHostWriteFileTime); - - this.logger.log("Node make directory time: " + TypeScript.nodeMakeDirectoryTime); - this.logger.log("Node writeFileSync time: " + TypeScript.nodeWriteFileSyncTime); - this.logger.log("Node createBuffer time: " + TypeScript.nodeCreateBufferTime); - - this.logger.log("Total time: " + (new Date().getTime() - start)); - } - } - - // Exit with the appropriate error code - this.ioHost.quit(this.hasErrors ? 1 : 0); - } - - private resolve() { - // Resolve file dependencies, if requested - var includeDefaultLibrary = !this.compilationSettings.noLib(); - var resolvedFiles: IResolvedFile[] = []; - - var start = new Date().getTime(); - - if (!this.compilationSettings.noResolve()) { - // Resolve references - var resolutionResults = ReferenceResolver.resolve(this.inputFiles, this, this.compilationSettings.useCaseSensitiveFileResolution()); - resolvedFiles = resolutionResults.resolvedFiles; - - // Only include the library if useDefaultLib is set to true and did not see any 'no-default-lib' comments - includeDefaultLibrary = !this.compilationSettings.noLib() && !resolutionResults.seenNoDefaultLibTag; - - // Populate any diagnostic messages generated during resolution - resolutionResults.diagnostics.forEach(d => this.addDiagnostic(d)); - } - else { - for (var i = 0, n = this.inputFiles.length; i < n; i++) { - var inputFile = this.inputFiles[i]; - var referencedFiles: string[] = []; - var importedFiles: string[] = []; - - // If declaration files are going to be emitted, preprocess the file contents and add in referenced files as well - if (this.compilationSettings.generateDeclarationFiles()) { - var references = getReferencedFiles(inputFile, this.getScriptSnapshot(inputFile)); - for (var j = 0; j < references.length; j++) { - referencedFiles.push(references[j].path); - } - - inputFile = this.resolvePath(inputFile); - } - - resolvedFiles.push({ - path: inputFile, - referencedFiles: referencedFiles, - importedFiles: importedFiles - }); - } - } - - var defaultLibStart = new Date().getTime(); - if (includeDefaultLibrary) { - var libraryResolvedFile: IResolvedFile = { - path: this.getDefaultLibraryFilePath(), - referencedFiles: [], - importedFiles: [] - }; - - // Prepend the library to the resolved list - resolvedFiles = [libraryResolvedFile].concat(resolvedFiles); - } - TypeScript.fileResolutionGetDefaultLibraryTime += new Date().getTime() - defaultLibStart; - - this.resolvedFiles = resolvedFiles; - - TypeScript.fileResolutionTime = new Date().getTime() - start; - } - - // Returns true if compilation failed from some reason. - private compile(): void { - var compiler = new TypeScriptCompiler(this.logger, this.compilationSettings); - - this.resolvedFiles.forEach(resolvedFile => { - var sourceFile = this.getSourceFile(resolvedFile.path); - compiler.addFile(resolvedFile.path, sourceFile.scriptSnapshot, sourceFile.byteOrderMark, /*version:*/ 0, /*isOpen:*/ false, resolvedFile.referencedFiles); - }); - - for (var it = compiler.compile((path: string) => this.resolvePath(path)); it.moveNext();) { - var result = it.current(); - - result.diagnostics.forEach(d => this.addDiagnostic(d)); - if (!this.tryWriteOutputFiles(result.outputFiles)) { - return; - } - } - } - - // Parse command line options - private parseOptions() { - var opts = new OptionsParser(this.ioHost, this.compilerVersion); - - var mutableSettings = new CompilationSettings(); - opts.option('out', { - usage: { - locCode: DiagnosticCode.Concatenate_and_emit_output_to_single_file, - args: null - }, - type: DiagnosticCode.file2, - set: (str) => { - mutableSettings.outFileOption = str; - } - }); - - opts.option('outDir', { - usage: { - locCode: DiagnosticCode.Redirect_output_structure_to_the_directory, - args: null - }, - type: DiagnosticCode.DIRECTORY, - set: (str) => { - mutableSettings.outDirOption = str; - } - }); - - opts.flag('sourcemap', { - usage: { - locCode: DiagnosticCode.Generates_corresponding_0_file, - args: ['.map'] - }, - set: () => { - mutableSettings.mapSourceFiles = true; - } - }); - - opts.option('mapRoot', { - usage: { - locCode: DiagnosticCode.Specifies_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations, - args: null - }, - type: DiagnosticCode.LOCATION, - set: (str) => { - mutableSettings.mapRoot = str; - } - }); - - opts.option('sourceRoot', { - usage: { - locCode: DiagnosticCode.Specifies_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations, - args: null - }, - type: DiagnosticCode.LOCATION, - set: (str) => { - mutableSettings.sourceRoot = str; - } - }); - - opts.flag('declaration', { - usage: { - locCode: DiagnosticCode.Generates_corresponding_0_file, - args: ['.d.ts'] - }, - set: () => { - mutableSettings.generateDeclarationFiles = true; - } - }, 'd'); - - if (this.ioHost.watchFile) { - opts.flag('watch', { - usage: { - locCode: DiagnosticCode.Watch_input_files, - args: null - }, - set: () => { - mutableSettings.watch = true; - } - }, 'w'); - } - - opts.flag('propagateEnumConstants', { - experimental: true, - set: () => { mutableSettings.propagateEnumConstants = true; } - }); - - opts.flag('removeComments', { - usage: { - locCode: DiagnosticCode.Do_not_emit_comments_to_output, - args: null - }, - set: () => { - mutableSettings.removeComments = true; - } - }); - - opts.flag('noResolve', { - experimental: true, - usage: { - locCode: DiagnosticCode.Skip_resolution_and_preprocessing, - args: null - }, - set: () => { - mutableSettings.noResolve = true; - } - }); - - opts.flag('noLib', { - experimental: true, - set: () => { - mutableSettings.noLib = true; - } - }); - - opts.flag('diagnostics', { - experimental: true, - set: () => { - mutableSettings.gatherDiagnostics = true; - } - }); - - opts.option('target', { - usage: { - locCode: DiagnosticCode.Specify_ECMAScript_target_version_0_default_or_1, - args: ['ES3', 'ES5'] - }, - type: DiagnosticCode.VERSION, - set: (type) => { - type = type.toLowerCase(); - - if (type === 'es3') { - mutableSettings.codeGenTarget = LanguageVersion.EcmaScript3; - } - else if (type === 'es5') { - mutableSettings.codeGenTarget = LanguageVersion.EcmaScript5; - } - else { - this.addDiagnostic( - new Diagnostic(null, null, 0, 0, DiagnosticCode.Argument_for_0_option_must_be_1_or_2, ["target", "ES3", "ES5"])); - } - } - }, 't'); - - opts.option('module', { - usage: { - locCode: DiagnosticCode.Specify_module_code_generation_0_or_1, - args: ['commonjs', 'amd'] - }, - type: DiagnosticCode.KIND, - set: (type) => { - type = type.toLowerCase(); - - if (type === 'commonjs') { - mutableSettings.moduleGenTarget = ModuleGenTarget.Synchronous; - } - else if (type === 'amd') { - mutableSettings.moduleGenTarget = ModuleGenTarget.Asynchronous; - } - else { - this.addDiagnostic( - new Diagnostic(null, null, 0, 0, DiagnosticCode.Argument_for_0_option_must_be_1_or_2, ["module", "commonjs", "amd"])); - } - } - }, 'm'); - - var needsHelp = false; - opts.flag('help', { - usage: { - locCode: DiagnosticCode.Print_this_message, - args: null - }, - set: () => { - needsHelp = true; - } - }, 'h'); - - opts.flag('useCaseSensitiveFileResolution', { - experimental: true, - set: () => { - mutableSettings.useCaseSensitiveFileResolution = true; - } - }); - var shouldPrintVersionOnly = false; - opts.flag('version', { - usage: { - locCode: DiagnosticCode.Print_the_compiler_s_version_0, - args: [this.compilerVersion] - }, - set: () => { - shouldPrintVersionOnly = true; - } - }, 'v'); - - var locale: string = null; - opts.option('locale', { - experimental: true, - usage: { - locCode: DiagnosticCode.Specify_locale_for_errors_and_messages_For_example_0_or_1, - args: ['en', 'ja-jp'] - }, - type: DiagnosticCode.STRING, - set: (value) => { - locale = value; - } - }); - - opts.flag('noImplicitAny', { - usage: { - locCode: DiagnosticCode.Raise_error_on_expressions_and_declarations_with_an_implied_any_type, - args: null - }, - set: () => { - mutableSettings.noImplicitAny = true; - } - }); - - if (Environment.supportsCodePage()) { - opts.option('codepage', { - usage: { - locCode: DiagnosticCode.Specify_the_codepage_to_use_when_opening_source_files, - args: null - }, - type: DiagnosticCode.NUMBER, - set: (arg) => { - mutableSettings.codepage = parseInt(arg, 10); - } - }); - } - - opts.parse(this.ioHost.arguments); - - this.compilationSettings = ImmutableCompilationSettings.fromCompilationSettings(mutableSettings); - - if (locale) { - if (!this.setLocale(locale)) { - return false; - } - } - - this.inputFiles.push.apply(this.inputFiles, opts.unnamed); - - if (shouldPrintVersionOnly) { - opts.printVersion(); - return false; - } - // If no source files provided to compiler - print usage information - else if (this.inputFiles.length === 0 || needsHelp) { - opts.printUsage(); - return false; - } - - return !this.hasErrors; - } - - private setLocale(locale: string): boolean { - var matchResult = /^([a-z]+)([_\-]([a-z]+))?$/.exec(locale.toLowerCase()); - if (!matchResult) { - this.addDiagnostic(new Diagnostic(null, null, 0, 0, DiagnosticCode.Locale_must_be_of_the_form_language_or_language_territory_For_example_0_or_1, ['en', 'ja-jp'])); - return false; - } - - var language = matchResult[1]; - var territory = matchResult[3]; - - // First try the entire locale, then fall back to just language if that's all we have. - if (!this.setLanguageAndTerritory(language, territory) && - !this.setLanguageAndTerritory(language, null)) { - - this.addDiagnostic(new Diagnostic(null, null, 0, 0, DiagnosticCode.Unsupported_locale_0, [locale])); - return false; - } - - return true; - } - - private setLanguageAndTerritory(language: string, territory: string): boolean { - - var compilerFilePath = this.ioHost.executingFilePath(); - var containingDirectoryPath = this.ioHost.directoryName(compilerFilePath); - - var filePath = IOUtils.combine(containingDirectoryPath, language); - if (territory) { - filePath = filePath + "-" + territory; - } - - filePath = this.resolvePath(IOUtils.combine(filePath, "diagnosticMessages.generated.json")); - - if (!this.fileExists(filePath)) { - return false; - } - - var fileContents = this.ioHost.readFile(filePath, this.compilationSettings.codepage()); - TypeScript.LocalizedDiagnosticMessages = JSON.parse(fileContents.contents); - return true; - } - - // Handle -watch switch - private watchFiles() { - if (!this.ioHost.watchFile) { - this.addDiagnostic( - new Diagnostic(null, null, 0, 0, DiagnosticCode.Current_host_does_not_support_0_option, ['-w[atch]'])); - return; - } - - var lastResolvedFileSet: string[] = [] - var watchers: { [x: string]: IFileWatcher; } = {}; - var firstTime = true; - - var addWatcher = (fileName: string) => { - if (!watchers[fileName]) { - var watcher = this.ioHost.watchFile(fileName, onWatchedFileChange); - watchers[fileName] = watcher; - } - }; - - var removeWatcher = (fileName: string) => { - if (watchers[fileName]) { - watchers[fileName].close(); - delete watchers[fileName]; - } - }; - - var onWatchedFileChange = () => { - // Clean errors for previous compilation - this.hasErrors = false; - - // Clear out any source file data we've cached. - this.fileNameToSourceFile = new StringHashTable(); - - // Resolve file dependencies, if requested - this.resolve(); - - // Check if any new files were added to the environment as a result of the file change - var oldFiles = lastResolvedFileSet; - var newFiles = this.resolvedFiles.map(resolvedFile => resolvedFile.path).sort(); - - var i = 0, j = 0; - while (i < oldFiles.length && j < newFiles.length) { - - var compareResult = oldFiles[i].localeCompare(newFiles[j]); - if (compareResult === 0) { - // No change here - i++; - j++; - } - else if (compareResult < 0) { - // Entry in old list does not exist in the new one, it was removed - removeWatcher(oldFiles[i]); - i++; - } - else { - // Entry in new list does exist in the new one, it was added - addWatcher(newFiles[j]); - j++; - } - } - - // All remaining unmatched items in the old list have been removed - for (var k = i; k < oldFiles.length; k++) { - removeWatcher(oldFiles[k]); - } - - // All remaing unmatched items in the new list have been added - for (k = j; k < newFiles.length; k++) { - addWatcher(newFiles[k]); - } - - // Update the state - lastResolvedFileSet = newFiles; - - // Print header - if (!firstTime) { - var fileNames = ""; - for (var k = 0; k < lastResolvedFileSet.length; k++) { - fileNames += Environment.newLine + " " + lastResolvedFileSet[k]; - } - this.ioHost.standardError.WriteLine(getLocalizedText(DiagnosticCode.NL_Recompiling_0, [fileNames])); - } - else { - firstTime = false; - } - - // Trigger a new compilation - this.compile(); - }; - - // Switch to using stdout for all error messages - this.ioHost.standardOut = this.ioHost.standardOut; - - onWatchedFileChange(); - } - - private getSourceFile(fileName: string): SourceFile { - var sourceFile: SourceFile = this.fileNameToSourceFile.lookup(fileName); - if (!sourceFile) { - // Attempt to read the file - var fileInformation: FileInformation; - - try { - fileInformation = this.ioHost.readFile(fileName, this.compilationSettings.codepage()); - } - catch (e) { - this.addDiagnostic(new Diagnostic(null, null, 0, 0, DiagnosticCode.Cannot_read_file_0_1, [fileName, e.message])); - fileInformation = new FileInformation("", ByteOrderMark.None); - } - - var snapshot = ScriptSnapshot.fromString(fileInformation.contents); - var sourceFile = new SourceFile(snapshot, fileInformation.byteOrderMark); - this.fileNameToSourceFile.add(fileName, sourceFile); - } - - return sourceFile; - } - - private getDefaultLibraryFilePath(): string { - var compilerFilePath = this.ioHost.executingFilePath(); - var containingDirectoryPath = this.ioHost.directoryName(compilerFilePath); - var libraryFilePath = this.resolvePath(IOUtils.combine(containingDirectoryPath, "lib.d.ts")); - - return libraryFilePath; - } - - /// IReferenceResolverHost methods - getScriptSnapshot(fileName: string): IScriptSnapshot { - return this.getSourceFile(fileName).scriptSnapshot; - } - - resolveRelativePath(path: string, directory: string): string { - var unQuotedPath = stripStartAndEndQuotes(path); - var normalizedPath: string; - - if (isRooted(unQuotedPath) || !directory) { - normalizedPath = unQuotedPath; - } else { - normalizedPath = IOUtils.combine(directory, unQuotedPath); - } - - // get the absolute path - normalizedPath = this.resolvePath(normalizedPath); - - // Switch to forward slashes - normalizedPath = switchToForwardSlashes(normalizedPath); - - return normalizedPath; - } - - private fileExistsCache = createIntrinsicsObject(); - - fileExists(path: string): boolean { - var exists = this.fileExistsCache[path]; - if (exists === undefined) { - var start = new Date().getTime(); - exists = this.ioHost.fileExists(path); - this.fileExistsCache[path] = exists; - TypeScript.compilerFileExistsTime += new Date().getTime() - start; - } - - return exists; - } - - getParentDirectory(path: string): string { - var start = new Date().getTime(); - var result = this.ioHost.directoryName(path); - TypeScript.compilerDirectoryNameTime += new Date().getTime() - start; - - return result; - } - - - private addDiagnostic(diagnostic: Diagnostic): void { - var diagnosticInfo = diagnostic.info(); - if (diagnosticInfo.category === DiagnosticCategory.Error) { - this.hasErrors = true; - } - - this.ioHost.standardError.Write(TypeScriptCompiler.getFullDiagnosticText(diagnostic, path => this.resolvePath(path))); - } - - private tryWriteOutputFiles(outputFiles: OutputFile[]): boolean { - for (var i = 0, n = outputFiles.length; i < n; i++) { - var outputFile = outputFiles[i]; - - try { - this.writeFile(outputFile.name, outputFile.text, outputFile.writeByteOrderMark); - } - catch (e) { - this.addDiagnostic( - new Diagnostic(outputFile.name, null, 0, 0, DiagnosticCode.Emit_Error_0, [e.message])); - return false; - } - } - - return true; - } - - writeFile(fileName: string, contents: string, writeByteOrderMark: boolean): void { - var start = new Date().getTime(); - IOUtils.writeFileAndFolderStructure(this.ioHost, fileName, contents, writeByteOrderMark); - TypeScript.emitWriteFileTime += new Date().getTime() - start; - } - - directoryExists(path: string): boolean { - var start = new Date().getTime(); - var result = this.ioHost.directoryExists(path); - TypeScript.compilerDirectoryExistsTime += new Date().getTime() - start; - return result; - } - - // For performance reasons we cache the results of resolvePath. This avoids costly lookup - // on the disk once we've already resolved a path once. - private resolvePathCache = createIntrinsicsObject(); - - resolvePath(path: string): string { - var cachedValue = this.resolvePathCache[path]; - if (!cachedValue) { - var start = new Date().getTime(); - cachedValue = this.ioHost.absolutePath(path); - this.resolvePathCache[path] = cachedValue; - TypeScript.compilerResolvePathTime += new Date().getTime() - start; - } - - return cachedValue; - } - } - - // Start the batch compilation using the current hosts IO - var batch = new TypeScript.BatchCompiler(Environment); - batch.batchCompile(); -} diff --git a/src/services/resources/diagnosticCode.generated.ts b/src/services/resources/diagnosticCode.generated.ts index 86509fdd63..1a0ac12e16 100644 --- a/src/services/resources/diagnosticCode.generated.ts +++ b/src/services/resources/diagnosticCode.generated.ts @@ -402,19 +402,13 @@ module TypeScript { Option_0_specified_without_1: "Option '{0}' specified without '{1}'", codepage_option_not_supported_on_current_platform: "'codepage' option not supported on current platform.", Concatenate_and_emit_output_to_single_file: "Concatenate and emit output to single file.", - Generates_corresponding_0_file: "Generates corresponding {0} file.", Specifies_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations: "Specifies the location where debugger should locate map files instead of generated locations.", Specifies_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations: "Specifies the location where debugger should locate TypeScript files instead of source locations.", Watch_input_files: "Watch input files.", Redirect_output_structure_to_the_directory: "Redirect output structure to the directory.", Do_not_emit_comments_to_output: "Do not emit comments to output.", - Skip_resolution_and_preprocessing: "Skip resolution and preprocessing.", - Specify_ECMAScript_target_version_0_default_or_1: "Specify ECMAScript target version: '{0}' (default), or '{1}'", - Specify_module_code_generation_0_or_1: "Specify module code generation: '{0}' or '{1}'", Print_this_message: "Print this message.", - Print_the_compiler_s_version_0: "Print the compiler's version: {0}", Allow_use_of_deprecated_0_keyword_when_referencing_an_external_module: "Allow use of deprecated '{0}' keyword when referencing an external module.", - Specify_locale_for_errors_and_messages_For_example_0_or_1: "Specify locale for errors and messages. For example '{0}' or '{1}'", Syntax_0: "Syntax: {0}", options: "options", file1: "file", @@ -431,7 +425,6 @@ module TypeScript { LOCATION: "LOCATION", DIRECTORY: "DIRECTORY", NUMBER: "NUMBER", - Specify_the_codepage_to_use_when_opening_source_files: "Specify the codepage to use when opening source files.", Additional_locations: "Additional locations:", This_version_of_the_Javascript_runtime_does_not_support_the_0_function: "This version of the Javascript runtime does not support the '{0}' function.", Unknown_rule: "Unknown rule.", diff --git a/src/services/services.ts b/src/services/services.ts index 3de077b160..2a1fe59d23 100644 --- a/src/services/services.ts +++ b/src/services/services.ts @@ -335,36 +335,44 @@ module ts { var paramTag = "@param"; var jsDocCommentParts: SymbolDisplayPart[] = []; - ts.forEach(declarations, declaration => { - var sourceFileOfDeclaration = getSourceFileOfNode(declaration); - // If it is parameter - try and get the jsDoc comment with @param tag from function declaration's jsDoc comments - if (canUseParsedParamTagComments && declaration.kind === SyntaxKind.Parameter) { - ts.forEach(getJsDocCommentTextRange(declaration.parent, sourceFileOfDeclaration), jsDocCommentTextRange => { - var cleanedParamJsDocComment = getCleanedParamJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); - if (cleanedParamJsDocComment) { - jsDocCommentParts.push.apply(jsDocCommentParts, cleanedParamJsDocComment); - } - }); + ts.forEach(declarations, (declaration, indexOfDeclaration) => { + // Make sure we are collecting doc comment from declaration once, + // In case of union property there might be same declaration multiple times + // which only varies in type parameter + // Eg. var a: Array | Array; a.length + // The property length will have two declarations of property length coming + // from Array - Array and Array + if (indexOf(declarations, declaration) === indexOfDeclaration) { + var sourceFileOfDeclaration = getSourceFileOfNode(declaration); + // If it is parameter - try and get the jsDoc comment with @param tag from function declaration's jsDoc comments + if (canUseParsedParamTagComments && declaration.kind === SyntaxKind.Parameter) { + ts.forEach(getJsDocCommentTextRange(declaration.parent, sourceFileOfDeclaration), jsDocCommentTextRange => { + var cleanedParamJsDocComment = getCleanedParamJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); + if (cleanedParamJsDocComment) { + jsDocCommentParts.push.apply(jsDocCommentParts, cleanedParamJsDocComment); + } + }); + } + + // If this is left side of dotted module declaration, there is no doc comments associated with this node + if (declaration.kind === SyntaxKind.ModuleDeclaration && (declaration).body.kind === SyntaxKind.ModuleDeclaration) { + return; + } + + // If this is dotted module name, get the doc comments from the parent + while (declaration.kind === SyntaxKind.ModuleDeclaration && declaration.parent.kind === SyntaxKind.ModuleDeclaration) { + declaration = declaration.parent; + } + + // Get the cleaned js doc comment text from the declaration + ts.forEach(getJsDocCommentTextRange( + declaration.kind === SyntaxKind.VariableDeclaration ? declaration.parent.parent : declaration, sourceFileOfDeclaration), jsDocCommentTextRange => { + var cleanedJsDocComment = getCleanedJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); + if (cleanedJsDocComment) { + jsDocCommentParts.push.apply(jsDocCommentParts, cleanedJsDocComment); + } + }); } - - // If this is left side of dotted module declaration, there is no doc comments associated with this node - if (declaration.kind === SyntaxKind.ModuleDeclaration && (declaration).body.kind === SyntaxKind.ModuleDeclaration) { - return; - } - - // If this is dotted module name, get the doc comments from the parent - while (declaration.kind === SyntaxKind.ModuleDeclaration && declaration.parent.kind === SyntaxKind.ModuleDeclaration) { - declaration = declaration.parent; - } - - // Get the cleaned js doc comment text from the declaration - ts.forEach(getJsDocCommentTextRange( - declaration.kind === SyntaxKind.VariableDeclaration ? declaration.parent.parent : declaration, sourceFileOfDeclaration), jsDocCommentTextRange => { - var cleanedJsDocComment = getCleanedJsDocComment(jsDocCommentTextRange.pos, jsDocCommentTextRange.end, sourceFileOfDeclaration); - if (cleanedJsDocComment) { - jsDocCommentParts.push.apply(jsDocCommentParts, cleanedJsDocComment); - } - }); }); return jsDocCommentParts; diff --git a/src/services/syntax/SyntaxGenerator.d.ts b/src/services/syntax/SyntaxGenerator.d.ts index d01d227b78..783ecb436e 100644 --- a/src/services/syntax/SyntaxGenerator.d.ts +++ b/src/services/syntax/SyntaxGenerator.d.ts @@ -383,19 +383,13 @@ declare module TypeScript { Option_0_specified_without_1: string; codepage_option_not_supported_on_current_platform: string; Concatenate_and_emit_output_to_single_file: string; - Generates_corresponding_0_file: string; Specifies_the_location_where_debugger_should_locate_map_files_instead_of_generated_locations: string; Specifies_the_location_where_debugger_should_locate_TypeScript_files_instead_of_source_locations: string; Watch_input_files: string; Redirect_output_structure_to_the_directory: string; Do_not_emit_comments_to_output: string; - Skip_resolution_and_preprocessing: string; - Specify_ECMAScript_target_version_0_default_or_1: string; - Specify_module_code_generation_0_or_1: string; Print_this_message: string; - Print_the_compiler_s_version_0: string; Allow_use_of_deprecated_0_keyword_when_referencing_an_external_module: string; - Specify_locale_for_errors_and_messages_For_example_0_or_1: string; Syntax_0: string; options: string; file1: string; @@ -412,7 +406,6 @@ declare module TypeScript { LOCATION: string; DIRECTORY: string; NUMBER: string; - Specify_the_codepage_to_use_when_opening_source_files: string; Additional_locations: string; This_version_of_the_Javascript_runtime_does_not_support_the_0_function: string; Unknown_rule: string; diff --git a/tests/baselines/reference/arrayAssignmentTest3.errors.txt b/tests/baselines/reference/arrayAssignmentTest3.errors.txt index 1c88408eb5..31347782c5 100644 --- a/tests/baselines/reference/arrayAssignmentTest3.errors.txt +++ b/tests/baselines/reference/arrayAssignmentTest3.errors.txt @@ -1,4 +1,5 @@ tests/cases/compiler/arrayAssignmentTest3.ts(12,25): error TS2345: Argument of type 'B' is not assignable to parameter of type 'B[]'. + Property 'length' is missing in type 'B'. ==== tests/cases/compiler/arrayAssignmentTest3.ts (1 errors) ==== @@ -16,5 +17,6 @@ tests/cases/compiler/arrayAssignmentTest3.ts(12,25): error TS2345: Argument of t var xx = new a(null, 7, new B()); ~~~~~~~ !!! error TS2345: Argument of type 'B' is not assignable to parameter of type 'B[]'. +!!! error TS2345: Property 'length' is missing in type 'B'. \ No newline at end of file diff --git a/tests/baselines/reference/arrowFunctionContexts.js b/tests/baselines/reference/arrowFunctionContexts.js index abb8fd0ab7..cdf902a6c3 100644 --- a/tests/baselines/reference/arrowFunctionContexts.js +++ b/tests/baselines/reference/arrowFunctionContexts.js @@ -103,6 +103,7 @@ var __extends = this.__extends || function (d, b) { __.prototype = b.prototype; d.prototype = new __(); }; +// Arrow function used in with statement with (window) { var p = function () { return this; }; } @@ -142,6 +143,7 @@ var M; // Repeat above for module members that are functions? (necessary to redo all of them?) var M2; (function (M2) { + // Arrow function used in with statement with (window) { var p = function () { return this; }; } diff --git a/tests/baselines/reference/assignmentCompatBug5.errors.txt b/tests/baselines/reference/assignmentCompatBug5.errors.txt index a015cc3bbc..fd13a07a94 100644 --- a/tests/baselines/reference/assignmentCompatBug5.errors.txt +++ b/tests/baselines/reference/assignmentCompatBug5.errors.txt @@ -3,7 +3,10 @@ tests/cases/compiler/assignmentCompatBug5.ts(2,6): error TS2345: Argument of typ tests/cases/compiler/assignmentCompatBug5.ts(5,6): error TS2345: Argument of type 'string[]' is not assignable to parameter of type 'number[]'. Type 'string' is not assignable to type 'number'. tests/cases/compiler/assignmentCompatBug5.ts(8,6): error TS2345: Argument of type '(s: string) => void' is not assignable to parameter of type '(n: number) => number'. + Types of parameters 's' and 'n' are incompatible. + Type 'string' is not assignable to type 'number'. tests/cases/compiler/assignmentCompatBug5.ts(9,6): error TS2345: Argument of type '(n: number) => void' is not assignable to parameter of type '(n: number) => number'. + Type 'void' is not assignable to type 'number'. ==== tests/cases/compiler/assignmentCompatBug5.ts (4 errors) ==== @@ -23,8 +26,11 @@ tests/cases/compiler/assignmentCompatBug5.ts(9,6): error TS2345: Argument of typ foo3((s:string) => { }); ~~~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(s: string) => void' is not assignable to parameter of type '(n: number) => number'. +!!! error TS2345: Types of parameters 's' and 'n' are incompatible. +!!! error TS2345: Type 'string' is not assignable to type 'number'. foo3((n) => { return; }); ~~~~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(n: number) => void' is not assignable to parameter of type '(n: number) => number'. +!!! error TS2345: Type 'void' is not assignable to type 'number'. \ No newline at end of file diff --git a/tests/baselines/reference/assignmentCompatInterfaceWithStringIndexSignature.errors.txt b/tests/baselines/reference/assignmentCompatInterfaceWithStringIndexSignature.errors.txt index f972c9a925..65c1d30779 100644 --- a/tests/baselines/reference/assignmentCompatInterfaceWithStringIndexSignature.errors.txt +++ b/tests/baselines/reference/assignmentCompatInterfaceWithStringIndexSignature.errors.txt @@ -1,4 +1,5 @@ tests/cases/compiler/assignmentCompatInterfaceWithStringIndexSignature.ts(15,5): error TS2345: Argument of type 'Foo' is not assignable to parameter of type 'IHandlerMap'. + Index signature is missing in type 'Foo'. ==== tests/cases/compiler/assignmentCompatInterfaceWithStringIndexSignature.ts (1 errors) ==== @@ -19,4 +20,5 @@ tests/cases/compiler/assignmentCompatInterfaceWithStringIndexSignature.ts(15,5): Biz(new Foo()); ~~~~~~~~~ !!! error TS2345: Argument of type 'Foo' is not assignable to parameter of type 'IHandlerMap'. +!!! error TS2345: Index signature is missing in type 'Foo'. \ No newline at end of file diff --git a/tests/baselines/reference/augmentedTypesEnum2.js b/tests/baselines/reference/augmentedTypesEnum2.js index 434e508f14..f0c86e5640 100644 --- a/tests/baselines/reference/augmentedTypesEnum2.js +++ b/tests/baselines/reference/augmentedTypesEnum2.js @@ -31,7 +31,7 @@ var e2; (function (e2) { e2[e2["One"] = 0] = "One"; })(e2 || (e2 = {})); -; +; // error var e2 = (function () { function e2() { } diff --git a/tests/baselines/reference/augmentedTypesInterface.js b/tests/baselines/reference/augmentedTypesInterface.js index a5039f8b1d..e28864fd54 100644 --- a/tests/baselines/reference/augmentedTypesInterface.js +++ b/tests/baselines/reference/augmentedTypesInterface.js @@ -47,5 +47,5 @@ var i3; (function (i3) { i3[i3["One"] = 0] = "One"; })(i3 || (i3 = {})); -; +; // error //import i4 = require(''); // error diff --git a/tests/baselines/reference/augmentedTypesModules.js b/tests/baselines/reference/augmentedTypesModules.js index a9bff3fa74..3b7544996a 100644 --- a/tests/baselines/reference/augmentedTypesModules.js +++ b/tests/baselines/reference/augmentedTypesModules.js @@ -124,21 +124,21 @@ var m1d; var m1d = 1; // error function m2() { } -; +; // ok since the module is not instantiated var m2a; (function (m2a) { var y = 2; })(m2a || (m2a = {})); function m2a() { } -; +; // error since the module is instantiated var m2b; (function (m2b) { m2b.y = 2; })(m2b || (m2b = {})); function m2b() { } -; +; // error since the module is instantiated // should be errors to have function first function m2c() { } diff --git a/tests/baselines/reference/augmentedTypesModules2.js b/tests/baselines/reference/augmentedTypesModules2.js index d1551b6244..70fd31f03e 100644 --- a/tests/baselines/reference/augmentedTypesModules2.js +++ b/tests/baselines/reference/augmentedTypesModules2.js @@ -31,21 +31,21 @@ module m2g { export class C { foo() { } } } //// [augmentedTypesModules2.js] function m2() { } -; +; // ok since the module is not instantiated var m2a; (function (m2a) { var y = 2; })(m2a || (m2a = {})); function m2a() { } -; +; // error since the module is instantiated var m2b; (function (m2b) { m2b.y = 2; })(m2b || (m2b = {})); function m2b() { } -; +; // error since the module is instantiated function m2c() { } ; @@ -59,7 +59,7 @@ var m2cc; })(m2cc || (m2cc = {})); function m2cc() { } -; +; // error to have module first function m2f() { } ; diff --git a/tests/baselines/reference/chainedCallsWithTypeParameterConstrainedToOtherTypeParameter.errors.txt b/tests/baselines/reference/chainedCallsWithTypeParameterConstrainedToOtherTypeParameter.errors.txt index be465275de..f9edcf4eef 100644 --- a/tests/baselines/reference/chainedCallsWithTypeParameterConstrainedToOtherTypeParameter.errors.txt +++ b/tests/baselines/reference/chainedCallsWithTypeParameterConstrainedToOtherTypeParameter.errors.txt @@ -1,4 +1,5 @@ tests/cases/compiler/chainedCallsWithTypeParameterConstrainedToOtherTypeParameter.ts(19,59): error TS2345: Argument of type '(c: C) => B' is not assignable to parameter of type '(x: C) => C'. + Type 'B' is not assignable to type 'C'. ==== tests/cases/compiler/chainedCallsWithTypeParameterConstrainedToOtherTypeParameter.ts (1 errors) ==== @@ -22,4 +23,5 @@ tests/cases/compiler/chainedCallsWithTypeParameterConstrainedToOtherTypeParamete // Ok to go down the chain, but error to try to climb back up (new Chain(new A)).then(a => new B).then(b => new C).then(c => new B).then(b => new A); ~~~~~~~~~~ -!!! error TS2345: Argument of type '(c: C) => B' is not assignable to parameter of type '(x: C) => C'. \ No newline at end of file +!!! error TS2345: Argument of type '(c: C) => B' is not assignable to parameter of type '(x: C) => C'. +!!! error TS2345: Type 'B' is not assignable to type 'C'. \ No newline at end of file diff --git a/tests/baselines/reference/chainedCallsWithTypeParameterConstrainedToOtherTypeParameter2.errors.txt b/tests/baselines/reference/chainedCallsWithTypeParameterConstrainedToOtherTypeParameter2.errors.txt index e307cc9be8..8f5924586d 100644 --- a/tests/baselines/reference/chainedCallsWithTypeParameterConstrainedToOtherTypeParameter2.errors.txt +++ b/tests/baselines/reference/chainedCallsWithTypeParameterConstrainedToOtherTypeParameter2.errors.txt @@ -1,5 +1,7 @@ tests/cases/compiler/chainedCallsWithTypeParameterConstrainedToOtherTypeParameter2.ts(7,43): error TS2345: Argument of type '(ss: S) => T' is not assignable to parameter of type '(x: S) => S'. + Type 'T' is not assignable to type 'S'. tests/cases/compiler/chainedCallsWithTypeParameterConstrainedToOtherTypeParameter2.ts(10,29): error TS2345: Argument of type '(ss: S) => T' is not assignable to parameter of type '(x: S) => S'. + Type 'T' is not assignable to type 'S'. tests/cases/compiler/chainedCallsWithTypeParameterConstrainedToOtherTypeParameter2.ts(32,9): error TS2322: Type 'string' is not assignable to type 'number'. tests/cases/compiler/chainedCallsWithTypeParameterConstrainedToOtherTypeParameter2.ts(36,9): error TS2322: Type 'string' is not assignable to type 'number'. tests/cases/compiler/chainedCallsWithTypeParameterConstrainedToOtherTypeParameter2.ts(37,9): error TS2322: Type 'string' is not assignable to type 'number'. @@ -15,11 +17,13 @@ tests/cases/compiler/chainedCallsWithTypeParameterConstrainedToOtherTypeParamete (new Chain(t)).then(tt => s).then(ss => t); ~~~~~~~ !!! error TS2345: Argument of type '(ss: S) => T' is not assignable to parameter of type '(x: S) => S'. +!!! error TS2345: Type 'T' is not assignable to type 'S'. // But error to try to climb up the chain (new Chain(s)).then(ss => t); ~~~~~~~ !!! error TS2345: Argument of type '(ss: S) => T' is not assignable to parameter of type '(x: S) => S'. +!!! error TS2345: Type 'T' is not assignable to type 'S'. // Staying at T or S should be fine (new Chain(t)).then(tt => t).then(tt => t).then(tt => t); diff --git a/tests/baselines/reference/commaOperatorOtherValidOperation.js b/tests/baselines/reference/commaOperatorOtherValidOperation.js index 4d556472ad..383b7c5058 100644 --- a/tests/baselines/reference/commaOperatorOtherValidOperation.js +++ b/tests/baselines/reference/commaOperatorOtherValidOperation.js @@ -22,6 +22,7 @@ function foo1() //// [commaOperatorOtherValidOperation.js] +//Comma operator in for loop for (var i = 0, j = 10; i < j; i++, j--) { } //Comma operator in fuction arguments and return diff --git a/tests/baselines/reference/commentsOnObjectLiteral1.js b/tests/baselines/reference/commentsOnObjectLiteral1.js index 1c47ed68d8..feb6a521b8 100644 --- a/tests/baselines/reference/commentsOnObjectLiteral1.js +++ b/tests/baselines/reference/commentsOnObjectLiteral1.js @@ -8,4 +8,8 @@ var Person = makeClass( ); //// [commentsOnObjectLiteral1.js] -var Person = makeClass({}); +var Person = makeClass( +/** + @scope Person +*/ +{}); diff --git a/tests/baselines/reference/commentsVarDecl.js b/tests/baselines/reference/commentsVarDecl.js index 5105e03879..5ff2a3c1c6 100644 --- a/tests/baselines/reference/commentsVarDecl.js +++ b/tests/baselines/reference/commentsVarDecl.js @@ -66,7 +66,9 @@ var n = 30; /** var deckaration with comment on type as well*/ var y = 20; /// var deckaration with comment on type as well -var yy = 20; +var yy = +/// value comment +20; /** comment2 */ var z = function (x, y) { return x + y; }; var z2; diff --git a/tests/baselines/reference/constDeclarations-scopes.js b/tests/baselines/reference/constDeclarations-scopes.js index aa35dc7df7..f8fbc47312 100644 --- a/tests/baselines/reference/constDeclarations-scopes.js +++ b/tests/baselines/reference/constDeclarations-scopes.js @@ -189,6 +189,7 @@ while (false) { label2: label3: label4: const c = 0; n = c; } +// Try/catch/finally try { const c = 0; n = c; @@ -201,12 +202,14 @@ finally { const c = 0; n = c; } +// Switch switch (0) { case 0: const c = 0; n = c; break; } +// blocks { const c = 0; n = c; diff --git a/tests/baselines/reference/constDeclarations-scopes2.js b/tests/baselines/reference/constDeclarations-scopes2.js index 1d0f252ab4..d407cf5680 100644 --- a/tests/baselines/reference/constDeclarations-scopes2.js +++ b/tests/baselines/reference/constDeclarations-scopes2.js @@ -20,6 +20,7 @@ for (const c = 0; c < 10; n = c ) { const c = "string"; var n; var b; +// for scope for (const c = 0; c < 10; n = c) { // for block const c = false; diff --git a/tests/baselines/reference/constDeclarations-validContexts.js b/tests/baselines/reference/constDeclarations-validContexts.js index 7c33c4e144..5a54e91571 100644 --- a/tests/baselines/reference/constDeclarations-validContexts.js +++ b/tests/baselines/reference/constDeclarations-validContexts.js @@ -153,6 +153,7 @@ if (true) { while (false) { label2: label3: label4: const c9 = 0; } +// Try/catch/finally try { const c10 = 0; } @@ -162,6 +163,7 @@ catch (e) { finally { const c12 = 0; } +// Switch switch (0) { case 0: const c13 = 0; @@ -170,6 +172,7 @@ switch (0) { const c14 = 0; break; } +// blocks { const c15 = 0; { diff --git a/tests/baselines/reference/contextualTypingOfGenericFunctionTypedArguments1.errors.txt b/tests/baselines/reference/contextualTypingOfGenericFunctionTypedArguments1.errors.txt index f7bac87895..c7b15e8efe 100644 --- a/tests/baselines/reference/contextualTypingOfGenericFunctionTypedArguments1.errors.txt +++ b/tests/baselines/reference/contextualTypingOfGenericFunctionTypedArguments1.errors.txt @@ -1,5 +1,7 @@ tests/cases/compiler/contextualTypingOfGenericFunctionTypedArguments1.ts(16,32): error TS2345: Argument of type '(x: number) => string' is not assignable to parameter of type '(x: number) => Date'. + Type 'string' is not assignable to type 'Date'. tests/cases/compiler/contextualTypingOfGenericFunctionTypedArguments1.ts(17,32): error TS2345: Argument of type '(x: number) => string' is not assignable to parameter of type '(x: number) => Date'. + Type 'string' is not assignable to type 'Date'. ==== tests/cases/compiler/contextualTypingOfGenericFunctionTypedArguments1.ts (2 errors) ==== @@ -21,7 +23,9 @@ tests/cases/compiler/contextualTypingOfGenericFunctionTypedArguments1.ts(17,32): var r5 = _.forEach(c2, f); ~ !!! error TS2345: Argument of type '(x: number) => string' is not assignable to parameter of type '(x: number) => Date'. +!!! error TS2345: Type 'string' is not assignable to type 'Date'. var r6 = _.forEach(c2, (x) => { return x.toFixed() }); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number) => string' is not assignable to parameter of type '(x: number) => Date'. +!!! error TS2345: Type 'string' is not assignable to type 'Date'. \ No newline at end of file diff --git a/tests/baselines/reference/contextualTypingOfObjectLiterals.errors.txt b/tests/baselines/reference/contextualTypingOfObjectLiterals.errors.txt index 5d41b312f7..ac8063a437 100644 --- a/tests/baselines/reference/contextualTypingOfObjectLiterals.errors.txt +++ b/tests/baselines/reference/contextualTypingOfObjectLiterals.errors.txt @@ -1,6 +1,7 @@ tests/cases/compiler/contextualTypingOfObjectLiterals.ts(4,1): error TS2322: Type '{ x: string; }' is not assignable to type '{ [x: string]: string; }'. Index signature is missing in type '{ x: string; }'. tests/cases/compiler/contextualTypingOfObjectLiterals.ts(10,3): error TS2345: Argument of type '{ x: string; }' is not assignable to parameter of type '{ [s: string]: string; }'. + Index signature is missing in type '{ x: string; }'. ==== tests/cases/compiler/contextualTypingOfObjectLiterals.ts (2 errors) ==== @@ -18,4 +19,5 @@ tests/cases/compiler/contextualTypingOfObjectLiterals.ts(10,3): error TS2345: Ar f(obj1); // Ok f(obj2); // Error - indexer doesn't match ~~~~ -!!! error TS2345: Argument of type '{ x: string; }' is not assignable to parameter of type '{ [s: string]: string; }'. \ No newline at end of file +!!! error TS2345: Argument of type '{ x: string; }' is not assignable to parameter of type '{ [s: string]: string; }'. +!!! error TS2345: Index signature is missing in type '{ x: string; }'. \ No newline at end of file diff --git a/tests/baselines/reference/destructuringParameterProperties2.errors.txt b/tests/baselines/reference/destructuringParameterProperties2.errors.txt index 61c0e61611..bc7588a853 100644 --- a/tests/baselines/reference/destructuringParameterProperties2.errors.txt +++ b/tests/baselines/reference/destructuringParameterProperties2.errors.txt @@ -6,6 +6,8 @@ tests/cases/conformance/es6/destructuring/destructuringParameterProperties2.ts(9 tests/cases/conformance/es6/destructuring/destructuringParameterProperties2.ts(13,21): error TS2339: Property 'b' does not exist on type 'C1'. tests/cases/conformance/es6/destructuring/destructuringParameterProperties2.ts(17,21): error TS2339: Property 'c' does not exist on type 'C1'. tests/cases/conformance/es6/destructuring/destructuringParameterProperties2.ts(21,27): error TS2345: Argument of type '[number, undefined, string]' is not assignable to parameter of type '[number, string, boolean]'. + Types of property '2' are incompatible. + Type 'string' is not assignable to type 'boolean'. ==== tests/cases/conformance/es6/destructuring/destructuringParameterProperties2.ts (8 errors) ==== @@ -46,6 +48,8 @@ tests/cases/conformance/es6/destructuring/destructuringParameterProperties2.ts(2 var x = new C1(undefined, [0, undefined, ""]); ~~~~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '[number, undefined, string]' is not assignable to parameter of type '[number, string, boolean]'. +!!! error TS2345: Types of property '2' are incompatible. +!!! error TS2345: Type 'string' is not assignable to type 'boolean'. var [x_a, x_b, x_c] = [x.getA(), x.getB(), x.getC()]; var y = new C1(10, [0, "", true]); diff --git a/tests/baselines/reference/elaboratedErrors.errors.txt b/tests/baselines/reference/elaboratedErrors.errors.txt new file mode 100644 index 0000000000..7bc83a19a5 --- /dev/null +++ b/tests/baselines/reference/elaboratedErrors.errors.txt @@ -0,0 +1,52 @@ +tests/cases/compiler/elaboratedErrors.ts(10,7): error TS2420: Class 'WorkerFS' incorrectly implements interface 'FileSystem'. + Types of property 'read' are incompatible. + Type 'string' is not assignable to type 'number'. +tests/cases/compiler/elaboratedErrors.ts(20,1): error TS2322: Type 'Beta' is not assignable to type 'Alpha'. + Property 'x' is missing in type 'Beta'. +tests/cases/compiler/elaboratedErrors.ts(21,1): error TS2322: Type 'Beta' is not assignable to type 'Alpha'. +tests/cases/compiler/elaboratedErrors.ts(24,1): error TS2322: Type 'Alpha' is not assignable to type 'Beta'. + Property 'y' is missing in type 'Alpha'. +tests/cases/compiler/elaboratedErrors.ts(25,1): error TS2322: Type 'Alpha' is not assignable to type 'Beta'. + + +==== tests/cases/compiler/elaboratedErrors.ts (5 errors) ==== + interface FileSystem { + read: number; + } + + function fn(s: WorkerFS): void; + function fn(s: FileSystem): void; + function fn(s: FileSystem|WorkerFS) { } + + // This should issue a large error, not a small one + class WorkerFS implements FileSystem { + ~~~~~~~~ +!!! error TS2420: Class 'WorkerFS' incorrectly implements interface 'FileSystem'. +!!! error TS2420: Types of property 'read' are incompatible. +!!! error TS2420: Type 'string' is not assignable to type 'number'. + read: string; + } + + interface Alpha { x: string; } + interface Beta { y: number; } + var x: Alpha; + var y: Beta; + + // Only one of these errors should be large + x = y; + ~ +!!! error TS2322: Type 'Beta' is not assignable to type 'Alpha'. +!!! error TS2322: Property 'x' is missing in type 'Beta'. + x = y; + ~ +!!! error TS2322: Type 'Beta' is not assignable to type 'Alpha'. + + // Only one of these errors should be large + y = x; + ~ +!!! error TS2322: Type 'Alpha' is not assignable to type 'Beta'. +!!! error TS2322: Property 'y' is missing in type 'Alpha'. + y = x; + ~ +!!! error TS2322: Type 'Alpha' is not assignable to type 'Beta'. + \ No newline at end of file diff --git a/tests/baselines/reference/elaboratedErrors.js b/tests/baselines/reference/elaboratedErrors.js new file mode 100644 index 0000000000..c245c1a856 --- /dev/null +++ b/tests/baselines/reference/elaboratedErrors.js @@ -0,0 +1,45 @@ +//// [elaboratedErrors.ts] +interface FileSystem { + read: number; +} + +function fn(s: WorkerFS): void; +function fn(s: FileSystem): void; +function fn(s: FileSystem|WorkerFS) { } + +// This should issue a large error, not a small one +class WorkerFS implements FileSystem { + read: string; +} + +interface Alpha { x: string; } +interface Beta { y: number; } +var x: Alpha; +var y: Beta; + +// Only one of these errors should be large +x = y; +x = y; + +// Only one of these errors should be large +y = x; +y = x; + + +//// [elaboratedErrors.js] +function fn(s) { +} +// This should issue a large error, not a small one +var WorkerFS = (function () { + function WorkerFS() { + } + return WorkerFS; +})(); +var x; +var y; +// Only one of these errors should be large +x = y; +x = y; +// Only one of these errors should be large +y = x; +y = x; diff --git a/tests/baselines/reference/escapedIdentifiers.js b/tests/baselines/reference/escapedIdentifiers.js index cabeb7f1d5..5de505e4cb 100644 --- a/tests/baselines/reference/escapedIdentifiers.js +++ b/tests/baselines/reference/escapedIdentifiers.js @@ -204,19 +204,20 @@ constructorTestObject.arg\u0031 = 1; constructorTestObject.arg2 = 'string'; constructorTestObject.arg\u0033 = true; constructorTestObject.arg4 = 2; +// Lables l\u0061bel1: while (false) { while (false) - continue label1; + continue label1; // it will go to next iteration of outer loop } label2: while (false) { while (false) - continue l\u0061bel2; + continue l\u0061bel2; // it will go to next iteration of outer loop } label3: while (false) { while (false) - continue label3; + continue label3; // it will go to next iteration of outer loop } l\u0061bel4: while (false) { while (false) - continue l\u0061bel4; + continue l\u0061bel4; // it will go to next iteration of outer loop } diff --git a/tests/baselines/reference/exportAssignmentConstrainedGenericType.errors.txt b/tests/baselines/reference/exportAssignmentConstrainedGenericType.errors.txt index cf63c48925..946bc8ee8b 100644 --- a/tests/baselines/reference/exportAssignmentConstrainedGenericType.errors.txt +++ b/tests/baselines/reference/exportAssignmentConstrainedGenericType.errors.txt @@ -1,4 +1,5 @@ tests/cases/conformance/externalModules/foo_1.ts(2,17): error TS2345: Argument of type 'boolean' is not assignable to parameter of type '{ a: string; b: number; }'. + Property 'a' is missing in type 'Boolean'. ==== tests/cases/conformance/externalModules/foo_1.ts (1 errors) ==== @@ -6,6 +7,7 @@ tests/cases/conformance/externalModules/foo_1.ts(2,17): error TS2345: Argument o var x = new foo(true); // Should error ~~~~ !!! error TS2345: Argument of type 'boolean' is not assignable to parameter of type '{ a: string; b: number; }'. +!!! error TS2345: Property 'a' is missing in type 'Boolean'. var y = new foo({a: "test", b: 42}); // Should be OK var z: number = y.test.b; ==== tests/cases/conformance/externalModules/foo_0.ts (0 errors) ==== diff --git a/tests/baselines/reference/forStatementsMultipleInvalidDecl.js b/tests/baselines/reference/forStatementsMultipleInvalidDecl.js index 73db1ff3c7..4dbfe7e62b 100644 --- a/tests/baselines/reference/forStatementsMultipleInvalidDecl.js +++ b/tests/baselines/reference/forStatementsMultipleInvalidDecl.js @@ -93,6 +93,7 @@ var M; } M.F2 = F2; })(M || (M = {})); +// all of these are errors for (var a;;) { } for (var a = 1;;) { diff --git a/tests/baselines/reference/functionCall7.errors.txt b/tests/baselines/reference/functionCall7.errors.txt index 576ea9c266..19e572fa58 100644 --- a/tests/baselines/reference/functionCall7.errors.txt +++ b/tests/baselines/reference/functionCall7.errors.txt @@ -1,5 +1,6 @@ tests/cases/compiler/functionCall7.ts(5,1): error TS2346: Supplied parameters do not match any signature of call target. tests/cases/compiler/functionCall7.ts(6,5): error TS2345: Argument of type 'number' is not assignable to parameter of type 'c1'. + Property 'a' is missing in type 'Number'. tests/cases/compiler/functionCall7.ts(7,1): error TS2346: Supplied parameters do not match any signature of call target. @@ -14,6 +15,7 @@ tests/cases/compiler/functionCall7.ts(7,1): error TS2346: Supplied parameters do foo(4); ~ !!! error TS2345: Argument of type 'number' is not assignable to parameter of type 'c1'. +!!! error TS2345: Property 'a' is missing in type 'Number'. foo(); ~~~~~ !!! error TS2346: Supplied parameters do not match any signature of call target. diff --git a/tests/baselines/reference/functionConstraintSatisfaction2.errors.txt b/tests/baselines/reference/functionConstraintSatisfaction2.errors.txt index 4af5c01c50..03ce995293 100644 --- a/tests/baselines/reference/functionConstraintSatisfaction2.errors.txt +++ b/tests/baselines/reference/functionConstraintSatisfaction2.errors.txt @@ -1,8 +1,11 @@ tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction2.ts(5,5): error TS2345: Argument of type 'number' is not assignable to parameter of type 'Function'. + Property 'apply' is missing in type 'Number'. tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction2.ts(6,1): error TS2346: Supplied parameters do not match any signature of call target. tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction2.ts(7,1): error TS2346: Supplied parameters do not match any signature of call target. tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction2.ts(23,14): error TS2345: Argument of type 'Function' is not assignable to parameter of type '(x: string) => string'. tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction2.ts(24,15): error TS2345: Argument of type '(x: string[]) => string[]' is not assignable to parameter of type '(x: string) => string'. + Types of parameters 'x' and 'x' are incompatible. + Type 'string[]' is not assignable to type 'string'. tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction2.ts(25,15): error TS2345: Argument of type 'typeof C' is not assignable to parameter of type '(x: string) => string'. tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction2.ts(26,15): error TS2345: Argument of type 'new (x: string) => string' is not assignable to parameter of type '(x: string) => string'. tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction2.ts(28,16): error TS2345: Argument of type '(x: U, y: V) => U' is not assignable to parameter of type '(x: string) => string'. @@ -11,6 +14,7 @@ tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstrain tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction2.ts(34,16): error TS2345: Argument of type 'F2' is not assignable to parameter of type '(x: string) => string'. tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction2.ts(36,38): error TS2313: Constraint of a type parameter cannot reference any type parameter from the same type parameter list. tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction2.ts(37,10): error TS2345: Argument of type 'T' is not assignable to parameter of type '(x: string) => string'. + Type 'void' is not assignable to type 'string'. tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstraintSatisfaction2.ts(38,10): error TS2345: Argument of type 'U' is not assignable to parameter of type '(x: string) => string'. @@ -22,6 +26,7 @@ tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstrain foo(1); ~ !!! error TS2345: Argument of type 'number' is not assignable to parameter of type 'Function'. +!!! error TS2345: Property 'apply' is missing in type 'Number'. foo(() => { }, 1); ~~~~~~~~~~~~~~~~~ !!! error TS2346: Supplied parameters do not match any signature of call target. @@ -49,6 +54,8 @@ tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstrain var r2 = foo2((x: string[]) => x); ~~~~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: string[]) => string[]' is not assignable to parameter of type '(x: string) => string'. +!!! error TS2345: Types of parameters 'x' and 'x' are incompatible. +!!! error TS2345: Type 'string[]' is not assignable to type 'string'. var r6 = foo2(C); ~ !!! error TS2345: Argument of type 'typeof C' is not assignable to parameter of type '(x: string) => string'. @@ -78,6 +85,7 @@ tests/cases/conformance/types/typeParameters/typeArgumentLists/functionConstrain foo2(x); ~ !!! error TS2345: Argument of type 'T' is not assignable to parameter of type '(x: string) => string'. +!!! error TS2345: Type 'void' is not assignable to type 'string'. foo2(y); ~ !!! error TS2345: Argument of type 'U' is not assignable to parameter of type '(x: string) => string'. diff --git a/tests/baselines/reference/genericCallToOverloadedMethodWithOverloadedArguments.errors.txt b/tests/baselines/reference/genericCallToOverloadedMethodWithOverloadedArguments.errors.txt index 8900e97503..428ebecf5b 100644 --- a/tests/baselines/reference/genericCallToOverloadedMethodWithOverloadedArguments.errors.txt +++ b/tests/baselines/reference/genericCallToOverloadedMethodWithOverloadedArguments.errors.txt @@ -1,7 +1,15 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallToOverloadedMethodWithOverloadedArguments.ts(24,38): error TS2345: Argument of type '{ (n: number): Promise; (s: string): Promise; }' is not assignable to parameter of type '(x: number) => Promise'. + Type 'Promise' is not assignable to type 'Promise'. + Type 'number' is not assignable to type 'string'. tests/cases/conformance/types/typeRelationships/typeInference/genericCallToOverloadedMethodWithOverloadedArguments.ts(53,38): error TS2345: Argument of type '{ (n: number): Promise; (s: string): Promise; }' is not assignable to parameter of type '(x: number) => Promise'. + Type 'Promise' is not assignable to type 'Promise'. + Type 'number' is not assignable to type 'string'. tests/cases/conformance/types/typeRelationships/typeInference/genericCallToOverloadedMethodWithOverloadedArguments.ts(69,38): error TS2345: Argument of type '{ (n: number): Promise; (s: string): Promise; }' is not assignable to parameter of type '(x: number) => Promise'. + Type 'Promise' is not assignable to type 'Promise'. + Type 'number' is not assignable to type 'string'. tests/cases/conformance/types/typeRelationships/typeInference/genericCallToOverloadedMethodWithOverloadedArguments.ts(85,38): error TS2345: Argument of type '{ (n: number): Promise; (s: string): Promise; (b: boolean): Promise; }' is not assignable to parameter of type '(x: number) => Promise'. + Type 'Promise' is not assignable to type 'Promise'. + Type 'number' is not assignable to type 'boolean'. ==== tests/cases/conformance/types/typeRelationships/typeInference/genericCallToOverloadedMethodWithOverloadedArguments.ts (4 errors) ==== @@ -31,6 +39,8 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallToOverl var newPromise = numPromise.then(testFunction); ~~~~~~~~~~~~ !!! error TS2345: Argument of type '{ (n: number): Promise; (s: string): Promise; }' is not assignable to parameter of type '(x: number) => Promise'. +!!! error TS2345: Type 'Promise' is not assignable to type 'Promise'. +!!! error TS2345: Type 'number' is not assignable to type 'string'. } ////////////////////////////////////// @@ -62,6 +72,8 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallToOverl var newPromise = numPromise.then(testFunction); ~~~~~~~~~~~~ !!! error TS2345: Argument of type '{ (n: number): Promise; (s: string): Promise; }' is not assignable to parameter of type '(x: number) => Promise'. +!!! error TS2345: Type 'Promise' is not assignable to type 'Promise'. +!!! error TS2345: Type 'number' is not assignable to type 'string'. } ////////////////////////////////////// @@ -80,6 +92,8 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallToOverl var newPromise = numPromise.then(testFunction); ~~~~~~~~~~~~ !!! error TS2345: Argument of type '{ (n: number): Promise; (s: string): Promise; }' is not assignable to parameter of type '(x: number) => Promise'. +!!! error TS2345: Type 'Promise' is not assignable to type 'Promise'. +!!! error TS2345: Type 'number' is not assignable to type 'string'. } ////////////////////////////////////// @@ -98,5 +112,7 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallToOverl var newPromise = numPromise.then(testFunction); ~~~~~~~~~~~~ !!! error TS2345: Argument of type '{ (n: number): Promise; (s: string): Promise; (b: boolean): Promise; }' is not assignable to parameter of type '(x: number) => Promise'. +!!! error TS2345: Type 'Promise' is not assignable to type 'Promise'. +!!! error TS2345: Type 'number' is not assignable to type 'boolean'. } \ No newline at end of file diff --git a/tests/baselines/reference/genericCallWithConstraintsTypeArgumentInference2.errors.txt b/tests/baselines/reference/genericCallWithConstraintsTypeArgumentInference2.errors.txt index 604896319c..d8228dd224 100644 --- a/tests/baselines/reference/genericCallWithConstraintsTypeArgumentInference2.errors.txt +++ b/tests/baselines/reference/genericCallWithConstraintsTypeArgumentInference2.errors.txt @@ -1,5 +1,6 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithConstraintsTypeArgumentInference2.ts(3,17): error TS2313: Constraint of a type parameter cannot reference any type parameter from the same type parameter list. tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithConstraintsTypeArgumentInference2.ts(11,26): error TS2345: Argument of type 'number' is not assignable to parameter of type 'Date'. + Property 'toDateString' is missing in type 'Number'. ==== tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithConstraintsTypeArgumentInference2.ts (2 errors) ==== @@ -18,4 +19,5 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithCon var r4 = foo(1); // error ~ !!! error TS2345: Argument of type 'number' is not assignable to parameter of type 'Date'. +!!! error TS2345: Property 'toDateString' is missing in type 'Number'. var r5 = foo(new Date()); // no error \ No newline at end of file diff --git a/tests/baselines/reference/genericCallWithConstructorTypedArguments5.errors.txt b/tests/baselines/reference/genericCallWithConstructorTypedArguments5.errors.txt index 48e615bdb3..a014ef85b6 100644 --- a/tests/baselines/reference/genericCallWithConstructorTypedArguments5.errors.txt +++ b/tests/baselines/reference/genericCallWithConstructorTypedArguments5.errors.txt @@ -1,5 +1,9 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithConstructorTypedArguments5.ts(11,14): error TS2345: Argument of type '{ cb: new (x: T, y: T) => string; }' is not assignable to parameter of type '{ cb: new (t: any) => string; }'. + Types of property 'cb' are incompatible. + Type 'new (x: T, y: T) => string' is not assignable to type 'new (t: any) => string'. tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithConstructorTypedArguments5.ts(13,14): error TS2345: Argument of type '{ cb: new (x: string, y: number) => string; }' is not assignable to parameter of type '{ cb: new (t: string) => string; }'. + Types of property 'cb' are incompatible. + Type 'new (x: string, y: number) => string' is not assignable to type 'new (t: string) => string'. ==== tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithConstructorTypedArguments5.ts (2 errors) ==== @@ -16,10 +20,14 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithCon var r2 = foo(arg2); // error ~~~~ !!! error TS2345: Argument of type '{ cb: new (x: T, y: T) => string; }' is not assignable to parameter of type '{ cb: new (t: any) => string; }'. +!!! error TS2345: Types of property 'cb' are incompatible. +!!! error TS2345: Type 'new (x: T, y: T) => string' is not assignable to type 'new (t: any) => string'. var arg3: { cb: new (x: string, y: number) => string }; var r3 = foo(arg3); // error ~~~~ !!! error TS2345: Argument of type '{ cb: new (x: string, y: number) => string; }' is not assignable to parameter of type '{ cb: new (t: string) => string; }'. +!!! error TS2345: Types of property 'cb' are incompatible. +!!! error TS2345: Type 'new (x: string, y: number) => string' is not assignable to type 'new (t: string) => string'. function foo2(arg: { cb: new(t: T, t2: T) => U }) { return new arg.cb(null, null); diff --git a/tests/baselines/reference/genericCallWithGenericSignatureArguments.errors.txt b/tests/baselines/reference/genericCallWithGenericSignatureArguments.errors.txt index 2d5ad21959..33c01aa544 100644 --- a/tests/baselines/reference/genericCallWithGenericSignatureArguments.errors.txt +++ b/tests/baselines/reference/genericCallWithGenericSignatureArguments.errors.txt @@ -1,7 +1,9 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGenericSignatureArguments.ts(18,10): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate '{ x: number; y?: number; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; z?: number; }'. + Property 'y' is missing in type '{ x: number; z?: number; }'. tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGenericSignatureArguments.ts(19,10): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate '{ x: number; z?: number; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; y?: number; }'. + Property 'z' is missing in type '{ x: number; y?: number; }'. ==== tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGenericSignatureArguments.ts (2 errors) ==== @@ -26,10 +28,12 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGen ~~~ !!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. !!! error TS2453: Type argument candidate '{ x: number; y?: number; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; z?: number; }'. +!!! error TS2453: Property 'y' is missing in type '{ x: number; z?: number; }'. var r5 = foo((x: typeof b) => b, (x: typeof a) => a); // typeof b => typeof b ~~~ !!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. !!! error TS2453: Type argument candidate '{ x: number; z?: number; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; y?: number; }'. +!!! error TS2453: Property 'z' is missing in type '{ x: number; y?: number; }'. function other(x: T) { var r6 = foo((a: T) => a, (b: T) => b); // T => T diff --git a/tests/baselines/reference/genericCallWithGenericSignatureArguments2.errors.txt b/tests/baselines/reference/genericCallWithGenericSignatureArguments2.errors.txt index a8ee6ac6ca..5b5d4ad66f 100644 --- a/tests/baselines/reference/genericCallWithGenericSignatureArguments2.errors.txt +++ b/tests/baselines/reference/genericCallWithGenericSignatureArguments2.errors.txt @@ -3,10 +3,15 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGen tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGenericSignatureArguments2.ts(15,21): error TS2345: Argument of type 'Date' is not assignable to parameter of type 'T'. tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGenericSignatureArguments2.ts(16,22): error TS2345: Argument of type 'number' is not assignable to parameter of type 'T'. tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGenericSignatureArguments2.ts(25,23): error TS2345: Argument of type '(a: T) => T' is not assignable to parameter of type '(x: Date) => Date'. + Types of parameters 'a' and 'x' are incompatible. + Type 'T' is not assignable to type 'Date'. tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGenericSignatureArguments2.ts(37,36): error TS2345: Argument of type '(x: E) => F' is not assignable to parameter of type '(x: E) => E'. + Type 'F' is not assignable to type 'E'. tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGenericSignatureArguments2.ts(50,21): error TS2345: Argument of type 'Date' is not assignable to parameter of type 'T'. tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGenericSignatureArguments2.ts(51,22): error TS2345: Argument of type 'number' is not assignable to parameter of type 'T'. tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGenericSignatureArguments2.ts(60,23): error TS2345: Argument of type '(a: T) => T' is not assignable to parameter of type '(x: Date) => Date'. + Types of parameters 'a' and 'x' are incompatible. + Type 'T' is not assignable to type 'Date'. tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGenericSignatureArguments2.ts(67,51): error TS2304: Cannot find name 'U'. tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGenericSignatureArguments2.ts(67,57): error TS2304: Cannot find name 'U'. @@ -46,6 +51,8 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGen var r7 = foo2((a: T) => a, (b: T) => b); // error ~~~~~~~~~~~ !!! error TS2345: Argument of type '(a: T) => T' is not assignable to parameter of type '(x: Date) => Date'. +!!! error TS2345: Types of parameters 'a' and 'x' are incompatible. +!!! error TS2345: Type 'T' is not assignable to type 'Date'. var r7b = foo2((a) => a, (b) => b); // valid, T is inferred to be Date } @@ -60,6 +67,7 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGen var r7 = foo3(E.A, (x) => E.A, (x) => F.A); // error ~~~~~~~~~~ !!! error TS2345: Argument of type '(x: E) => F' is not assignable to parameter of type '(x: E) => E'. +!!! error TS2345: Type 'F' is not assignable to type 'E'. } module TU { @@ -89,6 +97,8 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGen var r7 = foo2((a: T) => a, (b: T) => b); ~~~~~~~~~~~ !!! error TS2345: Argument of type '(a: T) => T' is not assignable to parameter of type '(x: Date) => Date'. +!!! error TS2345: Types of parameters 'a' and 'x' are incompatible. +!!! error TS2345: Type 'T' is not assignable to type 'Date'. var r7b = foo2((a) => a, (b) => b); } diff --git a/tests/baselines/reference/genericCallWithGenericSignatureArguments3.errors.txt b/tests/baselines/reference/genericCallWithGenericSignatureArguments3.errors.txt index 574cc5ca50..87ae6b6385 100644 --- a/tests/baselines/reference/genericCallWithGenericSignatureArguments3.errors.txt +++ b/tests/baselines/reference/genericCallWithGenericSignatureArguments3.errors.txt @@ -1,5 +1,6 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGenericSignatureArguments3.ts(32,11): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate '(y: string) => string' is not a valid type argument because it is not a supertype of candidate '(a: string) => boolean'. + Type 'boolean' is not assignable to type 'string'. tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGenericSignatureArguments3.ts(33,11): error TS2453: The type argument for type parameter 'U' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate '(n: Object) => number' is not a valid type argument because it is not a supertype of candidate 'number'. @@ -40,6 +41,7 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithGen ~~~~ !!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. !!! error TS2453: Type argument candidate '(y: string) => string' is not a valid type argument because it is not a supertype of candidate '(a: string) => boolean'. +!!! error TS2453: Type 'boolean' is not assignable to type 'string'. var r12 = foo2(x, (a1: (y: string) => boolean) => (n: Object) => 1, (a2: (z: string) => boolean) => 2); // error ~~~~ !!! error TS2453: The type argument for type parameter 'U' cannot be inferred from the usage. Consider specifying the type arguments explicitly. diff --git a/tests/baselines/reference/genericCallWithNonSymmetricSubtypes.errors.txt b/tests/baselines/reference/genericCallWithNonSymmetricSubtypes.errors.txt index 2efcd043d7..3b896d9a7d 100644 --- a/tests/baselines/reference/genericCallWithNonSymmetricSubtypes.errors.txt +++ b/tests/baselines/reference/genericCallWithNonSymmetricSubtypes.errors.txt @@ -1,7 +1,9 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithNonSymmetricSubtypes.ts(12,9): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate '{ x: number; y?: number; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; z?: number; }'. + Property 'y' is missing in type '{ x: number; z?: number; }'. tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithNonSymmetricSubtypes.ts(13,10): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate '{ x: number; z?: number; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; y?: number; }'. + Property 'z' is missing in type '{ x: number; y?: number; }'. ==== tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithNonSymmetricSubtypes.ts (2 errors) ==== @@ -20,10 +22,12 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithNon ~~~ !!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. !!! error TS2453: Type argument candidate '{ x: number; y?: number; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; z?: number; }'. +!!! error TS2453: Property 'y' is missing in type '{ x: number; z?: number; }'. var r2 = foo(b, a); // { x: number; z?: number; }; ~~~ !!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. !!! error TS2453: Type argument candidate '{ x: number; z?: number; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; y?: number; }'. +!!! error TS2453: Property 'z' is missing in type '{ x: number; y?: number; }'. var x: { x: number; }; var y: { x?: number; }; diff --git a/tests/baselines/reference/genericCallWithObjectTypeArgs.errors.txt b/tests/baselines/reference/genericCallWithObjectTypeArgs.errors.txt index 97b09a7d43..ecd76d4ea1 100644 --- a/tests/baselines/reference/genericCallWithObjectTypeArgs.errors.txt +++ b/tests/baselines/reference/genericCallWithObjectTypeArgs.errors.txt @@ -1,5 +1,6 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgs.ts(20,9): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'C' is not a valid type argument because it is not a supertype of candidate 'D'. + Types have separate declarations of a private property 'x'. ==== tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgs.ts (1 errors) ==== @@ -26,4 +27,5 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObj ~~~ !!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. !!! error TS2453: Type argument candidate 'C' is not a valid type argument because it is not a supertype of candidate 'D'. +!!! error TS2453: Types have separate declarations of a private property 'x'. var r2 = foo(c1, c1); // ok \ No newline at end of file diff --git a/tests/baselines/reference/genericCallWithObjectTypeArgsAndConstraints3.errors.txt b/tests/baselines/reference/genericCallWithObjectTypeArgsAndConstraints3.errors.txt index 02b38ddeb7..54455782cc 100644 --- a/tests/baselines/reference/genericCallWithObjectTypeArgsAndConstraints3.errors.txt +++ b/tests/baselines/reference/genericCallWithObjectTypeArgsAndConstraints3.errors.txt @@ -1,5 +1,6 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints3.ts(18,10): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'Derived' is not a valid type argument because it is not a supertype of candidate 'Derived2'. + Property 'y' is missing in type 'Derived2'. tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObjectTypeArgsAndConstraints3.ts(20,29): error TS2313: Constraint of a type parameter cannot reference any type parameter from the same type parameter list. @@ -25,6 +26,7 @@ tests/cases/conformance/types/typeRelationships/typeInference/genericCallWithObj ~ !!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. !!! error TS2453: Type argument candidate 'Derived' is not a valid type argument because it is not a supertype of candidate 'Derived2'. +!!! error TS2453: Property 'y' is missing in type 'Derived2'. function f2(a: U) { ~~~~~~~~~~~~~~~~~~~~~~~~ diff --git a/tests/baselines/reference/genericChainedCalls.js b/tests/baselines/reference/genericChainedCalls.js index 618d34cbc5..71d83a906b 100644 --- a/tests/baselines/reference/genericChainedCalls.js +++ b/tests/baselines/reference/genericChainedCalls.js @@ -15,7 +15,8 @@ var s3 = s2.func(num => num.toString()) //// [genericChainedCalls.js] -var r1 = v1.func(function (num) { return num.toString(); }).func(function (str) { return str.length; }).func(function (num) { return num.toString(); }); +var r1 = v1.func(function (num) { return num.toString(); }).func(function (str) { return str.length; }) // error, number doesn't have a length +.func(function (num) { return num.toString(); }); var s1 = v1.func(function (num) { return num.toString(); }); var s2 = s1.func(function (str) { return str.length; }); // should also error var s3 = s2.func(function (num) { return num.toString(); }); diff --git a/tests/baselines/reference/genericCombinators2.errors.txt b/tests/baselines/reference/genericCombinators2.errors.txt index c09ef79b29..5be717109c 100644 --- a/tests/baselines/reference/genericCombinators2.errors.txt +++ b/tests/baselines/reference/genericCombinators2.errors.txt @@ -1,5 +1,7 @@ tests/cases/compiler/genericCombinators2.ts(15,43): error TS2345: Argument of type '(x: number, y: string) => string' is not assignable to parameter of type '(x: number, y: string) => Date'. + Type 'string' is not assignable to type 'Date'. tests/cases/compiler/genericCombinators2.ts(16,43): error TS2345: Argument of type '(x: number, y: string) => string' is not assignable to parameter of type '(x: number, y: string) => Date'. + Type 'string' is not assignable to type 'Date'. ==== tests/cases/compiler/genericCombinators2.ts (2 errors) ==== @@ -20,6 +22,8 @@ tests/cases/compiler/genericCombinators2.ts(16,43): error TS2345: Argument of ty var r5a = _.map(c2, (x, y) => { return x.toFixed() }); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number, y: string) => string' is not assignable to parameter of type '(x: number, y: string) => Date'. +!!! error TS2345: Type 'string' is not assignable to type 'Date'. var r5b = _.map(c2, rf1); ~~~ -!!! error TS2345: Argument of type '(x: number, y: string) => string' is not assignable to parameter of type '(x: number, y: string) => Date'. \ No newline at end of file +!!! error TS2345: Argument of type '(x: number, y: string) => string' is not assignable to parameter of type '(x: number, y: string) => Date'. +!!! error TS2345: Type 'string' is not assignable to type 'Date'. \ No newline at end of file diff --git a/tests/baselines/reference/genericConstraint2.errors.txt b/tests/baselines/reference/genericConstraint2.errors.txt index 3ab29b585d..c1be6fc232 100644 --- a/tests/baselines/reference/genericConstraint2.errors.txt +++ b/tests/baselines/reference/genericConstraint2.errors.txt @@ -2,6 +2,7 @@ tests/cases/compiler/genericConstraint2.ts(5,18): error TS2313: Constraint of a tests/cases/compiler/genericConstraint2.ts(11,7): error TS2420: Class 'ComparableString' incorrectly implements interface 'Comparable'. Property 'comparer' is missing in type 'ComparableString'. tests/cases/compiler/genericConstraint2.ts(21,17): error TS2344: Type 'ComparableString' does not satisfy the constraint 'Comparable'. + Property 'comparer' is missing in type 'ComparableString'. ==== tests/cases/compiler/genericConstraint2.ts (3 errors) ==== @@ -32,4 +33,5 @@ tests/cases/compiler/genericConstraint2.ts(21,17): error TS2344: Type 'Comparabl var b = new ComparableString("b"); var c = compare(a, b); ~~~~~~~~~~~~~~~~ -!!! error TS2344: Type 'ComparableString' does not satisfy the constraint 'Comparable'. \ No newline at end of file +!!! error TS2344: Type 'ComparableString' does not satisfy the constraint 'Comparable'. +!!! error TS2344: Property 'comparer' is missing in type 'ComparableString'. \ No newline at end of file diff --git a/tests/baselines/reference/genericRestArgs.errors.txt b/tests/baselines/reference/genericRestArgs.errors.txt index 8a97745295..99106ebd79 100644 --- a/tests/baselines/reference/genericRestArgs.errors.txt +++ b/tests/baselines/reference/genericRestArgs.errors.txt @@ -4,6 +4,7 @@ tests/cases/compiler/genericRestArgs.ts(5,34): error TS2345: Argument of type 's tests/cases/compiler/genericRestArgs.ts(10,12): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'number' is not a valid type argument because it is not a supertype of candidate 'string'. tests/cases/compiler/genericRestArgs.ts(12,30): error TS2345: Argument of type 'number' is not assignable to parameter of type 'any[]'. + Property 'length' is missing in type 'Number'. ==== tests/cases/compiler/genericRestArgs.ts (4 errors) ==== @@ -28,4 +29,5 @@ tests/cases/compiler/genericRestArgs.ts(12,30): error TS2345: Argument of type ' var a2Gb = makeArrayG(1, ""); var a2Gc = makeArrayG(1, ""); // error ~ -!!! error TS2345: Argument of type 'number' is not assignable to parameter of type 'any[]'. \ No newline at end of file +!!! error TS2345: Argument of type 'number' is not assignable to parameter of type 'any[]'. +!!! error TS2345: Property 'length' is missing in type 'Number'. \ No newline at end of file diff --git a/tests/baselines/reference/implicitAnyDeclareFunctionWithoutFormalType.js b/tests/baselines/reference/implicitAnyDeclareFunctionWithoutFormalType.js index 72d68da228..6332f44448 100644 --- a/tests/baselines/reference/implicitAnyDeclareFunctionWithoutFormalType.js +++ b/tests/baselines/reference/implicitAnyDeclareFunctionWithoutFormalType.js @@ -18,22 +18,22 @@ function foo(x) { ; function bar(x, y) { } -; +; // error at "y"; no error at "x" function func2(a, b, c) { } -; +; // error at "a,b,c" function func3() { var args = []; for (var _i = 0; _i < arguments.length; _i++) { args[_i - 0] = arguments[_i]; } } -; +; // error at "args" function func4(z, w) { if (z === void 0) { z = null; } if (w === void 0) { w = undefined; } } -; +; // error at "z,w" // these shouldn't be errors function noError1(x, y) { if (x === void 0) { x = 3; } diff --git a/tests/baselines/reference/implicitAnyDeclareVariablesWithoutTypeAndInit.js b/tests/baselines/reference/implicitAnyDeclareVariablesWithoutTypeAndInit.js index 95b617d79e..ae09bf2e40 100644 --- a/tests/baselines/reference/implicitAnyDeclareVariablesWithoutTypeAndInit.js +++ b/tests/baselines/reference/implicitAnyDeclareVariablesWithoutTypeAndInit.js @@ -16,7 +16,7 @@ var x1: any; var y1 = new x1; var x; // error at "x" function func(k) { } -; +; //error at "k" func(x); // this shouldn't be an error var bar = 3; diff --git a/tests/baselines/reference/implicitAnyInCatch.js b/tests/baselines/reference/implicitAnyInCatch.js index 9952c7ca32..29a2e03a13 100644 --- a/tests/baselines/reference/implicitAnyInCatch.js +++ b/tests/baselines/reference/implicitAnyInCatch.js @@ -15,6 +15,7 @@ class C { //// [implicitAnyInCatch.js] +// this should not be an error try { } catch (error) { diff --git a/tests/baselines/reference/incompatibleTypes.errors.txt b/tests/baselines/reference/incompatibleTypes.errors.txt index 14dfa883f4..01e4531031 100644 --- a/tests/baselines/reference/incompatibleTypes.errors.txt +++ b/tests/baselines/reference/incompatibleTypes.errors.txt @@ -15,6 +15,8 @@ tests/cases/compiler/incompatibleTypes.ts(33,7): error TS2420: Class 'C4' incorr Type '{ c: { b: string; }; d: string; }' is not assignable to type '{ a: { a: string; }; b: string; }'. Property 'a' is missing in type '{ c: { b: string; }; d: string; }'. tests/cases/compiler/incompatibleTypes.ts(42,5): error TS2345: Argument of type 'C1' is not assignable to parameter of type 'IFoo2'. + Types of property 'p1' are incompatible. + Type '() => string' is not assignable to type '(s: string) => number'. tests/cases/compiler/incompatibleTypes.ts(49,5): error TS2345: Argument of type '{ e: number; f: number; }' is not assignable to parameter of type '{ c: { b: string; }; d: string; }'. Property 'c' is missing in type '{ e: number; f: number; }'. tests/cases/compiler/incompatibleTypes.ts(66,5): error TS2322: Type '{ e: number; f: number; }' is not assignable to type '{ a: { a: string; }; b: string; }'. @@ -88,6 +90,8 @@ tests/cases/compiler/incompatibleTypes.ts(74,5): error TS2322: Type '(a: any) => if1(c1); ~~ !!! error TS2345: Argument of type 'C1' is not assignable to parameter of type 'IFoo2'. +!!! error TS2345: Types of property 'p1' are incompatible. +!!! error TS2345: Type '() => string' is not assignable to type '(s: string) => number'. function of1(n: { a: { a: string; }; b: string; }): number; diff --git a/tests/baselines/reference/indexSignatureTypeInference.errors.txt b/tests/baselines/reference/indexSignatureTypeInference.errors.txt index 55bd2ce884..f93bfc6ce4 100644 --- a/tests/baselines/reference/indexSignatureTypeInference.errors.txt +++ b/tests/baselines/reference/indexSignatureTypeInference.errors.txt @@ -1,4 +1,5 @@ tests/cases/conformance/types/typeRelationships/typeInference/indexSignatureTypeInference.ts(18,27): error TS2345: Argument of type 'NumberMap' is not assignable to parameter of type 'StringMap<{}>'. + Index signature is missing in type 'NumberMap'. ==== tests/cases/conformance/types/typeRelationships/typeInference/indexSignatureTypeInference.ts (1 errors) ==== @@ -22,5 +23,6 @@ tests/cases/conformance/types/typeRelationships/typeInference/indexSignatureType var v1 = stringMapToArray(numberMap); // Error expected here ~~~~~~~~~ !!! error TS2345: Argument of type 'NumberMap' is not assignable to parameter of type 'StringMap<{}>'. +!!! error TS2345: Index signature is missing in type 'NumberMap'. var v1 = stringMapToArray(stringMap); // Ok \ No newline at end of file diff --git a/tests/baselines/reference/interfaceAssignmentCompat.errors.txt b/tests/baselines/reference/interfaceAssignmentCompat.errors.txt index 35cf2df71f..425aa3b3e9 100644 --- a/tests/baselines/reference/interfaceAssignmentCompat.errors.txt +++ b/tests/baselines/reference/interfaceAssignmentCompat.errors.txt @@ -1,6 +1,9 @@ tests/cases/compiler/interfaceAssignmentCompat.ts(32,18): error TS2345: Argument of type '(a: IFrenchEye, b: IFrenchEye) => number' is not assignable to parameter of type '(a: IEye, b: IEye) => number'. + Types of parameters 'a' and 'a' are incompatible. + Type 'IFrenchEye' is not assignable to type 'IEye'. tests/cases/compiler/interfaceAssignmentCompat.ts(37,29): error TS2339: Property '_map' does not exist on type 'typeof Color'. tests/cases/compiler/interfaceAssignmentCompat.ts(42,13): error TS2322: Type 'IEye' is not assignable to type 'IFrenchEye'. + Property 'coleur' is missing in type 'IEye'. tests/cases/compiler/interfaceAssignmentCompat.ts(44,9): error TS2322: Type 'IEye[]' is not assignable to type 'IFrenchEye[]'. Type 'IEye' is not assignable to type 'IFrenchEye'. @@ -40,6 +43,8 @@ tests/cases/compiler/interfaceAssignmentCompat.ts(44,9): error TS2322: Type 'IEy x=x.sort(CompareYeux); // parameter mismatch ~~~~~~~~~~~ !!! error TS2345: Argument of type '(a: IFrenchEye, b: IFrenchEye) => number' is not assignable to parameter of type '(a: IEye, b: IEye) => number'. +!!! error TS2345: Types of parameters 'a' and 'a' are incompatible. +!!! error TS2345: Type 'IFrenchEye' is not assignable to type 'IEye'. // type of z inferred from specialized array type var z=x.sort(CompareEyes); // ok @@ -54,6 +59,7 @@ tests/cases/compiler/interfaceAssignmentCompat.ts(44,9): error TS2322: Type 'IEy eeks[j]=z[j]; // nope: element assignment ~~~~~~~ !!! error TS2322: Type 'IEye' is not assignable to type 'IFrenchEye'. +!!! error TS2322: Property 'coleur' is missing in type 'IEye'. } eeks=z; // nope: array assignment ~~~~ diff --git a/tests/baselines/reference/letDeclarations-scopes.js b/tests/baselines/reference/letDeclarations-scopes.js index b4910f0ed4..fc72180799 100644 --- a/tests/baselines/reference/letDeclarations-scopes.js +++ b/tests/baselines/reference/letDeclarations-scopes.js @@ -205,6 +205,7 @@ for (let l = 0; n = l; l++) { } for (let l in {}) { } +// Try/catch/finally try { let l = 0; n = l; @@ -217,12 +218,14 @@ finally { let l = 0; n = l; } +// Switch switch (0) { case 0: let l = 0; n = l; break; } +// blocks { let l = 0; n = l; diff --git a/tests/baselines/reference/letDeclarations-validContexts.js b/tests/baselines/reference/letDeclarations-validContexts.js index 7347be6132..f6d404135f 100644 --- a/tests/baselines/reference/letDeclarations-validContexts.js +++ b/tests/baselines/reference/letDeclarations-validContexts.js @@ -173,6 +173,7 @@ if (true) { while (false) { label2: label3: label4: let l9 = 0; } +// Try/catch/finally try { let l10 = 0; } @@ -182,6 +183,7 @@ catch (e) { finally { let l12 = 0; } +// Switch switch (0) { case 0: let l13 = 0; @@ -190,6 +192,7 @@ switch (0) { let l14 = 0; break; } +// blocks { let l15 = 0; { @@ -247,6 +250,7 @@ var o = { let l29 = 0; } }; +// labels label: let l30 = 0; { label2: let l31 = 0; diff --git a/tests/baselines/reference/maxConstraints.errors.txt b/tests/baselines/reference/maxConstraints.errors.txt index 1c3844d697..16ae5bd206 100644 --- a/tests/baselines/reference/maxConstraints.errors.txt +++ b/tests/baselines/reference/maxConstraints.errors.txt @@ -1,5 +1,6 @@ tests/cases/compiler/maxConstraints.ts(5,6): error TS2313: Constraint of a type parameter cannot reference any type parameter from the same type parameter list. tests/cases/compiler/maxConstraints.ts(8,22): error TS2345: Argument of type 'number' is not assignable to parameter of type 'Comparable'. + Property 'compareTo' is missing in type 'Number'. ==== tests/cases/compiler/maxConstraints.ts (2 errors) ==== @@ -14,4 +15,5 @@ tests/cases/compiler/maxConstraints.ts(8,22): error TS2345: Argument of type 'nu var max2: Comparer = (x, y) => { return (x.compareTo(y) > 0) ? x : y }; var maxResult = max2(1, 2); ~ -!!! error TS2345: Argument of type 'number' is not assignable to parameter of type 'Comparable'. \ No newline at end of file +!!! error TS2345: Argument of type 'number' is not assignable to parameter of type 'Comparable'. +!!! error TS2345: Property 'compareTo' is missing in type 'Number'. \ No newline at end of file diff --git a/tests/baselines/reference/objectLiteralShorthandPropertiesFunctionArgument2.errors.txt b/tests/baselines/reference/objectLiteralShorthandPropertiesFunctionArgument2.errors.txt index 44426a8afb..00ac59319e 100644 --- a/tests/baselines/reference/objectLiteralShorthandPropertiesFunctionArgument2.errors.txt +++ b/tests/baselines/reference/objectLiteralShorthandPropertiesFunctionArgument2.errors.txt @@ -1,4 +1,5 @@ tests/cases/conformance/es6/shorthandPropertyAssignment/objectLiteralShorthandPropertiesFunctionArgument2.ts(7,5): error TS2345: Argument of type '{ name: string; id: number; }' is not assignable to parameter of type '{ a: string; id: number; }'. + Property 'a' is missing in type '{ name: string; id: number; }'. ==== tests/cases/conformance/es6/shorthandPropertyAssignment/objectLiteralShorthandPropertiesFunctionArgument2.ts (1 errors) ==== @@ -11,4 +12,5 @@ tests/cases/conformance/es6/shorthandPropertyAssignment/objectLiteralShorthandPr foo(person); // error ~~~~~~ !!! error TS2345: Argument of type '{ name: string; id: number; }' is not assignable to parameter of type '{ a: string; id: number; }'. +!!! error TS2345: Property 'a' is missing in type '{ name: string; id: number; }'. \ No newline at end of file diff --git a/tests/baselines/reference/optionalBindingParameters1.errors.txt b/tests/baselines/reference/optionalBindingParameters1.errors.txt index a2961fb965..78fc1cbddf 100644 --- a/tests/baselines/reference/optionalBindingParameters1.errors.txt +++ b/tests/baselines/reference/optionalBindingParameters1.errors.txt @@ -1,5 +1,7 @@ tests/cases/conformance/es6/destructuring/optionalBindingParameters1.ts(2,14): error TS2463: A binding pattern parameter cannot be optional in an implementation signature. tests/cases/conformance/es6/destructuring/optionalBindingParameters1.ts(8,5): error TS2345: Argument of type '[boolean, number, string]' is not assignable to parameter of type '[string, number, boolean]'. + Types of property '0' are incompatible. + Type 'boolean' is not assignable to type 'string'. ==== tests/cases/conformance/es6/destructuring/optionalBindingParameters1.ts (2 errors) ==== @@ -14,4 +16,6 @@ tests/cases/conformance/es6/destructuring/optionalBindingParameters1.ts(8,5): er foo([false, 0, ""]); ~~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '[boolean, number, string]' is not assignable to parameter of type '[string, number, boolean]'. \ No newline at end of file +!!! error TS2345: Argument of type '[boolean, number, string]' is not assignable to parameter of type '[string, number, boolean]'. +!!! error TS2345: Types of property '0' are incompatible. +!!! error TS2345: Type 'boolean' is not assignable to type 'string'. \ No newline at end of file diff --git a/tests/baselines/reference/optionalBindingParametersInOverloads1.errors.txt b/tests/baselines/reference/optionalBindingParametersInOverloads1.errors.txt index 5999ec514b..312603d2c2 100644 --- a/tests/baselines/reference/optionalBindingParametersInOverloads1.errors.txt +++ b/tests/baselines/reference/optionalBindingParametersInOverloads1.errors.txt @@ -1,4 +1,6 @@ tests/cases/conformance/es6/destructuring/optionalBindingParametersInOverloads1.ts(9,5): error TS2345: Argument of type '[boolean, number, string]' is not assignable to parameter of type '[string, number, boolean]'. + Types of property '0' are incompatible. + Type 'boolean' is not assignable to type 'string'. ==== tests/cases/conformance/es6/destructuring/optionalBindingParametersInOverloads1.ts (1 errors) ==== @@ -12,4 +14,6 @@ tests/cases/conformance/es6/destructuring/optionalBindingParametersInOverloads1. foo([false, 0, ""]); ~~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '[boolean, number, string]' is not assignable to parameter of type '[string, number, boolean]'. \ No newline at end of file +!!! error TS2345: Argument of type '[boolean, number, string]' is not assignable to parameter of type '[string, number, boolean]'. +!!! error TS2345: Types of property '0' are incompatible. +!!! error TS2345: Type 'boolean' is not assignable to type 'string'. \ No newline at end of file diff --git a/tests/baselines/reference/overEagerReturnTypeSpecialization.js b/tests/baselines/reference/overEagerReturnTypeSpecialization.js index 18c61a2aa7..67d2005eca 100644 --- a/tests/baselines/reference/overEagerReturnTypeSpecialization.js +++ b/tests/baselines/reference/overEagerReturnTypeSpecialization.js @@ -16,5 +16,7 @@ var r2: I1 = v1.func(num => num.toString()) // Correctly returns an I1 +.func(function (str) { return str.length; }); // should error +var r2 = v1.func(function (num) { return num.toString(); }) // Correctly returns an I1 +.func(function (str) { return str.length; }); // should be ok diff --git a/tests/baselines/reference/overloadResolutionOverCTLambda.errors.txt b/tests/baselines/reference/overloadResolutionOverCTLambda.errors.txt index 03901cf67a..9fc11b681c 100644 --- a/tests/baselines/reference/overloadResolutionOverCTLambda.errors.txt +++ b/tests/baselines/reference/overloadResolutionOverCTLambda.errors.txt @@ -1,8 +1,10 @@ tests/cases/compiler/overloadResolutionOverCTLambda.ts(2,5): error TS2345: Argument of type '(a: number) => number' is not assignable to parameter of type '(item: number) => boolean'. + Type 'number' is not assignable to type 'boolean'. ==== tests/cases/compiler/overloadResolutionOverCTLambda.ts (1 errors) ==== function foo(b: (item: number) => boolean) { } foo(a => a); // can not convert (number)=>bool to (number)=>number ~~~~~~ -!!! error TS2345: Argument of type '(a: number) => number' is not assignable to parameter of type '(item: number) => boolean'. \ No newline at end of file +!!! error TS2345: Argument of type '(a: number) => number' is not assignable to parameter of type '(item: number) => boolean'. +!!! error TS2345: Type 'number' is not assignable to type 'boolean'. \ No newline at end of file diff --git a/tests/baselines/reference/overloadresolutionWithConstraintCheckingDeferred.errors.txt b/tests/baselines/reference/overloadresolutionWithConstraintCheckingDeferred.errors.txt index 4a119c5ca2..ed504fd410 100644 --- a/tests/baselines/reference/overloadresolutionWithConstraintCheckingDeferred.errors.txt +++ b/tests/baselines/reference/overloadresolutionWithConstraintCheckingDeferred.errors.txt @@ -1,8 +1,11 @@ tests/cases/compiler/overloadresolutionWithConstraintCheckingDeferred.ts(14,5): error TS2322: Type 'string' is not assignable to type 'number'. tests/cases/compiler/overloadresolutionWithConstraintCheckingDeferred.ts(14,37): error TS2345: Argument of type 'D' is not assignable to parameter of type 'A'. + Property 'x' is missing in type 'D'. tests/cases/compiler/overloadresolutionWithConstraintCheckingDeferred.ts(16,5): error TS2322: Type 'string' is not assignable to type 'number'. tests/cases/compiler/overloadresolutionWithConstraintCheckingDeferred.ts(16,38): error TS2344: Type 'D' does not satisfy the constraint 'A'. tests/cases/compiler/overloadresolutionWithConstraintCheckingDeferred.ts(18,27): error TS2345: Argument of type '(x: D) => G' is not assignable to parameter of type '(x: B) => any'. + Types of parameters 'x' and 'x' are incompatible. + Type 'D' is not assignable to type 'B'. tests/cases/compiler/overloadresolutionWithConstraintCheckingDeferred.ts(19,12): error TS2344: Type 'D' does not satisfy the constraint 'A'. @@ -25,6 +28,7 @@ tests/cases/compiler/overloadresolutionWithConstraintCheckingDeferred.ts(19,12): !!! error TS2322: Type 'string' is not assignable to type 'number'. ~ !!! error TS2345: Argument of type 'D' is not assignable to parameter of type 'A'. +!!! error TS2345: Property 'x' is missing in type 'D'. var result2: number = foo(x => new G(x)); // x has type D, new G(x) fails, so first overload is picked. ~~~~~~~ @@ -43,4 +47,6 @@ tests/cases/compiler/overloadresolutionWithConstraintCheckingDeferred.ts(19,12): }); ~ !!! error TS2345: Argument of type '(x: D) => G' is not assignable to parameter of type '(x: B) => any'. +!!! error TS2345: Types of parameters 'x' and 'x' are incompatible. +!!! error TS2345: Type 'D' is not assignable to type 'B'. \ No newline at end of file diff --git a/tests/baselines/reference/overloadsWithProvisionalErrors.errors.txt b/tests/baselines/reference/overloadsWithProvisionalErrors.errors.txt index bd918de55f..55fe8ed4fd 100644 --- a/tests/baselines/reference/overloadsWithProvisionalErrors.errors.txt +++ b/tests/baselines/reference/overloadsWithProvisionalErrors.errors.txt @@ -1,6 +1,8 @@ tests/cases/compiler/overloadsWithProvisionalErrors.ts(6,6): error TS2345: Argument of type '(s: string) => {}' is not assignable to parameter of type '(s: string) => { a: number; b: number; }'. + Type '{}' is not assignable to type '{ a: number; b: number; }'. tests/cases/compiler/overloadsWithProvisionalErrors.ts(7,17): error TS2304: Cannot find name 'blah'. tests/cases/compiler/overloadsWithProvisionalErrors.ts(8,6): error TS2345: Argument of type '(s: string) => { a: any; }' is not assignable to parameter of type '(s: string) => { a: number; b: number; }'. + Type '{ a: any; }' is not assignable to type '{ a: number; b: number; }'. tests/cases/compiler/overloadsWithProvisionalErrors.ts(8,17): error TS2304: Cannot find name 'blah'. @@ -13,11 +15,13 @@ tests/cases/compiler/overloadsWithProvisionalErrors.ts(8,17): error TS2304: Cann func(s => ({})); // Error for no applicable overload (object type is missing a and b) ~~~~~~~~~ !!! error TS2345: Argument of type '(s: string) => {}' is not assignable to parameter of type '(s: string) => { a: number; b: number; }'. +!!! error TS2345: Type '{}' is not assignable to type '{ a: number; b: number; }'. func(s => ({ a: blah, b: 3 })); // Only error inside the function, but not outside (since it would be applicable if not for the provisional error) ~~~~ !!! error TS2304: Cannot find name 'blah'. func(s => ({ a: blah })); // Two errors here, one for blah not being defined, and one for the overload since it would not be applicable anyway ~~~~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(s: string) => { a: any; }' is not assignable to parameter of type '(s: string) => { a: number; b: number; }'. +!!! error TS2345: Type '{ a: any; }' is not assignable to type '{ a: number; b: number; }'. ~~~~ !!! error TS2304: Cannot find name 'blah'. \ No newline at end of file diff --git a/tests/baselines/reference/parser536727.errors.txt b/tests/baselines/reference/parser536727.errors.txt index a25859f78a..4204e62c93 100644 --- a/tests/baselines/reference/parser536727.errors.txt +++ b/tests/baselines/reference/parser536727.errors.txt @@ -1,5 +1,7 @@ tests/cases/conformance/parser/ecmascript5/RegressionTests/parser536727.ts(7,5): error TS2345: Argument of type '() => (x: string) => string' is not assignable to parameter of type '(x: string) => string'. + Type '(x: string) => string' is not assignable to type 'string'. tests/cases/conformance/parser/ecmascript5/RegressionTests/parser536727.ts(8,5): error TS2345: Argument of type '() => (x: string) => string' is not assignable to parameter of type '(x: string) => string'. + Type '(x: string) => string' is not assignable to type 'string'. ==== tests/cases/conformance/parser/ecmascript5/RegressionTests/parser536727.ts (2 errors) ==== @@ -12,7 +14,9 @@ tests/cases/conformance/parser/ecmascript5/RegressionTests/parser536727.ts(8,5): foo(() => g); ~~~~~~~ !!! error TS2345: Argument of type '() => (x: string) => string' is not assignable to parameter of type '(x: string) => string'. +!!! error TS2345: Type '(x: string) => string' is not assignable to type 'string'. foo(x); ~ !!! error TS2345: Argument of type '() => (x: string) => string' is not assignable to parameter of type '(x: string) => string'. +!!! error TS2345: Type '(x: string) => string' is not assignable to type 'string'. \ No newline at end of file diff --git a/tests/baselines/reference/parserSbp_7.9_A9_T3.js b/tests/baselines/reference/parserSbp_7.9_A9_T3.js index 60c8c4ad6e..192ca61721 100644 --- a/tests/baselines/reference/parserSbp_7.9_A9_T3.js +++ b/tests/baselines/reference/parserSbp_7.9_A9_T3.js @@ -19,6 +19,13 @@ do { //// [parserSbp_7.9_A9_T3.js] // Copyright 2009 the Sputnik authors. All rights reserved. // This code is governed by the BSD license found in the LICENSE file. +/** + * Check Do-While Statement for automatic semicolon insertion + * + * @path bestPractice/Sbp_7.9_A9_T3.js + * @description Execute do { \n ; \n }while(false) true + */ +//CHECK#1 do { ; } while (false); diff --git a/tests/baselines/reference/promiseChaining.js b/tests/baselines/reference/promiseChaining.js index 20961542b2..ce15e2d44c 100644 --- a/tests/baselines/reference/promiseChaining.js +++ b/tests/baselines/reference/promiseChaining.js @@ -19,7 +19,7 @@ var Chain = (function () { Chain.prototype.then = function (cb) { var result = cb(this.value); // should get a fresh type parameter which each then call - var z = this.then(function (x) { return result; }).then(function (x) { return "abc"; }).then(function (x) { return x.length; }); // No error + var z = this.then(function (x) { return result; }) /*S*/.then(function (x) { return "abc"; }) /*string*/.then(function (x) { return x.length; }); // No error return new Chain(result); }; return Chain; diff --git a/tests/baselines/reference/promiseChaining1.errors.txt b/tests/baselines/reference/promiseChaining1.errors.txt index e0fac7c289..7396d03059 100644 --- a/tests/baselines/reference/promiseChaining1.errors.txt +++ b/tests/baselines/reference/promiseChaining1.errors.txt @@ -1,4 +1,5 @@ tests/cases/compiler/promiseChaining1.ts(7,50): error TS2345: Argument of type '(x: S) => string' is not assignable to parameter of type '(x: S) => Function'. + Type 'string' is not assignable to type 'Function'. ==== tests/cases/compiler/promiseChaining1.ts (1 errors) ==== @@ -11,6 +12,7 @@ tests/cases/compiler/promiseChaining1.ts(7,50): error TS2345: Argument of type ' var z = this.then(x => result)/*S*/.then(x => "abc")/*Function*/.then(x => x.length)/*number*/; // Should error on "abc" because it is not a Function ~~~~~~~~~~ !!! error TS2345: Argument of type '(x: S) => string' is not assignable to parameter of type '(x: S) => Function'. +!!! error TS2345: Type 'string' is not assignable to type 'Function'. return new Chain2(result); } } \ No newline at end of file diff --git a/tests/baselines/reference/promiseChaining1.js b/tests/baselines/reference/promiseChaining1.js index ee79d3268b..001f1ffc1a 100644 --- a/tests/baselines/reference/promiseChaining1.js +++ b/tests/baselines/reference/promiseChaining1.js @@ -19,7 +19,7 @@ var Chain2 = (function () { Chain2.prototype.then = function (cb) { var result = cb(this.value); // should get a fresh type parameter which each then call - var z = this.then(function (x) { return result; }).then(function (x) { return "abc"; }).then(function (x) { return x.length; }); // Should error on "abc" because it is not a Function + var z = this.then(function (x) { return result; }) /*S*/.then(function (x) { return "abc"; }) /*Function*/.then(function (x) { return x.length; }); // Should error on "abc" because it is not a Function return new Chain2(result); }; return Chain2; diff --git a/tests/baselines/reference/promiseChaining2.errors.txt b/tests/baselines/reference/promiseChaining2.errors.txt index c5b3f2fc1f..a31c4335da 100644 --- a/tests/baselines/reference/promiseChaining2.errors.txt +++ b/tests/baselines/reference/promiseChaining2.errors.txt @@ -1,4 +1,5 @@ tests/cases/compiler/promiseChaining2.ts(7,45): error TS2345: Argument of type '(x: S) => string' is not assignable to parameter of type '(x: S) => Function'. + Type 'string' is not assignable to type 'Function'. ==== tests/cases/compiler/promiseChaining2.ts (1 errors) ==== @@ -11,6 +12,7 @@ tests/cases/compiler/promiseChaining2.ts(7,45): error TS2345: Argument of type ' var z = this.then(x => result).then(x => "abc").then(x => x.length); ~~~~~~~~~~ !!! error TS2345: Argument of type '(x: S) => string' is not assignable to parameter of type '(x: S) => Function'. +!!! error TS2345: Type 'string' is not assignable to type 'Function'. return new Chain2(result); } } \ No newline at end of file diff --git a/tests/baselines/reference/promisePermutations.errors.txt b/tests/baselines/reference/promisePermutations.errors.txt index 9104d924e6..744fd5da90 100644 --- a/tests/baselines/reference/promisePermutations.errors.txt +++ b/tests/baselines/reference/promisePermutations.errors.txt @@ -1,8 +1,18 @@ tests/cases/compiler/promisePermutations.ts(74,70): error TS2345: Argument of type '(x: number) => IPromise' is not assignable to parameter of type '(value: IPromise) => IPromise'. + Types of parameters 'x' and 'value' are incompatible. + Type 'number' is not assignable to type 'IPromise'. tests/cases/compiler/promisePermutations.ts(79,19): error TS2345: Argument of type '(x: number, y?: string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'x' and 'value' are incompatible. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations.ts(82,19): error TS2345: Argument of type '(x: number, y?: string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'x' and 'value' are incompatible. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations.ts(83,19): error TS2345: Argument of type '(x: number, y?: string) => Promise' is not assignable to parameter of type '(value: string) => Promise'. + Types of parameters 'x' and 'value' are incompatible. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations.ts(84,19): error TS2345: Argument of type '(x: number, y?: string) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'x' and 'value' are incompatible. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations.ts(88,19): error TS2345: Argument of type '(x: number, cb: (a: string) => string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. tests/cases/compiler/promisePermutations.ts(91,19): error TS2345: Argument of type '(x: number, cb: (a: string) => string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. tests/cases/compiler/promisePermutations.ts(92,19): error TS2345: Argument of type '(x: number, cb: (a: string) => string) => Promise' is not assignable to parameter of type '(value: string) => Promise'. @@ -12,9 +22,17 @@ tests/cases/compiler/promisePermutations.ts(100,19): error TS2345: Argument of t tests/cases/compiler/promisePermutations.ts(101,19): error TS2345: Argument of type '(x: number, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => Promise'. tests/cases/compiler/promisePermutations.ts(102,19): error TS2345: Argument of type '(x: number, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. tests/cases/compiler/promisePermutations.ts(106,19): error TS2345: Argument of type '(cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'cb' and 'value' are incompatible. + Type '(a: T) => T' is not assignable to type 'string'. tests/cases/compiler/promisePermutations.ts(109,19): error TS2345: Argument of type '(cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'cb' and 'value' are incompatible. + Type '(a: T) => T' is not assignable to type 'string'. tests/cases/compiler/promisePermutations.ts(110,19): error TS2345: Argument of type '(cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => Promise'. + Types of parameters 'cb' and 'value' are incompatible. + Type '(a: T) => T' is not assignable to type 'string'. tests/cases/compiler/promisePermutations.ts(111,19): error TS2345: Argument of type '(cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'cb' and 'value' are incompatible. + Type '(a: T) => T' is not assignable to type 'string'. tests/cases/compiler/promisePermutations.ts(117,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. tests/cases/compiler/promisePermutations.ts(120,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. tests/cases/compiler/promisePermutations.ts(121,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => Promise'. @@ -34,10 +52,19 @@ tests/cases/compiler/promisePermutations.ts(144,12): error TS2453: The type argu Type 'string' is not assignable to type 'number'. tests/cases/compiler/promisePermutations.ts(152,12): error TS2453: The type argument for type parameter 'U' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'Promise' is not a valid type argument because it is not a supertype of candidate 'IPromise'. + Types of property 'then' are incompatible. + Type '{ (success?: (value: string) => IPromise, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => IPromise, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; }' is not assignable to type '{ (success?: (value: number) => Promise, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => Promise, error?: (error: any) => U, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void): Promise; }'. tests/cases/compiler/promisePermutations.ts(156,21): error TS2345: Argument of type '{ (x: number): IPromise; (x: string): IPromise; }' is not assignable to parameter of type '(value: number) => IPromise'. + Type 'IPromise' is not assignable to type 'IPromise'. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations.ts(158,21): error TS2345: Argument of type '{ (x: number): IPromise; (x: string): IPromise; }' is not assignable to parameter of type '(value: number) => IPromise'. + Type 'IPromise' is not assignable to type 'IPromise'. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations.ts(159,21): error TS2345: Argument of type '{ (x: number): Promise; (x: string): Promise; }' is not assignable to parameter of type '(value: number) => Promise'. + Type 'Promise' is not assignable to type 'Promise'. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations.ts(160,21): error TS2345: Argument of type '{ (x: number): Promise; (x: string): Promise; }' is not assignable to parameter of type '(value: number) => IPromise'. + Type 'Promise' is not assignable to type 'IPromise'. ==== tests/cases/compiler/promisePermutations.ts (33 errors) ==== @@ -117,6 +144,8 @@ tests/cases/compiler/promisePermutations.ts(160,21): error TS2345: Argument of t var s3d = s3.then(testFunction3P, testFunction3, testFunction3).then(testFunction3, testFunction3, testFunction3); // error ~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number) => IPromise' is not assignable to parameter of type '(value: IPromise) => IPromise'. +!!! error TS2345: Types of parameters 'x' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'IPromise'. var r4: IPromise; var sIPromise: (x: any) => IPromise; @@ -124,17 +153,25 @@ tests/cases/compiler/promisePermutations.ts(160,21): error TS2345: Argument of t var r4a = r4.then(testFunction4, testFunction4, testFunction4); // error ~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number, y?: string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'x' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var r4b = r4.then(sIPromise, testFunction4, testFunction4).then(sIPromise, testFunction4, testFunction4); // ok var s4: Promise; var s4a = s4.then(testFunction4, testFunction4, testFunction4); // error ~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number, y?: string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'x' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s4b = s4.then(testFunction4P, testFunction4P, testFunction4P); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number, y?: string) => Promise' is not assignable to parameter of type '(value: string) => Promise'. +!!! error TS2345: Types of parameters 'x' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s4c = s4.then(testFunction4P, testFunction4, testFunction4); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number, y?: string) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'x' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s4d = s4.then(sIPromise, testFunction4P, testFunction4).then(sIPromise, testFunction4P, testFunction4); var r5: IPromise; @@ -175,17 +212,25 @@ tests/cases/compiler/promisePermutations.ts(160,21): error TS2345: Argument of t var r7a = r7.then(testFunction7, testFunction7, testFunction7); // error ~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'cb' and 'value' are incompatible. +!!! error TS2345: Type '(a: T) => T' is not assignable to type 'string'. var r7b = r7.then(sIPromise, sIPromise, sIPromise).then(sIPromise, sIPromise, sIPromise); // ok var s7: Promise; var s7a = r7.then(testFunction7, testFunction7, testFunction7); // error ~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'cb' and 'value' are incompatible. +!!! error TS2345: Type '(a: T) => T' is not assignable to type 'string'. var s7b = r7.then(testFunction7P, testFunction7P, testFunction7P); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => Promise'. +!!! error TS2345: Types of parameters 'cb' and 'value' are incompatible. +!!! error TS2345: Type '(a: T) => T' is not assignable to type 'string'. var s7c = r7.then(testFunction7P, testFunction7, testFunction7); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'cb' and 'value' are incompatible. +!!! error TS2345: Type '(a: T) => T' is not assignable to type 'string'. var s7d = r7.then(sPromise, sPromise, sPromise).then(sPromise, sPromise, sPromise); // ok? var r8: IPromise; @@ -258,22 +303,31 @@ tests/cases/compiler/promisePermutations.ts(160,21): error TS2345: Argument of t ~~~~~~~~ !!! error TS2453: The type argument for type parameter 'U' cannot be inferred from the usage. Consider specifying the type arguments explicitly. !!! error TS2453: Type argument candidate 'Promise' is not a valid type argument because it is not a supertype of candidate 'IPromise'. +!!! error TS2453: Types of property 'then' are incompatible. +!!! error TS2453: Type '{ (success?: (value: string) => IPromise, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => IPromise, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; }' is not assignable to type '{ (success?: (value: number) => Promise, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => Promise, error?: (error: any) => U, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void): Promise; }'. var s10g = s10.then(testFunctionP, nIPromise, sIPromise).then(sPromise, sIPromise, sIPromise); // ok var r11: IPromise; var r11a = r11.then(testFunction11, testFunction11, testFunction11); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '{ (x: number): IPromise; (x: string): IPromise; }' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Type 'IPromise' is not assignable to type 'IPromise'. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s11: Promise; var s11a = s11.then(testFunction11, testFunction11, testFunction11); // ok ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '{ (x: number): IPromise; (x: string): IPromise; }' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Type 'IPromise' is not assignable to type 'IPromise'. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s11b = s11.then(testFunction11P, testFunction11P, testFunction11P); // error ~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '{ (x: number): Promise; (x: string): Promise; }' is not assignable to parameter of type '(value: number) => Promise'. +!!! error TS2345: Type 'Promise' is not assignable to type 'Promise'. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s11c = s11.then(testFunction11P, testFunction11, testFunction11); // error ~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '{ (x: number): Promise; (x: string): Promise; }' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Type 'Promise' is not assignable to type 'IPromise'. var r12 = testFunction12(x => x); var r12a = r12.then(testFunction12, testFunction12, testFunction12); // ok diff --git a/tests/baselines/reference/promisePermutations2.errors.txt b/tests/baselines/reference/promisePermutations2.errors.txt index 3c316115a2..5a50b9391b 100644 --- a/tests/baselines/reference/promisePermutations2.errors.txt +++ b/tests/baselines/reference/promisePermutations2.errors.txt @@ -1,8 +1,18 @@ tests/cases/compiler/promisePermutations2.ts(73,70): error TS2345: Argument of type '(x: number) => IPromise' is not assignable to parameter of type '(value: IPromise) => IPromise'. + Types of parameters 'x' and 'value' are incompatible. + Type 'number' is not assignable to type 'IPromise'. tests/cases/compiler/promisePermutations2.ts(78,19): error TS2345: Argument of type '(x: number, y?: string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'x' and 'value' are incompatible. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations2.ts(81,19): error TS2345: Argument of type '(x: number, y?: string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'x' and 'value' are incompatible. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations2.ts(82,19): error TS2345: Argument of type '(x: number, y?: string) => Promise' is not assignable to parameter of type '(value: string) => Promise'. + Types of parameters 'x' and 'value' are incompatible. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations2.ts(83,19): error TS2345: Argument of type '(x: number, y?: string) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'x' and 'value' are incompatible. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations2.ts(87,19): error TS2345: Argument of type '(x: number, cb: (a: string) => string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. tests/cases/compiler/promisePermutations2.ts(90,19): error TS2345: Argument of type '(x: number, cb: (a: string) => string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. tests/cases/compiler/promisePermutations2.ts(91,19): error TS2345: Argument of type '(x: number, cb: (a: string) => string) => Promise' is not assignable to parameter of type '(value: string) => Promise'. @@ -12,9 +22,17 @@ tests/cases/compiler/promisePermutations2.ts(99,19): error TS2345: Argument of t tests/cases/compiler/promisePermutations2.ts(100,19): error TS2345: Argument of type '(x: number, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => Promise'. tests/cases/compiler/promisePermutations2.ts(101,19): error TS2345: Argument of type '(x: number, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. tests/cases/compiler/promisePermutations2.ts(105,19): error TS2345: Argument of type '(cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'cb' and 'value' are incompatible. + Type '(a: T) => T' is not assignable to type 'string'. tests/cases/compiler/promisePermutations2.ts(108,19): error TS2345: Argument of type '(cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'cb' and 'value' are incompatible. + Type '(a: T) => T' is not assignable to type 'string'. tests/cases/compiler/promisePermutations2.ts(109,19): error TS2345: Argument of type '(cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => Promise'. + Types of parameters 'cb' and 'value' are incompatible. + Type '(a: T) => T' is not assignable to type 'string'. tests/cases/compiler/promisePermutations2.ts(110,19): error TS2345: Argument of type '(cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'cb' and 'value' are incompatible. + Type '(a: T) => T' is not assignable to type 'string'. tests/cases/compiler/promisePermutations2.ts(116,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. tests/cases/compiler/promisePermutations2.ts(119,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. tests/cases/compiler/promisePermutations2.ts(120,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => Promise'. @@ -34,10 +52,19 @@ tests/cases/compiler/promisePermutations2.ts(143,12): error TS2453: The type arg Type 'string' is not assignable to type 'number'. tests/cases/compiler/promisePermutations2.ts(151,12): error TS2453: The type argument for type parameter 'U' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'Promise' is not a valid type argument because it is not a supertype of candidate 'IPromise'. + Types of property 'then' are incompatible. + Type '{ (success?: (value: string) => IPromise, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => IPromise, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; }' is not assignable to type '(success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void) => Promise'. tests/cases/compiler/promisePermutations2.ts(155,21): error TS2345: Argument of type '{ (x: number): IPromise; (x: string): IPromise; }' is not assignable to parameter of type '(value: number) => IPromise'. + Type 'IPromise' is not assignable to type 'IPromise'. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations2.ts(157,21): error TS2345: Argument of type '{ (x: number): IPromise; (x: string): IPromise; }' is not assignable to parameter of type '(value: number) => IPromise'. + Type 'IPromise' is not assignable to type 'IPromise'. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations2.ts(158,21): error TS2345: Argument of type '{ (x: number): Promise; (x: string): Promise; }' is not assignable to parameter of type '(value: number) => Promise'. + Type 'Promise' is not assignable to type 'Promise'. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations2.ts(159,21): error TS2345: Argument of type '{ (x: number): Promise; (x: string): Promise; }' is not assignable to parameter of type '(value: number) => IPromise'. + Type 'Promise' is not assignable to type 'IPromise'. ==== tests/cases/compiler/promisePermutations2.ts (33 errors) ==== @@ -116,6 +143,8 @@ tests/cases/compiler/promisePermutations2.ts(159,21): error TS2345: Argument of var s3d = s3.then(testFunction3P, testFunction3, testFunction3).then(testFunction3, testFunction3, testFunction3); // Should error ~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number) => IPromise' is not assignable to parameter of type '(value: IPromise) => IPromise'. +!!! error TS2345: Types of parameters 'x' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'IPromise'. var r4: IPromise; var sIPromise: (x: any) => IPromise; @@ -123,17 +152,25 @@ tests/cases/compiler/promisePermutations2.ts(159,21): error TS2345: Argument of var r4a = r4.then(testFunction4, testFunction4, testFunction4); // error ~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number, y?: string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'x' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var r4b = r4.then(sIPromise, testFunction4, testFunction4).then(sIPromise, testFunction4, testFunction4); // ok var s4: Promise; var s4a = s4.then(testFunction4, testFunction4, testFunction4); // error ~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number, y?: string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'x' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s4b = s4.then(testFunction4P, testFunction4P, testFunction4P); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number, y?: string) => Promise' is not assignable to parameter of type '(value: string) => Promise'. +!!! error TS2345: Types of parameters 'x' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s4c = s4.then(testFunction4P, testFunction4, testFunction4); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number, y?: string) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'x' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s4d = s4.then(sIPromise, testFunction4P, testFunction4).then(sIPromise, testFunction4P, testFunction4); var r5: IPromise; @@ -174,17 +211,25 @@ tests/cases/compiler/promisePermutations2.ts(159,21): error TS2345: Argument of var r7a = r7.then(testFunction7, testFunction7, testFunction7); // error ~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'cb' and 'value' are incompatible. +!!! error TS2345: Type '(a: T) => T' is not assignable to type 'string'. var r7b = r7.then(sIPromise, sIPromise, sIPromise).then(sIPromise, sIPromise, sIPromise); // ok var s7: Promise; var s7a = r7.then(testFunction7, testFunction7, testFunction7); // error ~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'cb' and 'value' are incompatible. +!!! error TS2345: Type '(a: T) => T' is not assignable to type 'string'. var s7b = r7.then(testFunction7P, testFunction7P, testFunction7P); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => Promise'. +!!! error TS2345: Types of parameters 'cb' and 'value' are incompatible. +!!! error TS2345: Type '(a: T) => T' is not assignable to type 'string'. var s7c = r7.then(testFunction7P, testFunction7, testFunction7); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'cb' and 'value' are incompatible. +!!! error TS2345: Type '(a: T) => T' is not assignable to type 'string'. var s7d = r7.then(sPromise, sPromise, sPromise).then(sPromise, sPromise, sPromise); // ok? var r8: IPromise; @@ -257,22 +302,31 @@ tests/cases/compiler/promisePermutations2.ts(159,21): error TS2345: Argument of ~~~~~~~~ !!! error TS2453: The type argument for type parameter 'U' cannot be inferred from the usage. Consider specifying the type arguments explicitly. !!! error TS2453: Type argument candidate 'Promise' is not a valid type argument because it is not a supertype of candidate 'IPromise'. +!!! error TS2453: Types of property 'then' are incompatible. +!!! error TS2453: Type '{ (success?: (value: string) => IPromise, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => IPromise, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => IPromise, progress?: (progress: any) => void): IPromise; (success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void): IPromise; }' is not assignable to type '(success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void) => Promise'. var s10g = s10.then(testFunctionP, nIPromise, sIPromise).then(sPromise, sIPromise, sIPromise); // ok var r11: IPromise; var r11a = r11.then(testFunction11, testFunction11, testFunction11); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '{ (x: number): IPromise; (x: string): IPromise; }' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Type 'IPromise' is not assignable to type 'IPromise'. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s11: Promise; var s11a = s11.then(testFunction11, testFunction11, testFunction11); // ok ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '{ (x: number): IPromise; (x: string): IPromise; }' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Type 'IPromise' is not assignable to type 'IPromise'. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s11b = s11.then(testFunction11P, testFunction11P, testFunction11P); // ok ~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '{ (x: number): Promise; (x: string): Promise; }' is not assignable to parameter of type '(value: number) => Promise'. +!!! error TS2345: Type 'Promise' is not assignable to type 'Promise'. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s11c = s11.then(testFunction11P, testFunction11, testFunction11); // ok ~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '{ (x: number): Promise; (x: string): Promise; }' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Type 'Promise' is not assignable to type 'IPromise'. var r12 = testFunction12(x => x); var r12a = r12.then(testFunction12, testFunction12, testFunction12); // ok diff --git a/tests/baselines/reference/promisePermutations3.errors.txt b/tests/baselines/reference/promisePermutations3.errors.txt index f8edf83c69..d0874ea7f5 100644 --- a/tests/baselines/reference/promisePermutations3.errors.txt +++ b/tests/baselines/reference/promisePermutations3.errors.txt @@ -1,9 +1,21 @@ tests/cases/compiler/promisePermutations3.ts(68,69): error TS2345: Argument of type '(x: number) => IPromise' is not assignable to parameter of type '(value: IPromise) => IPromise'. + Types of parameters 'x' and 'value' are incompatible. + Type 'number' is not assignable to type 'IPromise'. tests/cases/compiler/promisePermutations3.ts(73,70): error TS2345: Argument of type '(x: number) => IPromise' is not assignable to parameter of type '(value: IPromise) => IPromise'. + Types of parameters 'x' and 'value' are incompatible. + Type 'number' is not assignable to type 'IPromise'. tests/cases/compiler/promisePermutations3.ts(78,19): error TS2345: Argument of type '(x: number, y?: string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'x' and 'value' are incompatible. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations3.ts(81,19): error TS2345: Argument of type '(x: number, y?: string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'x' and 'value' are incompatible. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations3.ts(82,19): error TS2345: Argument of type '(x: number, y?: string) => Promise' is not assignable to parameter of type '(value: string) => Promise'. + Types of parameters 'x' and 'value' are incompatible. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations3.ts(83,19): error TS2345: Argument of type '(x: number, y?: string) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'x' and 'value' are incompatible. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations3.ts(87,19): error TS2345: Argument of type '(x: number, cb: (a: string) => string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. tests/cases/compiler/promisePermutations3.ts(90,19): error TS2345: Argument of type '(x: number, cb: (a: string) => string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. tests/cases/compiler/promisePermutations3.ts(91,19): error TS2345: Argument of type '(x: number, cb: (a: string) => string) => Promise' is not assignable to parameter of type '(value: string) => Promise'. @@ -13,9 +25,17 @@ tests/cases/compiler/promisePermutations3.ts(99,19): error TS2345: Argument of t tests/cases/compiler/promisePermutations3.ts(100,19): error TS2345: Argument of type '(x: number, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => Promise'. tests/cases/compiler/promisePermutations3.ts(101,19): error TS2345: Argument of type '(x: number, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. tests/cases/compiler/promisePermutations3.ts(105,19): error TS2345: Argument of type '(cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'cb' and 'value' are incompatible. + Type '(a: T) => T' is not assignable to type 'string'. tests/cases/compiler/promisePermutations3.ts(108,19): error TS2345: Argument of type '(cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'cb' and 'value' are incompatible. + Type '(a: T) => T' is not assignable to type 'string'. tests/cases/compiler/promisePermutations3.ts(109,19): error TS2345: Argument of type '(cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => Promise'. + Types of parameters 'cb' and 'value' are incompatible. + Type '(a: T) => T' is not assignable to type 'string'. tests/cases/compiler/promisePermutations3.ts(110,19): error TS2345: Argument of type '(cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. + Types of parameters 'cb' and 'value' are incompatible. + Type '(a: T) => T' is not assignable to type 'string'. tests/cases/compiler/promisePermutations3.ts(116,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. tests/cases/compiler/promisePermutations3.ts(119,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: number) => IPromise'. tests/cases/compiler/promisePermutations3.ts(120,19): error TS2345: Argument of type '(x: T, cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: number) => Promise'. @@ -35,11 +55,21 @@ tests/cases/compiler/promisePermutations3.ts(143,12): error TS2453: The type arg Type 'string' is not assignable to type 'number'. tests/cases/compiler/promisePermutations3.ts(151,12): error TS2453: The type argument for type parameter 'U' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'Promise' is not a valid type argument because it is not a supertype of candidate 'IPromise'. + Types of property 'then' are incompatible. + Type '(success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void) => IPromise' is not assignable to type '{ (success?: (value: number) => Promise, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => Promise, error?: (error: any) => U, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void): Promise; }'. tests/cases/compiler/promisePermutations3.ts(155,21): error TS2345: Argument of type '{ (x: number): IPromise; (x: string): IPromise; }' is not assignable to parameter of type '(value: number) => IPromise'. + Type 'IPromise' is not assignable to type 'IPromise'. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations3.ts(157,21): error TS2345: Argument of type '{ (x: number): IPromise; (x: string): IPromise; }' is not assignable to parameter of type '(value: number) => IPromise'. + Type 'IPromise' is not assignable to type 'IPromise'. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations3.ts(158,21): error TS2345: Argument of type '{ (x: number): Promise; (x: string): Promise; }' is not assignable to parameter of type '(value: number) => Promise'. + Type 'Promise' is not assignable to type 'Promise'. + Type 'number' is not assignable to type 'string'. tests/cases/compiler/promisePermutations3.ts(159,21): error TS2345: Argument of type '{ (x: number): Promise; (x: string): Promise; }' is not assignable to parameter of type '(value: number) => IPromise'. + Type 'Promise' is not assignable to type 'IPromise'. tests/cases/compiler/promisePermutations3.ts(165,21): error TS2345: Argument of type '{ (x: T): IPromise; (x: T, y: T): Promise; }' is not assignable to parameter of type '(value: (x: any) => any) => Promise'. + Type 'IPromise' is not assignable to type 'Promise'. ==== tests/cases/compiler/promisePermutations3.ts (35 errors) ==== @@ -113,6 +143,8 @@ tests/cases/compiler/promisePermutations3.ts(165,21): error TS2345: Argument of var r3b = r3.then(testFunction3, testFunction3, testFunction3).then(testFunction3, testFunction3, testFunction3); ~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number) => IPromise' is not assignable to parameter of type '(value: IPromise) => IPromise'. +!!! error TS2345: Types of parameters 'x' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'IPromise'. var s3: Promise; var s3a = s3.then(testFunction3, testFunction3, testFunction3); var s3b = s3.then(testFunction3P, testFunction3P, testFunction3P); @@ -120,6 +152,8 @@ tests/cases/compiler/promisePermutations3.ts(165,21): error TS2345: Argument of var s3d = s3.then(testFunction3P, testFunction3, testFunction3).then(testFunction3, testFunction3, testFunction3); ~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number) => IPromise' is not assignable to parameter of type '(value: IPromise) => IPromise'. +!!! error TS2345: Types of parameters 'x' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'IPromise'. var r4: IPromise; var sIPromise: (x: any) => IPromise; @@ -127,17 +161,25 @@ tests/cases/compiler/promisePermutations3.ts(165,21): error TS2345: Argument of var r4a = r4.then(testFunction4, testFunction4, testFunction4); // error ~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number, y?: string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'x' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var r4b = r4.then(sIPromise, testFunction4, testFunction4).then(sIPromise, testFunction4, testFunction4); // ok var s4: Promise; var s4a = s4.then(testFunction4, testFunction4, testFunction4); // error ~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number, y?: string) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'x' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s4b = s4.then(testFunction4P, testFunction4P, testFunction4P); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number, y?: string) => Promise' is not assignable to parameter of type '(value: string) => Promise'. +!!! error TS2345: Types of parameters 'x' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s4c = s4.then(testFunction4P, testFunction4, testFunction4); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: number, y?: string) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'x' and 'value' are incompatible. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s4d = s4.then(sIPromise, testFunction4P, testFunction4).then(sIPromise, testFunction4P, testFunction4); var r5: IPromise; @@ -178,17 +220,25 @@ tests/cases/compiler/promisePermutations3.ts(165,21): error TS2345: Argument of var r7a = r7.then(testFunction7, testFunction7, testFunction7); // error ~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'cb' and 'value' are incompatible. +!!! error TS2345: Type '(a: T) => T' is not assignable to type 'string'. var r7b = r7.then(sIPromise, sIPromise, sIPromise).then(sIPromise, sIPromise, sIPromise); // ok var s7: Promise; var s7a = r7.then(testFunction7, testFunction7, testFunction7); // error ~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(cb: (a: T) => T) => IPromise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'cb' and 'value' are incompatible. +!!! error TS2345: Type '(a: T) => T' is not assignable to type 'string'. var s7b = r7.then(testFunction7P, testFunction7P, testFunction7P); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => Promise'. +!!! error TS2345: Types of parameters 'cb' and 'value' are incompatible. +!!! error TS2345: Type '(a: T) => T' is not assignable to type 'string'. var s7c = r7.then(testFunction7P, testFunction7, testFunction7); // error ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(cb: (a: T) => T) => Promise' is not assignable to parameter of type '(value: string) => IPromise'. +!!! error TS2345: Types of parameters 'cb' and 'value' are incompatible. +!!! error TS2345: Type '(a: T) => T' is not assignable to type 'string'. var s7d = r7.then(sPromise, sPromise, sPromise).then(sPromise, sPromise, sPromise); // ok? var r8: IPromise; @@ -261,22 +311,31 @@ tests/cases/compiler/promisePermutations3.ts(165,21): error TS2345: Argument of ~~~~~~~~ !!! error TS2453: The type argument for type parameter 'U' cannot be inferred from the usage. Consider specifying the type arguments explicitly. !!! error TS2453: Type argument candidate 'Promise' is not a valid type argument because it is not a supertype of candidate 'IPromise'. +!!! error TS2453: Types of property 'then' are incompatible. +!!! error TS2453: Type '(success?: (value: string) => U, error?: (error: any) => U, progress?: (progress: any) => void) => IPromise' is not assignable to type '{ (success?: (value: number) => Promise, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => Promise, error?: (error: any) => U, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => Promise, progress?: (progress: any) => void): Promise; (success?: (value: number) => U, error?: (error: any) => U, progress?: (progress: any) => void): Promise; }'. var s10g = s10.then(testFunctionP, nIPromise, sIPromise).then(sPromise, sIPromise, sIPromise); // ok var r11: IPromise; var r11a = r11.then(testFunction11, testFunction11, testFunction11); // ok ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '{ (x: number): IPromise; (x: string): IPromise; }' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Type 'IPromise' is not assignable to type 'IPromise'. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s11: Promise; var s11a = s11.then(testFunction11, testFunction11, testFunction11); // ok ~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '{ (x: number): IPromise; (x: string): IPromise; }' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Type 'IPromise' is not assignable to type 'IPromise'. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s11b = s11.then(testFunction11P, testFunction11P, testFunction11P); // error ~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '{ (x: number): Promise; (x: string): Promise; }' is not assignable to parameter of type '(value: number) => Promise'. +!!! error TS2345: Type 'Promise' is not assignable to type 'Promise'. +!!! error TS2345: Type 'number' is not assignable to type 'string'. var s11c = s11.then(testFunction11P, testFunction11, testFunction11); // error ~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '{ (x: number): Promise; (x: string): Promise; }' is not assignable to parameter of type '(value: number) => IPromise'. +!!! error TS2345: Type 'Promise' is not assignable to type 'IPromise'. var r12 = testFunction12(x => x); var r12a = r12.then(testFunction12, testFunction12, testFunction12); // ok @@ -285,4 +344,5 @@ tests/cases/compiler/promisePermutations3.ts(165,21): error TS2345: Argument of var s12b = s12.then(testFunction12P, testFunction12P, testFunction12P); // ok ~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '{ (x: T): IPromise; (x: T, y: T): Promise; }' is not assignable to parameter of type '(value: (x: any) => any) => Promise'. +!!! error TS2345: Type 'IPromise' is not assignable to type 'Promise'. var s12c = s12.then(testFunction12P, testFunction12, testFunction12); // ok \ No newline at end of file diff --git a/tests/baselines/reference/recursiveClassReferenceTest.errors.txt b/tests/baselines/reference/recursiveClassReferenceTest.errors.txt index f256172447..088d7222f4 100644 --- a/tests/baselines/reference/recursiveClassReferenceTest.errors.txt +++ b/tests/baselines/reference/recursiveClassReferenceTest.errors.txt @@ -2,6 +2,7 @@ tests/cases/compiler/recursiveClassReferenceTest.ts(16,19): error TS2304: Cannot tests/cases/compiler/recursiveClassReferenceTest.ts(56,11): error TS2304: Cannot find name 'domNode'. tests/cases/compiler/recursiveClassReferenceTest.ts(88,36): error TS2304: Cannot find name 'mode'. tests/cases/compiler/recursiveClassReferenceTest.ts(95,21): error TS2345: Argument of type 'Window' is not assignable to parameter of type 'IMode'. + Property 'getInitialState' is missing in type 'Window'. ==== tests/cases/compiler/recursiveClassReferenceTest.ts (4 errors) ==== @@ -108,6 +109,7 @@ tests/cases/compiler/recursiveClassReferenceTest.ts(95,21): error TS2345: Argume return new State(self); ~~~~ !!! error TS2345: Argument of type 'Window' is not assignable to parameter of type 'IMode'. +!!! error TS2345: Property 'getInitialState' is missing in type 'Window'. } diff --git a/tests/baselines/reference/recursiveInitializer.js b/tests/baselines/reference/recursiveInitializer.js index c7a723c35d..82abf2b50a 100644 --- a/tests/baselines/reference/recursiveInitializer.js +++ b/tests/baselines/reference/recursiveInitializer.js @@ -23,10 +23,10 @@ var f = (x: string) => f(x); // number unless otherwise specified var n1 = n1++; var n2 = n2 + n2; -var n3 = n3 + n3; +var n3 /* any */ = n3 + n3; // string unless otherwise specified var s1 = s1 + ''; -var s2 = s2 + s2; +var s2 /* any */ = s2 + s2; var s3 = s3 + s3; var s4 = '' + s4; // boolean unless otherwise specified diff --git a/tests/baselines/reference/scopingInCatchBlocks.js b/tests/baselines/reference/scopingInCatchBlocks.js index 8590173147..2d3ca7098b 100644 --- a/tests/baselines/reference/scopingInCatchBlocks.js +++ b/tests/baselines/reference/scopingInCatchBlocks.js @@ -19,9 +19,9 @@ catch (ex1) { try { } catch (ex1) { -} +} // should not error try { } catch (ex1) { -} +} // should not error var x = ex1; // should error diff --git a/tests/baselines/reference/sourceMapValidationClasses.js b/tests/baselines/reference/sourceMapValidationClasses.js index 96724f7c3c..e3b705bc4b 100644 --- a/tests/baselines/reference/sourceMapValidationClasses.js +++ b/tests/baselines/reference/sourceMapValidationClasses.js @@ -57,9 +57,9 @@ var Foo; var greeter = new Greeter("Hello, world!"); var str = greeter.greet(); function foo2(greeting) { - var restGreetings = []; + var restGreetings /* more greeting */ = []; for (var _i = 1; _i < arguments.length; _i++) { - restGreetings[_i - 1] = arguments[_i]; + restGreetings /* more greeting */[_i - 1] = arguments[_i]; } var greeters = []; /* inline block comment */ greeters[0] = new Greeter(greeting); @@ -69,6 +69,7 @@ var Foo; return greeters; } var b = foo2("Hello", "World", "!"); + // This is simple signle line comment for (var j = 0; j < b.length; j++) { b[j].greet(); } diff --git a/tests/baselines/reference/sourceMapValidationClasses.js.map b/tests/baselines/reference/sourceMapValidationClasses.js.map index 2a1b381e11..68ded9631e 100644 --- a/tests/baselines/reference/sourceMapValidationClasses.js.map +++ b/tests/baselines/reference/sourceMapValidationClasses.js.map @@ -1,2 +1,2 @@ //// [sourceMapValidationClasses.js.map] -{"version":3,"file":"sourceMapValidationClasses.js","sourceRoot":"","sources":["sourceMapValidationClasses.ts"],"names":["Foo","Foo.Bar","Foo.Bar.Greeter","Foo.Bar.Greeter.constructor","Foo.Bar.Greeter.greet","Foo.Bar.foo","Foo.Bar.foo2"],"mappings":"AAAA,IAAO,GAAG,CAmCT;AAnCD,WAAO,GAAG;IAACA,IAAAA,GAAGA,CAmCbA;IAnCUA,WAAAA,GAAGA,EAACA,CAACA;QACZC,YAAYA,CAACA;QAEbA,IAAMA,OAAOA;YACTC,SADEA,OAAOA,CACUA,QAAgBA;gBAAhBC,aAAQA,GAARA,QAAQA,CAAQA;YACnCA,CAACA;YAEDD,uBAAKA,GAALA;gBACIE,MAAMA,CAACA,MAAMA,GAAGA,IAAIA,CAACA,QAAQA,GAAGA,OAAOA,CAACA;YAC5CA,CAACA;YACLF,cAACA;QAADA,CAACA,AAPDD,IAOCA;QAGDA,SAASA,GAAGA,CAACA,QAAgBA;YACzBI,MAAMA,CAACA,IAAIA,OAAOA,CAACA,QAAQA,CAACA,CAACA;QACjCA,CAACA;QAEDJ,IAAIA,OAAOA,GAAGA,IAAIA,OAAOA,CAACA,eAAeA,CAACA,CAACA;QAC3CA,IAAIA,GAAGA,GAAGA,OAAOA,CAACA,KAAKA,EAAEA,CAACA;QAE1BA,SAASA,IAAIA,CAACA,QAAgBA;YAAEK,uBAA8CA;iBAA9CA,WAA8CA,CAA9CA,sBAA8CA,CAA9CA,IAA8CA;gBAA9CA,sCAA8CA;;YAC1EA,IAAIA,QAAQA,GAAcA,EAAEA,EAAEA,0BAA0BA,AAA3BA;YAC7BA,QAAQA,CAACA,CAACA,CAACA,GAAGA,IAAIA,OAAOA,CAACA,QAAQA,CAACA,CAACA;YACpCA,GAAGA,CAACA,CAACA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,GAAGA,aAAaA,CAACA,MAAMA,EAAEA,CAACA,EAAEA,EAAEA,CAACA;gBAC5CA,QAAQA,CAACA,IAAIA,CAACA,IAAIA,OAAOA,CAACA,aAAaA,CAACA,CAACA,CAACA,CAACA,CAACA,CAACA;YACjDA,CAACA;YAEDA,MAAMA,CAACA,QAAQA,CAACA;QACpBA,CAACA;QAEDL,IAAIA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,EAAEA,OAAOA,EAAEA,GAAGA,CAACA,CAACA;QAEpCA,GAAGA,CAACA,CAACA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,GAAGA,CAACA,CAACA,MAAMA,EAAEA,CAACA,EAAEA,EAAEA,CAACA;YAChCA,CAACA,CAACA,CAACA,CAACA,CAACA,KAAKA,EAAEA,CAACA;QACjBA,CAACA;IACLA,CAACA,EAnCUD,GAAGA,GAAHA,OAAGA,KAAHA,OAAGA,QAmCbA;AAADA,CAACA,EAnCM,GAAG,KAAH,GAAG,QAmCT"} \ No newline at end of file +{"version":3,"file":"sourceMapValidationClasses.js","sourceRoot":"","sources":["sourceMapValidationClasses.ts"],"names":["Foo","Foo.Bar","Foo.Bar.Greeter","Foo.Bar.Greeter.constructor","Foo.Bar.Greeter.greet","Foo.Bar.foo","Foo.Bar.foo2"],"mappings":"AAAA,IAAO,GAAG,CAmCT;AAnCD,WAAO,GAAG;IAACA,IAAAA,GAAGA,CAmCbA;IAnCUA,WAAAA,GAAGA,EAACA,CAACA;QACZC,YAAYA,CAACA;QAEbA,IAAMA,OAAOA;YACTC,SADEA,OAAOA,CACUA,QAAgBA;gBAAhBC,aAAQA,GAARA,QAAQA,CAAQA;YACnCA,CAACA;YAEDD,uBAAKA,GAALA;gBACIE,MAAMA,CAACA,MAAMA,GAAGA,IAAIA,CAACA,QAAQA,GAAGA,OAAOA,CAACA;YAC5CA,CAACA;YACLF,cAACA;QAADA,CAACA,AAPDD,IAOCA;QAGDA,SAASA,GAAGA,CAACA,QAAgBA;YACzBI,MAAMA,CAACA,IAAIA,OAAOA,CAACA,QAAQA,CAACA,CAACA;QACjCA,CAACA;QAEDJ,IAAIA,OAAOA,GAAGA,IAAIA,OAAOA,CAACA,eAAeA,CAACA,CAACA;QAC3CA,IAAIA,GAAGA,GAAGA,OAAOA,CAACA,KAAKA,EAAEA,CAACA;QAE1BA,SAASA,IAAIA,CAACA,QAAgBA;YAAEK,kBAAiBA,mBAAmBA,MAAUA;iBAA9CA,WAA8CA,CAA9CA,sBAA8CA,CAA9CA,IAA8CA;gBAA9CA,cAAiBA,mBAAmBA,yBAAUA;;YAC1EA,IAAIA,QAAQA,GAAcA,EAAEA,EAAEA,0BAA0BA,AAA3BA;YAC7BA,QAAQA,CAACA,CAACA,CAACA,GAAGA,IAAIA,OAAOA,CAACA,QAAQA,CAACA,CAACA;YACpCA,GAAGA,CAACA,CAACA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,GAAGA,aAAaA,CAACA,MAAMA,EAAEA,CAACA,EAAEA,EAAEA,CAACA;gBAC5CA,QAAQA,CAACA,IAAIA,CAACA,IAAIA,OAAOA,CAACA,aAAaA,CAACA,CAACA,CAACA,CAACA,CAACA,CAACA;YACjDA,CAACA;YAEDA,MAAMA,CAACA,QAAQA,CAACA;QACpBA,CAACA;QAEDL,IAAIA,CAACA,GAAGA,IAAIA,CAACA,OAAOA,EAAEA,OAAOA,EAAEA,GAAGA,CAACA,CAACA;QAEpCA,AADAA,qCAAqCA;QACrCA,GAAGA,CAACA,CAACA,GAAGA,CAACA,CAACA,GAAGA,CAACA,EAAEA,CAACA,GAAGA,CAACA,CAACA,MAAMA,EAAEA,CAACA,EAAEA,EAAEA,CAACA;YAChCA,CAACA,CAACA,CAACA,CAACA,CAACA,KAAKA,EAAEA,CAACA;QACjBA,CAACA;IACLA,CAACA,EAnCUD,GAAGA,GAAHA,OAAGA,KAAHA,OAAGA,QAmCbA;AAADA,CAACA,EAnCM,GAAG,KAAH,GAAG,QAmCT"} \ No newline at end of file diff --git a/tests/baselines/reference/sourceMapValidationClasses.sourcemap.txt b/tests/baselines/reference/sourceMapValidationClasses.sourcemap.txt index d82ac6c3e0..6cd77b696f 100644 --- a/tests/baselines/reference/sourceMapValidationClasses.sourcemap.txt +++ b/tests/baselines/reference/sourceMapValidationClasses.sourcemap.txt @@ -433,7 +433,7 @@ sourceFile:sourceMapValidationClasses.ts 3 > ^^^^ 4 > ^ 5 > ^^^^^^^^ -6 > ^^^^^^-> +6 > ^^^^^^^^^^^^^^^^^^^^^^^^^^-> 1 > > > @@ -447,14 +447,20 @@ sourceFile:sourceMapValidationClasses.ts 4 >Emitted(20, 23) Source(21, 19) + SourceIndex(0) name (Foo.Bar) 5 >Emitted(20, 31) Source(21, 35) + SourceIndex(0) name (Foo.Bar) --- ->>> var restGreetings = []; +>>> var restGreetings /* more greeting */ = []; 1->^^^^^^^^^^^^ -2 > ^^^^^^^^^^^^^^^^^^^^^^^ -3 > ^^^^^^^^^^^^^^^^^^^^^^^^^-> +2 > ^^^^^^^^^^^^^^^^^^ +3 > ^^^^^^^^^^^^^^^^^^^ +4 > ^^^^^^ +5 > ^^^^^-> 1->, -2 > ...restGreetings /* more greeting */: string[] +2 > ...restGreetings +3 > /* more greeting */ +4 > : string[] 1->Emitted(21, 13) Source(21, 37) + SourceIndex(0) name (Foo.Bar.foo2) -2 >Emitted(21, 36) Source(21, 83) + SourceIndex(0) name (Foo.Bar.foo2) +2 >Emitted(21, 31) Source(21, 54) + SourceIndex(0) name (Foo.Bar.foo2) +3 >Emitted(21, 50) Source(21, 73) + SourceIndex(0) name (Foo.Bar.foo2) +4 >Emitted(21, 56) Source(21, 83) + SourceIndex(0) name (Foo.Bar.foo2) --- >>> for (var _i = 1; _i < arguments.length; _i++) { 1->^^^^^^^^^^^^^^^^^ @@ -463,6 +469,7 @@ sourceFile:sourceMapValidationClasses.ts 4 > ^^^^^^^^^^^^^^^^^^^^^^ 5 > ^ 6 > ^^^^ +7 > ^^^^^^^^^^^^^^^^^^^-> 1-> 2 > ...restGreetings /* more greeting */: string[] 3 > @@ -476,13 +483,19 @@ sourceFile:sourceMapValidationClasses.ts 5 >Emitted(22, 53) Source(21, 37) + SourceIndex(0) name (Foo.Bar.foo2) 6 >Emitted(22, 57) Source(21, 83) + SourceIndex(0) name (Foo.Bar.foo2) --- ->>> restGreetings[_i - 1] = arguments[_i]; -1 >^^^^^^^^^^^^^^^^ -2 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ -1 > -2 > ...restGreetings /* more greeting */: string[] -1 >Emitted(23, 17) Source(21, 37) + SourceIndex(0) name (Foo.Bar.foo2) -2 >Emitted(23, 55) Source(21, 83) + SourceIndex(0) name (Foo.Bar.foo2) +>>> restGreetings /* more greeting */[_i - 1] = arguments[_i]; +1->^^^^^^^^^^^^^^^^ +2 > ^^^^^^^^^^^^^^ +3 > ^^^^^^^^^^^^^^^^^^^ +4 > ^^^^^^^^^^^^^^^^^^^^^^^^^ +1-> +2 > ...restGreetings +3 > /* more greeting */ +4 > : string[] +1->Emitted(23, 17) Source(21, 37) + SourceIndex(0) name (Foo.Bar.foo2) +2 >Emitted(23, 31) Source(21, 54) + SourceIndex(0) name (Foo.Bar.foo2) +3 >Emitted(23, 50) Source(21, 73) + SourceIndex(0) name (Foo.Bar.foo2) +4 >Emitted(23, 75) Source(21, 83) + SourceIndex(0) name (Foo.Bar.foo2) --- >>> } >>> var greeters = []; /* inline block comment */ @@ -717,7 +730,7 @@ sourceFile:sourceMapValidationClasses.ts 11> ^^^ 12> ^ 13> ^ -14> ^-> +14> ^^-> 1-> > > @@ -747,8 +760,21 @@ sourceFile:sourceMapValidationClasses.ts 12>Emitted(32, 44) Source(31, 40) + SourceIndex(0) name (Foo.Bar) 13>Emitted(32, 45) Source(31, 41) + SourceIndex(0) name (Foo.Bar) --- ->>> for (var j = 0; j < b.length; j++) { +>>> // This is simple signle line comment 1->^^^^^^^^ +2 > +3 > ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ +1-> + > // This is simple signle line comment + > +2 > +3 > // This is simple signle line comment +1->Emitted(33, 9) Source(33, 5) + SourceIndex(0) name (Foo.Bar) +2 >Emitted(33, 9) Source(32, 5) + SourceIndex(0) name (Foo.Bar) +3 >Emitted(33, 46) Source(32, 42) + SourceIndex(0) name (Foo.Bar) +--- +>>> for (var j = 0; j < b.length; j++) { +1 >^^^^^^^^ 2 > ^^^ 3 > ^ 4 > ^ @@ -768,8 +794,7 @@ sourceFile:sourceMapValidationClasses.ts 18> ^^ 19> ^^ 20> ^ -1-> - > // This is simple signle line comment +1 > > 2 > for 3 > @@ -790,26 +815,26 @@ sourceFile:sourceMapValidationClasses.ts 18> ++ 19> ) 20> { -1->Emitted(33, 9) Source(33, 5) + SourceIndex(0) name (Foo.Bar) -2 >Emitted(33, 12) Source(33, 8) + SourceIndex(0) name (Foo.Bar) -3 >Emitted(33, 13) Source(33, 9) + SourceIndex(0) name (Foo.Bar) -4 >Emitted(33, 14) Source(33, 10) + SourceIndex(0) name (Foo.Bar) -5 >Emitted(33, 17) Source(33, 13) + SourceIndex(0) name (Foo.Bar) -6 >Emitted(33, 18) Source(33, 14) + SourceIndex(0) name (Foo.Bar) -7 >Emitted(33, 19) Source(33, 15) + SourceIndex(0) name (Foo.Bar) -8 >Emitted(33, 22) Source(33, 18) + SourceIndex(0) name (Foo.Bar) -9 >Emitted(33, 23) Source(33, 19) + SourceIndex(0) name (Foo.Bar) -10>Emitted(33, 25) Source(33, 21) + SourceIndex(0) name (Foo.Bar) -11>Emitted(33, 26) Source(33, 22) + SourceIndex(0) name (Foo.Bar) -12>Emitted(33, 29) Source(33, 25) + SourceIndex(0) name (Foo.Bar) -13>Emitted(33, 30) Source(33, 26) + SourceIndex(0) name (Foo.Bar) -14>Emitted(33, 31) Source(33, 27) + SourceIndex(0) name (Foo.Bar) -15>Emitted(33, 37) Source(33, 33) + SourceIndex(0) name (Foo.Bar) -16>Emitted(33, 39) Source(33, 35) + SourceIndex(0) name (Foo.Bar) -17>Emitted(33, 40) Source(33, 36) + SourceIndex(0) name (Foo.Bar) -18>Emitted(33, 42) Source(33, 38) + SourceIndex(0) name (Foo.Bar) -19>Emitted(33, 44) Source(33, 40) + SourceIndex(0) name (Foo.Bar) -20>Emitted(33, 45) Source(33, 41) + SourceIndex(0) name (Foo.Bar) +1 >Emitted(34, 9) Source(33, 5) + SourceIndex(0) name (Foo.Bar) +2 >Emitted(34, 12) Source(33, 8) + SourceIndex(0) name (Foo.Bar) +3 >Emitted(34, 13) Source(33, 9) + SourceIndex(0) name (Foo.Bar) +4 >Emitted(34, 14) Source(33, 10) + SourceIndex(0) name (Foo.Bar) +5 >Emitted(34, 17) Source(33, 13) + SourceIndex(0) name (Foo.Bar) +6 >Emitted(34, 18) Source(33, 14) + SourceIndex(0) name (Foo.Bar) +7 >Emitted(34, 19) Source(33, 15) + SourceIndex(0) name (Foo.Bar) +8 >Emitted(34, 22) Source(33, 18) + SourceIndex(0) name (Foo.Bar) +9 >Emitted(34, 23) Source(33, 19) + SourceIndex(0) name (Foo.Bar) +10>Emitted(34, 25) Source(33, 21) + SourceIndex(0) name (Foo.Bar) +11>Emitted(34, 26) Source(33, 22) + SourceIndex(0) name (Foo.Bar) +12>Emitted(34, 29) Source(33, 25) + SourceIndex(0) name (Foo.Bar) +13>Emitted(34, 30) Source(33, 26) + SourceIndex(0) name (Foo.Bar) +14>Emitted(34, 31) Source(33, 27) + SourceIndex(0) name (Foo.Bar) +15>Emitted(34, 37) Source(33, 33) + SourceIndex(0) name (Foo.Bar) +16>Emitted(34, 39) Source(33, 35) + SourceIndex(0) name (Foo.Bar) +17>Emitted(34, 40) Source(33, 36) + SourceIndex(0) name (Foo.Bar) +18>Emitted(34, 42) Source(33, 38) + SourceIndex(0) name (Foo.Bar) +19>Emitted(34, 44) Source(33, 40) + SourceIndex(0) name (Foo.Bar) +20>Emitted(34, 45) Source(33, 41) + SourceIndex(0) name (Foo.Bar) --- >>> b[j].greet(); 1 >^^^^^^^^^^^^ @@ -831,15 +856,15 @@ sourceFile:sourceMapValidationClasses.ts 7 > greet 8 > () 9 > ; -1 >Emitted(34, 13) Source(34, 9) + SourceIndex(0) name (Foo.Bar) -2 >Emitted(34, 14) Source(34, 10) + SourceIndex(0) name (Foo.Bar) -3 >Emitted(34, 15) Source(34, 11) + SourceIndex(0) name (Foo.Bar) -4 >Emitted(34, 16) Source(34, 12) + SourceIndex(0) name (Foo.Bar) -5 >Emitted(34, 17) Source(34, 13) + SourceIndex(0) name (Foo.Bar) -6 >Emitted(34, 18) Source(34, 14) + SourceIndex(0) name (Foo.Bar) -7 >Emitted(34, 23) Source(34, 19) + SourceIndex(0) name (Foo.Bar) -8 >Emitted(34, 25) Source(34, 21) + SourceIndex(0) name (Foo.Bar) -9 >Emitted(34, 26) Source(34, 22) + SourceIndex(0) name (Foo.Bar) +1 >Emitted(35, 13) Source(34, 9) + SourceIndex(0) name (Foo.Bar) +2 >Emitted(35, 14) Source(34, 10) + SourceIndex(0) name (Foo.Bar) +3 >Emitted(35, 15) Source(34, 11) + SourceIndex(0) name (Foo.Bar) +4 >Emitted(35, 16) Source(34, 12) + SourceIndex(0) name (Foo.Bar) +5 >Emitted(35, 17) Source(34, 13) + SourceIndex(0) name (Foo.Bar) +6 >Emitted(35, 18) Source(34, 14) + SourceIndex(0) name (Foo.Bar) +7 >Emitted(35, 23) Source(34, 19) + SourceIndex(0) name (Foo.Bar) +8 >Emitted(35, 25) Source(34, 21) + SourceIndex(0) name (Foo.Bar) +9 >Emitted(35, 26) Source(34, 22) + SourceIndex(0) name (Foo.Bar) --- >>> } 1 >^^^^^^^^ @@ -848,8 +873,8 @@ sourceFile:sourceMapValidationClasses.ts 1 > > 2 > } -1 >Emitted(35, 9) Source(35, 5) + SourceIndex(0) name (Foo.Bar) -2 >Emitted(35, 10) Source(35, 6) + SourceIndex(0) name (Foo.Bar) +1 >Emitted(36, 9) Source(35, 5) + SourceIndex(0) name (Foo.Bar) +2 >Emitted(36, 10) Source(35, 6) + SourceIndex(0) name (Foo.Bar) --- >>> })(Bar = Foo.Bar || (Foo.Bar = {})); 1->^^^^ @@ -906,15 +931,15 @@ sourceFile:sourceMapValidationClasses.ts > b[j].greet(); > } > } -1->Emitted(36, 5) Source(36, 1) + SourceIndex(0) name (Foo.Bar) -2 >Emitted(36, 6) Source(36, 2) + SourceIndex(0) name (Foo.Bar) -3 >Emitted(36, 8) Source(1, 12) + SourceIndex(0) name (Foo) -4 >Emitted(36, 11) Source(1, 15) + SourceIndex(0) name (Foo) -5 >Emitted(36, 14) Source(1, 12) + SourceIndex(0) name (Foo) -6 >Emitted(36, 21) Source(1, 15) + SourceIndex(0) name (Foo) -7 >Emitted(36, 26) Source(1, 12) + SourceIndex(0) name (Foo) -8 >Emitted(36, 33) Source(1, 15) + SourceIndex(0) name (Foo) -9 >Emitted(36, 41) Source(36, 2) + SourceIndex(0) name (Foo) +1->Emitted(37, 5) Source(36, 1) + SourceIndex(0) name (Foo.Bar) +2 >Emitted(37, 6) Source(36, 2) + SourceIndex(0) name (Foo.Bar) +3 >Emitted(37, 8) Source(1, 12) + SourceIndex(0) name (Foo) +4 >Emitted(37, 11) Source(1, 15) + SourceIndex(0) name (Foo) +5 >Emitted(37, 14) Source(1, 12) + SourceIndex(0) name (Foo) +6 >Emitted(37, 21) Source(1, 15) + SourceIndex(0) name (Foo) +7 >Emitted(37, 26) Source(1, 12) + SourceIndex(0) name (Foo) +8 >Emitted(37, 33) Source(1, 15) + SourceIndex(0) name (Foo) +9 >Emitted(37, 41) Source(36, 2) + SourceIndex(0) name (Foo) --- >>>})(Foo || (Foo = {})); 1 > @@ -967,12 +992,12 @@ sourceFile:sourceMapValidationClasses.ts > b[j].greet(); > } > } -1 >Emitted(37, 1) Source(36, 1) + SourceIndex(0) name (Foo) -2 >Emitted(37, 2) Source(36, 2) + SourceIndex(0) name (Foo) -3 >Emitted(37, 4) Source(1, 8) + SourceIndex(0) -4 >Emitted(37, 7) Source(1, 11) + SourceIndex(0) -5 >Emitted(37, 12) Source(1, 8) + SourceIndex(0) -6 >Emitted(37, 15) Source(1, 11) + SourceIndex(0) -7 >Emitted(37, 23) Source(36, 2) + SourceIndex(0) +1 >Emitted(38, 1) Source(36, 1) + SourceIndex(0) name (Foo) +2 >Emitted(38, 2) Source(36, 2) + SourceIndex(0) name (Foo) +3 >Emitted(38, 4) Source(1, 8) + SourceIndex(0) +4 >Emitted(38, 7) Source(1, 11) + SourceIndex(0) +5 >Emitted(38, 12) Source(1, 8) + SourceIndex(0) +6 >Emitted(38, 15) Source(1, 11) + SourceIndex(0) +7 >Emitted(38, 23) Source(36, 2) + SourceIndex(0) --- >>>//# sourceMappingURL=sourceMapValidationClasses.js.map \ No newline at end of file diff --git a/tests/baselines/reference/sourceMapValidationEnums.js.map b/tests/baselines/reference/sourceMapValidationEnums.js.map index 721e0a3b48..1627788c6b 100644 --- a/tests/baselines/reference/sourceMapValidationEnums.js.map +++ b/tests/baselines/reference/sourceMapValidationEnums.js.map @@ -1,2 +1,2 @@ //// [sourceMapValidationEnums.js.map] -{"version":3,"file":"sourceMapValidationEnums.js","sourceRoot":"","sources":["sourceMapValidationEnums.ts"],"names":["e","e2","e3"],"mappings":"AAAA,IAAK,CAIJ;AAJD,WAAK,CAAC;IACFA,mBAACA;IACDA,mBAACA;IACDA,mBAACA;AACLA,CAACA,EAJI,CAAC,KAAD,CAAC,QAIL;AACD,IAAK,EAKJ;AALD,WAAK,EAAE;IACHC,aAAIA,EAAEA,OAAAA;IACNA,aAAIA,EAAEA,OAAAA;IACNA,sBAACA;IACDA,wBAAEA;AACNA,CAACA,EALI,EAAE,KAAF,EAAE,QAKN;AACD,IAAK,EACJ;AADD,WAAK,EAAE;AACPC,CAACA,EADI,EAAE,KAAF,EAAE,QACN"} \ No newline at end of file +{"version":3,"file":"sourceMapValidationEnums.js","sourceRoot":"","sources":["sourceMapValidationEnums.ts"],"names":["e","e2","e3"],"mappings":"AAAA,IAAK,CAIJ;AAJD,WAAK,CAAC;IACFA,mBAACA,CAAAA;IACDA,mBAACA,CAAAA;IACDA,mBAACA,CAAAA;AACLA,CAACA,EAJI,CAAC,KAAD,CAAC,QAIL;AACD,IAAK,EAKJ;AALD,WAAK,EAAE;IACHC,aAAIA,EAAEA,OAAAA,CAAAA;IACNA,aAAIA,EAAEA,OAAAA,CAAAA;IACNA,sBAACA,CAAAA;IACDA,wBAAEA,CAAAA;AACNA,CAACA,EALI,EAAE,KAAF,EAAE,QAKN;AACD,IAAK,EACJ;AADD,WAAK,EAAE;AACPC,CAACA,EADI,EAAE,KAAF,EAAE,QACN"} \ No newline at end of file diff --git a/tests/baselines/reference/sourceMapValidationEnums.sourcemap.txt b/tests/baselines/reference/sourceMapValidationEnums.sourcemap.txt index 18148fc281..337aa0989d 100644 --- a/tests/baselines/reference/sourceMapValidationEnums.sourcemap.txt +++ b/tests/baselines/reference/sourceMapValidationEnums.sourcemap.txt @@ -39,31 +39,40 @@ sourceFile:sourceMapValidationEnums.ts >>> e[e["x"] = 0] = "x"; 1->^^^^ 2 > ^^^^^^^^^^^^^^^^^^^ -3 > ^^-> +3 > ^ +4 > ^-> 1-> { > 2 > x +3 > 1->Emitted(3, 5) Source(2, 5) + SourceIndex(0) name (e) 2 >Emitted(3, 24) Source(2, 6) + SourceIndex(0) name (e) +3 >Emitted(3, 25) Source(2, 6) + SourceIndex(0) name (e) --- >>> e[e["y"] = 1] = "y"; 1->^^^^ 2 > ^^^^^^^^^^^^^^^^^^^ -3 > ^^-> +3 > ^ +4 > ^-> 1->, > 2 > y +3 > 1->Emitted(4, 5) Source(3, 5) + SourceIndex(0) name (e) 2 >Emitted(4, 24) Source(3, 6) + SourceIndex(0) name (e) +3 >Emitted(4, 25) Source(3, 6) + SourceIndex(0) name (e) --- >>> e[e["x"] = 2] = "x"; 1->^^^^ 2 > ^^^^^^^^^^^^^^^^^^^ +3 > ^ 1->, > 2 > x +3 > 1->Emitted(5, 5) Source(4, 5) + SourceIndex(0) name (e) 2 >Emitted(5, 24) Source(4, 6) + SourceIndex(0) name (e) +3 >Emitted(5, 25) Source(4, 6) + SourceIndex(0) name (e) --- >>>})(e || (e = {})); 1 > @@ -128,51 +137,63 @@ sourceFile:sourceMapValidationEnums.ts 2 > ^^^^^^^^^^^^^ 3 > ^^ 4 > ^^^^^^^ -5 > ^^-> +5 > ^ +6 > ^-> 1-> { > 2 > x = 3 > 10 4 > +5 > 1->Emitted(9, 5) Source(7, 5) + SourceIndex(0) name (e2) 2 >Emitted(9, 18) Source(7, 9) + SourceIndex(0) name (e2) 3 >Emitted(9, 20) Source(7, 11) + SourceIndex(0) name (e2) 4 >Emitted(9, 27) Source(7, 11) + SourceIndex(0) name (e2) +5 >Emitted(9, 28) Source(7, 11) + SourceIndex(0) name (e2) --- >>> e2[e2["y"] = 10] = "y"; 1->^^^^ 2 > ^^^^^^^^^^^^^ 3 > ^^ 4 > ^^^^^^^ -5 > ^^-> +5 > ^ +6 > ^-> 1->, > 2 > y = 3 > 10 4 > +5 > 1->Emitted(10, 5) Source(8, 5) + SourceIndex(0) name (e2) 2 >Emitted(10, 18) Source(8, 9) + SourceIndex(0) name (e2) 3 >Emitted(10, 20) Source(8, 11) + SourceIndex(0) name (e2) 4 >Emitted(10, 27) Source(8, 11) + SourceIndex(0) name (e2) +5 >Emitted(10, 28) Source(8, 11) + SourceIndex(0) name (e2) --- >>> e2[e2["z"] = 11] = "z"; 1->^^^^ 2 > ^^^^^^^^^^^^^^^^^^^^^^ -3 > ^^^^-> +3 > ^ +4 > ^^^-> 1->, > 2 > z +3 > 1->Emitted(11, 5) Source(9, 5) + SourceIndex(0) name (e2) 2 >Emitted(11, 27) Source(9, 6) + SourceIndex(0) name (e2) +3 >Emitted(11, 28) Source(9, 6) + SourceIndex(0) name (e2) --- >>> e2[e2["x2"] = 12] = "x2"; 1->^^^^ 2 > ^^^^^^^^^^^^^^^^^^^^^^^^ +3 > ^ 1->, > 2 > x2 +3 > 1->Emitted(12, 5) Source(10, 5) + SourceIndex(0) name (e2) 2 >Emitted(12, 29) Source(10, 7) + SourceIndex(0) name (e2) +3 >Emitted(12, 30) Source(10, 7) + SourceIndex(0) name (e2) --- >>>})(e2 || (e2 = {})); 1 > diff --git a/tests/baselines/reference/subtypingWithCallSignaturesA.errors.txt b/tests/baselines/reference/subtypingWithCallSignaturesA.errors.txt index 31f6e5572d..3821c707f4 100644 --- a/tests/baselines/reference/subtypingWithCallSignaturesA.errors.txt +++ b/tests/baselines/reference/subtypingWithCallSignaturesA.errors.txt @@ -1,8 +1,10 @@ tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignaturesA.ts(2,15): error TS2345: Argument of type '(x: number) => string' is not assignable to parameter of type '(x: number) => number'. + Type 'string' is not assignable to type 'number'. ==== tests/cases/conformance/types/typeRelationships/subtypesAndSuperTypes/subtypingWithCallSignaturesA.ts (1 errors) ==== declare function foo3(cb: (x: number) => number): typeof cb; var r5 = foo3((x: number) => ''); // error ~~~~~~~~~~~~~~~~~ -!!! error TS2345: Argument of type '(x: number) => string' is not assignable to parameter of type '(x: number) => number'. \ No newline at end of file +!!! error TS2345: Argument of type '(x: number) => string' is not assignable to parameter of type '(x: number) => number'. +!!! error TS2345: Type 'string' is not assignable to type 'number'. \ No newline at end of file diff --git a/tests/baselines/reference/superCallArgsMustMatch.errors.txt b/tests/baselines/reference/superCallArgsMustMatch.errors.txt new file mode 100644 index 0000000000..06758b44fe --- /dev/null +++ b/tests/baselines/reference/superCallArgsMustMatch.errors.txt @@ -0,0 +1,31 @@ +tests/cases/compiler/superCallArgsMustMatch.ts(17,15): error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'. + + +==== tests/cases/compiler/superCallArgsMustMatch.ts (1 errors) ==== + class T5{ + + public foo: T; + + constructor(public bar: T) { } + + } + + + + class T6 extends T5{ + + constructor() { + + // Should error; base constructor has type T for first arg, + // which is instantiated with 'number' in the extends clause + super("hi"); + ~~~~ +!!! error TS2345: Argument of type 'string' is not assignable to parameter of type 'number'. + + var x: number = this.foo; + + } + + } + + \ No newline at end of file diff --git a/tests/baselines/reference/superCallArgsMustMatch.js b/tests/baselines/reference/superCallArgsMustMatch.js index 0b772fd39d..e38c519ead 100644 --- a/tests/baselines/reference/superCallArgsMustMatch.js +++ b/tests/baselines/reference/superCallArgsMustMatch.js @@ -13,7 +13,9 @@ class T6 extends T5{ constructor() { - super("hi"); // Should error, base constructor has type T for first arg, which is fixed as number in the extends clause + // Should error; base constructor has type T for first arg, + // which is instantiated with 'number' in the extends clause + super("hi"); var x: number = this.foo; @@ -39,7 +41,9 @@ var T5 = (function () { var T6 = (function (_super) { __extends(T6, _super); function T6() { - _super.call(this, "hi"); // Should error, base constructor has type T for first arg, which is fixed as number in the extends clause + // Should error; base constructor has type T for first arg, + // which is instantiated with 'number' in the extends clause + _super.call(this, "hi"); var x = this.foo; } return T6; diff --git a/tests/baselines/reference/superCallArgsMustMatch.types b/tests/baselines/reference/superCallArgsMustMatch.types deleted file mode 100644 index c2019881d9..0000000000 --- a/tests/baselines/reference/superCallArgsMustMatch.types +++ /dev/null @@ -1,38 +0,0 @@ -=== tests/cases/compiler/superCallArgsMustMatch.ts === -class T5{ ->T5 : T5 ->T : T - - public foo: T; ->foo : T ->T : T - - constructor(public bar: T) { } ->bar : T ->T : T - -} - - - -class T6 extends T5{ ->T6 : T6 ->T5 : T5 - - constructor() { - - super("hi"); // Should error, base constructor has type T for first arg, which is fixed as number in the extends clause ->super("hi") : void ->super : typeof T5 - - var x: number = this.foo; ->x : number ->this.foo : number ->this : T6 ->foo : number - - } - -} - - diff --git a/tests/baselines/reference/superCallFromClassThatDerivesFromGenericTypeButWithIncorrectNumberOfTypeArguments1.errors.txt b/tests/baselines/reference/superCallFromClassThatDerivesFromGenericTypeButWithIncorrectNumberOfTypeArguments1.errors.txt new file mode 100644 index 0000000000..14905b224a --- /dev/null +++ b/tests/baselines/reference/superCallFromClassThatDerivesFromGenericTypeButWithIncorrectNumberOfTypeArguments1.errors.txt @@ -0,0 +1,19 @@ +tests/cases/compiler/superCallFromClassThatDerivesFromGenericTypeButWithIncorrectNumberOfTypeArguments1.ts(8,17): error TS2314: Generic type 'A' requires 2 type argument(s). +tests/cases/compiler/superCallFromClassThatDerivesFromGenericTypeButWithIncorrectNumberOfTypeArguments1.ts(9,21): error TS2335: 'super' can only be referenced in a derived class. + + +==== tests/cases/compiler/superCallFromClassThatDerivesFromGenericTypeButWithIncorrectNumberOfTypeArguments1.ts (2 errors) ==== + + class A { + constructor(private map: (value: T1) => T2) { + + } + } + + class B extends A { + ~~~~~~~~~ +!!! error TS2314: Generic type 'A' requires 2 type argument(s). + constructor() { super(value => String(value)); } + ~~~~~ +!!! error TS2335: 'super' can only be referenced in a derived class. + } \ No newline at end of file diff --git a/tests/baselines/reference/superCallFromClassThatDerivesFromGenericTypeButWithIncorrectNumberOfTypeArguments1.js b/tests/baselines/reference/superCallFromClassThatDerivesFromGenericTypeButWithIncorrectNumberOfTypeArguments1.js new file mode 100644 index 0000000000..92abed0d66 --- /dev/null +++ b/tests/baselines/reference/superCallFromClassThatDerivesFromGenericTypeButWithIncorrectNumberOfTypeArguments1.js @@ -0,0 +1,32 @@ +//// [superCallFromClassThatDerivesFromGenericTypeButWithIncorrectNumberOfTypeArguments1.ts] + +class A { + constructor(private map: (value: T1) => T2) { + + } +} + +class B extends A { + constructor() { super(value => String(value)); } +} + +//// [superCallFromClassThatDerivesFromGenericTypeButWithIncorrectNumberOfTypeArguments1.js] +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var A = (function () { + function A(map) { + this.map = map; + } + return A; +})(); +var B = (function (_super) { + __extends(B, _super); + function B() { + _super.call(this, function (value) { return String(value); }); + } + return B; +})(A); diff --git a/tests/baselines/reference/superCallFromClassThatDerivesFromGenericTypeButWithNoTypeArguments1.errors.txt b/tests/baselines/reference/superCallFromClassThatDerivesFromGenericTypeButWithNoTypeArguments1.errors.txt new file mode 100644 index 0000000000..d402272df1 --- /dev/null +++ b/tests/baselines/reference/superCallFromClassThatDerivesFromGenericTypeButWithNoTypeArguments1.errors.txt @@ -0,0 +1,19 @@ +tests/cases/compiler/superCallFromClassThatDerivesFromGenericTypeButWithNoTypeArguments1.ts(8,17): error TS2314: Generic type 'A' requires 2 type argument(s). +tests/cases/compiler/superCallFromClassThatDerivesFromGenericTypeButWithNoTypeArguments1.ts(9,21): error TS2335: 'super' can only be referenced in a derived class. + + +==== tests/cases/compiler/superCallFromClassThatDerivesFromGenericTypeButWithNoTypeArguments1.ts (2 errors) ==== + + class A { + constructor(private map: (value: T1) => T2) { + + } + } + + class B extends A { + ~ +!!! error TS2314: Generic type 'A' requires 2 type argument(s). + constructor() { super(value => String(value)); } + ~~~~~ +!!! error TS2335: 'super' can only be referenced in a derived class. + } \ No newline at end of file diff --git a/tests/baselines/reference/superCallFromClassThatDerivesFromGenericTypeButWithNoTypeArguments1.js b/tests/baselines/reference/superCallFromClassThatDerivesFromGenericTypeButWithNoTypeArguments1.js new file mode 100644 index 0000000000..7e3c61e669 --- /dev/null +++ b/tests/baselines/reference/superCallFromClassThatDerivesFromGenericTypeButWithNoTypeArguments1.js @@ -0,0 +1,32 @@ +//// [superCallFromClassThatDerivesFromGenericTypeButWithNoTypeArguments1.ts] + +class A { + constructor(private map: (value: T1) => T2) { + + } +} + +class B extends A { + constructor() { super(value => String(value)); } +} + +//// [superCallFromClassThatDerivesFromGenericTypeButWithNoTypeArguments1.js] +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var A = (function () { + function A(map) { + this.map = map; + } + return A; +})(); +var B = (function (_super) { + __extends(B, _super); + function B() { + _super.call(this, function (value) { return String(value); }); + } + return B; +})(A); diff --git a/tests/baselines/reference/superCallFromClassThatDerivesNonGenericTypeButWithTypeArguments1.errors.txt b/tests/baselines/reference/superCallFromClassThatDerivesNonGenericTypeButWithTypeArguments1.errors.txt new file mode 100644 index 0000000000..8bbf8b87cd --- /dev/null +++ b/tests/baselines/reference/superCallFromClassThatDerivesNonGenericTypeButWithTypeArguments1.errors.txt @@ -0,0 +1,19 @@ +tests/cases/compiler/superCallFromClassThatDerivesNonGenericTypeButWithTypeArguments1.ts(8,17): error TS2315: Type 'A' is not generic. +tests/cases/compiler/superCallFromClassThatDerivesNonGenericTypeButWithTypeArguments1.ts(9,21): error TS2335: 'super' can only be referenced in a derived class. + + +==== tests/cases/compiler/superCallFromClassThatDerivesNonGenericTypeButWithTypeArguments1.ts (2 errors) ==== + + class A { + constructor(private map: (value: number) => string) { + + } + } + + class B extends A { + ~~~~~~~~~~~~~~~~~ +!!! error TS2315: Type 'A' is not generic. + constructor() { super(value => String(value)); } + ~~~~~ +!!! error TS2335: 'super' can only be referenced in a derived class. + } \ No newline at end of file diff --git a/tests/baselines/reference/superCallFromClassThatDerivesNonGenericTypeButWithTypeArguments1.js b/tests/baselines/reference/superCallFromClassThatDerivesNonGenericTypeButWithTypeArguments1.js new file mode 100644 index 0000000000..b48d5bb7f5 --- /dev/null +++ b/tests/baselines/reference/superCallFromClassThatDerivesNonGenericTypeButWithTypeArguments1.js @@ -0,0 +1,32 @@ +//// [superCallFromClassThatDerivesNonGenericTypeButWithTypeArguments1.ts] + +class A { + constructor(private map: (value: number) => string) { + + } +} + +class B extends A { + constructor() { super(value => String(value)); } +} + +//// [superCallFromClassThatDerivesNonGenericTypeButWithTypeArguments1.js] +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var A = (function () { + function A(map) { + this.map = map; + } + return A; +})(); +var B = (function (_super) { + __extends(B, _super); + function B() { + _super.call(this, function (value) { return String(value); }); + } + return B; +})(A); diff --git a/tests/baselines/reference/superCallFromClassThatHasNoBaseType1.errors.txt b/tests/baselines/reference/superCallFromClassThatHasNoBaseType1.errors.txt new file mode 100644 index 0000000000..bac5abad00 --- /dev/null +++ b/tests/baselines/reference/superCallFromClassThatHasNoBaseType1.errors.txt @@ -0,0 +1,16 @@ +tests/cases/compiler/superCallFromClassThatHasNoBaseType1.ts(9,21): error TS2335: 'super' can only be referenced in a derived class. + + +==== tests/cases/compiler/superCallFromClassThatHasNoBaseType1.ts (1 errors) ==== + + class A { + constructor(private map: (value: number) => string) { + + } + } + + class B { + constructor() { super(value => String(value)); } + ~~~~~ +!!! error TS2335: 'super' can only be referenced in a derived class. + } \ No newline at end of file diff --git a/tests/baselines/reference/superCallFromClassThatHasNoBaseType1.js b/tests/baselines/reference/superCallFromClassThatHasNoBaseType1.js new file mode 100644 index 0000000000..7818aed7ff --- /dev/null +++ b/tests/baselines/reference/superCallFromClassThatHasNoBaseType1.js @@ -0,0 +1,25 @@ +//// [superCallFromClassThatHasNoBaseType1.ts] + +class A { + constructor(private map: (value: number) => string) { + + } +} + +class B { + constructor() { super(value => String(value)); } +} + +//// [superCallFromClassThatHasNoBaseType1.js] +var A = (function () { + function A(map) { + this.map = map; + } + return A; +})(); +var B = (function () { + function B() { + _super.call(this, function (value) { return String(value); }); + } + return B; +})(); diff --git a/tests/baselines/reference/superCallFromFunction1.errors.txt b/tests/baselines/reference/superCallFromFunction1.errors.txt new file mode 100644 index 0000000000..374a3aeb16 --- /dev/null +++ b/tests/baselines/reference/superCallFromFunction1.errors.txt @@ -0,0 +1,10 @@ +tests/cases/compiler/superCallFromFunction1.ts(3,5): error TS2335: 'super' can only be referenced in a derived class. + + +==== tests/cases/compiler/superCallFromFunction1.ts (1 errors) ==== + + function foo() { + super(value => String(value)); + ~~~~~ +!!! error TS2335: 'super' can only be referenced in a derived class. + } \ No newline at end of file diff --git a/tests/baselines/reference/superCallFromFunction1.js b/tests/baselines/reference/superCallFromFunction1.js new file mode 100644 index 0000000000..a7fcbaaeff --- /dev/null +++ b/tests/baselines/reference/superCallFromFunction1.js @@ -0,0 +1,10 @@ +//// [superCallFromFunction1.ts] + +function foo() { + super(value => String(value)); +} + +//// [superCallFromFunction1.js] +function foo() { + _super.call(this, function (value) { return String(value); }); +} diff --git a/tests/baselines/reference/superCallParameterContextualTyping1.js b/tests/baselines/reference/superCallParameterContextualTyping1.js new file mode 100644 index 0000000000..b11d62d62c --- /dev/null +++ b/tests/baselines/reference/superCallParameterContextualTyping1.js @@ -0,0 +1,35 @@ +//// [superCallParameterContextualTyping1.ts] + +class A { + constructor(private map: (value: T1) => T2) { + + } +} + +class B extends A { + // Ensure 'value' is of type 'number (and not '{}') by using its 'toExponential()' method. + constructor() { super(value => String(value.toExponential())); } +} + + +//// [superCallParameterContextualTyping1.js] +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var A = (function () { + function A(map) { + this.map = map; + } + return A; +})(); +var B = (function (_super) { + __extends(B, _super); + // Ensure 'value' is of type 'number (and not '{}') by using its 'toExponential()' method. + function B() { + _super.call(this, function (value) { return String(value.toExponential()); }); + } + return B; +})(A); diff --git a/tests/baselines/reference/superCallParameterContextualTyping1.types b/tests/baselines/reference/superCallParameterContextualTyping1.types new file mode 100644 index 0000000000..23aa314799 --- /dev/null +++ b/tests/baselines/reference/superCallParameterContextualTyping1.types @@ -0,0 +1,34 @@ +=== tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping1.ts === + +class A { +>A : A +>T1 : T1 +>T2 : T2 + + constructor(private map: (value: T1) => T2) { +>map : (value: T1) => T2 +>value : T1 +>T1 : T1 +>T2 : T2 + + } +} + +class B extends A { +>B : B +>A : A + + // Ensure 'value' is of type 'number (and not '{}') by using its 'toExponential()' method. + constructor() { super(value => String(value.toExponential())); } +>super(value => String(value.toExponential())) : void +>super : typeof A +>value => String(value.toExponential()) : (value: number) => string +>value : number +>String(value.toExponential()) : string +>String : StringConstructor +>value.toExponential() : string +>value.toExponential : (fractionDigits?: number) => string +>value : number +>toExponential : (fractionDigits?: number) => string +} + diff --git a/tests/baselines/reference/superCallParameterContextualTyping2.errors.txt b/tests/baselines/reference/superCallParameterContextualTyping2.errors.txt new file mode 100644 index 0000000000..a1e89d41ef --- /dev/null +++ b/tests/baselines/reference/superCallParameterContextualTyping2.errors.txt @@ -0,0 +1,17 @@ +tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping2.ts(10,43): error TS2349: Cannot invoke an expression whose type lacks a call signature. + + +==== tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping2.ts (1 errors) ==== + + class A { + constructor(private map: (value: T1) => T2) { + + } + } + + class C extends A { + // Ensure 'value' is not of type 'any' by invoking it with type arguments. + constructor() { super(value => String(value())); } + ~~~~~~~~~~~~~~~ +!!! error TS2349: Cannot invoke an expression whose type lacks a call signature. + } \ No newline at end of file diff --git a/tests/baselines/reference/superCallParameterContextualTyping2.js b/tests/baselines/reference/superCallParameterContextualTyping2.js new file mode 100644 index 0000000000..61e8b94f00 --- /dev/null +++ b/tests/baselines/reference/superCallParameterContextualTyping2.js @@ -0,0 +1,34 @@ +//// [superCallParameterContextualTyping2.ts] + +class A { + constructor(private map: (value: T1) => T2) { + + } +} + +class C extends A { + // Ensure 'value' is not of type 'any' by invoking it with type arguments. + constructor() { super(value => String(value())); } +} + +//// [superCallParameterContextualTyping2.js] +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var A = (function () { + function A(map) { + this.map = map; + } + return A; +})(); +var C = (function (_super) { + __extends(C, _super); + // Ensure 'value' is not of type 'any' by invoking it with type arguments. + function C() { + _super.call(this, function (value) { return String(value()); }); + } + return C; +})(A); diff --git a/tests/baselines/reference/superCallParameterContextualTyping3.js b/tests/baselines/reference/superCallParameterContextualTyping3.js new file mode 100644 index 0000000000..e33bcb29bb --- /dev/null +++ b/tests/baselines/reference/superCallParameterContextualTyping3.js @@ -0,0 +1,67 @@ +//// [superCallParameterContextualTyping3.ts] +interface ContextualType { + method(parameter: T): void; +} + +class CBase { + constructor(param: ContextualType) { + } + + foo(param: ContextualType) { + } +} + +class C extends CBase { + constructor() { + // Should be okay. + // 'p' should have type 'string'. + super({ + method(p) { + p.length; + } + }); + + // Should be okay. + // 'p' should have type 'string'. + super.foo({ + method(p) { + p.length; + } + }); + } +} + +//// [superCallParameterContextualTyping3.js] +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var CBase = (function () { + function CBase(param) { + } + CBase.prototype.foo = function (param) { + }; + return CBase; +})(); +var C = (function (_super) { + __extends(C, _super); + function C() { + // Should be okay. + // 'p' should have type 'string'. + _super.call(this, { + method: function (p) { + p.length; + } + }); + // Should be okay. + // 'p' should have type 'string'. + _super.prototype.foo.call(this, { + method: function (p) { + p.length; + } + }); + } + return C; +})(CBase); diff --git a/tests/baselines/reference/superCallParameterContextualTyping3.types b/tests/baselines/reference/superCallParameterContextualTyping3.types new file mode 100644 index 0000000000..4a8515d110 --- /dev/null +++ b/tests/baselines/reference/superCallParameterContextualTyping3.types @@ -0,0 +1,73 @@ +=== tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping3.ts === +interface ContextualType { +>ContextualType : ContextualType +>T : T + + method(parameter: T): void; +>method : (parameter: T) => void +>parameter : T +>T : T +} + +class CBase { +>CBase : CBase +>T : T + + constructor(param: ContextualType) { +>param : ContextualType +>ContextualType : ContextualType +>T : T + } + + foo(param: ContextualType) { +>foo : (param: ContextualType) => void +>param : ContextualType +>ContextualType : ContextualType +>T : T + } +} + +class C extends CBase { +>C : C +>CBase : CBase + + constructor() { + // Should be okay. + // 'p' should have type 'string'. + super({ +>super({ method(p) { p.length; } }) : void +>super : typeof CBase +>{ method(p) { p.length; } } : { method(p: string): void; } + + method(p) { +>method : (p: string) => void +>p : string + + p.length; +>p.length : number +>p : string +>length : number + } + }); + + // Should be okay. + // 'p' should have type 'string'. + super.foo({ +>super.foo({ method(p) { p.length; } }) : void +>super.foo : (param: ContextualType) => void +>super : CBase +>foo : (param: ContextualType) => void +>{ method(p) { p.length; } } : { method(p: string): void; } + + method(p) { +>method : (p: string) => void +>p : string + + p.length; +>p.length : number +>p : string +>length : number + } + }); + } +} diff --git a/tests/baselines/reference/superNewCall1.errors.txt b/tests/baselines/reference/superNewCall1.errors.txt new file mode 100644 index 0000000000..2b104e7d64 --- /dev/null +++ b/tests/baselines/reference/superNewCall1.errors.txt @@ -0,0 +1,23 @@ +tests/cases/compiler/superNewCall1.ts(9,5): error TS2377: Constructors for derived classes must contain a 'super' call. +tests/cases/compiler/superNewCall1.ts(10,9): error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature. + + +==== tests/cases/compiler/superNewCall1.ts (2 errors) ==== + + class A { + constructor(private map: (value: T1) => T2) { + + } + } + + class B extends A { + constructor() { + ~~~~~~~~~~~~~~~ + new super(value => String(value)); + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ + ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +!!! error TS2351: Cannot use 'new' with an expression whose type lacks a call or construct signature. + } + ~~~~~ +!!! error TS2377: Constructors for derived classes must contain a 'super' call. + } \ No newline at end of file diff --git a/tests/baselines/reference/superNewCall1.js b/tests/baselines/reference/superNewCall1.js new file mode 100644 index 0000000000..d9b74ac508 --- /dev/null +++ b/tests/baselines/reference/superNewCall1.js @@ -0,0 +1,34 @@ +//// [superNewCall1.ts] + +class A { + constructor(private map: (value: T1) => T2) { + + } +} + +class B extends A { + constructor() { + new super(value => String(value)); + } +} + +//// [superNewCall1.js] +var __extends = this.__extends || function (d, b) { + for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; + function __() { this.constructor = d; } + __.prototype = b.prototype; + d.prototype = new __(); +}; +var A = (function () { + function A(map) { + this.map = map; + } + return A; +})(); +var B = (function (_super) { + __extends(B, _super); + function B() { + new _super.prototype(function (value) { return String(value); }); + } + return B; +})(A); diff --git a/tests/baselines/reference/switchAssignmentCompat.js b/tests/baselines/reference/switchAssignmentCompat.js index 7b3f2af80b..1e6792ee37 100644 --- a/tests/baselines/reference/switchAssignmentCompat.js +++ b/tests/baselines/reference/switchAssignmentCompat.js @@ -13,5 +13,5 @@ var Foo = (function () { return Foo; })(); switch (0) { - case Foo: break; + case Foo: break; // Error expected } diff --git a/tests/baselines/reference/switchCasesExpressionTypeMismatch.js b/tests/baselines/reference/switchCasesExpressionTypeMismatch.js index a35dc633e3..ca354779be 100644 --- a/tests/baselines/reference/switchCasesExpressionTypeMismatch.js +++ b/tests/baselines/reference/switchCasesExpressionTypeMismatch.js @@ -25,12 +25,13 @@ var Foo = (function () { return Foo; })(); switch (0) { - case Foo: break; - case "sss": break; - case 123: break; - case true: break; + case Foo: break; // Error + case "sss": break; // Error + case 123: break; // No Error + case true: break; // Error } var s = 0; +// No error for all switch (s) { case Foo: break; case "sss": break; diff --git a/tests/baselines/reference/taggedTemplateStringsTypeArgumentInference.errors.txt b/tests/baselines/reference/taggedTemplateStringsTypeArgumentInference.errors.txt index 99e90d5714..275fdac6ac 100644 --- a/tests/baselines/reference/taggedTemplateStringsTypeArgumentInference.errors.txt +++ b/tests/baselines/reference/taggedTemplateStringsTypeArgumentInference.errors.txt @@ -26,6 +26,7 @@ tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInference tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInference.ts(64,25): error TS1159: Tagged templates are only available when targeting ECMAScript 6 and higher. tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInference.ts(77,11): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate '{ x: number; z: Date; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; y: string; }'. + Property 'z' is missing in type '{ x: number; y: string; }'. tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInference.ts(77,25): error TS1159: Tagged templates are only available when targeting ECMAScript 6 and higher. tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInference.ts(81,25): error TS1159: Tagged templates are only available when targeting ECMAScript 6 and higher. tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInference.ts(86,23): error TS1159: Tagged templates are only available when targeting ECMAScript 6 and higher. @@ -164,6 +165,7 @@ tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInference ~~~~~~~~~~~~~ !!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. !!! error TS2453: Type argument candidate '{ x: number; z: Date; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; y: string; }'. +!!! error TS2453: Property 'z' is missing in type '{ x: number; y: string; }'. ~~~ !!! error TS1159: Tagged templates are only available when targeting ECMAScript 6 and higher. var a9e: {}; diff --git a/tests/baselines/reference/taggedTemplateStringsTypeArgumentInferenceES6.errors.txt b/tests/baselines/reference/taggedTemplateStringsTypeArgumentInferenceES6.errors.txt index 170c10c738..1a4a1dc5aa 100644 --- a/tests/baselines/reference/taggedTemplateStringsTypeArgumentInferenceES6.errors.txt +++ b/tests/baselines/reference/taggedTemplateStringsTypeArgumentInferenceES6.errors.txt @@ -2,6 +2,7 @@ tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInference Type argument candidate 'string' is not a valid type argument because it is not a supertype of candidate 'number'. tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInferenceES6.ts(76,11): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate '{ x: number; z: Date; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; y: string; }'. + Property 'z' is missing in type '{ x: number; y: string; }'. ==== tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInferenceES6.ts (2 errors) ==== @@ -87,6 +88,7 @@ tests/cases/conformance/es6/templates/taggedTemplateStringsTypeArgumentInference ~~~~~~~~~~~~~ !!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. !!! error TS2453: Type argument candidate '{ x: number; z: Date; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; y: string; }'. +!!! error TS2453: Property 'z' is missing in type '{ x: number; y: string; }'. var a9e: {}; // Generic tag with multiple parameters of generic type passed arguments with a single best common type diff --git a/tests/baselines/reference/throwStatements.js b/tests/baselines/reference/throwStatements.js index 871bbc2ff0..146d123279 100644 --- a/tests/baselines/reference/throwStatements.js +++ b/tests/baselines/reference/throwStatements.js @@ -149,6 +149,7 @@ throw aFunctionInModule; // no initializer or annotation, so this is an 'any' var x; throw x; +// literals throw 0.0; throw false; throw null; diff --git a/tests/baselines/reference/typeArgInference2.errors.txt b/tests/baselines/reference/typeArgInference2.errors.txt index 08fc2f4e23..dd2e227f2f 100644 --- a/tests/baselines/reference/typeArgInference2.errors.txt +++ b/tests/baselines/reference/typeArgInference2.errors.txt @@ -1,5 +1,6 @@ tests/cases/compiler/typeArgInference2.ts(12,10): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate '{ name: string; a: number; }' is not a valid type argument because it is not a supertype of candidate '{ name: string; b: number; }'. + Property 'a' is missing in type '{ name: string; b: number; }'. ==== tests/cases/compiler/typeArgInference2.ts (1 errors) ==== @@ -17,4 +18,5 @@ tests/cases/compiler/typeArgInference2.ts(12,10): error TS2453: The type argumen var z6 = foo({ name: "abc", a: 5 }, { name: "def", b: 5 }); // error ~~~ !!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. -!!! error TS2453: Type argument candidate '{ name: string; a: number; }' is not a valid type argument because it is not a supertype of candidate '{ name: string; b: number; }'. \ No newline at end of file +!!! error TS2453: Type argument candidate '{ name: string; a: number; }' is not a valid type argument because it is not a supertype of candidate '{ name: string; b: number; }'. +!!! error TS2453: Property 'a' is missing in type '{ name: string; b: number; }'. \ No newline at end of file diff --git a/tests/baselines/reference/typeArgumentConstraintResolution1.errors.txt b/tests/baselines/reference/typeArgumentConstraintResolution1.errors.txt index 1131b6e1a6..d7cf5e83b8 100644 --- a/tests/baselines/reference/typeArgumentConstraintResolution1.errors.txt +++ b/tests/baselines/reference/typeArgumentConstraintResolution1.errors.txt @@ -1,4 +1,5 @@ tests/cases/compiler/typeArgumentConstraintResolution1.ts(4,12): error TS2345: Argument of type 'string' is not assignable to parameter of type 'Date'. + Property 'toDateString' is missing in type 'String'. tests/cases/compiler/typeArgumentConstraintResolution1.ts(11,12): error TS2345: Argument of type 'string' is not assignable to parameter of type 'Date'. @@ -9,6 +10,7 @@ tests/cases/compiler/typeArgumentConstraintResolution1.ts(11,12): error TS2345: foo1(""); // should error ~~ !!! error TS2345: Argument of type 'string' is not assignable to parameter of type 'Date'. +!!! error TS2345: Property 'toDateString' is missing in type 'String'. diff --git a/tests/baselines/reference/typeArgumentInference.errors.txt b/tests/baselines/reference/typeArgumentInference.errors.txt index e374de7b13..126fe3d772 100644 --- a/tests/baselines/reference/typeArgumentInference.errors.txt +++ b/tests/baselines/reference/typeArgumentInference.errors.txt @@ -2,6 +2,7 @@ tests/cases/conformance/expressions/functionCalls/typeArgumentInference.ts(68,11 Type argument candidate 'string' is not a valid type argument because it is not a supertype of candidate 'number'. tests/cases/conformance/expressions/functionCalls/typeArgumentInference.ts(82,11): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate '{ x: number; z: Date; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; y: string; }'. + Property 'z' is missing in type '{ x: number; y: string; }'. ==== tests/cases/conformance/expressions/functionCalls/typeArgumentInference.ts (2 errors) ==== @@ -93,6 +94,7 @@ tests/cases/conformance/expressions/functionCalls/typeArgumentInference.ts(82,11 ~~~~~~~~~~~~~ !!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. !!! error TS2453: Type argument candidate '{ x: number; z: Date; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; y: string; }'. +!!! error TS2453: Property 'z' is missing in type '{ x: number; y: string; }'. var a9e: {}; var a9f = someGenerics9(undefined, { x: 6, z: new Date() }, { x: 6, y: '' }); var a9f: A92; diff --git a/tests/baselines/reference/typeArgumentInferenceConstructSignatures.errors.txt b/tests/baselines/reference/typeArgumentInferenceConstructSignatures.errors.txt index c251f860ad..c82dab89e9 100644 --- a/tests/baselines/reference/typeArgumentInferenceConstructSignatures.errors.txt +++ b/tests/baselines/reference/typeArgumentInferenceConstructSignatures.errors.txt @@ -1,13 +1,20 @@ tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceConstructSignatures.ts(25,35): error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceConstructSignatures.ts(51,19): error TS2304: Cannot find name 'Window'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceConstructSignatures.ts(61,39): error TS2345: Argument of type '(x: string) => string' is not assignable to parameter of type '(x: number) => void'. + Types of parameters 'x' and 'x' are incompatible. + Type 'string' is not assignable to type 'number'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceConstructSignatures.ts(71,39): error TS2345: Argument of type '(x: string) => string' is not assignable to parameter of type '(x: number) => void'. + Types of parameters 'x' and 'x' are incompatible. + Type 'string' is not assignable to type 'number'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceConstructSignatures.ts(81,45): error TS2345: Argument of type '(n: string) => string' is not assignable to parameter of type '(b: number) => number'. + Types of parameters 'n' and 'b' are incompatible. + Type 'string' is not assignable to type 'number'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceConstructSignatures.ts(106,15): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'string' is not a valid type argument because it is not a supertype of candidate 'number'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceConstructSignatures.ts(118,9): error TS2304: Cannot find name 'Window'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceConstructSignatures.ts(120,15): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate '{ x: number; z: any; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; y: string; }'. + Property 'z' is missing in type '{ x: number; y: string; }'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceConstructSignatures.ts(120,51): error TS2304: Cannot find name 'window'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceConstructSignatures.ts(122,56): error TS2304: Cannot find name 'window'. @@ -80,6 +87,8 @@ tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceConstruct new someGenerics4('', (x: string) => ''); // Error ~~~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: string) => string' is not assignable to parameter of type '(x: number) => void'. +!!! error TS2345: Types of parameters 'x' and 'x' are incompatible. +!!! error TS2345: Type 'string' is not assignable to type 'number'. new someGenerics4(null, null); // 2 parameter generic call with argument 2 of type parameter type and argument 1 of function type whose parameter is of type parameter type @@ -92,6 +101,8 @@ tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceConstruct new someGenerics5('', (x: string) => ''); // Error ~~~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: string) => string' is not assignable to parameter of type '(x: number) => void'. +!!! error TS2345: Types of parameters 'x' and 'x' are incompatible. +!!! error TS2345: Type 'string' is not assignable to type 'number'. new someGenerics5(null, null); // Generic call with multiple arguments of function types that each have parameters of the same generic type @@ -104,6 +115,8 @@ tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceConstruct new someGenerics6((n: number) => n, (n: string) => n, (n: number) => n); // Error ~~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(n: string) => string' is not assignable to parameter of type '(b: number) => number'. +!!! error TS2345: Types of parameters 'n' and 'b' are incompatible. +!!! error TS2345: Type 'string' is not assignable to type 'number'. new someGenerics6((n: number) => n, (n: number) => n, (n: number) => n); // Generic call with multiple arguments of function types that each have parameters of different generic type @@ -151,6 +164,7 @@ tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceConstruct ~~~~~~~~~~~~~ !!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. !!! error TS2453: Type argument candidate '{ x: number; z: any; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; y: string; }'. +!!! error TS2453: Property 'z' is missing in type '{ x: number; y: string; }'. ~~~~~~ !!! error TS2304: Cannot find name 'window'. var a9e: {}; diff --git a/tests/baselines/reference/typeArgumentInferenceErrors.errors.txt b/tests/baselines/reference/typeArgumentInferenceErrors.errors.txt index bb08cac4e0..9bd25dda4e 100644 --- a/tests/baselines/reference/typeArgumentInferenceErrors.errors.txt +++ b/tests/baselines/reference/typeArgumentInferenceErrors.errors.txt @@ -1,7 +1,13 @@ tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceErrors.ts(3,31): error TS2345: Argument of type 'number' is not assignable to parameter of type 'string'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceErrors.ts(7,35): error TS2345: Argument of type '(x: string) => string' is not assignable to parameter of type '(x: number) => void'. + Types of parameters 'x' and 'x' are incompatible. + Type 'string' is not assignable to type 'number'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceErrors.ts(11,35): error TS2345: Argument of type '(x: string) => string' is not assignable to parameter of type '(x: number) => void'. + Types of parameters 'x' and 'x' are incompatible. + Type 'string' is not assignable to type 'number'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceErrors.ts(15,41): error TS2345: Argument of type '(n: string) => string' is not assignable to parameter of type '(b: number) => number'. + Types of parameters 'n' and 'b' are incompatible. + Type 'string' is not assignable to type 'number'. ==== tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceErrors.ts (4 errors) ==== @@ -16,16 +22,22 @@ tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceErrors.ts someGenerics4('', (x: string) => ''); // Error ~~~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: string) => string' is not assignable to parameter of type '(x: number) => void'. +!!! error TS2345: Types of parameters 'x' and 'x' are incompatible. +!!! error TS2345: Type 'string' is not assignable to type 'number'. // 2 parameter generic call with argument 2 of type parameter type and argument 1 of function type whose parameter is of type parameter type function someGenerics5(n: T, f: (x: U) => void) { } someGenerics5('', (x: string) => ''); // Error ~~~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: string) => string' is not assignable to parameter of type '(x: number) => void'. +!!! error TS2345: Types of parameters 'x' and 'x' are incompatible. +!!! error TS2345: Type 'string' is not assignable to type 'number'. // Generic call with multiple arguments of function types that each have parameters of the same generic type function someGenerics6(a: (a: A) => A, b: (b: A) => A, c: (c: A) => A) { } someGenerics6((n: number) => n, (n: string) => n, (n: number) => n); // Error ~~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(n: string) => string' is not assignable to parameter of type '(b: number) => number'. +!!! error TS2345: Types of parameters 'n' and 'b' are incompatible. +!!! error TS2345: Type 'string' is not assignable to type 'number'. \ No newline at end of file diff --git a/tests/baselines/reference/typeArgumentInferenceWithConstraintAsCommonRoot.errors.txt b/tests/baselines/reference/typeArgumentInferenceWithConstraintAsCommonRoot.errors.txt index 72db7214c4..3d24175c75 100644 --- a/tests/baselines/reference/typeArgumentInferenceWithConstraintAsCommonRoot.errors.txt +++ b/tests/baselines/reference/typeArgumentInferenceWithConstraintAsCommonRoot.errors.txt @@ -1,5 +1,6 @@ tests/cases/compiler/typeArgumentInferenceWithConstraintAsCommonRoot.ts(7,1): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'Giraffe' is not a valid type argument because it is not a supertype of candidate 'Elephant'. + Property 'y' is missing in type 'Elephant'. ==== tests/cases/compiler/typeArgumentInferenceWithConstraintAsCommonRoot.ts (1 errors) ==== @@ -12,4 +13,5 @@ tests/cases/compiler/typeArgumentInferenceWithConstraintAsCommonRoot.ts(7,1): er f(g, e); // valid because both Giraffe and Elephant satisfy the constraint. T is Animal ~ !!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. -!!! error TS2453: Type argument candidate 'Giraffe' is not a valid type argument because it is not a supertype of candidate 'Elephant'. \ No newline at end of file +!!! error TS2453: Type argument candidate 'Giraffe' is not a valid type argument because it is not a supertype of candidate 'Elephant'. +!!! error TS2453: Property 'y' is missing in type 'Elephant'. \ No newline at end of file diff --git a/tests/baselines/reference/typeArgumentInferenceWithConstraints.errors.txt b/tests/baselines/reference/typeArgumentInferenceWithConstraints.errors.txt index a607bc2dc9..56370ac03d 100644 --- a/tests/baselines/reference/typeArgumentInferenceWithConstraints.errors.txt +++ b/tests/baselines/reference/typeArgumentInferenceWithConstraints.errors.txt @@ -4,15 +4,22 @@ tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceWithConst tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceWithConstraints.ts(32,34): error TS2304: Cannot find name 'Window'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceWithConstraints.ts(34,15): error TS2304: Cannot find name 'Window'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceWithConstraints.ts(41,35): error TS2345: Argument of type '(x: string) => string' is not assignable to parameter of type '(x: number) => void'. + Types of parameters 'x' and 'x' are incompatible. + Type 'string' is not assignable to type 'number'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceWithConstraints.ts(48,35): error TS2345: Argument of type '(x: string) => string' is not assignable to parameter of type '(x: number) => void'. + Types of parameters 'x' and 'x' are incompatible. + Type 'string' is not assignable to type 'number'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceWithConstraints.ts(49,15): error TS2344: Type 'string' does not satisfy the constraint 'number'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceWithConstraints.ts(55,41): error TS2345: Argument of type '(n: string) => string' is not assignable to parameter of type '(b: number) => number'. + Types of parameters 'n' and 'b' are incompatible. + Type 'string' is not assignable to type 'number'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceWithConstraints.ts(66,31): error TS2345: Argument of type '(a: (a: A) => A, b: (b: B) => B, c: (c: C) => C) => void' is not assignable to parameter of type 'string'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceWithConstraints.ts(73,11): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate 'string' is not a valid type argument because it is not a supertype of candidate 'number'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceWithConstraints.ts(85,9): error TS2304: Cannot find name 'Window'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceWithConstraints.ts(87,11): error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. Type argument candidate '{ x: number; z: any; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; y: string; }'. + Property 'z' is missing in type '{ x: number; y: string; }'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceWithConstraints.ts(87,47): error TS2304: Cannot find name 'window'. tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceWithConstraints.ts(89,52): error TS2304: Cannot find name 'window'. @@ -71,6 +78,8 @@ tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceWithConst someGenerics4('', (x: string) => ''); // Error ~~~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: string) => string' is not assignable to parameter of type '(x: number) => void'. +!!! error TS2345: Types of parameters 'x' and 'x' are incompatible. +!!! error TS2345: Type 'string' is not assignable to type 'number'. someGenerics4(null, null); // 2 parameter generic call with argument 2 of type parameter type and argument 1 of function type whose parameter is of type parameter type @@ -80,6 +89,8 @@ tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceWithConst someGenerics5('', (x: string) => ''); // Error ~~~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(x: string) => string' is not assignable to parameter of type '(x: number) => void'. +!!! error TS2345: Types of parameters 'x' and 'x' are incompatible. +!!! error TS2345: Type 'string' is not assignable to type 'number'. someGenerics5(null, null); // Error ~~~~~~ !!! error TS2344: Type 'string' does not satisfy the constraint 'number'. @@ -91,6 +102,8 @@ tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceWithConst someGenerics6((n: number) => n, (n: string) => n, (n: number) => n); // Error ~~~~~~~~~~~~~~~~ !!! error TS2345: Argument of type '(n: string) => string' is not assignable to parameter of type '(b: number) => number'. +!!! error TS2345: Types of parameters 'n' and 'b' are incompatible. +!!! error TS2345: Type 'string' is not assignable to type 'number'. someGenerics6((n: number) => n, (n: number) => n, (n: number) => n); // Generic call with multiple arguments of function types that each have parameters of different generic type @@ -133,6 +146,7 @@ tests/cases/conformance/expressions/functionCalls/typeArgumentInferenceWithConst ~~~~~~~~~~~~~ !!! error TS2453: The type argument for type parameter 'T' cannot be inferred from the usage. Consider specifying the type arguments explicitly. !!! error TS2453: Type argument candidate '{ x: number; z: any; }' is not a valid type argument because it is not a supertype of candidate '{ x: number; y: string; }'. +!!! error TS2453: Property 'z' is missing in type '{ x: number; y: string; }'. ~~~~~~ !!! error TS2304: Cannot find name 'window'. var a9e: {}; diff --git a/tests/baselines/reference/typeAssertions.errors.txt b/tests/baselines/reference/typeAssertions.errors.txt index ab5eb19ce2..a2ad28801c 100644 --- a/tests/baselines/reference/typeAssertions.errors.txt +++ b/tests/baselines/reference/typeAssertions.errors.txt @@ -4,7 +4,9 @@ tests/cases/conformance/expressions/typeAssertions/typeAssertions.ts(31,12): err tests/cases/conformance/expressions/typeAssertions/typeAssertions.ts(35,15): error TS2352: Neither type 'SomeOther' nor type 'SomeDerived' is assignable to the other. Property 'x' is missing in type 'SomeOther'. tests/cases/conformance/expressions/typeAssertions/typeAssertions.ts(37,13): error TS2352: Neither type 'SomeDerived' nor type 'SomeOther' is assignable to the other. + Property 'q' is missing in type 'SomeDerived'. tests/cases/conformance/expressions/typeAssertions/typeAssertions.ts(38,13): error TS2352: Neither type 'SomeBase' nor type 'SomeOther' is assignable to the other. + Property 'q' is missing in type 'SomeBase'. ==== tests/cases/conformance/expressions/typeAssertions/typeAssertions.ts (5 errors) ==== @@ -55,9 +57,11 @@ tests/cases/conformance/expressions/typeAssertions/typeAssertions.ts(38,13): err someOther = someDerived; // Error ~~~~~~~~~~~~~~~~~~~~~~ !!! error TS2352: Neither type 'SomeDerived' nor type 'SomeOther' is assignable to the other. +!!! error TS2352: Property 'q' is missing in type 'SomeDerived'. someOther = someBase; // Error ~~~~~~~~~~~~~~~~~~~ !!! error TS2352: Neither type 'SomeBase' nor type 'SomeOther' is assignable to the other. +!!! error TS2352: Property 'q' is missing in type 'SomeBase'. someOther = someOther; diff --git a/tests/baselines/reference/typeGuardsInConditionalExpression.js b/tests/baselines/reference/typeGuardsInConditionalExpression.js index 303a27dc93..ebe84879d2 100644 --- a/tests/baselines/reference/typeGuardsInConditionalExpression.js +++ b/tests/baselines/reference/typeGuardsInConditionalExpression.js @@ -105,56 +105,73 @@ function foo12(x: number | string | boolean) { // the type of a variable or parameter is narrowed by any type guard in the condition when false, // provided the false expression contains no assignments to the variable or parameter. function foo(x) { - return typeof x === "string" ? x.length : x++; // number + return typeof x === "string" ? x.length // string + : x++; // number } function foo2(x) { // x is assigned in the if true branch, the type is not narrowed - return typeof x === "string" ? (x = 10 && x) : x; // string | number + return typeof x === "string" ? (x = 10 && x) // string | number + : x; // string | number } function foo3(x) { // x is assigned in the if false branch, the type is not narrowed // even though assigned using same type as narrowed expression - return typeof x === "string" ? (x = "Hello" && x) : x; // string | number + return typeof x === "string" ? (x = "Hello" && x) // string | number + : x; // string | number } function foo4(x) { // false branch updates the variable - so here it is not number // even though assigned using same type as narrowed expression - return typeof x === "string" ? x : (x = 10 && x); // string | number + return typeof x === "string" ? x // string | number + : (x = 10 && x); // string | number } function foo5(x) { // false branch updates the variable - so here it is not number - return typeof x === "string" ? x : (x = "hello" && x); // string | number + return typeof x === "string" ? x // string | number + : (x = "hello" && x); // string | number } function foo6(x) { // Modify in both branches - return typeof x === "string" ? (x = 10 && x) : (x = "hello" && x); // string | number + return typeof x === "string" ? (x = 10 && x) // string | number + : (x = "hello" && x); // string | number } function foo7(x) { - return typeof x === "string" ? x === "hello" : typeof x === "boolean" ? x : x == 10; // number + return typeof x === "string" ? x === "hello" // string + : typeof x === "boolean" ? x // boolean + : x == 10; // number } function foo8(x) { var b; - return typeof x === "string" ? x === "hello" : ((b = x) && (typeof x === "boolean" ? x : x == 10)); // number + return typeof x === "string" ? x === "hello" : ((b = x) && (typeof x === "boolean" ? x // boolean + : x == 10)); // number } function foo9(x) { var y = 10; // usage of x or assignment to separate variable shouldn't cause narrowing of type to stop - return typeof x === "string" ? ((y = x.length) && x === "hello") : x === 10; // number + return typeof x === "string" ? ((y = x.length) && x === "hello") // string + : x === 10; // number } function foo10(x) { // Mixing typeguards var b; - return typeof x === "string" ? x : ((b = x) && typeof x === "number" && x.toString()); // x is number + return typeof x === "string" ? x // string + : ((b = x) // x is number | boolean + && typeof x === "number" && x.toString()); // x is number } function foo11(x) { // Mixing typeguards // Assigning value to x deep inside another guard stops narrowing of type too var b; - return typeof x === "string" ? x : ((b = x) && typeof x === "number" && (x = 10) && x); // x is number | boolean | string + return typeof x === "string" ? x // number | boolean | string - changed in the false branch + : ((b = x) // x is number | boolean | string - because the assignment changed it + && typeof x === "number" && (x = 10) // assignment to x + && x); // x is number | boolean | string } function foo12(x) { // Mixing typeguards // Assigning value to x in outer guard shouldn't stop narrowing in the inner expression var b; - return typeof x === "string" ? (x = 10 && x.toString().length) : ((b = x) && typeof x === "number" && x); // x is number + return typeof x === "string" ? (x = 10 && x.toString().length) // number | boolean | string - changed here + : ((b = x) // x is number | boolean | string - changed in true branch + && typeof x === "number" && x); // x is number } diff --git a/tests/baselines/reference/typeGuardsInFunctionAndModuleBlock.js b/tests/baselines/reference/typeGuardsInFunctionAndModuleBlock.js index 317017c9ac..239eeb4bfe 100644 --- a/tests/baselines/reference/typeGuardsInFunctionAndModuleBlock.js +++ b/tests/baselines/reference/typeGuardsInFunctionAndModuleBlock.js @@ -84,25 +84,29 @@ module m1 { function foo(x) { return typeof x === "string" ? x : function f() { var b = x; // number | boolean - return typeof x === "boolean" ? x.toString() : x.toString(); // number + return typeof x === "boolean" ? x.toString() // boolean + : x.toString(); // number }(); } function foo2(x) { return typeof x === "string" ? x : function f(a) { var b = x; // new scope - number | boolean - return typeof x === "boolean" ? x.toString() : x.toString(); // number + return typeof x === "boolean" ? x.toString() // boolean + : x.toString(); // number }(x); // x here is narrowed to number | boolean } function foo3(x) { return typeof x === "string" ? x : (function () { var b = x; // new scope - number | boolean - return typeof x === "boolean" ? x.toString() : x.toString(); // number + return typeof x === "boolean" ? x.toString() // boolean + : x.toString(); // number })(); } function foo4(x) { return typeof x === "string" ? x : (function (a) { var b = x; // new scope - number | boolean - return typeof x === "boolean" ? x.toString() : x.toString(); // number + return typeof x === "boolean" ? x.toString() // boolean + : x.toString(); // number })(x); // x here is narrowed to number | boolean } // Type guards affect nested function expressions, but not nested function declarations @@ -125,7 +129,8 @@ var m; y = x; // string; } else { - y = typeof x === "boolean" ? x.toString() : x.toString(); // number + y = typeof x === "boolean" ? x.toString() // boolean + : x.toString(); // number } })(m2 || (m2 = {})); })(m || (m = {})); @@ -142,7 +147,8 @@ var m1; y = x; // string; } else { - y = typeof x === "boolean" ? x.toString() : x.toString(); // number + y = typeof x === "boolean" ? x.toString() // boolean + : x.toString(); // number } })(m3 = m2.m3 || (m2.m3 = {})); })(m2 || (m2 = {})); diff --git a/tests/baselines/reference/typeGuardsInIfStatement.js b/tests/baselines/reference/typeGuardsInIfStatement.js index 6b1fb4b062..c228c03857 100644 --- a/tests/baselines/reference/typeGuardsInIfStatement.js +++ b/tests/baselines/reference/typeGuardsInIfStatement.js @@ -258,7 +258,8 @@ function foo10(x) { else { var y; var b = x; // number | boolean - return typeof x === "number" ? x === 10 : x; // x should be boolean + return typeof x === "number" ? x === 10 // number + : x; // x should be boolean } } function foo11(x) { @@ -270,7 +271,13 @@ function foo11(x) { else { var y; var b = x; // number | boolean | string - because below we are changing value of x in if statement - return typeof x === "number" ? (x = 10 && x.toString()) : (y = x && x.toString()); + return typeof x === "number" ? ( + // change value of x + x = 10 && x.toString() // number | boolean | string + ) : ( + // do not change value + y = x && x.toString() // number | boolean | string + ); } } function foo12(x) { @@ -282,6 +289,7 @@ function foo12(x) { else { x = 10; var b = x; // number | boolean | string - return typeof x === "number" ? x.toString() : x.toString(); // boolean | string + return typeof x === "number" ? x.toString() // number + : x.toString(); // boolean | string } } diff --git a/tests/baselines/reference/typeGuardsInRightOperandOfAndAndOperator.js b/tests/baselines/reference/typeGuardsInRightOperandOfAndAndOperator.js index 501c5d8a9f..ffba829c37 100644 --- a/tests/baselines/reference/typeGuardsInRightOperandOfAndAndOperator.js +++ b/tests/baselines/reference/typeGuardsInRightOperandOfAndAndOperator.js @@ -71,26 +71,37 @@ function foo3(x) { return typeof x === "string" && ((x = "hello") && x); // string | number } function foo4(x) { - return typeof x !== "string" && typeof x !== "number" && x; // boolean + return typeof x !== "string" // string | number | boolean + && typeof x !== "number" // number | boolean + && x; // boolean } function foo5(x) { // usage of x or assignment to separate variable shouldn't cause narrowing of type to stop var b; - return typeof x !== "string" && ((b = x) && (typeof x !== "number" && x)); // boolean + return typeof x !== "string" // string | number | boolean + && ((b = x) && (typeof x !== "number" // number | boolean + && x)); // boolean } function foo6(x) { // Mixing typeguard narrowing in if statement with conditional expression typeguard - return typeof x !== "string" && (typeof x !== "number" ? x : x === 10); // number + return typeof x !== "string" // string | number | boolean + && (typeof x !== "number" // number | boolean + ? x // boolean + : x === 10); // number } function foo7(x) { var y; var z; // Mixing typeguard narrowing // Assigning value to x deep inside another guard stops narrowing of type too - return typeof x !== "string" && ((z = x) && (typeof x === "number" ? (x = 10 && x.toString()) : (y = x && x.toString()))); // number | boolean | string + return typeof x !== "string" && ((z = x) // string | number | boolean - x changed deeper in conditional expression + && (typeof x === "number" ? (x = 10 && x.toString()) // number | boolean | string + : (y = x && x.toString()))); // number | boolean | string } function foo8(x) { // Mixing typeguard // Assigning value to x in outer guard shouldn't stop narrowing in the inner expression - return typeof x !== "string" && (x = 10) && (typeof x === "number" ? x : x.length); // string + return typeof x !== "string" && (x = 10) // change x - number| string + && (typeof x === "number" ? x // number + : x.length); // string } diff --git a/tests/baselines/reference/typeGuardsInRightOperandOfOrOrOperator.js b/tests/baselines/reference/typeGuardsInRightOperandOfOrOrOperator.js index d2b7938a9c..5f5880a494 100644 --- a/tests/baselines/reference/typeGuardsInRightOperandOfOrOrOperator.js +++ b/tests/baselines/reference/typeGuardsInRightOperandOfOrOrOperator.js @@ -71,26 +71,37 @@ function foo3(x) { return typeof x !== "string" || ((x = "hello") || x); // string | number } function foo4(x) { - return typeof x === "string" || typeof x === "number" || x; // boolean + return typeof x === "string" // string | number | boolean + || typeof x === "number" // number | boolean + || x; // boolean } function foo5(x) { // usage of x or assignment to separate variable shouldn't cause narrowing of type to stop var b; - return typeof x === "string" || ((b = x) || (typeof x === "number" || x)); // boolean + return typeof x === "string" // string | number | boolean + || ((b = x) || (typeof x === "number" // number | boolean + || x)); // boolean } function foo6(x) { // Mixing typeguard - return typeof x === "string" || (typeof x !== "number" ? x : x === 10); // number + return typeof x === "string" // string | number | boolean + || (typeof x !== "number" // number | boolean + ? x // boolean + : x === 10); // number } function foo7(x) { var y; var z; // Mixing typeguard narrowing // Assigning value to x deep inside another guard stops narrowing of type too - return typeof x === "string" || ((z = x) || (typeof x === "number" ? (x = 10 && x.toString()) : (y = x && x.toString()))); // number | boolean | string + return typeof x === "string" || ((z = x) // string | number | boolean - x changed deeper in conditional expression + || (typeof x === "number" ? (x = 10 && x.toString()) // number | boolean | string + : (y = x && x.toString()))); // number | boolean | string } function foo8(x) { // Mixing typeguard // Assigning value to x in outer guard shouldn't stop narrowing in the inner expression - return typeof x === "string" || (x = 10) || (typeof x === "number" ? x : x.length); // string + return typeof x === "string" || (x = 10) // change x - number| string + || (typeof x === "number" ? x // number + : x.length); // string } diff --git a/tests/baselines/reference/typeIdentityConsidersBrands.errors.txt b/tests/baselines/reference/typeIdentityConsidersBrands.errors.txt index 99264a0035..0e291769af 100644 --- a/tests/baselines/reference/typeIdentityConsidersBrands.errors.txt +++ b/tests/baselines/reference/typeIdentityConsidersBrands.errors.txt @@ -1,6 +1,7 @@ tests/cases/compiler/typeIdentityConsidersBrands.ts(30,1): error TS2322: Type 'X_1' is not assignable to type 'Y_1'. Types have separate declarations of a private property 'name'. tests/cases/compiler/typeIdentityConsidersBrands.ts(31,6): error TS2345: Argument of type 'Y_1' is not assignable to parameter of type 'X_1'. + Types have separate declarations of a private property 'name'. ==== tests/cases/compiler/typeIdentityConsidersBrands.ts (2 errors) ==== @@ -40,4 +41,5 @@ tests/cases/compiler/typeIdentityConsidersBrands.ts(31,6): error TS2345: Argumen foo2(a2); // should error ~~ !!! error TS2345: Argument of type 'Y_1' is not assignable to parameter of type 'X_1'. +!!! error TS2345: Types have separate declarations of a private property 'name'. \ No newline at end of file diff --git a/tests/baselines/reference/typeOfOnTypeArg.errors.txt b/tests/baselines/reference/typeOfOnTypeArg.errors.txt index 46b48983f2..8562b7f134 100644 --- a/tests/baselines/reference/typeOfOnTypeArg.errors.txt +++ b/tests/baselines/reference/typeOfOnTypeArg.errors.txt @@ -1,4 +1,5 @@ tests/cases/compiler/typeOfOnTypeArg.ts(7,6): error TS2345: Argument of type 'number' is not assignable to parameter of type '{ '': number; }'. + Property '''' is missing in type 'Number'. ==== tests/cases/compiler/typeOfOnTypeArg.ts (1 errors) ==== @@ -11,4 +12,5 @@ tests/cases/compiler/typeOfOnTypeArg.ts(7,6): error TS2345: Argument of type 'nu fill(32); ~~ !!! error TS2345: Argument of type 'number' is not assignable to parameter of type '{ '': number; }'. +!!! error TS2345: Property '''' is missing in type 'Number'. \ No newline at end of file diff --git a/tests/baselines/reference/undeclaredModuleError.errors.txt b/tests/baselines/reference/undeclaredModuleError.errors.txt index 9ce6cbfd89..62faef02ee 100644 --- a/tests/baselines/reference/undeclaredModuleError.errors.txt +++ b/tests/baselines/reference/undeclaredModuleError.errors.txt @@ -1,5 +1,6 @@ tests/cases/compiler/undeclaredModuleError.ts(1,21): error TS2307: Cannot find external module 'fs'. tests/cases/compiler/undeclaredModuleError.ts(8,29): error TS2345: Argument of type '() => void' is not assignable to parameter of type '(stat: any, name: string) => boolean'. + Type 'void' is not assignable to type 'boolean'. tests/cases/compiler/undeclaredModuleError.ts(11,41): error TS2304: Cannot find name 'IDoNotExist'. @@ -18,6 +19,7 @@ tests/cases/compiler/undeclaredModuleError.ts(11,41): error TS2304: Cannot find } , (error: Error, files: {}[]) => { ~~~~~~~~~ !!! error TS2345: Argument of type '() => void' is not assignable to parameter of type '(stat: any, name: string) => boolean'. +!!! error TS2345: Type 'void' is not assignable to type 'boolean'. files.forEach((file) => { var fullPath = join(IDoNotExist); ~~~~~~~~~~~ diff --git a/tests/baselines/reference/variableDeclaratorResolvedDuringContextualTyping.js b/tests/baselines/reference/variableDeclaratorResolvedDuringContextualTyping.js index 5196497478..cddf9ebf25 100644 --- a/tests/baselines/reference/variableDeclaratorResolvedDuringContextualTyping.js +++ b/tests/baselines/reference/variableDeclaratorResolvedDuringContextualTyping.js @@ -131,12 +131,12 @@ var WinJS; })(WinJS || (WinJS = {})); var Errors; (function (Errors) { - var ConnectionError = (function () { - function ConnectionError(request) { + var ConnectionError /* extends Error */ = (function () { + function ConnectionError /* extends Error */(request) { } - return ConnectionError; + return ConnectionError /* extends Error */; })(); - Errors.ConnectionError = ConnectionError; + Errors.ConnectionError /* extends Error */ = ConnectionError /* extends Error */; })(Errors || (Errors = {})); var FileService = (function () { function FileService() { diff --git a/tests/cases/compiler/elaboratedErrors.ts b/tests/cases/compiler/elaboratedErrors.ts new file mode 100644 index 0000000000..e985a9362f --- /dev/null +++ b/tests/cases/compiler/elaboratedErrors.ts @@ -0,0 +1,25 @@ +interface FileSystem { + read: number; +} + +function fn(s: WorkerFS): void; +function fn(s: FileSystem): void; +function fn(s: FileSystem|WorkerFS) { } + +// This should issue a large error, not a small one +class WorkerFS implements FileSystem { + read: string; +} + +interface Alpha { x: string; } +interface Beta { y: number; } +var x: Alpha; +var y: Beta; + +// Only one of these errors should be large +x = y; +x = y; + +// Only one of these errors should be large +y = x; +y = x; diff --git a/tests/cases/compiler/superCallArgsMustMatch.ts b/tests/cases/compiler/superCallArgsMustMatch.ts index a27aff3919..5407c3301f 100644 --- a/tests/cases/compiler/superCallArgsMustMatch.ts +++ b/tests/cases/compiler/superCallArgsMustMatch.ts @@ -12,7 +12,9 @@ class T6 extends T5{ constructor() { - super("hi"); // Should error, base constructor has type T for first arg, which is fixed as number in the extends clause + // Should error; base constructor has type T for first arg, + // which is instantiated with 'number' in the extends clause + super("hi"); var x: number = this.foo; diff --git a/tests/cases/compiler/superCallFromClassThatDerivesFromGenericTypeButWithIncorrectNumberOfTypeArguments1.ts b/tests/cases/compiler/superCallFromClassThatDerivesFromGenericTypeButWithIncorrectNumberOfTypeArguments1.ts new file mode 100644 index 0000000000..d633ccb018 --- /dev/null +++ b/tests/cases/compiler/superCallFromClassThatDerivesFromGenericTypeButWithIncorrectNumberOfTypeArguments1.ts @@ -0,0 +1,10 @@ + +class A { + constructor(private map: (value: T1) => T2) { + + } +} + +class B extends A { + constructor() { super(value => String(value)); } +} \ No newline at end of file diff --git a/tests/cases/compiler/superCallFromClassThatDerivesFromGenericTypeButWithNoTypeArguments1.ts b/tests/cases/compiler/superCallFromClassThatDerivesFromGenericTypeButWithNoTypeArguments1.ts new file mode 100644 index 0000000000..c09fb37db2 --- /dev/null +++ b/tests/cases/compiler/superCallFromClassThatDerivesFromGenericTypeButWithNoTypeArguments1.ts @@ -0,0 +1,10 @@ + +class A { + constructor(private map: (value: T1) => T2) { + + } +} + +class B extends A { + constructor() { super(value => String(value)); } +} \ No newline at end of file diff --git a/tests/cases/compiler/superCallFromClassThatDerivesNonGenericTypeButWithTypeArguments1.ts b/tests/cases/compiler/superCallFromClassThatDerivesNonGenericTypeButWithTypeArguments1.ts new file mode 100644 index 0000000000..99755d87fb --- /dev/null +++ b/tests/cases/compiler/superCallFromClassThatDerivesNonGenericTypeButWithTypeArguments1.ts @@ -0,0 +1,10 @@ + +class A { + constructor(private map: (value: number) => string) { + + } +} + +class B extends A { + constructor() { super(value => String(value)); } +} \ No newline at end of file diff --git a/tests/cases/compiler/superCallFromClassThatHasNoBaseType1.ts b/tests/cases/compiler/superCallFromClassThatHasNoBaseType1.ts new file mode 100644 index 0000000000..5f030bd556 --- /dev/null +++ b/tests/cases/compiler/superCallFromClassThatHasNoBaseType1.ts @@ -0,0 +1,10 @@ + +class A { + constructor(private map: (value: number) => string) { + + } +} + +class B { + constructor() { super(value => String(value)); } +} \ No newline at end of file diff --git a/tests/cases/compiler/superCallFromFunction1.ts b/tests/cases/compiler/superCallFromFunction1.ts new file mode 100644 index 0000000000..81874204e1 --- /dev/null +++ b/tests/cases/compiler/superCallFromFunction1.ts @@ -0,0 +1,4 @@ + +function foo() { + super(value => String(value)); +} \ No newline at end of file diff --git a/tests/cases/compiler/superNewCall1.ts b/tests/cases/compiler/superNewCall1.ts new file mode 100644 index 0000000000..b3792d5522 --- /dev/null +++ b/tests/cases/compiler/superNewCall1.ts @@ -0,0 +1,12 @@ + +class A { + constructor(private map: (value: T1) => T2) { + + } +} + +class B extends A { + constructor() { + new super(value => String(value)); + } +} \ No newline at end of file diff --git a/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping1.ts b/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping1.ts new file mode 100644 index 0000000000..7bcde9a695 --- /dev/null +++ b/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping1.ts @@ -0,0 +1,11 @@ + +class A { + constructor(private map: (value: T1) => T2) { + + } +} + +class B extends A { + // Ensure 'value' is of type 'number (and not '{}') by using its 'toExponential()' method. + constructor() { super(value => String(value.toExponential())); } +} diff --git a/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping2.ts b/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping2.ts new file mode 100644 index 0000000000..32b4337494 --- /dev/null +++ b/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping2.ts @@ -0,0 +1,11 @@ + +class A { + constructor(private map: (value: T1) => T2) { + + } +} + +class C extends A { + // Ensure 'value' is not of type 'any' by invoking it with type arguments. + constructor() { super(value => String(value())); } +} \ No newline at end of file diff --git a/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping3.ts b/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping3.ts new file mode 100644 index 0000000000..760337f3ef --- /dev/null +++ b/tests/cases/conformance/expressions/contextualTyping/superCallParameterContextualTyping3.ts @@ -0,0 +1,31 @@ +interface ContextualType { + method(parameter: T): void; +} + +class CBase { + constructor(param: ContextualType) { + } + + foo(param: ContextualType) { + } +} + +class C extends CBase { + constructor() { + // Should be okay. + // 'p' should have type 'string'. + super({ + method(p) { + p.length; + } + }); + + // Should be okay. + // 'p' should have type 'string'. + super.foo({ + method(p) { + p.length; + } + }); + } +} \ No newline at end of file diff --git a/tests/cases/fourslash/commentsUnion.ts b/tests/cases/fourslash/commentsUnion.ts new file mode 100644 index 0000000000..568e0d93cd --- /dev/null +++ b/tests/cases/fourslash/commentsUnion.ts @@ -0,0 +1,7 @@ +/// + +////var a: Array | Array; +////a./*1*/length + +goTo.marker('1'); +verify.quickInfoIs("(property) length: number", "Gets or sets the length of the array. This is a number one higher than the highest element defined in an array."); \ No newline at end of file diff --git a/tests/cases/fourslash/quickInfoForContextuallyTypedArrowFunctionInSuperCall.ts b/tests/cases/fourslash/quickInfoForContextuallyTypedArrowFunctionInSuperCall.ts new file mode 100644 index 0000000000..e24a484979 --- /dev/null +++ b/tests/cases/fourslash/quickInfoForContextuallyTypedArrowFunctionInSuperCall.ts @@ -0,0 +1,20 @@ +/// + +////class A { +//// constructor(private map: (value: T1) => T2) { +//// +//// } +////} +//// +////class B extends A { +//// constructor() { super(va/*1*/lue => String(va/*2*/lue.toExpone/*3*/ntial())); } +////} + +goTo.marker('1'); +verify.quickInfoIs('(parameter) value: number'); + +goTo.marker('2'); +verify.quickInfoIs('(parameter) value: number'); + +goTo.marker('3'); +verify.quickInfoIs('(method) Number.toExponential(fractionDigits?: number): string'); \ No newline at end of file