A value declaration.

A value declaration declares the name and type of the value, but doesn’t provide a definition for it. There are several possible reasons for this:

  • The value can be a formal() attribute and be a member of an abstract() class
    or an interface, and subtypes have to provide the definition.
  • The value can be the declaration of a class or function parameter that only listed the name (and potentially a default value).
  • The value can be forward-declared, and the definition will be provided later.

In any case, the declaration must explicitly specify a type; a Modifier indicating type inference cannot be used. (The ’dynamic’ modifier counts as a “type” here, indicating not the inference, but rather the absense of typing information.)

no subtypes hierarchy

Initializer
ValueDeclaration(MemberName name, Type|VariadicType|DynamicModifier type, Annotations annotations = ...)
Parameters:
  • name

    The name of the declared value.

  • type

    The type of the declared value.

    This can be:

    • a proper Type,
    • a variadic type for the declaration of a variadic parameter, or
    • a dynamic’ modifier (DynamicModifier) to indicate the absence of a type.
  • annotations = Annotations()

    The annotations of the declared value.

Attributes
annotationsSource Codeshared actual Annotations annotations

The annotations of the declared value.

childrenSource Codeshared actual [Annotations, Type|VariadicType|DynamicModifier, LIdentifier] children

The child nodes of this node.

Refines AnyValue.children ultimately refines Node.children
definitionSource Codeshared actual Null definition

A value declaration has no definition.

hashSource Codeshared actual Integer hash

The hash value of the value, which allows the value to be an element of a hash-based set or key of a hash-based map. Implementations must respect the constraint that:

  • if x==y then x.hash==y.hash.

Therefore, a class which refines equals must also refine hash.

Refines Object.hash
nameSource Codeshared actual MemberName name

The name of the declared value.

typeSource Codeshared actual Type|VariadicType|DynamicModifier type

The type of the declared value.

This can be:

  • a proper Type,
  • a variadic type for the declaration of a variadic parameter, or
  • a dynamic’ modifier (DynamicModifier) to indicate the absence of a type.
Inherited Attributes
Attributes inherited from: Node
Attributes inherited from: Object
Methods
copySource Codeshared ValueDeclaration copy(MemberName name = ..., Type|VariadicType|DynamicModifier type = ..., Annotations annotations = ...)
Parameters:
  • name = this.name
  • type = this.type
  • annotations = this.annotations
equalsSource Codeshared actual Boolean equals(Object that)

Determine if two values are equal. Implementations should respect the constraints that:

  • if x===y then x==y (reflexivity),
  • if x==y then y==x (symmetry),
  • if x==y and y==z then x==z (transitivity).

Furthermore it is recommended that implementations ensure that if x==y then x and y have the same concrete class.

A class which explicitly refines equals() is said to support value equality, and the equality operator == is considered much more meaningful for such classes than for a class which simply inherits the default implementation of identity equality from Identifiable.

transformSource Codeshared actual Result transform<out Result>(Transformer<Result> transformer)

Transform this node with the given transformer by calling the appropriate transformX method on the transformer.

If you have a Node node that’s actually an LIdentifier instance, then the runtime will call LIdentifier.transform; therefore, this method is by nature narrowing. This means that if transformer is a NarrowingTransformer, calling node.transform(transformer) is equivalent to calling transformer.transformNode(node). On the other hand, if transformer is a WideningTransformer, then the two operations are very different.

Inherited Methods
Methods inherited from: Node