(member)
| 84714 | return undefined; |
| 84715 | } |
| 84716 | function computeConstantValue(member) { |
| 84717 | var enumKind = getEnumKind(getSymbolOfNode(member.parent)); |
| 84718 | var isConstEnum = ts.isEnumConst(member.parent); |
| 84719 | var initializer = member.initializer; |
| 84720 | var value = enumKind === 1 /* EnumKind.Literal */ && !isLiteralEnumMember(member) ? undefined : evaluate(initializer); |
| 84721 | if (value !== undefined) { |
| 84722 | if (isConstEnum && typeof value === "number" && !isFinite(value)) { |
| 84723 | error(initializer, isNaN(value) ? |
| 84724 | ts.Diagnostics.const_enum_member_initializer_was_evaluated_to_disallowed_value_NaN : |
| 84725 | ts.Diagnostics.const_enum_member_initializer_was_evaluated_to_a_non_finite_value); |
| 84726 | } |
| 84727 | } |
| 84728 | else if (enumKind === 1 /* EnumKind.Literal */) { |
| 84729 | error(initializer, ts.Diagnostics.Computed_values_are_not_permitted_in_an_enum_with_string_valued_members); |
| 84730 | return 0; |
| 84731 | } |
| 84732 | else if (isConstEnum) { |
| 84733 | error(initializer, ts.Diagnostics.const_enum_member_initializers_can_only_contain_literal_values_and_other_computed_enum_values); |
| 84734 | } |
| 84735 | else if (member.parent.flags & 16777216 /* NodeFlags.Ambient */) { |
| 84736 | error(initializer, ts.Diagnostics.In_ambient_enum_declarations_member_initializer_must_be_constant_expression); |
| 84737 | } |
| 84738 | else { |
| 84739 | // Only here do we need to check that the initializer is assignable to the enum type. |
| 84740 | var source = checkExpression(initializer); |
| 84741 | if (!isTypeAssignableToKind(source, 296 /* TypeFlags.NumberLike */)) { |
| 84742 | error(initializer, ts.Diagnostics.Only_numeric_enums_can_have_computed_members_but_this_expression_has_type_0_If_you_do_not_need_exhaustiveness_checks_consider_using_an_object_literal_instead, typeToString(source)); |
| 84743 | } |
| 84744 | else { |
| 84745 | checkTypeAssignableTo(source, getDeclaredTypeOfSymbol(getSymbolOfNode(member.parent)), initializer, /*headMessage*/ undefined); |
| 84746 | } |
| 84747 | } |
| 84748 | return value; |
| 84749 | function evaluate(expr) { |
| 84750 | switch (expr.kind) { |
| 84751 | case 219 /* SyntaxKind.PrefixUnaryExpression */: |
| 84752 | var value_2 = evaluate(expr.operand); |
| 84753 | if (typeof value_2 === "number") { |
| 84754 | switch (expr.operator) { |
| 84755 | case 39 /* SyntaxKind.PlusToken */: return value_2; |
| 84756 | case 40 /* SyntaxKind.MinusToken */: return -value_2; |
| 84757 | case 54 /* SyntaxKind.TildeToken */: return ~value_2; |
| 84758 | } |
| 84759 | } |
| 84760 | break; |
| 84761 | case 221 /* SyntaxKind.BinaryExpression */: |
| 84762 | var left = evaluate(expr.left); |
| 84763 | var right = evaluate(expr.right); |
| 84764 | if (typeof left === "number" && typeof right === "number") { |
| 84765 | switch (expr.operatorToken.kind) { |
| 84766 | case 51 /* SyntaxKind.BarToken */: return left | right; |
| 84767 | case 50 /* SyntaxKind.AmpersandToken */: return left & right; |
| 84768 | case 48 /* SyntaxKind.GreaterThanGreaterThanToken */: return left >> right; |
| 84769 | case 49 /* SyntaxKind.GreaterThanGreaterThanGreaterThanToken */: return left >>> right; |
| 84770 | case 47 /* SyntaxKind.LessThanLessThanToken */: return left << right; |
| 84771 | case 52 /* SyntaxKind.CaretToken */: return left ^ right; |
| 84772 | case 41 /* SyntaxKind.AsteriskToken */: return left * right; |
| 84773 | case 43 /* SyntaxKind.SlashToken */: return left / right; |
no test coverage detected
searching dependent graphs…