From 332b3165c3add28bf317c115cc8fe693406f2e89 Mon Sep 17 00:00:00 2001 From: Yui T Date: Wed, 14 Sep 2016 11:54:17 -0700 Subject: [PATCH 1/3] Emit declaration file which inferred type alias with its value --- src/compiler/checker.ts | 9 +++++++-- src/compiler/declarationEmitter.ts | 2 +- src/compiler/types.ts | 1 + 3 files changed, 9 insertions(+), 3 deletions(-) diff --git a/src/compiler/checker.ts b/src/compiler/checker.ts index 9f1a0d4930..e1f230ce09 100644 --- a/src/compiler/checker.ts +++ b/src/compiler/checker.ts @@ -2150,8 +2150,13 @@ namespace ts { buildSymbolDisplay(type.symbol, writer, enclosingDeclaration, SymbolFlags.Type, SymbolFormatFlags.None, nextFlags); } else if (!(flags & TypeFormatFlags.InTypeAlias) && type.flags & (TypeFlags.Anonymous | TypeFlags.UnionOrIntersection) && type.aliasSymbol) { - const typeArguments = type.aliasTypeArguments; - writeSymbolTypeReference(type.aliasSymbol, typeArguments, 0, typeArguments ? typeArguments.length : 0, nextFlags); + if (type.flags & TypeFlags.Anonymous || !(flags & TypeFormatFlags.UseTypeAliasValue)) { + const typeArguments = type.aliasTypeArguments; + writeSymbolTypeReference(type.aliasSymbol, typeArguments, 0, typeArguments ? typeArguments.length : 0, nextFlags); + } + else { + writeUnionOrIntersectionType(type, nextFlags); + } } else if (type.flags & TypeFlags.UnionOrIntersection) { writeUnionOrIntersectionType(type, nextFlags); diff --git a/src/compiler/declarationEmitter.ts b/src/compiler/declarationEmitter.ts index ab1ca51825..f519a5881b 100644 --- a/src/compiler/declarationEmitter.ts +++ b/src/compiler/declarationEmitter.ts @@ -327,7 +327,7 @@ namespace ts { } else { errorNameNode = declaration.name; - resolver.writeTypeOfDeclaration(declaration, enclosingDeclaration, TypeFormatFlags.UseTypeOfFunction, writer); + resolver.writeTypeOfDeclaration(declaration, enclosingDeclaration, TypeFormatFlags.UseTypeOfFunction | TypeFormatFlags.UseTypeAliasValue, writer); errorNameNode = undefined; } } diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 50beef52bf..4c4cf52087 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1946,6 +1946,7 @@ namespace ts { UseFullyQualifiedType = 0x00000080, // Write out the fully qualified type name (eg. Module.Type, instead of Type) InFirstTypeArgument = 0x00000100, // Writing first type argument of the instantiated type InTypeAlias = 0x00000200, // Writing type in type alias declaration + UseTypeAliasValue = 0x00000400, // Writing infered type alias as its value. This is used when we emit declaration file } export const enum SymbolFormatFlags { From ced8cf867047cf3a44e4beee68dae3cc7a0a36d4 Mon Sep 17 00:00:00 2001 From: Yui T Date: Wed, 14 Sep 2016 11:55:13 -0700 Subject: [PATCH 2/3] Add tests and update baselines --- .../declarationEmitInferedTypeAlias1.js | 30 +++++++++++++++++++ .../declarationEmitInferedTypeAlias1.symbols | 19 ++++++++++++ .../declarationEmitInferedTypeAlias1.types | 23 ++++++++++++++ .../stringLiteralTypesAndTuples01.js | 2 +- .../stringLiteralTypesOverloads01.js | 2 +- .../declarationEmitInferedTypeAlias1.ts | 13 ++++++++ 6 files changed, 87 insertions(+), 2 deletions(-) create mode 100644 tests/baselines/reference/declarationEmitInferedTypeAlias1.js create mode 100644 tests/baselines/reference/declarationEmitInferedTypeAlias1.symbols create mode 100644 tests/baselines/reference/declarationEmitInferedTypeAlias1.types create mode 100644 tests/cases/compiler/declarationEmitInferedTypeAlias1.ts diff --git a/tests/baselines/reference/declarationEmitInferedTypeAlias1.js b/tests/baselines/reference/declarationEmitInferedTypeAlias1.js new file mode 100644 index 0000000000..05ce74e3ba --- /dev/null +++ b/tests/baselines/reference/declarationEmitInferedTypeAlias1.js @@ -0,0 +1,30 @@ +//// [tests/cases/compiler/declarationEmitInferedTypeAlias1.ts] //// + +//// [0.ts] + +{ + type Data = string | boolean; + let obj: Data = true; +} +export { } + +//// [1.ts] +let v = "str" || true; +export { v } + +//// [0.js] +"use strict"; +{ + var obj = true; +} +//// [1.js] +"use strict"; +var v = "str" || true; +exports.v = v; + + +//// [0.d.ts] +export { }; +//// [1.d.ts] +declare let v: string | boolean; +export { v }; diff --git a/tests/baselines/reference/declarationEmitInferedTypeAlias1.symbols b/tests/baselines/reference/declarationEmitInferedTypeAlias1.symbols new file mode 100644 index 0000000000..94599418c5 --- /dev/null +++ b/tests/baselines/reference/declarationEmitInferedTypeAlias1.symbols @@ -0,0 +1,19 @@ +=== tests/cases/compiler/0.ts === + +{ + type Data = string | boolean; +>Data : Symbol(Data, Decl(0.ts, 1, 1)) + + let obj: Data = true; +>obj : Symbol(obj, Decl(0.ts, 3, 7)) +>Data : Symbol(Data, Decl(0.ts, 1, 1)) +} +export { } + +=== tests/cases/compiler/1.ts === +let v = "str" || true; +>v : Symbol(v, Decl(1.ts, 0, 3)) + +export { v } +>v : Symbol(v, Decl(1.ts, 1, 8)) + diff --git a/tests/baselines/reference/declarationEmitInferedTypeAlias1.types b/tests/baselines/reference/declarationEmitInferedTypeAlias1.types new file mode 100644 index 0000000000..8da9e8b291 --- /dev/null +++ b/tests/baselines/reference/declarationEmitInferedTypeAlias1.types @@ -0,0 +1,23 @@ +=== tests/cases/compiler/0.ts === + +{ + type Data = string | boolean; +>Data : Data + + let obj: Data = true; +>obj : Data +>Data : Data +>true : true +} +export { } + +=== tests/cases/compiler/1.ts === +let v = "str" || true; +>v : Data +>"str" || true : Data +>"str" : string +>true : boolean + +export { v } +>v : Data + diff --git a/tests/baselines/reference/stringLiteralTypesAndTuples01.js b/tests/baselines/reference/stringLiteralTypesAndTuples01.js index b887213c8f..ae02d12429 100644 --- a/tests/baselines/reference/stringLiteralTypesAndTuples01.js +++ b/tests/baselines/reference/stringLiteralTypesAndTuples01.js @@ -38,5 +38,5 @@ function rawr(dino) { //// [stringLiteralTypesAndTuples01.d.ts] declare let hello: string, brave: string, newish: string, world: string; declare type RexOrRaptor = "t-rex" | "raptor"; -declare let im: "I'm", a: "a", dinosaur: RexOrRaptor; +declare let im: "I'm", a: "a", dinosaur: "t-rex" | "raptor"; declare function rawr(dino: RexOrRaptor): string; diff --git a/tests/baselines/reference/stringLiteralTypesOverloads01.js b/tests/baselines/reference/stringLiteralTypesOverloads01.js index dd050b5e46..ef441a4098 100644 --- a/tests/baselines/reference/stringLiteralTypesOverloads01.js +++ b/tests/baselines/reference/stringLiteralTypesOverloads01.js @@ -109,6 +109,6 @@ declare const boolean: "boolean"; declare const stringOrNumber: "string" | "number"; declare const stringOrBoolean: "string" | "boolean"; declare const booleanOrNumber: "number" | "boolean"; -declare const stringOrBooleanOrNumber: PrimitiveName; +declare const stringOrBooleanOrNumber: "string" | "number" | "boolean"; declare namespace Consts2 { } diff --git a/tests/cases/compiler/declarationEmitInferedTypeAlias1.ts b/tests/cases/compiler/declarationEmitInferedTypeAlias1.ts new file mode 100644 index 0000000000..be40faa8c5 --- /dev/null +++ b/tests/cases/compiler/declarationEmitInferedTypeAlias1.ts @@ -0,0 +1,13 @@ +// @declaration: true +// @skipDefaultLibCheck: true + +// @Filename: 0.ts +{ + type Data = string | boolean; + let obj: Data = true; +} +export { } + +// @Filename: 1.ts +let v = "str" || true; +export { v } \ No newline at end of file From 14b59b23e7f738cb50f04e133f231911846c21cc Mon Sep 17 00:00:00 2001 From: Yui T Date: Wed, 14 Sep 2016 13:30:15 -0700 Subject: [PATCH 3/3] Address PR --- src/compiler/declarationEmitter.ts | 6 +++--- src/compiler/types.ts | 2 +- 2 files changed, 4 insertions(+), 4 deletions(-) diff --git a/src/compiler/declarationEmitter.ts b/src/compiler/declarationEmitter.ts index f519a5881b..6ded3a5333 100644 --- a/src/compiler/declarationEmitter.ts +++ b/src/compiler/declarationEmitter.ts @@ -341,7 +341,7 @@ namespace ts { } else { errorNameNode = signature.name; - resolver.writeReturnTypeOfSignatureDeclaration(signature, enclosingDeclaration, TypeFormatFlags.UseTypeOfFunction, writer); + resolver.writeReturnTypeOfSignatureDeclaration(signature, enclosingDeclaration, TypeFormatFlags.UseTypeOfFunction | TypeFormatFlags.UseTypeAliasValue, writer); errorNameNode = undefined; } } @@ -563,7 +563,7 @@ namespace ts { write(tempVarName); write(": "); writer.getSymbolAccessibilityDiagnostic = getDefaultExportAccessibilityDiagnostic; - resolver.writeTypeOfExpression(node.expression, enclosingDeclaration, TypeFormatFlags.UseTypeOfFunction, writer); + resolver.writeTypeOfExpression(node.expression, enclosingDeclaration, TypeFormatFlags.UseTypeOfFunction | TypeFormatFlags.UseTypeAliasValue, writer); write(";"); writeLine(); write(node.isExportEquals ? "export = " : "export default "); @@ -1025,7 +1025,7 @@ namespace ts { } else { writer.getSymbolAccessibilityDiagnostic = getHeritageClauseVisibilityError; - resolver.writeBaseConstructorTypeOfClass(enclosingDeclaration, enclosingDeclaration, TypeFormatFlags.UseTypeOfFunction, writer); + resolver.writeBaseConstructorTypeOfClass(enclosingDeclaration, enclosingDeclaration, TypeFormatFlags.UseTypeOfFunction | TypeFormatFlags.UseTypeAliasValue, writer); } function getHeritageClauseVisibilityError(symbolAccessibilityResult: SymbolAccessibilityResult): SymbolAccessibilityDiagnostic { diff --git a/src/compiler/types.ts b/src/compiler/types.ts index 4c4cf52087..34f86c0d03 100644 --- a/src/compiler/types.ts +++ b/src/compiler/types.ts @@ -1946,7 +1946,7 @@ namespace ts { UseFullyQualifiedType = 0x00000080, // Write out the fully qualified type name (eg. Module.Type, instead of Type) InFirstTypeArgument = 0x00000100, // Writing first type argument of the instantiated type InTypeAlias = 0x00000200, // Writing type in type alias declaration - UseTypeAliasValue = 0x00000400, // Writing infered type alias as its value. This is used when we emit declaration file + UseTypeAliasValue = 0x00000400, // Serialize the type instead of using type-alias. This is needed when we emit declaration file. } export const enum SymbolFormatFlags {