@blockml/framework 0.9.0 → 0.9.2
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/blocks/org/blockml/bml/framework/Library.bml +8 -1
- package/blocks/org/blockml/bml/framework/capability/EvaluateExpression.bml +50 -0
- package/blocks/org/blockml/bml/framework/capability/EvaluateInterpolatedText.bml +50 -0
- package/blocks/org/blockml/bml/framework/capability/EvaluateParseValue.bml +68 -0
- package/blocks/org/blockml/bml/framework/capability/FindLocalMember.bml +58 -0
- package/blocks/org/blockml/bml/framework/capability/ForkBom.bml +1 -1
- package/blocks/org/blockml/bml/framework/capability/ParseInterpolatedText.bml +54 -0
- package/blocks/org/blockml/bml/framework/capability/TypeRegistry.bml +10 -1
- package/blocks/org/blockml/bml/framework/capability/ValidateGenerics.bml +66 -0
- package/blocks/org/blockml/bml/framework/capability/ValidateTypes.bml +19 -1
- package/blocks/org/blockml/bml/framework/config/FrameworkDiagnosticCodes.bml +1 -1
- package/blocks/org/blockml/bml/framework/documentation/Diagnostics.bml +22 -3
- package/blocks/org/blockml/bml/framework/documentation/EffectiveMembers.bml +2 -0
- package/blocks/org/blockml/bml/framework/documentation/ExpressionParsing.bml +6 -3
- package/blocks/org/blockml/bml/framework/documentation/PublicApi.bml +7 -1
- package/blocks/org/blockml/bml/framework/documentation/TypeRegistryBootstrap.bml +8 -7
- package/blocks/org/blockml/bml/framework/expression/ExpressionNode.bml +1 -1
- package/blocks/org/blockml/bml/framework/expression/InterpolatedStringNode.bml +51 -0
- package/dist/expression/evaluate-expression.d.ts +9 -0
- package/dist/expression/evaluate-expression.d.ts.map +1 -0
- package/dist/expression/evaluate-expression.js +124 -0
- package/dist/expression/evaluate-expression.js.map +1 -0
- package/dist/expression/parse-interpolated-text.d.ts +3 -0
- package/dist/expression/parse-interpolated-text.d.ts.map +1 -0
- package/dist/expression/parse-interpolated-text.js +80 -0
- package/dist/expression/parse-interpolated-text.js.map +1 -0
- package/dist/expression/restricted.d.ts +5 -0
- package/dist/expression/restricted.d.ts.map +1 -0
- package/dist/expression/restricted.js +65 -0
- package/dist/expression/restricted.js.map +1 -0
- package/dist/expression/types.d.ts +5 -1
- package/dist/expression/types.d.ts.map +1 -1
- package/dist/index.d.ts +8 -2
- package/dist/index.d.ts.map +1 -1
- package/dist/index.js +5 -1
- package/dist/index.js.map +1 -1
- package/dist/registry/bootstrap.d.ts.map +1 -1
- package/dist/registry/bootstrap.js +12 -2
- package/dist/registry/bootstrap.js.map +1 -1
- package/dist/registry/library-bootstrap.d.ts.map +1 -1
- package/dist/registry/library-bootstrap.js +14 -3
- package/dist/registry/library-bootstrap.js.map +1 -1
- package/dist/registry/package-paths.d.ts +2 -0
- package/dist/registry/package-paths.d.ts.map +1 -1
- package/dist/registry/package-paths.js +7 -0
- package/dist/registry/package-paths.js.map +1 -1
- package/dist/registry/type-registry.d.ts +5 -0
- package/dist/registry/type-registry.d.ts.map +1 -1
- package/dist/registry/type-registry.js +25 -1
- package/dist/registry/type-registry.js.map +1 -1
- package/dist/resolve/resolve-generic-application.d.ts +18 -0
- package/dist/resolve/resolve-generic-application.d.ts.map +1 -0
- package/dist/resolve/resolve-generic-application.js +129 -0
- package/dist/resolve/resolve-generic-application.js.map +1 -0
- package/dist/resolve/satisfies-type-bound.d.ts +4 -0
- package/dist/resolve/satisfies-type-bound.d.ts.map +1 -0
- package/dist/resolve/satisfies-type-bound.js +20 -0
- package/dist/resolve/satisfies-type-bound.js.map +1 -0
- package/dist/validate/evaluate-parse-value.d.ts +13 -0
- package/dist/validate/evaluate-parse-value.d.ts.map +1 -0
- package/dist/validate/evaluate-parse-value.js +138 -0
- package/dist/validate/evaluate-parse-value.js.map +1 -0
- package/dist/validate/instance-ids.d.ts +10 -0
- package/dist/validate/instance-ids.d.ts.map +1 -0
- package/dist/validate/instance-ids.js +57 -0
- package/dist/validate/instance-ids.js.map +1 -0
- package/dist/validate/reference-kinds.d.ts +50 -0
- package/dist/validate/reference-kinds.d.ts.map +1 -0
- package/dist/validate/reference-kinds.js +111 -0
- package/dist/validate/reference-kinds.js.map +1 -0
- package/dist/validate/validate-generics.d.ts +4 -0
- package/dist/validate/validate-generics.d.ts.map +1 -0
- package/dist/validate/validate-generics.js +141 -0
- package/dist/validate/validate-generics.js.map +1 -0
- package/dist/validate/validate-instances.d.ts.map +1 -1
- package/dist/validate/validate-instances.js +1 -61
- package/dist/validate/validate-instances.js.map +1 -1
- package/dist/validate/validate-parse-values.d.ts +4 -0
- package/dist/validate/validate-parse-values.d.ts.map +1 -0
- package/dist/validate/validate-parse-values.js +181 -0
- package/dist/validate/validate-parse-values.js.map +1 -0
- package/dist/validate/validate-references.d.ts +5 -0
- package/dist/validate/validate-references.d.ts.map +1 -0
- package/dist/validate/validate-references.js +392 -0
- package/dist/validate/validate-references.js.map +1 -0
- package/dist/validate/validate-types.d.ts.map +1 -1
- package/dist/validate/validate-types.js +117 -129
- package/dist/validate/validate-types.js.map +1 -1
- package/package.json +4 -4
|
@@ -0,0 +1,50 @@
|
|
|
1
|
+
import type { TypeExpression } from "@blockml/bom";
|
|
2
|
+
import type { TypeRegistry } from "../registry/type-registry.js";
|
|
3
|
+
export declare const TYPE_REFERENCE = "org.blockml.bml.type.TypeReference";
|
|
4
|
+
export declare const TYPE_REFERENCE_ENTITY = "org.blockml.bml.type.TypeReferenceEntity";
|
|
5
|
+
export declare const PACKAGE_REFERENCE = "org.blockml.bml.type.PackageReference";
|
|
6
|
+
export declare const PACKAGE_REFERENCE_ENTITY = "org.blockml.bml.type.PackageReferenceEntity";
|
|
7
|
+
export declare const INSTANCE_REFERENCE = "org.blockml.bml.type.InstanceReference";
|
|
8
|
+
export declare const INSTANCE_REFERENCE_ENTITY = "org.blockml.bml.type.InstanceReferenceEntity";
|
|
9
|
+
export declare const PROPERTY_REFERENCE = "org.blockml.bml.type.PropertyReference";
|
|
10
|
+
export declare const PROPERTY_REFERENCE_ENTITY = "org.blockml.bml.type.PropertyReferenceEntity";
|
|
11
|
+
export declare const AGGREGATION_REFERENCE = "org.blockml.bml.type.AggregationReference";
|
|
12
|
+
export declare const AGGREGATION_REFERENCE_ENTITY = "org.blockml.bml.type.AggregationReferenceEntity";
|
|
13
|
+
export declare const ASSOCIATION_REFERENCE = "org.blockml.bml.type.AssociationReference";
|
|
14
|
+
export declare const ASSOCIATION_REFERENCE_ENTITY = "org.blockml.bml.type.AssociationReferenceEntity";
|
|
15
|
+
export declare const CAPABILITY_REFERENCE = "org.blockml.bml.type.CapabilityReference";
|
|
16
|
+
export declare const CAPABILITY_REFERENCE_ENTITY = "org.blockml.bml.type.CapabilityReferenceEntity";
|
|
17
|
+
export declare const TYPE_IDENTIFIER = "org.blockml.bml.type.TypeIdentifier";
|
|
18
|
+
export declare const TYPE_IDENTIFIER_ENTITY = "org.blockml.bml.type.TypeIdentifierEntity";
|
|
19
|
+
export declare const PACKAGE_IDENTIFIER = "org.blockml.bml.type.PackageIdentifier";
|
|
20
|
+
export declare const PACKAGE_IDENTIFIER_ENTITY = "org.blockml.bml.type.PackageIdentifierEntity";
|
|
21
|
+
export declare const INSTANCE_IDENTIFIER = "org.blockml.bml.type.InstanceIdentifier";
|
|
22
|
+
export declare const INSTANCE_IDENTIFIER_ENTITY = "org.blockml.bml.type.InstanceIdentifierEntity";
|
|
23
|
+
export declare const MEMBER_IDENTIFIER = "org.blockml.bml.type.MemberIdentifier";
|
|
24
|
+
export declare const MEMBER_IDENTIFIER_ENTITY = "org.blockml.bml.type.MemberIdentifierEntity";
|
|
25
|
+
export declare const PROPERTY_IDENTIFIER = "org.blockml.bml.type.PropertyIdentifier";
|
|
26
|
+
export declare const PROPERTY_IDENTIFIER_ENTITY = "org.blockml.bml.type.PropertyIdentifierEntity";
|
|
27
|
+
export declare const AGGREGATION_IDENTIFIER = "org.blockml.bml.type.AggregationIdentifier";
|
|
28
|
+
export declare const AGGREGATION_IDENTIFIER_ENTITY = "org.blockml.bml.type.AggregationIdentifierEntity";
|
|
29
|
+
export declare const ASSOCIATION_IDENTIFIER = "org.blockml.bml.type.AssociationIdentifier";
|
|
30
|
+
export declare const ASSOCIATION_IDENTIFIER_ENTITY = "org.blockml.bml.type.AssociationIdentifierEntity";
|
|
31
|
+
export declare const CAPABILITY_IDENTIFIER = "org.blockml.bml.type.CapabilityIdentifier";
|
|
32
|
+
export declare const CAPABILITY_IDENTIFIER_ENTITY = "org.blockml.bml.type.CapabilityIdentifierEntity";
|
|
33
|
+
export type ReferenceKind = "type" | "package" | "instance" | "property" | "aggregation" | "association" | "capability";
|
|
34
|
+
export type ClassifiedDeclaredType = {
|
|
35
|
+
role: "reference";
|
|
36
|
+
kind: ReferenceKind;
|
|
37
|
+
isEntity: boolean;
|
|
38
|
+
boundFqn?: string;
|
|
39
|
+
} | {
|
|
40
|
+
role: "identifier";
|
|
41
|
+
};
|
|
42
|
+
export declare function unwrapNamed(expr: TypeExpression | undefined): {
|
|
43
|
+
fqn: string;
|
|
44
|
+
typeArguments?: TypeExpression[];
|
|
45
|
+
} | undefined;
|
|
46
|
+
export declare function namedTypeFqn(expr: TypeExpression | undefined, fallback?: string): string | undefined;
|
|
47
|
+
export declare function firstTypeArgumentFqn(expr: TypeExpression | undefined): string | undefined;
|
|
48
|
+
export declare function classifyDeclaredFqn(fqn: string, registry: TypeRegistry, boundFqn?: string): ClassifiedDeclaredType | undefined;
|
|
49
|
+
export declare function classifyDeclaredType(expr: TypeExpression | undefined, registry: TypeRegistry, fallbackFqn?: string): ClassifiedDeclaredType | undefined;
|
|
50
|
+
//# sourceMappingURL=reference-kinds.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-kinds.d.ts","sourceRoot":"","sources":["../../src/validate/reference-kinds.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AACnD,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAGjE,eAAO,MAAM,cAAc,uCAAuC,CAAC;AACnE,eAAO,MAAM,qBAAqB,6CAA6C,CAAC;AAChF,eAAO,MAAM,iBAAiB,0CAA0C,CAAC;AACzE,eAAO,MAAM,wBAAwB,gDAAgD,CAAC;AACtF,eAAO,MAAM,kBAAkB,2CAA2C,CAAC;AAC3E,eAAO,MAAM,yBAAyB,iDAAiD,CAAC;AACxF,eAAO,MAAM,kBAAkB,2CAA2C,CAAC;AAC3E,eAAO,MAAM,yBAAyB,iDAAiD,CAAC;AACxF,eAAO,MAAM,qBAAqB,8CAA8C,CAAC;AACjF,eAAO,MAAM,4BAA4B,oDAAoD,CAAC;AAC9F,eAAO,MAAM,qBAAqB,8CAA8C,CAAC;AACjF,eAAO,MAAM,4BAA4B,oDAAoD,CAAC;AAC9F,eAAO,MAAM,oBAAoB,6CAA6C,CAAC;AAC/E,eAAO,MAAM,2BAA2B,mDAAmD,CAAC;AAE5F,eAAO,MAAM,eAAe,wCAAwC,CAAC;AACrE,eAAO,MAAM,sBAAsB,8CAA8C,CAAC;AAClF,eAAO,MAAM,kBAAkB,2CAA2C,CAAC;AAC3E,eAAO,MAAM,yBAAyB,iDAAiD,CAAC;AACxF,eAAO,MAAM,mBAAmB,4CAA4C,CAAC;AAC7E,eAAO,MAAM,0BAA0B,kDAAkD,CAAC;AAC1F,eAAO,MAAM,iBAAiB,0CAA0C,CAAC;AACzE,eAAO,MAAM,wBAAwB,gDAAgD,CAAC;AACtF,eAAO,MAAM,mBAAmB,4CAA4C,CAAC;AAC7E,eAAO,MAAM,0BAA0B,kDAAkD,CAAC;AAC1F,eAAO,MAAM,sBAAsB,+CAA+C,CAAC;AACnF,eAAO,MAAM,6BAA6B,qDAAqD,CAAC;AAChG,eAAO,MAAM,sBAAsB,+CAA+C,CAAC;AACnF,eAAO,MAAM,6BAA6B,qDAAqD,CAAC;AAChG,eAAO,MAAM,qBAAqB,8CAA8C,CAAC;AACjF,eAAO,MAAM,4BAA4B,oDAAoD,CAAC;AAE9F,MAAM,MAAM,aAAa,GACrB,MAAM,GACN,SAAS,GACT,UAAU,GACV,UAAU,GACV,aAAa,GACb,aAAa,GACb,YAAY,CAAC;AAEjB,MAAM,MAAM,sBAAsB,GAC9B;IAAE,IAAI,EAAE,WAAW,CAAC;IAAC,IAAI,EAAE,aAAa,CAAC;IAAC,QAAQ,EAAE,OAAO,CAAC;IAAC,QAAQ,CAAC,EAAE,MAAM,CAAA;CAAE,GAChF;IAAE,IAAI,EAAE,YAAY,CAAA;CAAE,CAAC;AAqC3B,wBAAgB,WAAW,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,GAAG;IAC7D,GAAG,EAAE,MAAM,CAAC;IACZ,aAAa,CAAC,EAAE,cAAc,EAAE,CAAC;CAClC,GAAG,SAAS,CAcZ;AAED,wBAAgB,YAAY,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,EAAE,QAAQ,CAAC,EAAE,MAAM,GAAG,MAAM,GAAG,SAAS,CAEpG;AAED,wBAAgB,oBAAoB,CAAC,IAAI,EAAE,cAAc,GAAG,SAAS,GAAG,MAAM,GAAG,SAAS,CAIzF;AAED,wBAAgB,mBAAmB,CACjC,GAAG,EAAE,MAAM,EACX,QAAQ,EAAE,YAAY,EACtB,QAAQ,CAAC,EAAE,MAAM,GAChB,sBAAsB,GAAG,SAAS,CAqBpC;AAED,wBAAgB,oBAAoB,CAClC,IAAI,EAAE,cAAc,GAAG,SAAS,EAChC,QAAQ,EAAE,YAAY,EACtB,WAAW,CAAC,EAAE,MAAM,GACnB,sBAAsB,GAAG,SAAS,CAMpC"}
|
|
@@ -0,0 +1,111 @@
|
|
|
1
|
+
import { satisfiesTypeBound } from "../resolve/satisfies-type-bound.js";
|
|
2
|
+
export const TYPE_REFERENCE = "org.blockml.bml.type.TypeReference";
|
|
3
|
+
export const TYPE_REFERENCE_ENTITY = "org.blockml.bml.type.TypeReferenceEntity";
|
|
4
|
+
export const PACKAGE_REFERENCE = "org.blockml.bml.type.PackageReference";
|
|
5
|
+
export const PACKAGE_REFERENCE_ENTITY = "org.blockml.bml.type.PackageReferenceEntity";
|
|
6
|
+
export const INSTANCE_REFERENCE = "org.blockml.bml.type.InstanceReference";
|
|
7
|
+
export const INSTANCE_REFERENCE_ENTITY = "org.blockml.bml.type.InstanceReferenceEntity";
|
|
8
|
+
export const PROPERTY_REFERENCE = "org.blockml.bml.type.PropertyReference";
|
|
9
|
+
export const PROPERTY_REFERENCE_ENTITY = "org.blockml.bml.type.PropertyReferenceEntity";
|
|
10
|
+
export const AGGREGATION_REFERENCE = "org.blockml.bml.type.AggregationReference";
|
|
11
|
+
export const AGGREGATION_REFERENCE_ENTITY = "org.blockml.bml.type.AggregationReferenceEntity";
|
|
12
|
+
export const ASSOCIATION_REFERENCE = "org.blockml.bml.type.AssociationReference";
|
|
13
|
+
export const ASSOCIATION_REFERENCE_ENTITY = "org.blockml.bml.type.AssociationReferenceEntity";
|
|
14
|
+
export const CAPABILITY_REFERENCE = "org.blockml.bml.type.CapabilityReference";
|
|
15
|
+
export const CAPABILITY_REFERENCE_ENTITY = "org.blockml.bml.type.CapabilityReferenceEntity";
|
|
16
|
+
export const TYPE_IDENTIFIER = "org.blockml.bml.type.TypeIdentifier";
|
|
17
|
+
export const TYPE_IDENTIFIER_ENTITY = "org.blockml.bml.type.TypeIdentifierEntity";
|
|
18
|
+
export const PACKAGE_IDENTIFIER = "org.blockml.bml.type.PackageIdentifier";
|
|
19
|
+
export const PACKAGE_IDENTIFIER_ENTITY = "org.blockml.bml.type.PackageIdentifierEntity";
|
|
20
|
+
export const INSTANCE_IDENTIFIER = "org.blockml.bml.type.InstanceIdentifier";
|
|
21
|
+
export const INSTANCE_IDENTIFIER_ENTITY = "org.blockml.bml.type.InstanceIdentifierEntity";
|
|
22
|
+
export const MEMBER_IDENTIFIER = "org.blockml.bml.type.MemberIdentifier";
|
|
23
|
+
export const MEMBER_IDENTIFIER_ENTITY = "org.blockml.bml.type.MemberIdentifierEntity";
|
|
24
|
+
export const PROPERTY_IDENTIFIER = "org.blockml.bml.type.PropertyIdentifier";
|
|
25
|
+
export const PROPERTY_IDENTIFIER_ENTITY = "org.blockml.bml.type.PropertyIdentifierEntity";
|
|
26
|
+
export const AGGREGATION_IDENTIFIER = "org.blockml.bml.type.AggregationIdentifier";
|
|
27
|
+
export const AGGREGATION_IDENTIFIER_ENTITY = "org.blockml.bml.type.AggregationIdentifierEntity";
|
|
28
|
+
export const ASSOCIATION_IDENTIFIER = "org.blockml.bml.type.AssociationIdentifier";
|
|
29
|
+
export const ASSOCIATION_IDENTIFIER_ENTITY = "org.blockml.bml.type.AssociationIdentifierEntity";
|
|
30
|
+
export const CAPABILITY_IDENTIFIER = "org.blockml.bml.type.CapabilityIdentifier";
|
|
31
|
+
export const CAPABILITY_IDENTIFIER_ENTITY = "org.blockml.bml.type.CapabilityIdentifierEntity";
|
|
32
|
+
const REFERENCE_PAIRS = [
|
|
33
|
+
{ kind: "type", reference: TYPE_REFERENCE, entity: TYPE_REFERENCE_ENTITY },
|
|
34
|
+
{ kind: "package", reference: PACKAGE_REFERENCE, entity: PACKAGE_REFERENCE_ENTITY },
|
|
35
|
+
{ kind: "instance", reference: INSTANCE_REFERENCE, entity: INSTANCE_REFERENCE_ENTITY },
|
|
36
|
+
{ kind: "property", reference: PROPERTY_REFERENCE, entity: PROPERTY_REFERENCE_ENTITY },
|
|
37
|
+
{ kind: "aggregation", reference: AGGREGATION_REFERENCE, entity: AGGREGATION_REFERENCE_ENTITY },
|
|
38
|
+
{ kind: "association", reference: ASSOCIATION_REFERENCE, entity: ASSOCIATION_REFERENCE_ENTITY },
|
|
39
|
+
{ kind: "capability", reference: CAPABILITY_REFERENCE, entity: CAPABILITY_REFERENCE_ENTITY },
|
|
40
|
+
];
|
|
41
|
+
const IDENTIFIER_FQNS = [
|
|
42
|
+
TYPE_IDENTIFIER,
|
|
43
|
+
TYPE_IDENTIFIER_ENTITY,
|
|
44
|
+
PACKAGE_IDENTIFIER,
|
|
45
|
+
PACKAGE_IDENTIFIER_ENTITY,
|
|
46
|
+
INSTANCE_IDENTIFIER,
|
|
47
|
+
INSTANCE_IDENTIFIER_ENTITY,
|
|
48
|
+
MEMBER_IDENTIFIER,
|
|
49
|
+
MEMBER_IDENTIFIER_ENTITY,
|
|
50
|
+
PROPERTY_IDENTIFIER,
|
|
51
|
+
PROPERTY_IDENTIFIER_ENTITY,
|
|
52
|
+
AGGREGATION_IDENTIFIER,
|
|
53
|
+
AGGREGATION_IDENTIFIER_ENTITY,
|
|
54
|
+
ASSOCIATION_IDENTIFIER,
|
|
55
|
+
ASSOCIATION_IDENTIFIER_ENTITY,
|
|
56
|
+
CAPABILITY_IDENTIFIER,
|
|
57
|
+
CAPABILITY_IDENTIFIER_ENTITY,
|
|
58
|
+
];
|
|
59
|
+
export function unwrapNamed(expr) {
|
|
60
|
+
if (!expr) {
|
|
61
|
+
return undefined;
|
|
62
|
+
}
|
|
63
|
+
if (expr.kind === "named") {
|
|
64
|
+
return expr;
|
|
65
|
+
}
|
|
66
|
+
if (expr.kind === "grouped") {
|
|
67
|
+
return unwrapNamed(expr.expression);
|
|
68
|
+
}
|
|
69
|
+
if (expr.kind === "union") {
|
|
70
|
+
return unwrapNamed(expr.alternatives[0]);
|
|
71
|
+
}
|
|
72
|
+
return undefined;
|
|
73
|
+
}
|
|
74
|
+
export function namedTypeFqn(expr, fallback) {
|
|
75
|
+
return unwrapNamed(expr)?.fqn ?? fallback;
|
|
76
|
+
}
|
|
77
|
+
export function firstTypeArgumentFqn(expr) {
|
|
78
|
+
const named = unwrapNamed(expr);
|
|
79
|
+
const arg = named?.typeArguments?.[0];
|
|
80
|
+
return namedTypeFqn(arg);
|
|
81
|
+
}
|
|
82
|
+
export function classifyDeclaredFqn(fqn, registry, boundFqn) {
|
|
83
|
+
for (const pair of REFERENCE_PAIRS) {
|
|
84
|
+
const isEntity = satisfiesTypeBound(fqn, pair.entity, registry);
|
|
85
|
+
if (isEntity || satisfiesTypeBound(fqn, pair.reference, registry)) {
|
|
86
|
+
const classified = {
|
|
87
|
+
role: "reference",
|
|
88
|
+
kind: pair.kind,
|
|
89
|
+
isEntity,
|
|
90
|
+
};
|
|
91
|
+
if (boundFqn) {
|
|
92
|
+
classified.boundFqn = boundFqn;
|
|
93
|
+
}
|
|
94
|
+
return classified;
|
|
95
|
+
}
|
|
96
|
+
}
|
|
97
|
+
for (const ident of IDENTIFIER_FQNS) {
|
|
98
|
+
if (satisfiesTypeBound(fqn, ident, registry)) {
|
|
99
|
+
return { role: "identifier" };
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
return undefined;
|
|
103
|
+
}
|
|
104
|
+
export function classifyDeclaredType(expr, registry, fallbackFqn) {
|
|
105
|
+
const fqn = namedTypeFqn(expr, fallbackFqn);
|
|
106
|
+
if (!fqn) {
|
|
107
|
+
return undefined;
|
|
108
|
+
}
|
|
109
|
+
return classifyDeclaredFqn(fqn, registry, firstTypeArgumentFqn(expr));
|
|
110
|
+
}
|
|
111
|
+
//# sourceMappingURL=reference-kinds.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"reference-kinds.js","sourceRoot":"","sources":["../../src/validate/reference-kinds.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { BomDocument, Diagnostic } from "@blockml/bom";
|
|
2
|
+
import type { TypeRegistry } from "../registry/type-registry.js";
|
|
3
|
+
export declare function validateGenerics(document: BomDocument, registry: TypeRegistry): Diagnostic[];
|
|
4
|
+
//# sourceMappingURL=validate-generics.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-generics.d.ts","sourceRoot":"","sources":["../../src/validate/validate-generics.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EAGX,UAAU,EAKX,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AAmQjE,wBAAgB,gBAAgB,CAC9B,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,YAAY,GACrB,UAAU,EAAE,CAKd"}
|
|
@@ -0,0 +1,141 @@
|
|
|
1
|
+
import { resolveEffectiveMembers } from "../resolve/resolve-effective-members.js";
|
|
2
|
+
import { openGenericParameters, resolveGenericApplication, } from "../resolve/resolve-generic-application.js";
|
|
3
|
+
const TYPE_REFERENCE_ENTITY = "org.blockml.bml.type.TypeReferenceEntity";
|
|
4
|
+
function diag(code, message, file, loc) {
|
|
5
|
+
return {
|
|
6
|
+
severity: "error",
|
|
7
|
+
code,
|
|
8
|
+
message,
|
|
9
|
+
source: {
|
|
10
|
+
file: loc?.file ?? file,
|
|
11
|
+
line: loc?.line ?? 1,
|
|
12
|
+
column: loc?.column ?? 1,
|
|
13
|
+
...(loc?.endLine !== undefined ? { endLine: loc.endLine } : {}),
|
|
14
|
+
...(loc?.endColumn !== undefined ? { endColumn: loc.endColumn } : {}),
|
|
15
|
+
},
|
|
16
|
+
};
|
|
17
|
+
}
|
|
18
|
+
function reportNotAllowed(binding, file, diagnostics) {
|
|
19
|
+
diagnostics.push(diag("BML_GENERICS_DIRECTIVE_NOT_ALLOWED", "bml:generics is only allowed on Block instances", file, binding.source));
|
|
20
|
+
}
|
|
21
|
+
function isTypeReferenceEntityType(expr) {
|
|
22
|
+
if (!expr) {
|
|
23
|
+
return false;
|
|
24
|
+
}
|
|
25
|
+
if (expr.kind === "grouped") {
|
|
26
|
+
return isTypeReferenceEntityType(expr.expression);
|
|
27
|
+
}
|
|
28
|
+
return expr.kind === "named" && expr.fqn === TYPE_REFERENCE_ENTITY;
|
|
29
|
+
}
|
|
30
|
+
function aggregationIsTypeReferenceEntity(owner, aggregationName, registry) {
|
|
31
|
+
if (!owner) {
|
|
32
|
+
return false;
|
|
33
|
+
}
|
|
34
|
+
const member = resolveEffectiveMembers(owner, registry).find((m) => m.kind === "aggregation" && m.name === aggregationName);
|
|
35
|
+
return member?.kind === "aggregation" && isTypeReferenceEntityType(member.type);
|
|
36
|
+
}
|
|
37
|
+
function validateInstanceGenerics(instance, registry, file, diagnostics) {
|
|
38
|
+
const typeDoc = registry.get(instance.typeFqn);
|
|
39
|
+
const params = typeDoc?.block.genericTypes ?? [];
|
|
40
|
+
const typeBindings = typeDoc?.source.namespaceBindings ?? {};
|
|
41
|
+
const open = openGenericParameters(params, typeBindings);
|
|
42
|
+
const binding = instance.generics;
|
|
43
|
+
if (!binding) {
|
|
44
|
+
if (open.length > 0) {
|
|
45
|
+
diagnostics.push(diag("BML_OPEN_GENERIC_INSTANCE", `Instance of ${instance.typeFqn} has open genericTypes and requires bml:generics`, file, instance.source));
|
|
46
|
+
}
|
|
47
|
+
return;
|
|
48
|
+
}
|
|
49
|
+
if (params.length === 0) {
|
|
50
|
+
diagnostics.push(diag("BML_GENERICS_ARGUMENT_MISMATCH", `bml:generics is not applicable; ${instance.typeFqn} has no genericTypes`, file, binding.source));
|
|
51
|
+
return;
|
|
52
|
+
}
|
|
53
|
+
if (binding.arguments === undefined) {
|
|
54
|
+
const raw = binding.raw.trim();
|
|
55
|
+
if (raw.startsWith("(") && raw.endsWith(")")) {
|
|
56
|
+
return;
|
|
57
|
+
}
|
|
58
|
+
diagnostics.push(diag("BML_GENERICS_ARGUMENT_MISMATCH", "bml:generics must be a parenthesized TypeExpression list", file, binding.source));
|
|
59
|
+
return;
|
|
60
|
+
}
|
|
61
|
+
const resolved = resolveGenericApplication(params, binding.arguments, registry, typeBindings);
|
|
62
|
+
for (const item of resolved.diagnostics) {
|
|
63
|
+
diagnostics.push(diag(item.code, item.message, file, binding.source));
|
|
64
|
+
}
|
|
65
|
+
}
|
|
66
|
+
function walkCompositionNodes(nodes, registry, file, diagnostics, typeReferenceEntityAggregation) {
|
|
67
|
+
for (const node of nodes) {
|
|
68
|
+
if (node.kind === "virtualContainer") {
|
|
69
|
+
if (node.generics) {
|
|
70
|
+
reportNotAllowed(node.generics, file, diagnostics);
|
|
71
|
+
}
|
|
72
|
+
walkCompositionNodes(node.children, registry, file, diagnostics, typeReferenceEntityAggregation);
|
|
73
|
+
continue;
|
|
74
|
+
}
|
|
75
|
+
if (typeReferenceEntityAggregation) {
|
|
76
|
+
if (node.instance.generics) {
|
|
77
|
+
reportNotAllowed(node.instance.generics, file, diagnostics);
|
|
78
|
+
}
|
|
79
|
+
for (const agg of node.instance.aggregationCompositions ?? []) {
|
|
80
|
+
walkCompositionTemplate(agg.composition, registry, file, diagnostics, true, true);
|
|
81
|
+
}
|
|
82
|
+
continue;
|
|
83
|
+
}
|
|
84
|
+
validateInstanceGenerics(node.instance, registry, file, diagnostics);
|
|
85
|
+
const instanceType = registry.get(node.instance.typeFqn)?.block;
|
|
86
|
+
for (const agg of node.instance.aggregationCompositions ?? []) {
|
|
87
|
+
walkCompositionTemplate(agg.composition, registry, file, diagnostics, true, aggregationIsTypeReferenceEntity(instanceType, agg.aggregationName, registry));
|
|
88
|
+
}
|
|
89
|
+
}
|
|
90
|
+
}
|
|
91
|
+
function walkCompositionTemplate(template, registry, file, diagnostics, wrapperIsIllegalHost, typeReferenceEntityAggregation) {
|
|
92
|
+
if (wrapperIsIllegalHost && template.generics) {
|
|
93
|
+
reportNotAllowed(template.generics, file, diagnostics);
|
|
94
|
+
}
|
|
95
|
+
walkCompositionNodes(template.children, registry, file, diagnostics, typeReferenceEntityAggregation);
|
|
96
|
+
}
|
|
97
|
+
function walkConstraintInstance(instance, file, diagnostics) {
|
|
98
|
+
if (instance.generics) {
|
|
99
|
+
reportNotAllowed(instance.generics, file, diagnostics);
|
|
100
|
+
}
|
|
101
|
+
}
|
|
102
|
+
function walkMember(member, file, diagnostics) {
|
|
103
|
+
if (member.generics) {
|
|
104
|
+
reportNotAllowed(member.generics, file, diagnostics);
|
|
105
|
+
}
|
|
106
|
+
for (const instance of member.constraints ?? []) {
|
|
107
|
+
walkConstraintInstance(instance, file, diagnostics);
|
|
108
|
+
}
|
|
109
|
+
if (member.kind === "property") {
|
|
110
|
+
for (const instance of member.suggestions ?? []) {
|
|
111
|
+
walkConstraintInstance(instance, file, diagnostics);
|
|
112
|
+
}
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
function walkBlock(block, registry, file, diagnostics) {
|
|
116
|
+
if (block.generics) {
|
|
117
|
+
reportNotAllowed(block.generics, file, diagnostics);
|
|
118
|
+
}
|
|
119
|
+
for (const member of block.members) {
|
|
120
|
+
walkMember(member, file, diagnostics);
|
|
121
|
+
}
|
|
122
|
+
for (const template of block.compositions) {
|
|
123
|
+
walkCompositionTemplate(template, registry, file, diagnostics, true, aggregationIsTypeReferenceEntity(block, template.aggregationName, registry));
|
|
124
|
+
}
|
|
125
|
+
for (const instance of block.constraints ?? []) {
|
|
126
|
+
walkConstraintInstance(instance, file, diagnostics);
|
|
127
|
+
}
|
|
128
|
+
for (const sub of block.subBlocks) {
|
|
129
|
+
walkBlock(sub, registry, file, diagnostics);
|
|
130
|
+
}
|
|
131
|
+
for (const embedded of block.embeddedBlocks) {
|
|
132
|
+
walkBlock(embedded, registry, file, diagnostics);
|
|
133
|
+
}
|
|
134
|
+
}
|
|
135
|
+
export function validateGenerics(document, registry) {
|
|
136
|
+
const diagnostics = [];
|
|
137
|
+
const file = document.source.filePath ?? "<memory>";
|
|
138
|
+
walkBlock(document.block, registry, file, diagnostics);
|
|
139
|
+
return diagnostics;
|
|
140
|
+
}
|
|
141
|
+
//# sourceMappingURL=validate-generics.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-generics.js","sourceRoot":"","sources":["../../src/validate/validate-generics.ts"],"names":[],"mappings":"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"}
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-instances.d.ts","sourceRoot":"","sources":["../../src/validate/validate-instances.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EAEX,UAAU,
|
|
1
|
+
{"version":3,"file":"validate-instances.d.ts","sourceRoot":"","sources":["../../src/validate/validate-instances.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EAEX,UAAU,EACX,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AA8KjE,wBAAgB,iBAAiB,CAC/B,QAAQ,EAAE,WAAW,EACrB,QAAQ,EAAE,YAAY,GACrB,UAAU,EAAE,CAMd"}
|
|
@@ -1,59 +1,8 @@
|
|
|
1
1
|
import { resolveEffectiveMembers } from "../resolve/resolve-effective-members.js";
|
|
2
|
+
import { collectDocumentInstanceIds, instanceId, resolveInstanceRef, } from "./instance-ids.js";
|
|
2
3
|
function diag(code, message, file, line = 1, column = 1) {
|
|
3
4
|
return { severity: "error", code, message, source: { file, line, column } };
|
|
4
5
|
}
|
|
5
|
-
function literalString(val) {
|
|
6
|
-
if (!val || val.kind !== "literal") {
|
|
7
|
-
return undefined;
|
|
8
|
-
}
|
|
9
|
-
return typeof val.value === "string" ? val.value : String(val.value);
|
|
10
|
-
}
|
|
11
|
-
function instanceId(instance) {
|
|
12
|
-
return literalString(instance.id);
|
|
13
|
-
}
|
|
14
|
-
function collectIdsInComposition(nodes, ids, file) {
|
|
15
|
-
for (const node of nodes) {
|
|
16
|
-
if (node.kind === "blockInstance") {
|
|
17
|
-
const id = instanceId(node.instance);
|
|
18
|
-
if (id) {
|
|
19
|
-
const loc = { file };
|
|
20
|
-
if (node.instance.source?.line !== undefined) {
|
|
21
|
-
loc.line = node.instance.source.line;
|
|
22
|
-
}
|
|
23
|
-
if (node.instance.source?.column !== undefined) {
|
|
24
|
-
loc.column = node.instance.source.column;
|
|
25
|
-
}
|
|
26
|
-
ids.set(id, loc);
|
|
27
|
-
}
|
|
28
|
-
for (const agg of node.instance.aggregationCompositions ?? []) {
|
|
29
|
-
collectIdsInComposition(agg.composition.children, ids, file);
|
|
30
|
-
}
|
|
31
|
-
}
|
|
32
|
-
else {
|
|
33
|
-
collectIdsInComposition(node.children, ids, file);
|
|
34
|
-
}
|
|
35
|
-
}
|
|
36
|
-
}
|
|
37
|
-
function collectDocumentInstanceIds(block, file) {
|
|
38
|
-
const ids = new Map();
|
|
39
|
-
for (const template of block.compositions) {
|
|
40
|
-
collectIdsInComposition(template.children, ids, file);
|
|
41
|
-
}
|
|
42
|
-
for (const sub of block.subBlocks) {
|
|
43
|
-
const subIds = collectDocumentInstanceIds(sub, file);
|
|
44
|
-
for (const [id, loc] of subIds) {
|
|
45
|
-
ids.set(id, loc);
|
|
46
|
-
}
|
|
47
|
-
}
|
|
48
|
-
return ids;
|
|
49
|
-
}
|
|
50
|
-
function resolveInstanceRef(token, ids) {
|
|
51
|
-
if (token.includes("::")) {
|
|
52
|
-
const id = token.split("::").pop();
|
|
53
|
-
return id !== undefined && ids.has(id);
|
|
54
|
-
}
|
|
55
|
-
return ids.has(token);
|
|
56
|
-
}
|
|
57
6
|
function validateInstanceSemantics(instance, registry, file, diagnostics) {
|
|
58
7
|
if (!instance.typeFqn) {
|
|
59
8
|
diagnostics.push(diag("BML_UNKNOWN_TYPE", "Unknown type: (missing instance typeFqn)", file, instance.source?.line, instance.source?.column));
|
|
@@ -76,15 +25,6 @@ function validateInstanceRefs(instance, ids, file, diagnostics) {
|
|
|
76
25
|
if (instance.basePresets && !resolveInstanceRef(instance.basePresets, ids)) {
|
|
77
26
|
diagnostics.push(diag("BML_UNRESOLVABLE_INSTANCE_REF", `Unresolved basePresets reference: ${instance.basePresets}`, file, instance.source?.line, instance.source?.column));
|
|
78
27
|
}
|
|
79
|
-
for (const val of Object.values(instance.memberValues)) {
|
|
80
|
-
if (val.kind !== "literal") {
|
|
81
|
-
continue;
|
|
82
|
-
}
|
|
83
|
-
const text = typeof val.value === "string" ? val.value : undefined;
|
|
84
|
-
if (text && text.includes("::") && !resolveInstanceRef(text, ids)) {
|
|
85
|
-
diagnostics.push(diag("BML_UNRESOLVABLE_INSTANCE_REF", `Unresolved instance reference: ${text}`, file, instance.source?.line, instance.source?.column));
|
|
86
|
-
}
|
|
87
|
-
}
|
|
88
28
|
for (const agg of instance.aggregationCompositions ?? []) {
|
|
89
29
|
for (const child of agg.composition.children) {
|
|
90
30
|
if (child.kind === "blockInstance") {
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"validate-instances.js","sourceRoot":"","sources":["../../src/validate/validate-instances.ts"],"names":[],"mappings":"
|
|
1
|
+
{"version":3,"file":"validate-instances.js","sourceRoot":"","sources":["../../src/validate/validate-instances.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,4 @@
|
|
|
1
|
+
import type { BomDocument, Diagnostic } from "@blockml/bom";
|
|
2
|
+
import type { TypeRegistry } from "../registry/type-registry.js";
|
|
3
|
+
export declare function validateParseValues(document: BomDocument, registry: TypeRegistry): Diagnostic[];
|
|
4
|
+
//# sourceMappingURL=validate-parse-values.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"validate-parse-values.d.ts","sourceRoot":"","sources":["../../src/validate/validate-parse-values.ts"],"names":[],"mappings":"AAAA,OAAO,KAAK,EAGV,WAAW,EAEX,UAAU,EAMX,MAAM,cAAc,CAAC;AACtB,OAAO,KAAK,EAAE,YAAY,EAAE,MAAM,8BAA8B,CAAC;AA0NjE,wBAAgB,mBAAmB,CAAC,QAAQ,EAAE,WAAW,EAAE,QAAQ,EAAE,YAAY,GAAG,UAAU,EAAE,CAK/F"}
|
|
@@ -0,0 +1,181 @@
|
|
|
1
|
+
import { resolveEffectiveMembers } from "../resolve/resolve-effective-members.js";
|
|
2
|
+
import { evaluateParseValue } from "./evaluate-parse-value.js";
|
|
3
|
+
import { namedTypeFqn, TYPE_REFERENCE } from "./reference-kinds.js";
|
|
4
|
+
function diag(code, message, file, loc) {
|
|
5
|
+
const source = {
|
|
6
|
+
file: loc?.file ?? file,
|
|
7
|
+
line: loc?.line ?? 1,
|
|
8
|
+
column: loc?.column ?? 1,
|
|
9
|
+
};
|
|
10
|
+
if (loc?.endLine !== undefined) {
|
|
11
|
+
source.endLine = loc.endLine;
|
|
12
|
+
}
|
|
13
|
+
if (loc?.endColumn !== undefined) {
|
|
14
|
+
source.endColumn = loc.endColumn;
|
|
15
|
+
}
|
|
16
|
+
return { severity: "error", code, message, source };
|
|
17
|
+
}
|
|
18
|
+
function isUnion(expr) {
|
|
19
|
+
if (!expr) {
|
|
20
|
+
return false;
|
|
21
|
+
}
|
|
22
|
+
if (expr.kind === "union") {
|
|
23
|
+
return true;
|
|
24
|
+
}
|
|
25
|
+
if (expr.kind === "grouped") {
|
|
26
|
+
return isUnion(expr.expression);
|
|
27
|
+
}
|
|
28
|
+
return false;
|
|
29
|
+
}
|
|
30
|
+
function hasMultiplicity(expr, fallbackFqn) {
|
|
31
|
+
if (expr) {
|
|
32
|
+
if (expr.kind === "named" || expr.kind === "grouped") {
|
|
33
|
+
if (expr.multiplicity !== undefined) {
|
|
34
|
+
return true;
|
|
35
|
+
}
|
|
36
|
+
}
|
|
37
|
+
}
|
|
38
|
+
return fallbackFqn?.includes("[") === true;
|
|
39
|
+
}
|
|
40
|
+
function rawFromUnknown(value) {
|
|
41
|
+
if (typeof value === "string") {
|
|
42
|
+
return value;
|
|
43
|
+
}
|
|
44
|
+
if (typeof value === "number" || typeof value === "boolean") {
|
|
45
|
+
return String(value);
|
|
46
|
+
}
|
|
47
|
+
return undefined;
|
|
48
|
+
}
|
|
49
|
+
function checkRaw(typeFqn, raw, ctx, loc) {
|
|
50
|
+
const result = evaluateParseValue(typeFqn, raw, ctx.registry);
|
|
51
|
+
if (!result.ok) {
|
|
52
|
+
ctx.diagnostics.push(diag("BML_INVALID_VALUE", result.message, ctx.file, loc));
|
|
53
|
+
}
|
|
54
|
+
}
|
|
55
|
+
function checkLiteral(val, type, typeFqn, ctx, loc) {
|
|
56
|
+
if (!val || val.kind !== "literal") {
|
|
57
|
+
return;
|
|
58
|
+
}
|
|
59
|
+
if (isUnion(type) || type?.kind === "anonymousStruct") {
|
|
60
|
+
return;
|
|
61
|
+
}
|
|
62
|
+
const named = namedTypeFqn(type, typeFqn);
|
|
63
|
+
if (!named) {
|
|
64
|
+
return;
|
|
65
|
+
}
|
|
66
|
+
const list = hasMultiplicity(type, typeFqn);
|
|
67
|
+
if (list) {
|
|
68
|
+
if (Array.isArray(val.value)) {
|
|
69
|
+
for (const item of val.value) {
|
|
70
|
+
const raw = rawFromUnknown(item);
|
|
71
|
+
if (raw !== undefined) {
|
|
72
|
+
checkRaw(named, raw, ctx, loc);
|
|
73
|
+
}
|
|
74
|
+
}
|
|
75
|
+
}
|
|
76
|
+
return;
|
|
77
|
+
}
|
|
78
|
+
const raw = rawFromUnknown(val.value);
|
|
79
|
+
if (raw !== undefined) {
|
|
80
|
+
checkRaw(named, raw, ctx, loc);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
function checkTreValue(inst, ctx, loc) {
|
|
84
|
+
checkRaw(TYPE_REFERENCE, inst.value, ctx, loc);
|
|
85
|
+
}
|
|
86
|
+
function checkMember(member, ctx) {
|
|
87
|
+
const loc = member.typeSource ?? member.source;
|
|
88
|
+
if (member.kind === "property") {
|
|
89
|
+
checkLiteral(member.value, member.type, member.typeFqn, ctx, loc);
|
|
90
|
+
for (const entry of member.values ?? []) {
|
|
91
|
+
// Prefixed values (scad:value, …) are target-language facets, not BML
|
|
92
|
+
// literals — skip parseValue against the property type. TODO: a matching
|
|
93
|
+
// prefixed type (scad:type for scad:value) so each facet can be validated
|
|
94
|
+
// in its own language. Today prefixed values are not validated.
|
|
95
|
+
if (entry.namespace) {
|
|
96
|
+
continue;
|
|
97
|
+
}
|
|
98
|
+
if (member.value) {
|
|
99
|
+
continue;
|
|
100
|
+
}
|
|
101
|
+
checkLiteral(entry.value, member.type, member.typeFqn, ctx, loc);
|
|
102
|
+
}
|
|
103
|
+
for (const suggestion of member.suggestions ?? []) {
|
|
104
|
+
walkInstance(suggestion, ctx);
|
|
105
|
+
}
|
|
106
|
+
for (const group of member.groups ?? []) {
|
|
107
|
+
checkTreValue(group, ctx, loc);
|
|
108
|
+
}
|
|
109
|
+
}
|
|
110
|
+
else if (member.kind === "aggregation") {
|
|
111
|
+
for (const group of member.groups ?? []) {
|
|
112
|
+
checkTreValue(group, ctx, loc);
|
|
113
|
+
}
|
|
114
|
+
}
|
|
115
|
+
else if (member.kind === "capability") {
|
|
116
|
+
for (const thrown of member.throws ?? []) {
|
|
117
|
+
checkTreValue(thrown, ctx, loc);
|
|
118
|
+
}
|
|
119
|
+
}
|
|
120
|
+
for (const instance of member.constraints ?? []) {
|
|
121
|
+
walkInstance(instance, ctx);
|
|
122
|
+
}
|
|
123
|
+
}
|
|
124
|
+
function walkInstance(instance, ctx) {
|
|
125
|
+
const typeBlock = ctx.registry.get(instance.typeFqn)?.block;
|
|
126
|
+
const members = typeBlock ? resolveEffectiveMembers(typeBlock, ctx.registry) : [];
|
|
127
|
+
for (const [name, val] of Object.entries(instance.memberValues)) {
|
|
128
|
+
const member = members.find((m) => m.name === name);
|
|
129
|
+
if (!member) {
|
|
130
|
+
continue;
|
|
131
|
+
}
|
|
132
|
+
const type = member.kind === "property" || member.kind === "aggregation" || member.kind === "association"
|
|
133
|
+
? member.type
|
|
134
|
+
: undefined;
|
|
135
|
+
const typeFqn = member.kind === "property" || member.kind === "capability" ? member.typeFqn : undefined;
|
|
136
|
+
checkLiteral(val, type, typeFqn, ctx, instance.source);
|
|
137
|
+
}
|
|
138
|
+
for (const agg of instance.aggregationCompositions ?? []) {
|
|
139
|
+
walkCompositionNodes(agg.composition.children, ctx);
|
|
140
|
+
}
|
|
141
|
+
}
|
|
142
|
+
function walkCompositionNodes(nodes, ctx) {
|
|
143
|
+
for (const child of nodes) {
|
|
144
|
+
if (child.kind === "blockInstance") {
|
|
145
|
+
walkInstance(child.instance, ctx);
|
|
146
|
+
}
|
|
147
|
+
else {
|
|
148
|
+
walkCompositionNodes(child.children, ctx);
|
|
149
|
+
}
|
|
150
|
+
}
|
|
151
|
+
}
|
|
152
|
+
function walkBlockDefinition(block, ctx) {
|
|
153
|
+
for (const ref of block.contracts ?? []) {
|
|
154
|
+
checkTreValue(ref, ctx, block.source);
|
|
155
|
+
}
|
|
156
|
+
if (block.language) {
|
|
157
|
+
checkTreValue(block.language, ctx, block.source);
|
|
158
|
+
}
|
|
159
|
+
for (const instance of block.constraints ?? []) {
|
|
160
|
+
walkInstance(instance, ctx);
|
|
161
|
+
}
|
|
162
|
+
for (const member of block.members) {
|
|
163
|
+
checkMember(member, ctx);
|
|
164
|
+
}
|
|
165
|
+
for (const template of block.compositions) {
|
|
166
|
+
walkCompositionNodes(template.children, ctx);
|
|
167
|
+
}
|
|
168
|
+
for (const sub of block.subBlocks) {
|
|
169
|
+
walkBlockDefinition(sub, ctx);
|
|
170
|
+
}
|
|
171
|
+
for (const embedded of block.embeddedBlocks) {
|
|
172
|
+
walkBlockDefinition(embedded, ctx);
|
|
173
|
+
}
|
|
174
|
+
}
|
|
175
|
+
export function validateParseValues(document, registry) {
|
|
176
|
+
const diagnostics = [];
|
|
177
|
+
const file = document.source.filePath ?? "<memory>";
|
|
178
|
+
walkBlockDefinition(document.block, { registry, file, diagnostics });
|
|
179
|
+
return diagnostics;
|
|
180
|
+
}
|
|
181
|
+
//# sourceMappingURL=validate-parse-values.js.map
|