Files
ask262/engine262/src/runtime-semantics/ClassDeclaration.mts
T

42 lines
2.3 KiB
TypeScript

import { surroundingAgent } from '../host-defined/engine.mts';
import { Value } from '../value.mts';
import { StringValue } from '../static-semantics/all.mts';
import { Q, NormalCompletion } from '../completion.mts';
import type { ParseNode } from '../parser/ParseNode.mts';
import type { PlainEvaluator, ValueEvaluator } from '../evaluator.mts';
import {
InitializeBoundName, ClassDefinitionEvaluation, type DecoratorDefinitionRecord, DecoratorListEvaluation,
} from './all.mts';
/** https://tc39.es/ecma262/#sec-runtime-semantics-bindingclassdeclarationevaluation */
// ClassDeclaration :
// `class` BindingIdentifier ClassTail
// `class` ClassTail
export function* BindingClassDeclarationEvaluation(ClassDeclaration: ParseNode.ClassDeclaration, decorators: readonly DecoratorDefinitionRecord[]): ValueEvaluator {
const { BindingIdentifier, ClassTail } = ClassDeclaration;
const sourceText = ClassDeclaration.sourceText;
if (!BindingIdentifier) {
return Q(yield* ClassDefinitionEvaluation(ClassTail, Value.undefined, Value('default'), sourceText, decorators));
}
// 1. Let className be StringValue of BindingIdentifier.
const className = StringValue(BindingIdentifier);
// 2. Let value be ? ClassDefinitionEvaluation of ClassTail with arguments className, className, decorators.
const value = Q(yield* ClassDefinitionEvaluation(ClassTail, className, className, sourceText, decorators));
// 4. Let env be the running execution context's LexicalEnvironment.
const env = surroundingAgent.runningExecutionContext.LexicalEnvironment;
// 5. Perform ? InitializeBoundName(className, value, env).
Q(yield* InitializeBoundName(className, value, env));
// 6. Return value.
return value;
}
/** https://tc39.es/ecma262/#sec-class-definitions-runtime-semantics-evaluation */
// ClassDeclaration : `class` BindingIdentifier ClassTAil
export function* Evaluate_ClassDeclaration(ClassDeclaration: ParseNode.ClassDeclaration): PlainEvaluator {
const decorators = ClassDeclaration.Decorators ? Q(yield* DecoratorListEvaluation(ClassDeclaration.Decorators)) : [];
// 1. Perform ? BindingClassDeclarationEvaluation of this ClassDeclaration.
Q(yield* BindingClassDeclarationEvaluation(ClassDeclaration, decorators));
// 2. Return NormalCompletion(empty).
return NormalCompletion(undefined);
}