@rcrsr/rill 0.14.0 → 0.16.0
This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
- package/dist/ast-nodes.d.ts +2 -11
- package/dist/ast-nodes.js +0 -1
- package/dist/ast-unions.d.ts +0 -1
- package/dist/ast-unions.js +0 -1
- package/dist/constants.d.ts +0 -1
- package/dist/constants.js +0 -1
- package/dist/error-classes.d.ts +0 -1
- package/dist/error-classes.js +0 -1
- package/dist/error-formatter.d.ts +0 -1
- package/dist/error-formatter.js +0 -1
- package/dist/error-registry.d.ts +0 -1
- package/dist/error-registry.js +50 -1
- package/dist/ext/crypto/index.d.ts +0 -1
- package/dist/ext/crypto/index.js +5 -6
- package/dist/ext/exec/index.d.ts +0 -1
- package/dist/ext/exec/index.js +3 -4
- package/dist/ext/exec/runner.d.ts +0 -1
- package/dist/ext/exec/runner.js +0 -1
- package/dist/ext/fetch/index.d.ts +0 -1
- package/dist/ext/fetch/index.js +8 -39
- package/dist/ext/fetch/request.d.ts +0 -1
- package/dist/ext/fetch/request.js +0 -1
- package/dist/ext/fs/index.d.ts +0 -1
- package/dist/ext/fs/index.js +26 -27
- package/dist/ext/fs/sandbox.d.ts +0 -1
- package/dist/ext/fs/sandbox.js +0 -1
- package/dist/ext/kv/index.d.ts +0 -1
- package/dist/ext/kv/index.js +19 -20
- package/dist/ext/kv/store.d.ts +0 -1
- package/dist/ext/kv/store.js +0 -1
- package/dist/generated/introspection-data.d.ts +0 -1
- package/dist/generated/introspection-data.js +0 -1
- package/dist/generated/version-data.d.ts +1 -2
- package/dist/generated/version-data.js +2 -3
- package/dist/highlight-map.d.ts +0 -1
- package/dist/highlight-map.js +0 -1
- package/dist/index.d.ts +1 -2
- package/dist/index.js +1 -2
- package/dist/lexer/errors.d.ts +0 -1
- package/dist/lexer/errors.js +0 -1
- package/dist/lexer/helpers.d.ts +0 -1
- package/dist/lexer/helpers.js +0 -1
- package/dist/lexer/index.d.ts +0 -1
- package/dist/lexer/index.js +0 -1
- package/dist/lexer/operators.d.ts +0 -1
- package/dist/lexer/operators.js +0 -1
- package/dist/lexer/readers.d.ts +0 -1
- package/dist/lexer/readers.js +0 -1
- package/dist/lexer/state.d.ts +0 -1
- package/dist/lexer/state.js +0 -1
- package/dist/lexer/tokenizer.d.ts +0 -1
- package/dist/lexer/tokenizer.js +0 -1
- package/dist/parser/helpers.d.ts +0 -1
- package/dist/parser/helpers.js +0 -1
- package/dist/parser/index.d.ts +0 -1
- package/dist/parser/index.js +0 -1
- package/dist/parser/parser-collect.d.ts +0 -1
- package/dist/parser/parser-collect.js +0 -1
- package/dist/parser/parser-control.d.ts +0 -1
- package/dist/parser/parser-control.js +0 -1
- package/dist/parser/parser-expr.d.ts +0 -1
- package/dist/parser/parser-expr.js +0 -1
- package/dist/parser/parser-extract.d.ts +0 -1
- package/dist/parser/parser-extract.js +0 -1
- package/dist/parser/parser-functions.d.ts +0 -1
- package/dist/parser/parser-functions.js +0 -1
- package/dist/parser/parser-literals.d.ts +0 -1
- package/dist/parser/parser-literals.js +4 -2
- package/dist/parser/parser-script.d.ts +0 -1
- package/dist/parser/parser-script.js +0 -1
- package/dist/parser/parser-shape.d.ts +2 -3
- package/dist/parser/parser-shape.js +8 -40
- package/dist/parser/parser-types.d.ts +28 -2
- package/dist/parser/parser-types.js +64 -13
- package/dist/parser/parser-use.d.ts +0 -1
- package/dist/parser/parser-use.js +0 -1
- package/dist/parser/parser-variables.d.ts +0 -1
- package/dist/parser/parser-variables.js +0 -1
- package/dist/parser/parser.d.ts +0 -1
- package/dist/parser/parser.js +0 -1
- package/dist/parser/state.d.ts +0 -1
- package/dist/parser/state.js +0 -1
- package/dist/runtime/core/callable.d.ts +40 -13
- package/dist/runtime/core/callable.js +137 -31
- package/dist/runtime/core/context.d.ts +0 -1
- package/dist/runtime/core/context.js +1 -2
- package/dist/runtime/core/equals.d.ts +0 -1
- package/dist/runtime/core/equals.js +35 -3
- package/dist/runtime/core/eval/base.d.ts +0 -1
- package/dist/runtime/core/eval/base.js +0 -1
- package/dist/runtime/core/eval/evaluator.d.ts +0 -1
- package/dist/runtime/core/eval/evaluator.js +0 -1
- package/dist/runtime/core/eval/index.d.ts +0 -1
- package/dist/runtime/core/eval/index.js +0 -1
- package/dist/runtime/core/eval/mixins/annotations.d.ts +0 -1
- package/dist/runtime/core/eval/mixins/annotations.js +0 -1
- package/dist/runtime/core/eval/mixins/closures.d.ts +0 -1
- package/dist/runtime/core/eval/mixins/closures.js +82 -69
- package/dist/runtime/core/eval/mixins/collections.d.ts +0 -1
- package/dist/runtime/core/eval/mixins/collections.js +9 -4
- package/dist/runtime/core/eval/mixins/control-flow.d.ts +0 -1
- package/dist/runtime/core/eval/mixins/control-flow.js +0 -1
- package/dist/runtime/core/eval/mixins/conversion.d.ts +0 -1
- package/dist/runtime/core/eval/mixins/conversion.js +263 -16
- package/dist/runtime/core/eval/mixins/core.d.ts +0 -1
- package/dist/runtime/core/eval/mixins/core.js +0 -1
- package/dist/runtime/core/eval/mixins/expressions.d.ts +0 -1
- package/dist/runtime/core/eval/mixins/expressions.js +0 -1
- package/dist/runtime/core/eval/mixins/extraction.d.ts +0 -1
- package/dist/runtime/core/eval/mixins/extraction.js +8 -9
- package/dist/runtime/core/eval/mixins/list-dispatch.d.ts +0 -1
- package/dist/runtime/core/eval/mixins/list-dispatch.js +0 -1
- package/dist/runtime/core/eval/mixins/literals.d.ts +0 -1
- package/dist/runtime/core/eval/mixins/literals.js +3 -7
- package/dist/runtime/core/eval/mixins/types.d.ts +2 -1
- package/dist/runtime/core/eval/mixins/types.js +222 -200
- package/dist/runtime/core/eval/mixins/use.d.ts +0 -1
- package/dist/runtime/core/eval/mixins/use.js +0 -1
- package/dist/runtime/core/eval/mixins/variables.d.ts +0 -1
- package/dist/runtime/core/eval/mixins/variables.js +6 -7
- package/dist/runtime/core/eval/types.d.ts +0 -1
- package/dist/runtime/core/eval/types.js +0 -1
- package/dist/runtime/core/execute.d.ts +0 -1
- package/dist/runtime/core/execute.js +0 -1
- package/dist/runtime/core/field-descriptor.d.ts +2 -3
- package/dist/runtime/core/field-descriptor.js +0 -1
- package/dist/runtime/core/introspection.d.ts +0 -1
- package/dist/runtime/core/introspection.js +0 -1
- package/dist/runtime/core/resolvers.d.ts +0 -1
- package/dist/runtime/core/resolvers.js +0 -1
- package/dist/runtime/core/signals.d.ts +0 -1
- package/dist/runtime/core/signals.js +0 -1
- package/dist/runtime/core/types.d.ts +0 -1
- package/dist/runtime/core/types.js +0 -1
- package/dist/runtime/core/values.d.ts +59 -8
- package/dist/runtime/core/values.js +338 -36
- package/dist/runtime/ext/builtins.d.ts +0 -1
- package/dist/runtime/ext/builtins.js +43 -17
- package/dist/runtime/ext/extensions.d.ts +0 -1
- package/dist/runtime/ext/extensions.js +0 -1
- package/dist/runtime/index.d.ts +2 -3
- package/dist/runtime/index.js +1 -2
- package/dist/signature-parser.d.ts +0 -1
- package/dist/signature-parser.js +8 -4
- package/dist/source-location.d.ts +0 -1
- package/dist/source-location.js +0 -1
- package/dist/token-types.d.ts +0 -1
- package/dist/token-types.js +0 -1
- package/dist/types.d.ts +0 -1
- package/dist/types.js +0 -1
- package/dist/value-types.d.ts +15 -12
- package/dist/value-types.js +0 -1
- package/package.json +2 -1
- package/dist/ast-nodes.d.ts.map +0 -1
- package/dist/ast-nodes.js.map +0 -1
- package/dist/ast-unions.d.ts.map +0 -1
- package/dist/ast-unions.js.map +0 -1
- package/dist/constants.d.ts.map +0 -1
- package/dist/constants.js.map +0 -1
- package/dist/error-classes.d.ts.map +0 -1
- package/dist/error-classes.js.map +0 -1
- package/dist/error-formatter.d.ts.map +0 -1
- package/dist/error-formatter.js.map +0 -1
- package/dist/error-registry.d.ts.map +0 -1
- package/dist/error-registry.js.map +0 -1
- package/dist/ext/crypto/index.d.ts.map +0 -1
- package/dist/ext/crypto/index.js.map +0 -1
- package/dist/ext/exec/index.d.ts.map +0 -1
- package/dist/ext/exec/index.js.map +0 -1
- package/dist/ext/exec/runner.d.ts.map +0 -1
- package/dist/ext/exec/runner.js.map +0 -1
- package/dist/ext/fetch/index.d.ts.map +0 -1
- package/dist/ext/fetch/index.js.map +0 -1
- package/dist/ext/fetch/request.d.ts.map +0 -1
- package/dist/ext/fetch/request.js.map +0 -1
- package/dist/ext/fs/index.d.ts.map +0 -1
- package/dist/ext/fs/index.js.map +0 -1
- package/dist/ext/fs/sandbox.d.ts.map +0 -1
- package/dist/ext/fs/sandbox.js.map +0 -1
- package/dist/ext/kv/index.d.ts.map +0 -1
- package/dist/ext/kv/index.js.map +0 -1
- package/dist/ext/kv/store.d.ts.map +0 -1
- package/dist/ext/kv/store.js.map +0 -1
- package/dist/generated/introspection-data.d.ts.map +0 -1
- package/dist/generated/introspection-data.js.map +0 -1
- package/dist/generated/version-data.d.ts.map +0 -1
- package/dist/generated/version-data.js.map +0 -1
- package/dist/highlight-map.d.ts.map +0 -1
- package/dist/highlight-map.js.map +0 -1
- package/dist/index.d.ts.map +0 -1
- package/dist/index.js.map +0 -1
- package/dist/lexer/errors.d.ts.map +0 -1
- package/dist/lexer/errors.js.map +0 -1
- package/dist/lexer/helpers.d.ts.map +0 -1
- package/dist/lexer/helpers.js.map +0 -1
- package/dist/lexer/index.d.ts.map +0 -1
- package/dist/lexer/index.js.map +0 -1
- package/dist/lexer/operators.d.ts.map +0 -1
- package/dist/lexer/operators.js.map +0 -1
- package/dist/lexer/readers.d.ts.map +0 -1
- package/dist/lexer/readers.js.map +0 -1
- package/dist/lexer/state.d.ts.map +0 -1
- package/dist/lexer/state.js.map +0 -1
- package/dist/lexer/tokenizer.d.ts.map +0 -1
- package/dist/lexer/tokenizer.js.map +0 -1
- package/dist/parser/helpers.d.ts.map +0 -1
- package/dist/parser/helpers.js.map +0 -1
- package/dist/parser/index.d.ts.map +0 -1
- package/dist/parser/index.js.map +0 -1
- package/dist/parser/parser-collect.d.ts.map +0 -1
- package/dist/parser/parser-collect.js.map +0 -1
- package/dist/parser/parser-control.d.ts.map +0 -1
- package/dist/parser/parser-control.js.map +0 -1
- package/dist/parser/parser-expr.d.ts.map +0 -1
- package/dist/parser/parser-expr.js.map +0 -1
- package/dist/parser/parser-extract.d.ts.map +0 -1
- package/dist/parser/parser-extract.js.map +0 -1
- package/dist/parser/parser-functions.d.ts.map +0 -1
- package/dist/parser/parser-functions.js.map +0 -1
- package/dist/parser/parser-literals.d.ts.map +0 -1
- package/dist/parser/parser-literals.js.map +0 -1
- package/dist/parser/parser-script.d.ts.map +0 -1
- package/dist/parser/parser-script.js.map +0 -1
- package/dist/parser/parser-shape.d.ts.map +0 -1
- package/dist/parser/parser-shape.js.map +0 -1
- package/dist/parser/parser-types.d.ts.map +0 -1
- package/dist/parser/parser-types.js.map +0 -1
- package/dist/parser/parser-use.d.ts.map +0 -1
- package/dist/parser/parser-use.js.map +0 -1
- package/dist/parser/parser-variables.d.ts.map +0 -1
- package/dist/parser/parser-variables.js.map +0 -1
- package/dist/parser/parser.d.ts.map +0 -1
- package/dist/parser/parser.js.map +0 -1
- package/dist/parser/state.d.ts.map +0 -1
- package/dist/parser/state.js.map +0 -1
- package/dist/runtime/core/callable.d.ts.map +0 -1
- package/dist/runtime/core/callable.js.map +0 -1
- package/dist/runtime/core/context.d.ts.map +0 -1
- package/dist/runtime/core/context.js.map +0 -1
- package/dist/runtime/core/equals.d.ts.map +0 -1
- package/dist/runtime/core/equals.js.map +0 -1
- package/dist/runtime/core/eval/base.d.ts.map +0 -1
- package/dist/runtime/core/eval/base.js.map +0 -1
- package/dist/runtime/core/eval/evaluator.d.ts.map +0 -1
- package/dist/runtime/core/eval/evaluator.js.map +0 -1
- package/dist/runtime/core/eval/index.d.ts.map +0 -1
- package/dist/runtime/core/eval/index.js.map +0 -1
- package/dist/runtime/core/eval/mixins/annotations.d.ts.map +0 -1
- package/dist/runtime/core/eval/mixins/annotations.js.map +0 -1
- package/dist/runtime/core/eval/mixins/closures.d.ts.map +0 -1
- package/dist/runtime/core/eval/mixins/closures.js.map +0 -1
- package/dist/runtime/core/eval/mixins/collections.d.ts.map +0 -1
- package/dist/runtime/core/eval/mixins/collections.js.map +0 -1
- package/dist/runtime/core/eval/mixins/control-flow.d.ts.map +0 -1
- package/dist/runtime/core/eval/mixins/control-flow.js.map +0 -1
- package/dist/runtime/core/eval/mixins/conversion.d.ts.map +0 -1
- package/dist/runtime/core/eval/mixins/conversion.js.map +0 -1
- package/dist/runtime/core/eval/mixins/core.d.ts.map +0 -1
- package/dist/runtime/core/eval/mixins/core.js.map +0 -1
- package/dist/runtime/core/eval/mixins/expressions.d.ts.map +0 -1
- package/dist/runtime/core/eval/mixins/expressions.js.map +0 -1
- package/dist/runtime/core/eval/mixins/extraction.d.ts.map +0 -1
- package/dist/runtime/core/eval/mixins/extraction.js.map +0 -1
- package/dist/runtime/core/eval/mixins/list-dispatch.d.ts.map +0 -1
- package/dist/runtime/core/eval/mixins/list-dispatch.js.map +0 -1
- package/dist/runtime/core/eval/mixins/literals.d.ts.map +0 -1
- package/dist/runtime/core/eval/mixins/literals.js.map +0 -1
- package/dist/runtime/core/eval/mixins/types.d.ts.map +0 -1
- package/dist/runtime/core/eval/mixins/types.js.map +0 -1
- package/dist/runtime/core/eval/mixins/use.d.ts.map +0 -1
- package/dist/runtime/core/eval/mixins/use.js.map +0 -1
- package/dist/runtime/core/eval/mixins/variables.d.ts.map +0 -1
- package/dist/runtime/core/eval/mixins/variables.js.map +0 -1
- package/dist/runtime/core/eval/types.d.ts.map +0 -1
- package/dist/runtime/core/eval/types.js.map +0 -1
- package/dist/runtime/core/execute.d.ts.map +0 -1
- package/dist/runtime/core/execute.js.map +0 -1
- package/dist/runtime/core/field-descriptor.d.ts.map +0 -1
- package/dist/runtime/core/field-descriptor.js.map +0 -1
- package/dist/runtime/core/introspection.d.ts.map +0 -1
- package/dist/runtime/core/introspection.js.map +0 -1
- package/dist/runtime/core/resolvers.d.ts.map +0 -1
- package/dist/runtime/core/resolvers.js.map +0 -1
- package/dist/runtime/core/signals.d.ts.map +0 -1
- package/dist/runtime/core/signals.js.map +0 -1
- package/dist/runtime/core/types.d.ts.map +0 -1
- package/dist/runtime/core/types.js.map +0 -1
- package/dist/runtime/core/values.d.ts.map +0 -1
- package/dist/runtime/core/values.js.map +0 -1
- package/dist/runtime/ext/builtins.d.ts.map +0 -1
- package/dist/runtime/ext/builtins.js.map +0 -1
- package/dist/runtime/ext/extensions.d.ts.map +0 -1
- package/dist/runtime/ext/extensions.js.map +0 -1
- package/dist/runtime/index.d.ts.map +0 -1
- package/dist/runtime/index.js.map +0 -1
- package/dist/signature-parser.d.ts.map +0 -1
- package/dist/signature-parser.js.map +0 -1
- package/dist/source-location.d.ts.map +0 -1
- package/dist/source-location.js.map +0 -1
- package/dist/token-types.d.ts.map +0 -1
- package/dist/token-types.js.map +0 -1
- package/dist/types.d.ts.map +0 -1
- package/dist/types.js.map +0 -1
- package/dist/value-types.d.ts.map +0 -1
- package/dist/value-types.js.map +0 -1
|
@@ -12,6 +12,8 @@
|
|
|
12
12
|
* - evaluateTypeCheckPrimary(node) -> Promise<boolean>
|
|
13
13
|
* - evaluateTypeConstructor(node) -> Promise<RillTypeValue> [IR-7]
|
|
14
14
|
* - evaluateClosureSigLiteral(node) -> Promise<RillTypeValue> [IR-8]
|
|
15
|
+
* - resolveTypeRef(typeRef, getVariable) -> Promise<RillTypeValue> [IR-2]
|
|
16
|
+
* - buildCollectionType(name, args, resolveArg, evaluateDefault, location?) -> Promise<RillTypeValue> [IR-4]
|
|
15
17
|
*
|
|
16
18
|
* Error Handling:
|
|
17
19
|
* - Type assertion failures throw RuntimeError(RUNTIME_TYPE_ERROR) [EC-24]
|
|
@@ -23,6 +25,19 @@
|
|
|
23
25
|
import { RuntimeError } from '../../../../types.js';
|
|
24
26
|
import { inferType, checkType, isTypeValue, structuralTypeMatches, inferStructuralType, formatStructuralType, } from '../../values.js';
|
|
25
27
|
import { getVariable } from '../../context.js';
|
|
28
|
+
/**
|
|
29
|
+
* Leaf types that reject all type arguments.
|
|
30
|
+
* Extracted as module-level constant to avoid per-call allocation.
|
|
31
|
+
*/
|
|
32
|
+
const LEAF_TYPES = new Set([
|
|
33
|
+
'string',
|
|
34
|
+
'number',
|
|
35
|
+
'bool',
|
|
36
|
+
'vector',
|
|
37
|
+
'type',
|
|
38
|
+
'any',
|
|
39
|
+
'closure',
|
|
40
|
+
]);
|
|
26
41
|
/**
|
|
27
42
|
* TypesMixin implementation.
|
|
28
43
|
*
|
|
@@ -34,6 +49,7 @@ import { getVariable } from '../../context.js';
|
|
|
34
49
|
* - EvaluatorBase: ctx, checkAborted(), getNodeLocation()
|
|
35
50
|
* - evaluatePostfixExpr() (from future CoreMixin composition)
|
|
36
51
|
* - evaluateExpression() (from CoreMixin, for type constructor arg evaluation)
|
|
52
|
+
* - evaluatePrimary() (from CoreMixin, for default value evaluation)
|
|
37
53
|
*
|
|
38
54
|
* Methods added:
|
|
39
55
|
* - assertType(value, expected, location?) -> RillValue
|
|
@@ -43,133 +59,227 @@ import { getVariable } from '../../context.js';
|
|
|
43
59
|
* - evaluateTypeCheckPrimary(node) -> Promise<boolean>
|
|
44
60
|
* - evaluateTypeConstructor(node) -> Promise<RillTypeValue>
|
|
45
61
|
* - evaluateClosureSigLiteral(node) -> Promise<RillTypeValue>
|
|
62
|
+
* - resolveTypeRef(typeRef, getVariable) -> Promise<RillTypeValue>
|
|
63
|
+
* - buildCollectionType(name, args, resolveArg, evaluateDefault, location?) -> Promise<RillTypeValue>
|
|
46
64
|
*/
|
|
47
65
|
function createTypesMixin(Base) {
|
|
48
66
|
return class TypesEvaluator extends Base {
|
|
49
67
|
/**
|
|
50
|
-
*
|
|
68
|
+
* Shared helper that partitions args, enforces validation, evaluates
|
|
69
|
+
* defaults, and constructs a RillTypeValue [IR-4].
|
|
51
70
|
*
|
|
52
|
-
*
|
|
53
|
-
*
|
|
54
|
-
* Dynamic refs call getVariable, then dispatch on the result:
|
|
55
|
-
* - RillTypeValue → return as-is
|
|
56
|
-
* - Otherwise → throw RILL-R004
|
|
71
|
+
* Called by both resolveTypeRef and evaluateTypeConstructor with
|
|
72
|
+
* different resolution/evaluation strategies via callbacks.
|
|
57
73
|
*
|
|
58
|
-
*
|
|
59
|
-
* EC-
|
|
60
|
-
* EC-
|
|
61
|
-
* EC-
|
|
62
|
-
* EC-
|
|
63
|
-
* EC-
|
|
64
|
-
* EC-
|
|
74
|
+
* Error contracts:
|
|
75
|
+
* - EC-B1: Leaf type with args -> RILL-R004
|
|
76
|
+
* - EC-B2: list != 1 arg -> RILL-R004
|
|
77
|
+
* - EC-B3: Positional+named mix -> RILL-R004
|
|
78
|
+
* - EC-B4: tuple with named arg -> RILL-R004
|
|
79
|
+
* - EC-B5: Non-type arg value (delegated to resolveArg callback)
|
|
80
|
+
* - EC-B6: Default type mismatch -> RILL-R004
|
|
81
|
+
* - EC-B7: Tuple non-trailing default -> RILL-R004
|
|
65
82
|
*/
|
|
66
|
-
|
|
67
|
-
if (
|
|
68
|
-
|
|
69
|
-
|
|
70
|
-
|
|
71
|
-
return Object.freeze({
|
|
72
|
-
__rill_type: true,
|
|
73
|
-
typeName,
|
|
74
|
-
structure: { type: typeName },
|
|
75
|
-
});
|
|
83
|
+
async buildCollectionType(name, args, resolveArg, evaluateDefault, location) {
|
|
84
|
+
if (name === 'list') {
|
|
85
|
+
// EC-B2: list requires exactly 1 positional arg
|
|
86
|
+
if (args.length !== 1 || args[0].name !== undefined) {
|
|
87
|
+
throw new RuntimeError('RILL-R004', 'list() requires exactly 1 type argument', location);
|
|
76
88
|
}
|
|
77
|
-
|
|
78
|
-
const
|
|
79
|
-
|
|
80
|
-
|
|
81
|
-
|
|
82
|
-
|
|
83
|
-
|
|
84
|
-
|
|
85
|
-
|
|
86
|
-
|
|
87
|
-
|
|
88
|
-
|
|
89
|
+
const element = await resolveArg(args[0]);
|
|
90
|
+
const structure = { type: 'list', element };
|
|
91
|
+
return Object.freeze({
|
|
92
|
+
__rill_type: true,
|
|
93
|
+
typeName: name,
|
|
94
|
+
structure,
|
|
95
|
+
});
|
|
96
|
+
}
|
|
97
|
+
if (name === 'dict' || name === 'ordered') {
|
|
98
|
+
const positional = args.filter((a) => a.name === undefined);
|
|
99
|
+
const named = args.filter((a) => a.name !== undefined);
|
|
100
|
+
// EC-B3: Cannot mix positional and named arguments
|
|
101
|
+
if (positional.length > 0 && named.length > 0) {
|
|
102
|
+
throw new RuntimeError('RILL-R004', `${name}() cannot mix positional and named arguments`, location);
|
|
89
103
|
}
|
|
90
|
-
//
|
|
91
|
-
|
|
92
|
-
const
|
|
93
|
-
|
|
94
|
-
|
|
95
|
-
|
|
96
|
-
|
|
97
|
-
|
|
98
|
-
|
|
104
|
+
// Uniform path: exactly 1 positional, 0 named -> valueType
|
|
105
|
+
if (positional.length === 1 && named.length === 0) {
|
|
106
|
+
const valueType = await resolveArg(positional[0]);
|
|
107
|
+
// EC-B6: Default type mismatch on uniform single-arg path
|
|
108
|
+
if (positional[0].defaultValue !== undefined) {
|
|
109
|
+
const defaultVal = await evaluateDefault(positional[0].defaultValue);
|
|
110
|
+
if (!structuralTypeMatches(defaultVal, valueType)) {
|
|
111
|
+
throw new RuntimeError('RILL-R004', `Default value for ${name} element must be ${formatStructuralType(valueType)}, got ${inferType(defaultVal)}`, location);
|
|
112
|
+
}
|
|
99
113
|
}
|
|
100
|
-
const structure = {
|
|
101
|
-
type: 'list',
|
|
102
|
-
element: resolveArg(args[0]),
|
|
103
|
-
};
|
|
114
|
+
const structure = { type: name, valueType };
|
|
104
115
|
return Object.freeze({
|
|
105
116
|
__rill_type: true,
|
|
106
|
-
typeName,
|
|
117
|
+
typeName: name,
|
|
107
118
|
structure,
|
|
108
119
|
});
|
|
109
120
|
}
|
|
110
|
-
|
|
111
|
-
|
|
112
|
-
|
|
113
|
-
|
|
114
|
-
|
|
115
|
-
|
|
116
|
-
}
|
|
121
|
+
// EC: dict/ordered with 2+ positional args
|
|
122
|
+
if (positional.length >= 2) {
|
|
123
|
+
throw new RuntimeError('RILL-R004', `${name}() requires exactly 1 positional type argument`, location);
|
|
124
|
+
}
|
|
125
|
+
// Structural path: named args only -> fields
|
|
126
|
+
if (name === 'dict') {
|
|
117
127
|
const fields = {};
|
|
118
128
|
for (const arg of args) {
|
|
119
|
-
|
|
129
|
+
const resolvedType = await resolveArg(arg);
|
|
130
|
+
const fieldDef = { type: resolvedType };
|
|
131
|
+
if (arg.defaultValue !== undefined) {
|
|
132
|
+
const defaultVal = await evaluateDefault(arg.defaultValue);
|
|
133
|
+
// EC-B6: Default type mismatch
|
|
134
|
+
if (!structuralTypeMatches(defaultVal, resolvedType)) {
|
|
135
|
+
throw new RuntimeError('RILL-R004', `Default value for field '${arg.name}' must be ${formatStructuralType(resolvedType)}, got ${inferType(defaultVal)}`, location);
|
|
136
|
+
}
|
|
137
|
+
fieldDef.defaultValue = defaultVal;
|
|
138
|
+
}
|
|
139
|
+
fields[arg.name] = fieldDef;
|
|
120
140
|
}
|
|
121
141
|
const structure = { type: 'dict', fields };
|
|
122
142
|
return Object.freeze({
|
|
123
143
|
__rill_type: true,
|
|
124
|
-
typeName,
|
|
144
|
+
typeName: name,
|
|
125
145
|
structure,
|
|
126
146
|
});
|
|
127
147
|
}
|
|
128
|
-
|
|
129
|
-
|
|
130
|
-
|
|
131
|
-
|
|
132
|
-
|
|
148
|
+
// name === 'ordered': structural path -> fields array with name
|
|
149
|
+
const orderedFields = [];
|
|
150
|
+
for (const arg of args) {
|
|
151
|
+
const resolvedType = await resolveArg(arg);
|
|
152
|
+
const fieldDef = {
|
|
153
|
+
name: arg.name,
|
|
154
|
+
type: resolvedType,
|
|
155
|
+
};
|
|
156
|
+
if (arg.defaultValue !== undefined) {
|
|
157
|
+
const defaultVal = await evaluateDefault(arg.defaultValue);
|
|
158
|
+
// EC-B6: Default type mismatch
|
|
159
|
+
if (!structuralTypeMatches(defaultVal, resolvedType)) {
|
|
160
|
+
throw new RuntimeError('RILL-R004', `Default value for field '${arg.name}' must be ${formatStructuralType(resolvedType)}, got ${inferType(defaultVal)}`, location);
|
|
133
161
|
}
|
|
162
|
+
fieldDef.defaultValue = defaultVal;
|
|
134
163
|
}
|
|
135
|
-
|
|
136
|
-
const structure = { type: 'tuple', elements };
|
|
137
|
-
return Object.freeze({
|
|
138
|
-
__rill_type: true,
|
|
139
|
-
typeName,
|
|
140
|
-
structure,
|
|
141
|
-
});
|
|
164
|
+
orderedFields.push(fieldDef);
|
|
142
165
|
}
|
|
143
|
-
|
|
144
|
-
|
|
145
|
-
|
|
146
|
-
|
|
147
|
-
|
|
166
|
+
const structure = { type: 'ordered', fields: orderedFields };
|
|
167
|
+
return Object.freeze({
|
|
168
|
+
__rill_type: true,
|
|
169
|
+
typeName: name,
|
|
170
|
+
structure,
|
|
171
|
+
});
|
|
172
|
+
}
|
|
173
|
+
// name === 'tuple'
|
|
174
|
+
// EC-B4: tuple requires positional args only
|
|
175
|
+
for (const arg of args) {
|
|
176
|
+
if (arg.name !== undefined) {
|
|
177
|
+
throw new RuntimeError('RILL-R004', 'tuple() requires positional arguments', location);
|
|
178
|
+
}
|
|
179
|
+
}
|
|
180
|
+
// Uniform path: exactly 1 positional -> valueType
|
|
181
|
+
if (args.length === 1 && args[0].name === undefined) {
|
|
182
|
+
const valueType = await resolveArg(args[0]);
|
|
183
|
+
// EC-B6: Default type mismatch on uniform single-arg path
|
|
184
|
+
if (args[0].defaultValue !== undefined) {
|
|
185
|
+
const defaultVal = await evaluateDefault(args[0].defaultValue);
|
|
186
|
+
if (!structuralTypeMatches(defaultVal, valueType)) {
|
|
187
|
+
throw new RuntimeError('RILL-R004', `Default value for tuple element must be ${formatStructuralType(valueType)}, got ${inferType(defaultVal)}`, location);
|
|
148
188
|
}
|
|
149
189
|
}
|
|
150
|
-
const
|
|
151
|
-
arg.name,
|
|
152
|
-
resolveArg(arg),
|
|
153
|
-
]);
|
|
154
|
-
const structure = {
|
|
155
|
-
type: 'ordered',
|
|
156
|
-
fields: orderedFields,
|
|
157
|
-
};
|
|
190
|
+
const structure = { type: 'tuple', valueType };
|
|
158
191
|
return Object.freeze({
|
|
159
192
|
__rill_type: true,
|
|
160
|
-
typeName,
|
|
193
|
+
typeName: 'tuple',
|
|
161
194
|
structure,
|
|
162
195
|
});
|
|
163
196
|
}
|
|
164
|
-
//
|
|
197
|
+
// Structural path: 2+ positional -> elements
|
|
198
|
+
const elements = [];
|
|
199
|
+
for (const arg of args) {
|
|
200
|
+
const resolvedType = await resolveArg(arg);
|
|
201
|
+
const fieldDef = { type: resolvedType };
|
|
202
|
+
if (arg.defaultValue !== undefined) {
|
|
203
|
+
const defaultVal = await evaluateDefault(arg.defaultValue);
|
|
204
|
+
// EC-B6: Default type mismatch
|
|
205
|
+
if (!structuralTypeMatches(defaultVal, resolvedType)) {
|
|
206
|
+
throw new RuntimeError('RILL-R004', `Default value for tuple element must be ${formatStructuralType(resolvedType)}, got ${inferType(defaultVal)}`, location);
|
|
207
|
+
}
|
|
208
|
+
fieldDef.defaultValue = defaultVal;
|
|
209
|
+
}
|
|
210
|
+
elements.push(fieldDef);
|
|
211
|
+
}
|
|
212
|
+
// EC-B7: Tuple non-trailing default — no element without a default
|
|
213
|
+
// may follow an element that has one.
|
|
214
|
+
let sawDefault = false;
|
|
215
|
+
for (let i = 0; i < elements.length; i++) {
|
|
216
|
+
const hasDefault = elements[i].defaultValue !== undefined;
|
|
217
|
+
if (hasDefault) {
|
|
218
|
+
sawDefault = true;
|
|
219
|
+
}
|
|
220
|
+
else if (sawDefault) {
|
|
221
|
+
throw new RuntimeError('RILL-R004', `tuple() default values must be trailing: element at position ${i} has no default but a preceding element does`, location);
|
|
222
|
+
}
|
|
223
|
+
}
|
|
224
|
+
const structure = { type: 'tuple', elements };
|
|
225
|
+
return Object.freeze({
|
|
226
|
+
__rill_type: true,
|
|
227
|
+
typeName: 'tuple',
|
|
228
|
+
structure,
|
|
229
|
+
});
|
|
230
|
+
}
|
|
231
|
+
/**
|
|
232
|
+
* Resolve a TypeRef to a RillTypeValue [IR-2].
|
|
233
|
+
*
|
|
234
|
+
* Static refs with no args return a frozen RillTypeValue directly.
|
|
235
|
+
* Static refs with args delegate to buildCollectionType.
|
|
236
|
+
* Dynamic refs call getVariable, then dispatch on the result:
|
|
237
|
+
* - RillTypeValue -> return as-is
|
|
238
|
+
* - Otherwise -> throw RILL-R004
|
|
239
|
+
*
|
|
240
|
+
* EC-3: Variable not found -> RILL-R005.
|
|
241
|
+
* EC-4: Non-type variable value -> RILL-R004.
|
|
242
|
+
* EC-5: list with != 1 positional arg -> RILL-R004.
|
|
243
|
+
* EC-6: dict/ordered positional+named mix -> RILL-R004.
|
|
244
|
+
* EC-7: tuple with named arg -> RILL-R004.
|
|
245
|
+
* EC-8: Default type mismatch -> RILL-R004.
|
|
246
|
+
* EC-9: Default evaluation failure -> propagated.
|
|
247
|
+
* EC-10: Tuple non-trailing default -> RILL-R004.
|
|
248
|
+
*/
|
|
249
|
+
async resolveTypeRef(typeRef, getVariableFn) {
|
|
250
|
+
if (typeRef.kind === 'static') {
|
|
251
|
+
const { typeName, args } = typeRef;
|
|
252
|
+
// No args: existing bare-type behavior
|
|
253
|
+
if (!args || args.length === 0) {
|
|
254
|
+
return Object.freeze({
|
|
255
|
+
__rill_type: true,
|
|
256
|
+
typeName,
|
|
257
|
+
structure: { type: typeName },
|
|
258
|
+
});
|
|
259
|
+
}
|
|
260
|
+
// EC-B1: Leaf types reject all type arguments
|
|
261
|
+
if (LEAF_TYPES.has(typeName)) {
|
|
262
|
+
throw new RuntimeError('RILL-R004', `${typeName} does not accept type arguments`);
|
|
263
|
+
}
|
|
264
|
+
// Delegate to buildCollectionType with recursive resolveTypeRef
|
|
265
|
+
return this.buildCollectionType(typeName, args, async (arg) => {
|
|
266
|
+
const resolved = await this.resolveTypeRef(arg.value, getVariableFn);
|
|
267
|
+
return resolved.structure;
|
|
268
|
+
}, async (node) => {
|
|
269
|
+
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
270
|
+
return this.evaluatePrimary(node);
|
|
271
|
+
});
|
|
272
|
+
}
|
|
273
|
+
// Union type ref: (A | B) -- resolve each member recursively and
|
|
165
274
|
// return a RillTypeValue with structure: { type: 'union', members: [...] }.
|
|
166
275
|
// typeName is set to a display string for error messages; the structure
|
|
167
276
|
// field carries the authoritative type shape for validation (DR-1).
|
|
168
277
|
if (typeRef.kind === 'union') {
|
|
169
|
-
const members =
|
|
170
|
-
|
|
171
|
-
|
|
172
|
-
|
|
278
|
+
const members = [];
|
|
279
|
+
for (const member of typeRef.members) {
|
|
280
|
+
const resolved = await this.resolveTypeRef(member, getVariableFn);
|
|
281
|
+
members.push(resolved.structure);
|
|
282
|
+
}
|
|
173
283
|
const structure = { type: 'union', members };
|
|
174
284
|
const displayName = members
|
|
175
285
|
.map(formatStructuralType)
|
|
@@ -180,7 +290,7 @@ function createTypesMixin(Base) {
|
|
|
180
290
|
structure,
|
|
181
291
|
});
|
|
182
292
|
}
|
|
183
|
-
const result =
|
|
293
|
+
const result = getVariableFn(typeRef.varName);
|
|
184
294
|
if (result === undefined) {
|
|
185
295
|
throw new RuntimeError('RILL-R005', `Variable $${typeRef.varName} is not defined`);
|
|
186
296
|
}
|
|
@@ -202,7 +312,8 @@ function createTypesMixin(Base) {
|
|
|
202
312
|
const hasSubFields = 'element' in expected ||
|
|
203
313
|
'fields' in expected ||
|
|
204
314
|
'elements' in expected ||
|
|
205
|
-
'members' in expected
|
|
315
|
+
'members' in expected ||
|
|
316
|
+
'valueType' in expected;
|
|
206
317
|
if (hasSubFields) {
|
|
207
318
|
if (!structuralTypeMatches(value, expected)) {
|
|
208
319
|
const expectedStr = formatStructuralType(expected);
|
|
@@ -234,7 +345,7 @@ function createTypesMixin(Base) {
|
|
|
234
345
|
? // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
235
346
|
await this.evaluatePostfixExpr(node.operand)
|
|
236
347
|
: input;
|
|
237
|
-
const resolved = this.resolveTypeRef(node.typeRef, (name) => getVariable(this.ctx, name));
|
|
348
|
+
const resolved = await this.resolveTypeRef(node.typeRef, (name) => getVariable(this.ctx, name));
|
|
238
349
|
return this.assertType(value, resolved.structure, node.span.start);
|
|
239
350
|
}
|
|
240
351
|
/**
|
|
@@ -248,11 +359,12 @@ function createTypesMixin(Base) {
|
|
|
248
359
|
? // eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
249
360
|
await this.evaluatePostfixExpr(node.operand)
|
|
250
361
|
: input;
|
|
251
|
-
const resolved = this.resolveTypeRef(node.typeRef, (name) => getVariable(this.ctx, name));
|
|
362
|
+
const resolved = await this.resolveTypeRef(node.typeRef, (name) => getVariable(this.ctx, name));
|
|
252
363
|
const hasSubFields = 'element' in resolved.structure ||
|
|
253
364
|
'fields' in resolved.structure ||
|
|
254
365
|
'elements' in resolved.structure ||
|
|
255
|
-
'members' in resolved.structure
|
|
366
|
+
'members' in resolved.structure ||
|
|
367
|
+
'valueType' in resolved.structure;
|
|
256
368
|
if (hasSubFields) {
|
|
257
369
|
return structuralTypeMatches(value, resolved.structure);
|
|
258
370
|
}
|
|
@@ -285,115 +397,26 @@ function createTypesMixin(Base) {
|
|
|
285
397
|
/**
|
|
286
398
|
* Evaluate a type constructor node into a RillTypeValue [IR-7].
|
|
287
399
|
*
|
|
288
|
-
* Handles list(T), dict(
|
|
289
|
-
*
|
|
400
|
+
* Handles list(T), dict(...), tuple(...), ordered(...).
|
|
401
|
+
* Delegates to buildCollectionType with evaluateTypeConstructor-specific
|
|
402
|
+
* resolution strategy (resolves TypeRef via resolveTypeRef, evaluates
|
|
403
|
+
* defaults via evaluatePrimary).
|
|
290
404
|
*
|
|
291
|
-
* Error contracts
|
|
292
|
-
* - EC-4: list() with != 1 arg -> RILL-R004
|
|
293
|
-
* - EC-5: non-type argument -> RILL-R004
|
|
294
|
-
* - EC-6: positional arg in dict/ordered -> RILL-R004
|
|
295
|
-
* - EC-7: named arg in tuple -> RILL-R004
|
|
405
|
+
* Error contracts delegated to buildCollectionType.
|
|
296
406
|
*/
|
|
297
407
|
async evaluateTypeConstructor(node) {
|
|
298
408
|
const name = node.constructorName;
|
|
299
409
|
const location = node.span.start;
|
|
300
|
-
|
|
301
|
-
|
|
302
|
-
|
|
303
|
-
|
|
304
|
-
|
|
305
|
-
|
|
306
|
-
|
|
307
|
-
? { type: argValue.typeName }
|
|
308
|
-
: argValue.structure;
|
|
309
|
-
};
|
|
310
|
-
if (name === 'list') {
|
|
311
|
-
// EC-4: list() requires exactly 1 argument
|
|
312
|
-
if (node.args.length !== 1) {
|
|
313
|
-
throw new RuntimeError('RILL-R004', 'list() requires exactly 1 type argument', location);
|
|
314
|
-
}
|
|
315
|
-
const arg = node.args[0];
|
|
410
|
+
return this.buildCollectionType(name, node.args, async (arg) => {
|
|
411
|
+
const resolved = await this.resolveTypeRef(arg.value, (varName) => getVariable(this.ctx, varName));
|
|
412
|
+
return resolved.structure.type === 'any' &&
|
|
413
|
+
resolved.typeName !== 'any'
|
|
414
|
+
? { type: resolved.typeName }
|
|
415
|
+
: resolved.structure;
|
|
416
|
+
}, async (node) => {
|
|
316
417
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
317
|
-
|
|
318
|
-
|
|
319
|
-
const structure = {
|
|
320
|
-
type: 'list',
|
|
321
|
-
element: elementType,
|
|
322
|
-
};
|
|
323
|
-
return Object.freeze({
|
|
324
|
-
__rill_type: true,
|
|
325
|
-
typeName: 'list',
|
|
326
|
-
structure,
|
|
327
|
-
});
|
|
328
|
-
}
|
|
329
|
-
if (name === 'dict') {
|
|
330
|
-
// EC-6: dict() requires named arguments
|
|
331
|
-
for (const arg of node.args) {
|
|
332
|
-
if (arg.kind === 'positional') {
|
|
333
|
-
throw new RuntimeError('RILL-R004', 'dict() requires named arguments (field: type)', location);
|
|
334
|
-
}
|
|
335
|
-
}
|
|
336
|
-
const fields = {};
|
|
337
|
-
for (const arg of node.args) {
|
|
338
|
-
if (arg.kind === 'named') {
|
|
339
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
340
|
-
const argVal = await this.evaluateExpression(arg.value);
|
|
341
|
-
fields[arg.name] = await resolveArgAsType(argVal);
|
|
342
|
-
}
|
|
343
|
-
}
|
|
344
|
-
const structure = { type: 'dict', fields };
|
|
345
|
-
return Object.freeze({
|
|
346
|
-
__rill_type: true,
|
|
347
|
-
typeName: 'dict',
|
|
348
|
-
structure,
|
|
349
|
-
});
|
|
350
|
-
}
|
|
351
|
-
if (name === 'tuple') {
|
|
352
|
-
// EC-7: tuple() requires positional arguments
|
|
353
|
-
for (const arg of node.args) {
|
|
354
|
-
if (arg.kind === 'named') {
|
|
355
|
-
throw new RuntimeError('RILL-R004', 'tuple() requires positional arguments', location);
|
|
356
|
-
}
|
|
357
|
-
}
|
|
358
|
-
const elements = [];
|
|
359
|
-
for (const arg of node.args) {
|
|
360
|
-
if (arg.kind === 'positional') {
|
|
361
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
362
|
-
const argVal = await this.evaluateExpression(arg.value);
|
|
363
|
-
elements.push(await resolveArgAsType(argVal));
|
|
364
|
-
}
|
|
365
|
-
}
|
|
366
|
-
const structure = { type: 'tuple', elements };
|
|
367
|
-
return Object.freeze({
|
|
368
|
-
__rill_type: true,
|
|
369
|
-
typeName: 'tuple',
|
|
370
|
-
structure,
|
|
371
|
-
});
|
|
372
|
-
}
|
|
373
|
-
// name === 'ordered'
|
|
374
|
-
// EC-6: ordered() requires named arguments
|
|
375
|
-
for (const arg of node.args) {
|
|
376
|
-
if (arg.kind === 'positional') {
|
|
377
|
-
throw new RuntimeError('RILL-R004', 'ordered() requires named arguments (field: type)', location);
|
|
378
|
-
}
|
|
379
|
-
}
|
|
380
|
-
const orderedFields = [];
|
|
381
|
-
for (const arg of node.args) {
|
|
382
|
-
if (arg.kind === 'named') {
|
|
383
|
-
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
384
|
-
const argVal = await this.evaluateExpression(arg.value);
|
|
385
|
-
orderedFields.push([arg.name, await resolveArgAsType(argVal)]);
|
|
386
|
-
}
|
|
387
|
-
}
|
|
388
|
-
const structure = {
|
|
389
|
-
type: 'ordered',
|
|
390
|
-
fields: orderedFields,
|
|
391
|
-
};
|
|
392
|
-
return Object.freeze({
|
|
393
|
-
__rill_type: true,
|
|
394
|
-
typeName: 'ordered',
|
|
395
|
-
structure,
|
|
396
|
-
});
|
|
418
|
+
return this.evaluatePrimary(node);
|
|
419
|
+
}, location);
|
|
397
420
|
}
|
|
398
421
|
/**
|
|
399
422
|
* Evaluate a closure signature literal into a RillTypeValue [IR-8].
|
|
@@ -423,9 +446,9 @@ function createTypesMixin(Base) {
|
|
|
423
446
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
424
447
|
const paramVal = await this.evaluateExpression(param.typeExpr);
|
|
425
448
|
const paramType = await resolveTypeExpr(paramVal);
|
|
426
|
-
params.push(
|
|
449
|
+
params.push({ name: param.name, type: paramType });
|
|
427
450
|
}
|
|
428
|
-
// Evaluate return type (EC-8: required
|
|
451
|
+
// Evaluate return type (EC-8: required -- parser enforces this at parse time)
|
|
429
452
|
// returnType is PostfixExprNode (stops before pipe operators) so the
|
|
430
453
|
// return type annotation cannot accidentally consume a trailing pipe chain.
|
|
431
454
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
@@ -450,4 +473,3 @@ function createTypesMixin(Base) {
|
|
|
450
473
|
// TypeScript can't generate declarations for functions returning classes with protected members
|
|
451
474
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
452
475
|
export const TypesMixin = createTypesMixin;
|
|
453
|
-
//# sourceMappingURL=types.js.map
|
|
@@ -179,4 +179,3 @@ function parseSchemeString(value, node) {
|
|
|
179
179
|
// TypeScript can't generate declarations for functions returning classes with protected members
|
|
180
180
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
181
181
|
export const UseMixin = createUseMixin;
|
|
182
|
-
//# sourceMappingURL=use.js.map
|
|
@@ -317,11 +317,11 @@ function createVariablesMixin(Base) {
|
|
|
317
317
|
const finalAccess = node.existenceCheck.finalAccess;
|
|
318
318
|
const typeRef = node.existenceCheck.typeRef;
|
|
319
319
|
// Helper: check type match using structural resolution (EC-4: mismatch returns false)
|
|
320
|
-
const matchesType = (fieldValue) => {
|
|
320
|
+
const matchesType = async (fieldValue) => {
|
|
321
321
|
if (typeRef === null)
|
|
322
322
|
return true;
|
|
323
323
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
324
|
-
const resolved = this.resolveTypeRef(typeRef, (name) => getVariable(this.ctx, name));
|
|
324
|
+
const resolved = await this.resolveTypeRef(typeRef, (name) => getVariable(this.ctx, name));
|
|
325
325
|
return structuralTypeMatches(fieldValue, resolved.structure);
|
|
326
326
|
};
|
|
327
327
|
if (finalAccess.kind === 'literal') {
|
|
@@ -331,7 +331,7 @@ function createVariablesMixin(Base) {
|
|
|
331
331
|
const exists = fieldValue !== undefined && fieldValue !== null;
|
|
332
332
|
// If type-qualified check, verify type matches
|
|
333
333
|
if (exists && typeRef !== null) {
|
|
334
|
-
return matchesType(fieldValue);
|
|
334
|
+
return await matchesType(fieldValue);
|
|
335
335
|
}
|
|
336
336
|
return exists;
|
|
337
337
|
}
|
|
@@ -361,7 +361,7 @@ function createVariablesMixin(Base) {
|
|
|
361
361
|
const exists = fieldValue !== undefined && fieldValue !== null;
|
|
362
362
|
// If type-qualified check, verify type matches
|
|
363
363
|
if (exists && typeRef !== null) {
|
|
364
|
-
return matchesType(fieldValue);
|
|
364
|
+
return await matchesType(fieldValue);
|
|
365
365
|
}
|
|
366
366
|
return exists;
|
|
367
367
|
}
|
|
@@ -388,7 +388,7 @@ function createVariablesMixin(Base) {
|
|
|
388
388
|
const exists = fieldValue !== undefined && fieldValue !== null;
|
|
389
389
|
// If type-qualified check, verify type matches
|
|
390
390
|
if (exists && typeRef !== null) {
|
|
391
|
-
return matchesType(fieldValue);
|
|
391
|
+
return await matchesType(fieldValue);
|
|
392
392
|
}
|
|
393
393
|
return exists;
|
|
394
394
|
}
|
|
@@ -552,7 +552,7 @@ function createVariablesMixin(Base) {
|
|
|
552
552
|
if (node.typeRef !== null) {
|
|
553
553
|
// Resolve TypeRef and validate against the declared type
|
|
554
554
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
555
|
-
const resolved = this.resolveTypeRef(node.typeRef, (name) => getVariable(this.ctx, name));
|
|
555
|
+
const resolved = await this.resolveTypeRef(node.typeRef, (name) => getVariable(this.ctx, name));
|
|
556
556
|
this.setVariable(node.name, input, resolved.structure, node.span.start);
|
|
557
557
|
}
|
|
558
558
|
else {
|
|
@@ -578,4 +578,3 @@ function createVariablesMixin(Base) {
|
|
|
578
578
|
// TypeScript can't generate declarations for functions returning classes with protected members
|
|
579
579
|
// eslint-disable-next-line @typescript-eslint/no-explicit-any
|
|
580
580
|
export const VariablesMixin = createVariablesMixin;
|
|
581
|
-
//# sourceMappingURL=variables.js.map
|
|
@@ -38,4 +38,3 @@ export type EvaluatorConstructor<TBase extends EvaluatorBase = EvaluatorBase> =
|
|
|
38
38
|
* ```
|
|
39
39
|
*/
|
|
40
40
|
export type Mixin<TBase extends EvaluatorBase = EvaluatorBase, TExtension extends TBase = TBase> = (Base: EvaluatorConstructor<TBase>) => EvaluatorConstructor<TExtension>;
|
|
41
|
-
//# sourceMappingURL=types.d.ts.map
|
|
@@ -23,4 +23,3 @@ export declare function execute(script: ScriptNode, context: RuntimeContext): Pr
|
|
|
23
23
|
* @returns A stepper for step-by-step execution
|
|
24
24
|
*/
|
|
25
25
|
export declare function createStepper(script: ScriptNode, context: RuntimeContext): ExecutionStepper;
|
|
26
|
-
//# sourceMappingURL=execute.d.ts.map
|