| package org.checkerframework.dataflow.expression; |
| |
| import com.sun.source.tree.Tree; |
| import javax.lang.model.type.TypeMirror; |
| import org.checkerframework.checker.interning.qual.UsesObjectEquals; |
| import org.checkerframework.checker.nullness.qual.Nullable; |
| import org.checkerframework.dataflow.analysis.Store; |
| import org.checkerframework.dataflow.cfg.node.Node; |
| import org.checkerframework.javacutil.AnnotationProvider; |
| import org.checkerframework.javacutil.TreeUtils; |
| |
| /** Stands for any expression that the Dataflow Framework lacks explicit support for. */ |
| @UsesObjectEquals |
| public class Unknown extends JavaExpression { |
| |
| /** String representation of the expression that has no corresponding {@code JavaExpression}. */ |
| private final String originalExpression; |
| /** |
| * Create a new Unknown JavaExpression. |
| * |
| * @param type the Java type of this |
| */ |
| public Unknown(TypeMirror type) { |
| this(type, "?"); |
| } |
| |
| /** |
| * Create a new Unknown JavaExpression. |
| * |
| * @param type the Java type of this |
| * @param originalExpression String representation of the expression that has no corresponding |
| * {@code JavaExpression} |
| */ |
| public Unknown(TypeMirror type, String originalExpression) { |
| super(type); |
| this.originalExpression = originalExpression; |
| } |
| |
| /** |
| * Create a new Unknown JavaExpression. |
| * |
| * @param tree a tree that does not have a corresponding {@code JavaExpression} |
| */ |
| public Unknown(Tree tree) { |
| this(TreeUtils.typeOf(tree), TreeUtils.toStringTruncated(tree, 40)); |
| } |
| |
| /** |
| * Create a new Unknown JavaExpression. |
| * |
| * @param node a node that does not have a corresponding {@code JavaExpression} |
| */ |
| public Unknown(Node node) { |
| this(node.getType(), node.toString()); |
| } |
| |
| @Override |
| public boolean equals(@Nullable Object obj) { |
| return obj == this; |
| } |
| |
| // Overridden to avoid an error "overrides equals, but does not override hashCode" |
| @Override |
| public int hashCode() { |
| return System.identityHashCode(this); |
| } |
| |
| @Override |
| public String toString() { |
| return originalExpression; |
| } |
| |
| @Override |
| public boolean containsOfClass(Class<? extends JavaExpression> clazz) { |
| return getClass() == clazz; |
| } |
| |
| @Override |
| public boolean isDeterministic(AnnotationProvider provider) { |
| return false; |
| } |
| |
| @Override |
| public boolean isUnassignableByOtherCode() { |
| return false; |
| } |
| |
| @Override |
| public boolean isUnmodifiableByOtherCode() { |
| return false; |
| } |
| |
| @Override |
| public boolean syntacticEquals(JavaExpression je) { |
| return this == je; |
| } |
| |
| @Override |
| public boolean containsSyntacticEqualJavaExpression(JavaExpression other) { |
| return this.syntacticEquals(other); |
| } |
| |
| @Override |
| public boolean containsModifiableAliasOf(Store<?> store, JavaExpression other) { |
| return true; |
| } |
| |
| @Override |
| public <R, P> R accept(JavaExpressionVisitor<R, P> visitor, P p) { |
| return visitor.visitUnknown(this, p); |
| } |
| } |