-
-
Notifications
You must be signed in to change notification settings - Fork 2
/
evaluate-decorator.ts
32 lines (28 loc) · 1.27 KB
/
evaluate-decorator.ts
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
import type {EvaluatorOptions} from "./evaluator-options.js";
import type {IndexLiteral} from "../literal/literal.js";
import {stringifyLiteral} from "../literal/literal.js";
import {NotCallableError} from "../error/not-callable-error/not-callable-error.js";
import type {TS} from "../../type/ts.js";
import {__decorate, __param} from "../util/tslib/tslib-util.js";
import type {EvaluationError} from "../error/evaluation-error/evaluation-error.js";
/**
* Evaluates, or attempts to evaluate, a Decorator
*/
export function evaluateDecorator(options: EvaluatorOptions<TS.Decorator>, [parent, propertyName, index]: [IndexLiteral, string?, number?]): void | EvaluationError {
const {node, evaluate, environment, throwError, stack, getCurrentError} = options;
const decoratorImplementation = evaluate.expression(node.expression, options);
if (getCurrentError() != null) {
return;
}
if (typeof decoratorImplementation !== "function") {
return throwError(
new NotCallableError({
node,
environment,
value: decoratorImplementation,
message: `${stringifyLiteral(decoratorImplementation)} is not a valid decorator implementation'`
})
);
}
stack.push(__decorate([index != null ? __param(index, decoratorImplementation) : decoratorImplementation], parent, propertyName));
}