Class JavaExpression

java.lang.Object
org.checkerframework.dataflow.expression.JavaExpression
Direct Known Subclasses:
ArrayAccess, ArrayCreation, BinaryOperation, ClassName, FieldAccess, FormalParameter, LocalVariable, MethodCall, SuperReference, ThisReference, UnaryOperation, Unknown, ValueLiteral

public abstract class JavaExpression extends Object
This class represents a Java expression and its type. It does not represent all possible Java expressions (for example, it does not represent a ternary conditional expression ?:; use Unknown for unrepresentable expressions).

This class's representation is like an AST: subparts are also expressions. For declared names (fields, local variables, and methods), it also contains an Element.

Each subclass represents a different type of expression, such as MethodCall, ArrayAccess, LocalVariable, etc.

See Also:
  • Field Details

    • type

      protected final TypeMirror type
      The type of this expression.
  • Constructor Details

    • JavaExpression

      protected JavaExpression(TypeMirror type)
      Create a JavaExpression.
      Parameters:
      type - the type of the expression
  • Method Details

    • getType

      public TypeMirror getType()
    • containsOfClass

      @Pure public final boolean containsOfClass(Class<? extends JavaExpression> clazz)
      Returns true if some subexpression is of given class.

      If you want to debug and determine which subexpression is of the given class, use containedOfClass(java.lang.Class<T>).

      Parameters:
      clazz - the JavaExpression subclass to search for
      Returns:
      true if some subexpression's class is the given class
    • containedOfClass

      @Pure public abstract <T extends JavaExpression> @Nullable T containedOfClass(Class<T> clazz)
      Returns the first subexpression whose class is the given class, or null.

      This is intended as a diagnostic aid; most clients will use containsOfClass(java.lang.Class<? extends org.checkerframework.dataflow.expression.JavaExpression>).

      Type Parameters:
      T - the type corresponding to clazz
      Parameters:
      clazz - the JavaExpression subclass to search for
      Returns:
      true if some subexpression whose class is the given class
    • containsUnknown

      @Pure public final boolean containsUnknown()
      Returns true if some subexpression is Unknown.

      If you want to debug and determine which subexpression is of the given class, use containedUnknown().

      Returns:
      true if some subexpression is Unknown
    • containedUnknown

      @Pure public final @Nullable Unknown containedUnknown()
      Returns the first subexpression whose class is Unknown, or null.

      This is intended as a diagnostic aid; most clients will use containsUnknown().

      Returns:
      the first subexpression whose class is Unknown, or null
    • isDeterministic

      @Pure public abstract boolean isDeterministic(AnnotationProvider provider)
      Returns true if the expression is deterministic.
      Parameters:
      provider - an annotation provider (a type factory)
      Returns:
      true if this expression is deterministic
    • listIsDeterministic

      @Pure public static boolean listIsDeterministic(List<? extends @Nullable JavaExpression> list, AnnotationProvider provider)
      Returns true if all the expressions in the list are deterministic.
      Parameters:
      list - the list whose elements to test
      provider - an annotation provider (a type factory)
      Returns:
      true if all the expressions in the list are deterministic
    • isUnassignableByOtherCode

      @Deprecated @Pure public boolean isUnassignableByOtherCode()
      Deprecated.
      Returns true if and only if the value this expression stands for cannot be changed (with respect to ==) by a method call. This is the case for local variables, the self reference, final field accesses whose receiver is isUnassignableByOtherCode(), and operations whose operands are all isUnmodifiableByOtherCode().
      Returns:
      true if no subexpression of this can be assigned to from outside the current method body
      See Also:
    • isAssignableByOtherCode

      @Pure public boolean isAssignableByOtherCode()
      Returns true if some subexpression of this can be assigned to from outside the current method body.

      This is false for local variables, the self reference, final field accesses whose receiver is isUnassignableByOtherCode(), and operations whose operands are all not isModifiableByOtherCode().

      Returns:
      true if some subexpression of this can be assigned to from outside the current method body
      See Also:
    • isUnmodifiableByOtherCode

      @Deprecated @Pure public boolean isUnmodifiableByOtherCode()
      Deprecated.
      Returns true if and only if the value this expression stands for cannot be changed by a method call, including changes to any of its fields.

      Approximately, this returns true if the expression is isUnassignableByOtherCode() and its type is immutable.

      Returns:
      true if the value of this expression cannot be changed from outside the current method body
      See Also:
    • isModifiableByOtherCode

      @Pure public boolean isModifiableByOtherCode()
      Returns true if the value this expression stands for can be changed by a method call; equivalently, if the value this expression evaluates to can be changed by a side effect from outside the containing method.

      Approximately, this returns true if the expression is isAssignableByOtherCode() or its type is mutable. (String is an immutable type.)

      Returns:
      true if the value of this expression can be changed from outside the current method body
      See Also:
    • syntacticEquals

      @EqualsMethod @Pure public abstract boolean syntacticEquals(JavaExpression je)
      Returns true if and only if the two Java expressions are syntactically identical.

      This exists for use by containsSyntacticEqualJavaExpression(org.checkerframework.dataflow.expression.JavaExpression).

      Parameters:
      je - the other Java expression to compare to this one
      Returns:
      true if and only if the two Java expressions are syntactically identical
    • syntacticEqualsList

      @Pure public static boolean syntacticEqualsList(List<? extends @Nullable JavaExpression> lst1, List<? extends @Nullable JavaExpression> lst2)
      Returns true if the corresponding list elements satisfy syntacticEquals(org.checkerframework.dataflow.expression.JavaExpression).
      Parameters:
      lst1 - the first list to compare
      lst2 - the second list to compare
      Returns:
      true if the corresponding list elements satisfy syntacticEquals(org.checkerframework.dataflow.expression.JavaExpression)
    • containsSyntacticEqualJavaExpression

      @Pure public abstract boolean containsSyntacticEqualJavaExpression(JavaExpression other)
      Returns true if and only if this contains a JavaExpression that is syntactically equal to other.
      Parameters:
      other - the JavaExpression to search for
      Returns:
      true if and only if this contains a JavaExpression that is syntactically equal to other
    • listContainsSyntacticEqualJavaExpression

      @Pure public static boolean listContainsSyntacticEqualJavaExpression(List<? extends @Nullable JavaExpression> list, JavaExpression other)
      Returns true if the given list contains a JavaExpression that is syntactically equal to other.
      Parameters:
      list - the list in which to search for a match
      other - the JavaExpression to search for
      Returns:
      true if and only if the list contains a JavaExpression that is syntactically equal to other
    • containsModifiableAliasOf

      @Pure public boolean containsModifiableAliasOf(Store<?> store, JavaExpression other)
      Returns true if and only if other appears anywhere in this or an expression appears in this such that other might alias this expression, and that expression is modifiable.

      This is always true, except for cases where the Java type information prevents aliasing and none of the subexpressions can alias 'other'.

    • toStringDebug

      @Pure public String toStringDebug()
      Format this verbosely, for debugging.
      Returns:
      a verbose string representation of this
    • fromNodeFieldAccess

      public static JavaExpression fromNodeFieldAccess(FieldAccessNode node)
      Returns the Java expression for a FieldAccessNode. The result may contain Unknown as receiver.
      Parameters:
      node - the FieldAccessNode to convert to a JavaExpression
      Returns:
      the FieldAccess or ClassName that corresponds to node
    • fromArrayAccess

      public static ArrayAccess fromArrayAccess(ArrayAccessNode node)
      Returns the internal representation (as FieldAccess) of a FieldAccessNode. The result may contain Unknown as receiver.
      Parameters:
      node - the ArrayAccessNode to convert to a JavaExpression
      Returns:
      the internal representation (as FieldAccess) of a FieldAccessNode. Can contain Unknown as receiver.
    • fromNode

      public static JavaExpression fromNode(Node receiverNode)
      We ignore operations such as widening and narrowing when computing the internal representation.
      Parameters:
      receiverNode - a node to convert to a JavaExpression
      Returns:
      the internal representation of the given node. Might contain Unknown.
    • fromTree

      public static JavaExpression fromTree(ExpressionTree tree)
      Converts a javac ExpressionTree to a CF JavaExpression. The result might contain Unknown.

      We ignore operations such as widening and narrowing when computing the JavaExpression.

      Parameters:
      tree - a javac tree
      Returns:
      a JavaExpression for the given javac tree
    • fromVariableTree

      public static JavaExpression fromVariableTree(VariableTree tree)
      Returns the Java expression corresponding to the given variable tree tree.
      Parameters:
      tree - a variable tree
      Returns:
      a JavaExpression for tree
    • getParametersAsLocalVariables

      public static List<JavaExpression> getParametersAsLocalVariables(ExecutableElement methodEle)
      Returns the parameters of methodEle as LocalVariables.
      Parameters:
      methodEle - the method element
      Returns:
      list of parameters as LocalVariables
    • getFormalParameters

      public static List<FormalParameter> getFormalParameters(ExecutableElement methodEle)
      Returns the parameters of methodEle as FormalParameters.
      Parameters:
      methodEle - the method element
      Returns:
      list of parameters as FormalParameters
    • getReceiver

      public static JavaExpression getReceiver(ExpressionTree accessTree)
      Returns the receiver of the given invocation.
      Parameters:
      accessTree - a method or constructor invocation
      Returns:
      the receiver of the given invocation
    • getImplicitReceiver

      public static JavaExpression getImplicitReceiver(Element ele)
      Returns the implicit receiver of ele.

      Returns either a new ClassName or a new ThisReference depending on whether ele is static or not. The passed element must be a field, method, or class.

      When this returns a ThisReference, its type is the class that declares ele, which is not necessarily the type of this at the invocation site.

      Parameters:
      ele - a field, method, or class
      Returns:
      either a new ClassName or a new ThisReference depending on whether ele is static or not
    • getPseudoReceiver

      public static JavaExpression getPseudoReceiver(TreePath path, TypeMirror enclosingType)
      Returns either a new ClassName or ThisReference JavaExpression object for the enclosingType.

      The Tree should be an expression or a statement that does not have a receiver or an implicit receiver. For example, a local variable declaration.

      Parameters:
      path - a tree path
      enclosingType - type of the enclosing type
      Returns:
      a new ClassName or ThisReference that is a JavaExpression object for the enclosingType
    • accept

      public abstract <R, P> R accept(JavaExpressionVisitor<R,P> visitor, P p)
      Accept method of the visitor pattern.
      Type Parameters:
      R - result type of the operation
      P - parameter type
      Parameters:
      visitor - the visitor to be applied to this JavaExpression
      p - the parameter for this operation
      Returns:
      the result of visiting this
    • atFieldAccess

      public JavaExpression atFieldAccess(JavaExpression receiver)
      Viewpoint-adapts this to a field access with receiver receiver.
      Parameters:
      receiver - receiver of the field access
      Returns:
      viewpoint-adapted version of this
    • atMethodBody

      public final JavaExpression atMethodBody(MethodTree methodTree)
      Viewpoint-adapts this to the methodTree by converting any FormalParameter into LocalVariables.
      Parameters:
      methodTree - method declaration tree
      Returns:
      viewpoint-adapted version of this
    • atMethodInvocation

      public final JavaExpression atMethodInvocation(MethodInvocationTree methodInvocationTree)
      Viewpoint-adapts this to the methodInvocationTree.
      Parameters:
      methodInvocationTree - method invocation
      Returns:
      viewpoint-adapted version of this
    • atMethodInvocation

      public final JavaExpression atMethodInvocation(MethodInvocationNode invocationNode)
      Viewpoint-adapts this to the invocationNode.
      Parameters:
      invocationNode - method invocation
      Returns:
      viewpoint-adapted version of this
    • atConstructorInvocation

      public JavaExpression atConstructorInvocation(NewClassTree newClassTree)
      Viewpoint-adapts this to the newClassTree.
      Parameters:
      newClassTree - constructor invocation
      Returns:
      viewpoint-adapted version of this