Package org.springframework.expression.spel.ast

# Class SpelNodeImpl

java.lang.Object
org.springframework.expression.spel.ast.SpelNodeImpl

All Implemented Interfaces:
  `org.springframework.asm.Opcodes`, `SpelNode`

Direct Known Subclasses:
  `Assign`, `BeanReference`, `CompoundExpression`, `ConstructorReference`, `Elvis`, `FunctionReference`, `Identifier`, `Indexer`, `InlineList`, `InlineMap`, `Literal`, `MethodReference`, `Operator`, `OperatorNot`, `Projection`, `PropertyOrFieldReference`, `QualifiedIdentifier`, `Selection`, `Ternary`, `TypeReference`, `VariableReference`

public abstract class SpelNodeImpl extends Object implements SpelNode, org.springframework.asm.Opcodes
The common supertype of all AST nodes in a parsed Spring Expression Language format expression.

Since:
  3.0
Author:
  Andy Clement, Juergen Hoeller, Sam Brannen

## Field Summary

Fields
Modifier and Type
Field
Description
`protected SpelNodeImpl[]`
`children`
`protected String`
`exitTypeDescriptor`
Indicates the type descriptor for the result of this expression node.

### Fields inherited from interface org.springframework.asm.Opcodes

`AALOAD, AASTORE, ACC_ABSTRACT, ACC_ANNOTATION, ACC_BRIDGE, ACC_DEPRECATED, ACC_ENUM, ACC_FINAL, ACC_INTERFACE, ACC_MANDATED, ACC_MODULE, ACC_NATIVE, ACC_OPEN, ACC_PRIVATE, ACC_PROTECTED, ACC_PUBLIC, ACC_RECORD, ACC_STATIC, ACC_STATIC_PHASE, ACC_STRICT, ACC_SUPER, ACC_SYNCHRONIZED, ACC_SYNTHETIC, ACC_TRANSIENT, ACC_TRANSITIVE, ACC_VARARGS, ACC_VOLATILE, ACONST_NULL, ALOAD, ANEWARRAY, ARETURN, ARRAYLENGTH, ASM10_EXPERIMENTAL, ASM4, ASM5, ASM6, ASM7, ASM8, ASM9, ASTORE, ATHROW, BALOAD, BASTORE, BIPUSH, CALOAD, CASTORE, CHECKCAST, D2F, D2I, D2L, DADD, DALOAD, DASTORE, DCMPG, DCMPL, DCONST_0, DCONST_1, DDIV, DLOAD, DMUL, DNEG, DOUBLE, DREM, DRETURN, DSTORE, DSUB, DUP, DUP_X1, DUP_X2, DUP2, DUP2_X1, DUP2_X2, F_APPEND, F_CHOP, F_FULL, F_NEW, F_SAME, F_SAME1, F2D, F2I, F2L, FADD, FALOAD, FASTORE, FCMPG, FCMPL, FCONST_0, FCONST_1, FCONST_2, FDIV, FLOAD, FLOAT, FMUL, FNEG, FREM, FRETURN, FSTORE, FSUB, GETFIELD, GETSTATIC, GOTO, H_GETFIELD, H_GETSTATIC, H_INVOKEINTERFACE, H_INVOKESPECIAL, H_INVOKESTATIC, H_INVOKEVIRTUAL, H_NEWINVOKESPECIAL, H_PUTFIELD, H_PUTSTATIC, I2B, I2C, I2D, I2F, I2L, I2S, IADD, IALOAD, IAND, IASTORE, ICONST_0, ICONST_1, ICONST_2, ICONST_3, ICONST_4, ICONST_5, ICONST_M1, IDIV, IF_ACMPEQ, IF_ACMPNE, IF_ICMPEQ, IF_ICMPGE, IF_ICMPGT, IF_ICMPLE, IF_ICMPLT, IF_ICMPNE, IFEQ, IFGE, IFGT, IFLE, IFLT, IFNE, IFNONNULL, IFNULL, IINC, ILOAD, IMUL, INEG, INSTANCEOF, INTEGER, INVOKEDYNAMIC, INVOKEINTERFACE, INVOKESPECIAL, INVOKESTATIC, INVOKEVIRTUAL, IOR, IREM, IRETURN, ISHL, ISHR, ISTORE, ISUB, IUSHR, IXOR, JSR, L2D, L2F, L2I, LADD, LALOAD, LAND, LASTORE, LCMP, LCONST_0, LCONST_1, LDC, LDIV, LLOAD, LMUL, LNEG, LONG, LOOKUPSWITCH, LOR, LREM, LRETURN, LSHL, LSHR, LSTORE, LSUB, LUSHR, LXOR, MONITORENTER, MONITOREXIT, MULTIANEWARRAY, NEW, NEWARRAY, NOP, NULL, POP, POP2, PUTFIELD, PUTSTATIC, RET, RETURN, SALOAD, SASTORE, SIPUSH, SOURCE_DEPRECATED, SOURCE_MASK, SWAP, T_BOOLEAN, T_BYTE, T_CHAR, T_DOUBLE, T_FLOAT, T_INT, T_LONG, T_SHORT, TABLESWITCH, TOP, UNINITIALIZED_THIS, V_PREVIEW, V1_1, V1_2, V1_3, V1_4, V1_5, V1_6, V1_7, V1_8, V10, V11, V12, V13, V14, V15, V16, V17, V18, V19, V20, V21, V22, V23, V24, V25, V9`

## Constructor Summary

Constructors
Constructor
Description
`SpelNodeImpl(int startPos, int endPos, SpelNodeImpl... operands)`

## Method Summary

Modifier and Type
Method
Description
`protected static void`
`generateCodeForArgument(org.springframework.asm.MethodVisitor mv, CodeFlow cf, SpelNodeImpl argument, String paramDesc)`
Deprecated.
as of 6.2, in favor of `CodeFlow.generateCodeForArgument(MethodVisitor, SpelNode, String)`
`protected static void`
`generateCodeForArguments(org.springframework.asm.MethodVisitor mv, CodeFlow cf, Executable executable, SpelNodeImpl[] arguments)`
Generate code that handles building the argument values for the specified `Executable` (method or constructor).
`protected static void`
`generateCodeForArguments(org.springframework.asm.MethodVisitor mv, CodeFlow cf, Member member, SpelNodeImpl[] arguments)`
Deprecated.
as of 6.2, in favor of `generateCodeForArguments(MethodVisitor, CodeFlow, Executable, SpelNodeImpl[])`
`SpelNode`
`getChild(int index)`
Return the nth child under this node.
`int`
`getChildCount()`
Return the number of children under this node.
`int`
`getEndPosition()`
Return the end position of this AST node in the expression string.
`String`
`getExitDescriptor()`
`Class<?>`
`getObjectClass(Object obj)`
Determine the class of the object passed in, unless it is already a class object.
`int`
`getStartPosition()`
Return the start position of this AST node in the expression string.
`final TypedValue`
`getTypedValue(ExpressionState expressionState)`
Evaluate the expression node in the context of the supplied expression state and return the typed value.
`final Object`
`getValue(ExpressionState expressionState)`
Evaluate the expression node in the context of the supplied expression state and return the value.
`protected final <T> T`
`getValue(ExpressionState state, Class<T> desiredReturnType)`
`abstract TypedValue`
`getValueInternal(ExpressionState expressionState)`
`protected ValueRef`
`getValueRef(ExpressionState state)`
`boolean`
`isNullSafe()`
Determine if this node is the target of a null-safe navigation operation.
`boolean`
`isWritable(ExpressionState expressionState)`
Determine if this expression node will support a setValue() call.
`protected boolean`
`nextChildIs(Class<?>... classes)`
Return `true` if the next child is one of the specified classes.
`void`
`setValue(ExpressionState expressionState, Object newValue)`
Evaluate the expression to a node and then set the new value on that node.
`TypedValue`
`setValueInternal(ExpressionState expressionState, Supplier<TypedValue> valueSupplier)`
Evaluate the expression to a node and then set the new value created by the specified `Supplier` on that node.

### Methods inherited from class java.lang.Object

`clone, equals, finalize, getClass, hashCode, notify, notifyAll, toString, wait, wait, wait`

### Methods inherited from interface org.springframework.expression.spel.SpelNode

`generateCode, isCompilable, toStringAST`

## Field Details

### children

protected SpelNodeImpl[] children

### exitTypeDescriptor

@Nullable protected volatile String exitTypeDescriptor
Indicates the type descriptor for the result of this expression node. This is set as soon as it is known. For a literal node it is known immediately. For a property access or method invocation it is known after one evaluation of that node.

The descriptor is like the bytecode form but is slightly easier to work with. It does not include the trailing semicolon (for non array reference types). Some examples: Ljava/lang/String, I, [I

## Constructor Details

### SpelNodeImpl

public SpelNodeImpl(int startPos, int endPos, @Nullable SpelNodeImpl... operands)

## Method Details

### nextChildIs

protected boolean nextChildIs(Class<?>... classes)
Return `true` if the next child is one of the specified classes.

### getValue

@Nullable public final Object getValue(ExpressionState expressionState) throws EvaluationException
Description copied from interface: `SpelNode`
Evaluate the expression node in the context of the supplied expression state and return the value.

Specified by:
  `getValue` in interface `SpelNode`
Parameters:
  `expressionState` - the current expression state (includes the context)
Returns:
  the value of this node evaluated against the specified state
Throws:
  `EvaluationException` - if any problem occurs evaluating the expression

### getTypedValue

public final TypedValue getTypedValue(ExpressionState expressionState) throws EvaluationException
Description copied from interface: `SpelNode`
Evaluate the expression node in the context of the supplied expression state and return the typed value.

Specified by:
  `getTypedValue` in interface `SpelNode`
Parameters:
  `expressionState` - the current expression state (includes the context)
Returns:
  the typed value of this node evaluated against the specified state
Throws:
  `EvaluationException` - if any problem occurs evaluating the expression

### isWritable

public boolean isWritable(ExpressionState expressionState) throws EvaluationException
Description copied from interface: `SpelNode`
Determine if this expression node will support a setValue() call.

Specified by:
  `isWritable` in interface `SpelNode`
Parameters:
  `expressionState` - the current expression state (includes the context)
Returns:
  true if the expression node will allow setValue()
Throws:
  `EvaluationException` - if something went wrong trying to determine if the node supports writing

### setValue

public void setValue(ExpressionState expressionState, @Nullable Object newValue) throws EvaluationException
Description copied from interface: `SpelNode`
Evaluate the expression to a node and then set the new value on that node. For example, if the expression evaluates to a property reference, then the property will be set to the new value.

Specified by:
  `setValue` in interface `SpelNode`
Parameters:
  `expressionState` - the current expression state (includes the context)
  `newValue` - the new value
Throws:
  `EvaluationException` - if any problem occurs evaluating the expression or setting the new value

### setValueInternal

public TypedValue setValueInternal(ExpressionState expressionState, Supplier<TypedValue> valueSupplier) throws EvaluationException
Evaluate the expression to a node and then set the new value created by the specified `Supplier` on that node.

For example, if the expression evaluates to a property reference, then the property will be set to the new value.

Favor this method over `setValue(ExpressionState, Object)` when the value should be lazily computed.

By default, this method throws a `SpelEvaluationException`, effectively disabling this feature. Subclasses may override this method to provide an actual implementation.

Parameters:
  `expressionState` - the current expression state (includes the context)
  `valueSupplier` - a supplier of the new value
Throws:
  `EvaluationException` - if any problem occurs evaluating the expression or setting the new value
Since:
  5.2.24

### getChild

public SpelNode getChild(int index)
Description copied from interface: `SpelNode`
Return the nth child under this node.

Specified by:
  `getChild` in interface `SpelNode`
Returns:
  the child node
See Also:
  - `SpelNode.getChildCount()`

### getChildCount

public int getChildCount()
Description copied from interface: `SpelNode`
Return the number of children under this node.

Specified by:
  `getChildCount` in interface `SpelNode`
Returns:
  the child count
See Also:
  - `SpelNode.getChild(int)`

### getObjectClass

@Nullable public Class<?> getObjectClass(@Nullable Object obj)
Description copied from interface: `SpelNode`
Determine the class of the object passed in, unless it is already a class object.

Specified by:
  `getObjectClass` in interface `SpelNode`
Parameters:
  `obj` - the object that the caller wants the class of
Returns:
  the class of the object if it is not already a class object, or `null` if the object is `null`

### getStartPosition

public int getStartPosition()
Description copied from interface: `SpelNode`
Return the start position of this AST node in the expression string.

Specified by:
  `getStartPosition` in interface `SpelNode`
Returns:
  the start position

### getEndPosition

public int getEndPosition()
Description copied from interface: `SpelNode`
Return the end position of this AST node in the expression string.

Specified by:
  `getEndPosition` in interface `SpelNode`
Returns:
  the end position

### isNullSafe

public boolean isNullSafe()
Determine if this node is the target of a null-safe navigation operation.

The default implementation returns `false`.

Returns:
  `true` if this node is the target of a null-safe operation
Since:
  6.1.6

### getExitDescriptor

@Nullable public String getExitDescriptor()

### getValue

@Nullable protected final <T> T getValue(ExpressionState state, Class<T> desiredReturnType) throws EvaluationException

Throws:
  `EvaluationException`

### getValueRef

protected ValueRef getValueRef(ExpressionState state) throws EvaluationException

Throws:
  `EvaluationException`

### getValueInternal

public abstract TypedValue getValueInternal(ExpressionState expressionState) throws EvaluationException

Throws:
  `EvaluationException`

### generateCodeForArguments

@Deprecated(since="6.2") protected static void generateCodeForArguments(org.springframework.asm.MethodVisitor mv, CodeFlow cf, Member member, SpelNodeImpl[] arguments)
Deprecated.
as of 6.2, in favor of `generateCodeForArguments(MethodVisitor, CodeFlow, Executable, SpelNodeImpl[])`
Generate code that handles building the argument values for the specified `Member` (method or constructor).

This method takes into account whether the method or constructor was declared to accept varargs, and if it was then the argument values will be appropriately packaged into an array.

Parameters:
  `mv` - the method visitor where code should be generated
  `cf` - the current `CodeFlow`
  `member` - the method or constructor for which arguments are being set up
  `arguments` - the expression nodes for the expression supplied argument values

### generateCodeForArguments

protected static void generateCodeForArguments(org.springframework.asm.MethodVisitor mv, CodeFlow cf, Executable executable, SpelNodeImpl[] arguments)
Generate code that handles building the argument values for the specified `Executable` (method or constructor).

This method takes into account whether the method or constructor was declared to accept varargs, and if it was then the argument values will be appropriately packaged into an array.

Parameters:
  `mv` - the method visitor where code should be generated
  `cf` - the current `CodeFlow`
  `executable` - the `Executable` (method or constructor) for which arguments are being set up
  `arguments` - the expression nodes for the expression supplied argument values
Since:
  6.2

### generateCodeForArgument

@Deprecated(since="6.2") protected static void generateCodeForArgument(org.springframework.asm.MethodVisitor mv, CodeFlow cf, SpelNodeImpl argument, String paramDesc)
Deprecated.
as of 6.2, in favor of `CodeFlow.generateCodeForArgument(MethodVisitor, SpelNode, String)`
Generate bytecode that loads the supplied argument onto the stack.

This method also performs any boxing, unboxing, or check-casting necessary to ensure that the type of the argument on the stack matches the supplied `paramDesc`.