Fixes emit of type predicated in delcaration files
This commit is contained in:
parent
43febe50ab
commit
951084fc85
|
@ -188,7 +188,7 @@ namespace ts {
|
||||||
if (!moduleElementEmitInfo && asynchronousSubModuleDeclarationEmitInfo) {
|
if (!moduleElementEmitInfo && asynchronousSubModuleDeclarationEmitInfo) {
|
||||||
moduleElementEmitInfo = forEach(asynchronousSubModuleDeclarationEmitInfo, declEmitInfo => declEmitInfo.node === nodeToCheck ? declEmitInfo : undefined);
|
moduleElementEmitInfo = forEach(asynchronousSubModuleDeclarationEmitInfo, declEmitInfo => declEmitInfo.node === nodeToCheck ? declEmitInfo : undefined);
|
||||||
}
|
}
|
||||||
|
|
||||||
// If the alias was marked as not visible when we saw its declaration, we would have saved the aliasEmitInfo, but if we haven't yet visited the alias declaration
|
// If the alias was marked as not visible when we saw its declaration, we would have saved the aliasEmitInfo, but if we haven't yet visited the alias declaration
|
||||||
// then we don't need to write it at this point. We will write it when we actually see its declaration
|
// then we don't need to write it at this point. We will write it when we actually see its declaration
|
||||||
// Eg.
|
// Eg.
|
||||||
|
@ -198,7 +198,7 @@ namespace ts {
|
||||||
// we would write alias foo declaration when we visit it since it would now be marked as visible
|
// we would write alias foo declaration when we visit it since it would now be marked as visible
|
||||||
if (moduleElementEmitInfo) {
|
if (moduleElementEmitInfo) {
|
||||||
if (moduleElementEmitInfo.node.kind === SyntaxKind.ImportDeclaration) {
|
if (moduleElementEmitInfo.node.kind === SyntaxKind.ImportDeclaration) {
|
||||||
// we have to create asynchronous output only after we have collected complete information
|
// we have to create asynchronous output only after we have collected complete information
|
||||||
// because it is possible to enable multiple bindings as asynchronously visible
|
// because it is possible to enable multiple bindings as asynchronously visible
|
||||||
moduleElementEmitInfo.isVisible = true;
|
moduleElementEmitInfo.isVisible = true;
|
||||||
}
|
}
|
||||||
|
@ -353,6 +353,21 @@ namespace ts {
|
||||||
return emitEntityName(<Identifier>type);
|
return emitEntityName(<Identifier>type);
|
||||||
case SyntaxKind.QualifiedName:
|
case SyntaxKind.QualifiedName:
|
||||||
return emitEntityName(<QualifiedName>type);
|
return emitEntityName(<QualifiedName>type);
|
||||||
|
case SyntaxKind.TypePredicate:
|
||||||
|
return emitTypePredicate(<TypePredicateNode>type);
|
||||||
|
}
|
||||||
|
|
||||||
|
function writeEntityName(entityName: EntityName | Expression) {
|
||||||
|
if (entityName.kind === SyntaxKind.Identifier) {
|
||||||
|
writeTextOfNode(currentSourceFile, entityName);
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
let left = entityName.kind === SyntaxKind.QualifiedName ? (<QualifiedName>entityName).left : (<PropertyAccessExpression>entityName).expression;
|
||||||
|
let right = entityName.kind === SyntaxKind.QualifiedName ? (<QualifiedName>entityName).right : (<PropertyAccessExpression>entityName).name;
|
||||||
|
writeEntityName(left);
|
||||||
|
write(".");
|
||||||
|
writeTextOfNode(currentSourceFile, right);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function emitEntityName(entityName: EntityName | PropertyAccessExpression) {
|
function emitEntityName(entityName: EntityName | PropertyAccessExpression) {
|
||||||
|
@ -362,19 +377,6 @@ namespace ts {
|
||||||
|
|
||||||
handleSymbolAccessibilityError(visibilityResult);
|
handleSymbolAccessibilityError(visibilityResult);
|
||||||
writeEntityName(entityName);
|
writeEntityName(entityName);
|
||||||
|
|
||||||
function writeEntityName(entityName: EntityName | Expression) {
|
|
||||||
if (entityName.kind === SyntaxKind.Identifier) {
|
|
||||||
writeTextOfNode(currentSourceFile, entityName);
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
let left = entityName.kind === SyntaxKind.QualifiedName ? (<QualifiedName>entityName).left : (<PropertyAccessExpression>entityName).expression;
|
|
||||||
let right = entityName.kind === SyntaxKind.QualifiedName ? (<QualifiedName>entityName).right : (<PropertyAccessExpression>entityName).name;
|
|
||||||
writeEntityName(left);
|
|
||||||
write(".");
|
|
||||||
writeTextOfNode(currentSourceFile, right);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
function emitExpressionWithTypeArguments(node: ExpressionWithTypeArguments) {
|
function emitExpressionWithTypeArguments(node: ExpressionWithTypeArguments) {
|
||||||
|
@ -398,6 +400,12 @@ namespace ts {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
function emitTypePredicate(type: TypePredicateNode) {
|
||||||
|
writeEntityName(type.parameterName);
|
||||||
|
write(" is ");
|
||||||
|
emitType(type.type);
|
||||||
|
}
|
||||||
|
|
||||||
function emitTypeQuery(type: TypeQueryNode) {
|
function emitTypeQuery(type: TypeQueryNode) {
|
||||||
write("typeof ");
|
write("typeof ");
|
||||||
emitEntityName(type.exprName);
|
emitEntityName(type.exprName);
|
||||||
|
@ -600,7 +608,7 @@ namespace ts {
|
||||||
}
|
}
|
||||||
|
|
||||||
function writeImportEqualsDeclaration(node: ImportEqualsDeclaration) {
|
function writeImportEqualsDeclaration(node: ImportEqualsDeclaration) {
|
||||||
// note usage of writer. methods instead of aliases created, just to make sure we are using
|
// note usage of writer. methods instead of aliases created, just to make sure we are using
|
||||||
// correct writer especially to handle asynchronous alias writing
|
// correct writer especially to handle asynchronous alias writing
|
||||||
emitJsDocComments(node);
|
emitJsDocComments(node);
|
||||||
if (node.flags & NodeFlags.Export) {
|
if (node.flags & NodeFlags.Export) {
|
||||||
|
@ -642,7 +650,7 @@ namespace ts {
|
||||||
|
|
||||||
function writeImportDeclaration(node: ImportDeclaration) {
|
function writeImportDeclaration(node: ImportDeclaration) {
|
||||||
if (!node.importClause && !(node.flags & NodeFlags.Export)) {
|
if (!node.importClause && !(node.flags & NodeFlags.Export)) {
|
||||||
// do not write non-exported import declarations that don't have import clauses
|
// do not write non-exported import declarations that don't have import clauses
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
emitJsDocComments(node);
|
emitJsDocComments(node);
|
||||||
|
@ -1517,7 +1525,7 @@ namespace ts {
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
function emitNode(node: Node) {
|
function emitNode(node: Node) {
|
||||||
|
@ -1577,7 +1585,7 @@ namespace ts {
|
||||||
referencePathsOutput += "/// <reference path=\"" + declFileName + "\" />" + newLine;
|
referencePathsOutput += "/// <reference path=\"" + declFileName + "\" />" + newLine;
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
/* @internal */
|
/* @internal */
|
||||||
export function writeDeclarationFile(jsFilePath: string, sourceFile: SourceFile, host: EmitHost, resolver: EmitResolver, diagnostics: Diagnostic[]) {
|
export function writeDeclarationFile(jsFilePath: string, sourceFile: SourceFile, host: EmitHost, resolver: EmitResolver, diagnostics: Diagnostic[]) {
|
||||||
let emitDeclarationResult = emitDeclarations(host, resolver, diagnostics, jsFilePath, sourceFile);
|
let emitDeclarationResult = emitDeclarations(host, resolver, diagnostics, jsFilePath, sourceFile);
|
||||||
|
|
|
@ -28,6 +28,10 @@ export function fooWithSingleOverload(a: any) {
|
||||||
return a;
|
return a;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
export function fooWithTypePredicate(a: any): a is number {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
|
||||||
/** This comment should appear for nonExportedFoo*/
|
/** This comment should appear for nonExportedFoo*/
|
||||||
function nonExportedFoo() {
|
function nonExportedFoo() {
|
||||||
}
|
}
|
||||||
|
|
Loading…
Reference in a new issue