From 52bdf0ca1cba672f53b66bd60d4883ad4f248ce9 Mon Sep 17 00:00:00 2001 From: jbondc Date: Tue, 4 Aug 2015 10:25:43 -0400 Subject: [PATCH 1/3] Keep declared enum constant expression in definition file. --- src/compiler/declarationEmitter.ts | 16 ++++++++++++++-- 1 file changed, 14 insertions(+), 2 deletions(-) diff --git a/src/compiler/declarationEmitter.ts b/src/compiler/declarationEmitter.ts index 63d71b0339e4f..2e5b8504c72ec 100644 --- a/src/compiler/declarationEmitter.ts +++ b/src/compiler/declarationEmitter.ts @@ -791,12 +791,24 @@ namespace ts { let enumMemberValue = resolver.getConstantValue(node); if (enumMemberValue !== undefined) { write(" = "); - write(enumMemberValue.toString()); + if (!node.initializer || isExpressionLiteralConstant(node.initializer)) { + write(enumMemberValue.toString()); + write(","); + } + else { + writeTextOfNode(currentSourceFile, node.initializer); + write(","); + write(" /* " + enumMemberValue.toString() + " */"); + } } - write(","); writeLine(); } + function isExpressionLiteralConstant(expr: Node) { + return expr.kind === SyntaxKind.NumericLiteral || expr.kind === SyntaxKind.StringLiteral + || expr.kind === SyntaxKind.TrueKeyword || expr.kind === SyntaxKind.FalseKeyword; + } + function isPrivateMethodTypeParameter(node: TypeParameterDeclaration) { return node.parent.kind === SyntaxKind.MethodDeclaration && (node.parent.flags & NodeFlags.Private); } From ce0be6ca3cc6f3393d4064639a780861cdbfe2bd Mon Sep 17 00:00:00 2001 From: jbondc Date: Tue, 4 Aug 2015 10:57:07 -0400 Subject: [PATCH 2/3] Simplify --- src/compiler/declarationEmitter.ts | 13 ++++++------- 1 file changed, 6 insertions(+), 7 deletions(-) diff --git a/src/compiler/declarationEmitter.ts b/src/compiler/declarationEmitter.ts index 2e5b8504c72ec..23035a75ce813 100644 --- a/src/compiler/declarationEmitter.ts +++ b/src/compiler/declarationEmitter.ts @@ -791,16 +791,15 @@ namespace ts { let enumMemberValue = resolver.getConstantValue(node); if (enumMemberValue !== undefined) { write(" = "); - if (!node.initializer || isExpressionLiteralConstant(node.initializer)) { - write(enumMemberValue.toString()); - write(","); - } - else { + if (node.initializer && !isExpressionLiteralConstant(node.initializer)) { writeTextOfNode(currentSourceFile, node.initializer); - write(","); - write(" /* " + enumMemberValue.toString() + " */"); + write(", /* " + enumMemberValue.toString() + " */"); + writeLine(); + return; } + write(enumMemberValue.toString()); } + write(","); writeLine(); } From ba640137cafea9cb63894b4833f1f2fbe80f02de Mon Sep 17 00:00:00 2001 From: jbondc Date: Tue, 4 Aug 2015 11:02:40 -0400 Subject: [PATCH 3/3] Accept baselines. --- tests/baselines/reference/constEnum1.js | 12 ++--- .../reference/constEnumDeclarations.js | 2 +- .../reference/constEnumPropertyAccess1.js | 4 +- .../reference/constEnumPropertyAccess2.js | 4 +- tests/baselines/reference/declFileEnums.js | 47 ++++++++++++++++++- 5 files changed, 56 insertions(+), 13 deletions(-) diff --git a/tests/baselines/reference/constEnum1.js b/tests/baselines/reference/constEnum1.js index d5ccede3ff1f4..23cf58f669466 100644 --- a/tests/baselines/reference/constEnum1.js +++ b/tests/baselines/reference/constEnum1.js @@ -24,11 +24,11 @@ const enum E { //// [constEnum1.d.ts] declare const enum E { a = 10, - b = 10, - c = 11, + b = a, /* 10 */ + c = (a+1), /* 11 */ e = 12, - d = -13, - f = 20, - g = 20, - h = 10, + d = ~e, /* -13 */ + f = a << 2 >> 1, /* 20 */ + g = a << 2 >>> 1, /* 20 */ + h = a | b, /* 10 */ } diff --git a/tests/baselines/reference/constEnumDeclarations.js b/tests/baselines/reference/constEnumDeclarations.js index 1cbacb13bbd5f..9c2c5269d77ef 100644 --- a/tests/baselines/reference/constEnumDeclarations.js +++ b/tests/baselines/reference/constEnumDeclarations.js @@ -19,7 +19,7 @@ const enum E2 { declare const enum E { A = 1, B = 2, - C = 3, + C = A | B, /* 3 */ } declare const enum E2 { A = 1, diff --git a/tests/baselines/reference/constEnumPropertyAccess1.js b/tests/baselines/reference/constEnumPropertyAccess1.js index 114f1e1928ea4..196a852cb31a1 100644 --- a/tests/baselines/reference/constEnumPropertyAccess1.js +++ b/tests/baselines/reference/constEnumPropertyAccess1.js @@ -54,8 +54,8 @@ class C { declare const enum G { A = 1, B = 2, - C = 3, - D = 2, + C = A + B, /* 3 */ + D = A * 2, /* 2 */ } declare var o: { [idx: number]: boolean; diff --git a/tests/baselines/reference/constEnumPropertyAccess2.js b/tests/baselines/reference/constEnumPropertyAccess2.js index 46a1d918b94b3..03ad7da391e22 100644 --- a/tests/baselines/reference/constEnumPropertyAccess2.js +++ b/tests/baselines/reference/constEnumPropertyAccess2.js @@ -37,8 +37,8 @@ function foo(x) { } declare const enum G { A = 1, B = 2, - C = 3, - D = 2, + C = A + B, /* 3 */ + D = A * 2, /* 2 */ } declare var z: typeof G; declare var z1: any; diff --git a/tests/baselines/reference/declFileEnums.js b/tests/baselines/reference/declFileEnums.js index 34f1e386a964a..46cbad44be00d 100644 --- a/tests/baselines/reference/declFileEnums.js +++ b/tests/baselines/reference/declFileEnums.js @@ -80,13 +80,13 @@ declare enum e1 { } declare enum e2 { a = 10, - b = 12, + b = a + 2, /* 12 */ c = 10, } declare enum e3 { a = 10, b, - c = 13, + c = a + 3, /* 13 */ } declare enum e4 { a = 0, @@ -101,3 +101,46 @@ declare enum e5 { "Sunday" = 2, "Weekend days" = 3, } + + +//// [DtsFileErrors] + + +tests/cases/compiler/declFileEnums.d.ts(8,5): error TS1066: Ambient enum elements can only have integer literal initializers. +tests/cases/compiler/declFileEnums.d.ts(14,5): error TS1066: Ambient enum elements can only have integer literal initializers. + + +==== tests/cases/compiler/declFileEnums.d.ts (2 errors) ==== + declare enum e1 { + a = 0, + b = 1, + c = 2, + } + declare enum e2 { + a = 10, + b = a + 2, /* 12 */ + ~ +!!! error TS1066: Ambient enum elements can only have integer literal initializers. + c = 10, + } + declare enum e3 { + a = 10, + b, + c = a + 3, /* 13 */ + ~ +!!! error TS1066: Ambient enum elements can only have integer literal initializers. + } + declare enum e4 { + a = 0, + b = 1, + c = 2, + d = 10, + e = 11, + } + declare enum e5 { + "Friday" = 0, + "Saturday" = 1, + "Sunday" = 2, + "Weekend days" = 3, + } + \ No newline at end of file