org.springframework.expression.spel.ast

## Class SpelNodeImpl

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

- All Implemented Interfaces:
    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, 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 and 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, V9`

  - ### Constructor Summary

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

  - ### Method Summary

    All Methods Static Methods Instance Methods Abstract Methods Concrete Methods
    Modifier and Type | Method and Description
    --- | ---
    `void` | `generateCode(MethodVisitor mv, CodeFlow cf)` Generate the bytecode for this node into the supplied visitor.
    `protected static void` | `generateCodeForArgument(MethodVisitor mv, CodeFlow cf, SpelNodeImpl argument, String paramDesc)` Ask an argument to generate its bytecode and then follow it up with any boxing/unboxing/checkcasting to ensure it matches the expected parameter descriptor.
    `protected static void` | `generateCodeForArguments(MethodVisitor mv, CodeFlow cf, Member member, SpelNodeImpl[] arguments)` Generate code that handles building the argument values for the specified method.
    `SpelNode` | `getChild(int index)` Helper method that returns a SpelNode rather than an Antlr Tree 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.
    `TypedValue` | `getTypedValue(ExpressionState expressionState)` Evaluate the expression node in the context of the supplied expression state and return the typed value.
    `Object` | `getValue(ExpressionState expressionState)` Evaluate the expression node in the context of the supplied expression state and return the value.
    `protected <T> T` | `getValue(ExpressionState state, Class<T> desiredReturnType)`
    `abstract TypedValue` | `getValueInternal(ExpressionState expressionState)`
    `protected ValueRef` | `getValueRef(ExpressionState state)`
    `boolean` | `isCompilable()` Check whether a node can be compiled to bytecode.
    `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

      `toStringAST`

- - ### Field Detail

    - #### 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 Detail

    - #### SpelNodeImpl

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

  - ### Method Detail

    - #### 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`

    - #### 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 type value of this node evaluated against the specified state
      Throws:
        `EvaluationException`

    - #### 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`
      Helper method that returns a SpelNode rather than an Antlr Tree node.
      Specified by:
        `getChild` in interface `SpelNode`
      Returns:
        the child node cast to a SpelNode

    - #### 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

    - #### 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

    - #### isCompilable

          public boolean isCompilable()

      Check whether a node can be compiled to bytecode. The reasoning in each node may be different but will typically involve checking whether the exit type descriptor of the node is known and any relevant child nodes are compilable.
      Returns:
        `true` if this node can be compiled to bytecode

    - #### generateCode

          public void generateCode(MethodVisitor mv,
                                   CodeFlow cf)

      Generate the bytecode for this node into the supplied visitor. Context info about the current expression being compiled is available in the codeflow object, e.g. including information about the type of the object currently on the stack.
      Parameters:
        `mv` - the ASM MethodVisitor into which code should be generated
        `cf` - a context object with info about what is on the stack

    - #### 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

          protected static void generateCodeForArguments(MethodVisitor mv,
                                                         CodeFlow cf,
                                                         Member member,
                                                         SpelNodeImpl[] arguments)

      Generate code that handles building the argument values for the specified method. This method will take account of whether the invoked method is a varargs method and if it is 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 setup
        `arguments` - the expression nodes for the expression supplied argument values

    - #### generateCodeForArgument

          protected static void generateCodeForArgument(MethodVisitor mv,
                                                        CodeFlow cf,
                                                        SpelNodeImpl argument,
                                                        String paramDesc)

      Ask an argument to generate its bytecode and then follow it up with any boxing/unboxing/checkcasting to ensure it matches the expected parameter descriptor.