MCPcopy Index your code
hub / github.com/nodejs/node / computeConstantValue

Function computeConstantValue

test/fixtures/snapshot/typescript.js:84716–84834  ·  view source on GitHub ↗
(member)

Source from the content-addressed store, hash-verified

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;

Callers 1

computeMemberValueFunction · 0.85

Calls 10

getEnumKindFunction · 0.85
getSymbolOfNodeFunction · 0.85
isLiteralEnumMemberFunction · 0.85
isTypeAssignableToKindFunction · 0.85
typeToStringFunction · 0.85
checkTypeAssignableToFunction · 0.85
getDeclaredTypeOfSymbolFunction · 0.85
evaluateFunction · 0.70
errorFunction · 0.70
checkExpressionFunction · 0.70

Tested by

no test coverage detected

Used in the wild real call sites across dependent graphs

searching dependent graphs…