Record Class CallDetails

java.lang.Object
java.lang.Record
org.ek9lang.compiler.ir.data.CallDetails

public record CallDetails(String targetObject, String targetTypeName, String methodName, List<String> parameterTypes, String returnTypeName, List<String> arguments, CallMetaDataDetails metaData, boolean isVirtualCall, boolean isTraitCall, boolean isExplicitTraitDefaultCall, boolean isExternTarget, boolean statementOwned, boolean boundToNamedType, CallConventions conventions) extends Record
Used with CallInstr, holds all the necessary details to make a call. Includes metadata for backend optimization.

The targetTypeName is the type where the method is actually defined, which may be a parent class if the method is inherited. This enables correct method resolution for both JVM (INVOKEVIRTUAL) and LLVM (vtable dispatch) backends.

The isVirtualCall flag indicates whether the call requires runtime polymorphic dispatch (vtable lookup) or can use static dispatch (direct call). Virtual calls are needed for non-final methods on non-final classes where the runtime type may differ from the static type.

The isExplicitTraitDefaultCall flag indicates an explicit call to a trait's default method implementation using TraitName.method() syntax. In JVM bytecode, this requires INVOKESPECIAL to bypass virtual dispatch and call the interface's default method directly (similar to super calls).

The isExternTarget flag is TRUE exactly when the type the call NAMES is externally linked (IR lane F, Steve 2026-10-28: "extern should be externally linked in some way; defaulted/synthetic methods are not external"). Externally linked means the type's code is not produced from EK9 source in this program: it is EXTERN (a built-in such as String or Stdout, or a defines extern library type; Java on the JVM, the C runtime natively) or a PRE_BUILT parameterisation (bytecode shipped in ek9-lang), or it is a runtime helper class with no EK9 symbol (Ek9CycleGuard, Ek9Sort, ...). It is FALSE for a user EK9 type - even for its defaulted or synthesised members (_i_init, <init>, _isSet) - and for a type the compiler generates for this program (a Scenario 2 delegation wrapper for a parameterisation with no pre-built class, a Scenario 3 monomorphisation, a dynamic class or function). THE decision is IsExternallyLinked, reached through DispatchFacts.externallyLinked; ExternTargetInvariant checks every CALL of every IR fixture. toString() does not render it. The LLVM branch reads it for super(...) lowering (review B-R1): a user base class is therefore NOT a C-runtime type.

metaData is nullable, and its absence is meaningful only together with kind(). Purity, complexity and side-effects are properties of the callee that the user authored - as pure, complexity measured by phase 5 from their code. Every CALL is exactly one CallDetails.Kind:

  • CallDetails.Kind.PROGRAM - metadata present: the callee is EK9 language surface, and every field was READ from its resolved symbol (or, for a target with no resolvable member, from the OperatorMap declaration of that operator). Phase 12 may evaluate it.
  • CallDetails.Kind.PLUMBING - the callee is compiler↔runtime PLUMBING that the lowering invented (_true, _ofFalse, the Ek9Async/Ek9Sort/... stream helpers). It has no EK9 symbol because it is not part of the program at all, so no edit by a user or an AI can change it. Stamping a program-property field on it is a category error, so it carries no metadata.
  • CallDetails.Kind.SYNTHESISED_MEMBER - a compiler-synthesised member with no symbol (_i_init, _c_init, _fieldSetStatus, _copyAccepts; IsSynthesisedMember): never measured, so no metadata - but NOT plumbing, because the body is in this IR.
  • CallDetails.Kind.UNRESOLVED - no metadata and none of the above: a phase-7 site that did not read the callee it resolved. A defect, never a legitimate state; an IR reader must treat the call as UNKNOWN, never as effect-free.

The plumbing mark is DERIVED from targetTypeName/methodName through CompilerPlumbingCalls - the same predicate every synthesis site already asks before it drops the metadata - rather than stored as a second copy that could disagree with it. Name matching is sound there because the plumbing names cannot be written in EK9 (a leading _ is a syntax error; the helper types live in org.ek9.lang and carry no @Ek9Class).

There is deliberately no "default" or "unresolved" tuple. A fabricated pure=true is worse than no answer, because Phase 12 acts on it. See docs/ir-and-codegen/EK9_CALL_METADATA_ROOT_C_PLAN.md and docs/ir-and-codegen/EK9_ESCAPE_MUTATION_IR_SUFFICIENCY.md §10.1/§11.

statementOwned is TRUE when the call's closeable result is owned by the evaluation that makes it - its block statement, or, for code in no statement, a returning variable's or a property's initialiser or a text's string - so that evaluation closes it when it finishes. Phase 5 decides it on the call's resolved symbol (support/MarkStatementOwned); IR generation only reads it. It is a binary field, deliberately NOT rendered by toString(): the close the statement emits is what the IR shows.

boundToNamedType is TRUE for a call that must run the NAMED type's own implementation on a receiver whose class may override it (D38): a generated comparison's field-set-status step reads the status of the fields THAT operator compares, on this and on param alike. It is never virtual. Rendered bound=true; a back end calls the named type's method directly (JVM INVOKESPECIAL - the receiver is typed as the class being generated; native: the named type's function, never the vtable slot). It is the any-receiver sibling of Contract 19's CALL (Owner)super._x().

  • Nested Class Summary

    Nested Classes
    Modifier and Type
    Class
    Description
    static enum 
    The four kinds of CALL - see the record javadoc.
  • Constructor Summary

    Constructors
    Constructor
    Description
    CallDetails(String targetObject, String targetTypeName, String methodName, List<String> parameterTypes, String returnTypeName, List<String> arguments, CallMetaDataDetails metaData, boolean isVirtualCall, boolean isTraitCall, boolean isExplicitTraitDefaultCall, boolean isExternTarget)
    A call whose result no statement owns - every call other than the closeable temporaries phase 5 marked.
    CallDetails(String targetObject, String targetTypeName, String methodName, List<String> parameterTypes, String returnTypeName, List<String> arguments, CallMetaDataDetails metaData, boolean isVirtualCall, boolean isTraitCall, boolean isExplicitTraitDefaultCall, boolean isExternTarget, boolean statementOwned)
    A call that is not bound to its named type - every call other than D38's field-set-status step.
    CallDetails(String targetObject, String targetTypeName, String methodName, List<String> parameterTypes, String returnTypeName, List<String> arguments, CallMetaDataDetails metaData, boolean isVirtualCall, boolean isTraitCall, boolean isExplicitTraitDefaultCall, boolean isExternTarget, boolean statementOwned, boolean boundToNamedType)
    A call with today's ownership conventions (CallConventions.DEFAULT).
    CallDetails(String targetObject, String targetTypeName, String methodName, List<String> parameterTypes, String returnTypeName, List<String> arguments, CallMetaDataDetails metaData, boolean isVirtualCall, boolean isTraitCall, boolean isExplicitTraitDefaultCall, boolean isExternTarget, boolean statementOwned, boolean boundToNamedType, CallConventions conventions)
    Creates an instance of a CallDetails record class.
  • Method Summary

    Modifier and Type
    Method
    Description
    Returns the value of the arguments record component.
    boolean
    Returns the value of the boundToNamedType record component.
    Returns the value of the conventions record component.
    final boolean
    Indicates whether some other object is "equal to" this one.
    final int
    Returns a hash code value for this object.
    boolean
    Returns the value of the isExplicitTraitDefaultCall record component.
    boolean
    Returns the value of the isExternTarget record component.
    boolean
    THE plumbing mark: the callee is compiler↔runtime lowering, not part of the program.
    boolean
    Returns the value of the isTraitCall record component.
    boolean
    Returns the value of the isVirtualCall record component.
    What kind of callee this CALL reaches - see the record javadoc.
    Returns the value of the metaData record component.
    Returns the value of the methodName record component.
    Returns the value of the parameterTypes record component.
    Returns the value of the returnTypeName record component.
    boolean
    Returns the value of the statementOwned record component.
    Returns the value of the targetObject record component.
    Returns the value of the targetTypeName record component.
    Returns a string representation of this record class.
    This call with different ownership conventions (EK9_IR_OWNERSHIP_MODEL.md §5); everything else unchanged.
    withStatementOwned(boolean newStatementOwned)
    This call with phase 5's decision on whether the statement making it owns (and closes) the closeable it returns (support/MarkStatementOwned); everything else unchanged.

    Methods inherited from class Object

    clone, finalize, getClass, notify, notifyAll, wait, wait, wait
  • Constructor Details

    • CallDetails

      public CallDetails(String targetObject, String targetTypeName, String methodName, List<String> parameterTypes, String returnTypeName, List<String> arguments, CallMetaDataDetails metaData, boolean isVirtualCall, boolean isTraitCall, boolean isExplicitTraitDefaultCall, boolean isExternTarget, boolean statementOwned, boolean boundToNamedType, CallConventions conventions)
      Creates an instance of a CallDetails record class.
      Parameters:
      targetObject - the value for the targetObject record component
      targetTypeName - the value for the targetTypeName record component
      methodName - the value for the methodName record component
      parameterTypes - the value for the parameterTypes record component
      returnTypeName - the value for the returnTypeName record component
      arguments - the value for the arguments record component
      metaData - the value for the metaData record component
      isVirtualCall - the value for the isVirtualCall record component
      isTraitCall - the value for the isTraitCall record component
      isExplicitTraitDefaultCall - the value for the isExplicitTraitDefaultCall record component
      isExternTarget - the value for the isExternTarget record component
      statementOwned - the value for the statementOwned record component
      boundToNamedType - the value for the boundToNamedType record component
      conventions - the value for the conventions record component
    • CallDetails

      public CallDetails(String targetObject, String targetTypeName, String methodName, List<String> parameterTypes, String returnTypeName, List<String> arguments, CallMetaDataDetails metaData, boolean isVirtualCall, boolean isTraitCall, boolean isExplicitTraitDefaultCall, boolean isExternTarget, boolean statementOwned, boolean boundToNamedType)
      A call with today's ownership conventions (CallConventions.DEFAULT).
    • CallDetails

      public CallDetails(String targetObject, String targetTypeName, String methodName, List<String> parameterTypes, String returnTypeName, List<String> arguments, CallMetaDataDetails metaData, boolean isVirtualCall, boolean isTraitCall, boolean isExplicitTraitDefaultCall, boolean isExternTarget, boolean statementOwned)
      A call that is not bound to its named type - every call other than D38's field-set-status step.
    • CallDetails

      public CallDetails(String targetObject, String targetTypeName, String methodName, List<String> parameterTypes, String returnTypeName, List<String> arguments, CallMetaDataDetails metaData, boolean isVirtualCall, boolean isTraitCall, boolean isExplicitTraitDefaultCall, boolean isExternTarget)
      A call whose result no statement owns - every call other than the closeable temporaries phase 5 marked.
  • Method Details

    • withConventions

      public CallDetails withConventions(CallConventions newConventions)
      This call with different ownership conventions (EK9_IR_OWNERSHIP_MODEL.md §5); everything else unchanged.
    • withStatementOwned

      public CallDetails withStatementOwned(boolean newStatementOwned)
      This call with phase 5's decision on whether the statement making it owns (and closes) the closeable it returns (support/MarkStatementOwned); everything else unchanged. THE way to set it on a built call - never a field-by-field copy of the record.
    • kind

      public CallDetails.Kind kind()
      What kind of callee this CALL reaches - see the record javadoc. THE single question an IR reader asks before trusting (or refusing to trust) metaData().
    • isPlumbing

      public boolean isPlumbing()
      THE plumbing mark: the callee is compiler↔runtime lowering, not part of the program.
    • toString

      @Nonnull public String toString()
      Returns a string representation of this record class. The representation contains the name of the class, followed by the name and value of each of the record components.
      Specified by:
      toString in class Record
      Returns:
      a string representation of this object
    • hashCode

      public final int hashCode()
      Returns a hash code value for this object. The value is derived from the hash code of each of the record components.
      Specified by:
      hashCode in class Record
      Returns:
      a hash code value for this object
    • equals

      public final boolean equals(Object o)
      Indicates whether some other object is "equal to" this one. The objects are equal if the other object is of the same class and if all the record components are equal. Reference components are compared with Objects::equals(Object,Object); primitive components are compared with the compare method from their corresponding wrapper classes.
      Specified by:
      equals in class Record
      Parameters:
      o - the object with which to compare
      Returns:
      true if this object is the same as the o argument; false otherwise.
    • targetObject

      public String targetObject()
      Returns the value of the targetObject record component.
      Returns:
      the value of the targetObject record component
    • targetTypeName

      public String targetTypeName()
      Returns the value of the targetTypeName record component.
      Returns:
      the value of the targetTypeName record component
    • methodName

      public String methodName()
      Returns the value of the methodName record component.
      Returns:
      the value of the methodName record component
    • parameterTypes

      public List<String> parameterTypes()
      Returns the value of the parameterTypes record component.
      Returns:
      the value of the parameterTypes record component
    • returnTypeName

      public String returnTypeName()
      Returns the value of the returnTypeName record component.
      Returns:
      the value of the returnTypeName record component
    • arguments

      public List<String> arguments()
      Returns the value of the arguments record component.
      Returns:
      the value of the arguments record component
    • metaData

      public CallMetaDataDetails metaData()
      Returns the value of the metaData record component.
      Returns:
      the value of the metaData record component
    • isVirtualCall

      public boolean isVirtualCall()
      Returns the value of the isVirtualCall record component.
      Returns:
      the value of the isVirtualCall record component
    • isTraitCall

      public boolean isTraitCall()
      Returns the value of the isTraitCall record component.
      Returns:
      the value of the isTraitCall record component
    • isExplicitTraitDefaultCall

      public boolean isExplicitTraitDefaultCall()
      Returns the value of the isExplicitTraitDefaultCall record component.
      Returns:
      the value of the isExplicitTraitDefaultCall record component
    • isExternTarget

      public boolean isExternTarget()
      Returns the value of the isExternTarget record component.
      Returns:
      the value of the isExternTarget record component
    • statementOwned

      public boolean statementOwned()
      Returns the value of the statementOwned record component.
      Returns:
      the value of the statementOwned record component
    • boundToNamedType

      public boolean boundToNamedType()
      Returns the value of the boundToNamedType record component.
      Returns:
      the value of the boundToNamedType record component
    • conventions

      public CallConventions conventions()
      Returns the value of the conventions record component.
      Returns:
      the value of the conventions record component