Class SynthesisedCallMetaData
CallMetaDataDetails.
Use this - never hand-write new CallMetaDataDetails(true, 0).
Call metadata (purity, complexity, side-effects) is a property of the callee, and for a callee
that is part of the EK9 language surface it is a fact about the program: the user wrote
as pure, phase 5 measured the complexity from their code, and an AI can change either by
editing source. Fabricating a constant here asserts a measured-looking falsehood about user code -
? and <=> are user-overridable, so a hard-coded (true, 0) reports a user's
impure or complex operator as pure with zero complexity. Phase 12 gates fusability on exactly this
field, so a fabricated pure=true is strictly worse than no answer at all.
A site reaching for this must be calling a real EK9 method or operator. Compiler↔runtime
plumbing (_true, _false, _ofTrue, _ofFalse, _set,
_of, and the Ek9Async/Ek9Group/... stream helpers) has no EK9 symbol for the
callee because it is not EK9 surface at all - it is the compiler's own lowering, which no edit can
affect. Those sites must carry no metadata clause, not a fabricated one.
There are exactly TWO honest sources, in preference order: the resolved callee symbol (which
carries the user's authored purity and phase 5's measured complexity), and - when the target declares
no resolvable member - the OperatorMap declaration of that operator
(OperatorDeclarationMetaData). Anything else is a
fabrication. Failing both, this throws rather than silently reintroducing a default tuple.
- See Also:
-
Constructor Summary
ConstructorsConstructorDescriptionSynthesisedCallMetaData(IRGenerationContext stackContext) SynthesisedCallMetaData(Ek9Types ek9Types) For generators that holdEk9Typesdirectly rather than a full generation context - the Scenario 2 wrapper generators. -
Method Summary
Modifier and TypeMethodDescriptionMetadata for a zero-argument call (operand._isSet(),resource._close()).ResolvemethodName(argumentTypes)ontargetTypeand read the metadata off the resolved callee.forConstructor(ISymbol targetType, List<ISymbol> argumentTypes) Metadata for a CONSTRUCTOR call on the given type - the default constructor whenargumentTypesis empty, otherwise the matching overload (e.g.forSynthesisedCallee(ISymbol target, String methodName, List<ISymbol> argumentTypes) Metadata for a callee the COMPILER itself synthesised, where a symbol may legitimately not exist - returns null, meaning no metadata clause, when there is nothing measured to report.forSynthesisedConstructor(ISymbol targetType, List<ISymbol> argumentTypes) A compiler-synthesised CONSTRUCTOR - seeforSynthesisedCallee(ISymbol, String, List).
-
Constructor Details
-
SynthesisedCallMetaData
-
SynthesisedCallMetaData
-
-
Method Details
-
apply
Metadata for a zero-argument call (operand._isSet(),resource._close()). -
forConstructor
Metadata for a CONSTRUCTOR call on the given type - the default constructor whenargumentTypesis empty, otherwise the matching overload (e.g. the copy constructor).Constructors are keyed in the symbol table by the aggregate's UNQUALIFIED name (see
AggregateManipulator.addConstructorIfRequired), which is the one thing a caller reaching forapply(ISymbol, String)would get wrong. Route constructors through here so that naming rule lives in one place. A user's constructor can be impure and arbitrarily complex, so the copy-on-access and range-iteration lowerings must not keep asserting a fixed(true, 1, RETURN_MUTATION). -
forSynthesisedCallee
public CallMetaDataDetails forSynthesisedCallee(ISymbol target, String methodName, List<ISymbol> argumentTypes) Metadata for a callee the COMPILER itself synthesised, where a symbol may legitimately not exist - returns null, meaning no metadata clause, when there is nothing measured to report.Use this ONLY where the callee is known to be compiler-generated: a dynamic function's constructor (a
FunctionSymbolis not an aggregate, so it has no resolvable members), or an application lifecycle method such as_prepare. Every other site must useapply(ISymbol, String)and fail loud, because for a real EK9 callee a resolution miss is a bug, not an absence.Resolution tries the aggregate-member route first and then the construct's own SCOPE, which is what reaches a function's members. Returning null rather than a default tuple keeps the two-state rule: metadata read from a symbol, or no clause at all. Recording something here would mean measuring the synthesised body, which phase 5 - being parse-tree driven - never visits.
-
forSynthesisedConstructor
public CallMetaDataDetails forSynthesisedConstructor(ISymbol targetType, List<ISymbol> argumentTypes) A compiler-synthesised CONSTRUCTOR - seeforSynthesisedCallee(ISymbol, String, List). Constructors are keyed by the target's unqualified name. -
apply
public CallMetaDataDetails apply(ISymbol targetType, String methodName, List<ISymbol> argumentTypes) ResolvemethodName(argumentTypes)ontargetTypeand read the metadata off the resolved callee.- Parameters:
targetType- the type the call is made ON, as a resolved SYMBOL (never an FQN String)methodName- the JVM method name (_isSet), EK9 name (?) or, for a constructor, the target type's unqualified nameargumentTypes- resolved argument types, driving overload selection- Returns:
- the callee's measured metadata
- Throws:
CompilerException- when neither honest source has an answer
-