aboutsummaryrefslogtreecommitdiffhomepage
path: root/third_party/checker_framework_dataflow/java/org/checkerframework/dataflow/cfg/node/ReturnNode.java
diff options
context:
space:
mode:
Diffstat (limited to 'third_party/checker_framework_dataflow/java/org/checkerframework/dataflow/cfg/node/ReturnNode.java')
-rw-r--r--third_party/checker_framework_dataflow/java/org/checkerframework/dataflow/cfg/node/ReturnNode.java101
1 files changed, 101 insertions, 0 deletions
diff --git a/third_party/checker_framework_dataflow/java/org/checkerframework/dataflow/cfg/node/ReturnNode.java b/third_party/checker_framework_dataflow/java/org/checkerframework/dataflow/cfg/node/ReturnNode.java
new file mode 100644
index 0000000000..dbc74c83e3
--- /dev/null
+++ b/third_party/checker_framework_dataflow/java/org/checkerframework/dataflow/cfg/node/ReturnNode.java
@@ -0,0 +1,101 @@
+package org.checkerframework.dataflow.cfg.node;
+
+/*>>>
+import org.checkerframework.checker.nullness.qual.Nullable;
+*/
+
+import com.sun.source.tree.LambdaExpressionTree;
+import com.sun.tools.javac.code.Symbol.MethodSymbol;
+import org.checkerframework.dataflow.cfg.node.AssignmentContext.LambdaReturnContext;
+import org.checkerframework.dataflow.cfg.node.AssignmentContext.MethodReturnContext;
+import org.checkerframework.dataflow.util.HashCodeUtils;
+
+import java.util.Collection;
+import java.util.Collections;
+
+import javax.lang.model.type.TypeKind;
+import javax.lang.model.util.Types;
+
+import com.sun.source.tree.MethodTree;
+import com.sun.source.tree.ReturnTree;
+
+/**
+ * A node for a return statement:
+ *
+ * <pre>
+ * return
+ * return <em>expression</em>
+ * </pre>
+ *
+ * @author Stefan Heule
+ *
+ */
+public class ReturnNode extends Node {
+
+ protected ReturnTree tree;
+ protected /*@Nullable*/ Node result;
+
+ public ReturnNode(ReturnTree t, /*@Nullable*/ Node result, Types types, MethodTree methodTree) {
+ super(types.getNoType(TypeKind.NONE));
+ this.result = result;
+ tree = t;
+ result.setAssignmentContext(new MethodReturnContext(methodTree));
+ }
+
+ public ReturnNode(ReturnTree t, /*@Nullable*/ Node result, Types types, LambdaExpressionTree lambda, MethodSymbol methodSymbol) {
+ super(types.getNoType(TypeKind.NONE));
+ this.result = result;
+ tree = t;
+ result.setAssignmentContext(new LambdaReturnContext(methodSymbol));
+ }
+
+
+ public Node getResult() {
+ return result;
+ }
+
+ @Override
+ public ReturnTree getTree() {
+ return tree;
+ }
+
+ @Override
+ public <R, P> R accept(NodeVisitor<R, P> visitor, P p) {
+ return visitor.visitReturn(this, p);
+ }
+
+ @Override
+ public String toString() {
+ if (result != null) {
+ return "return " + result;
+ }
+ return "return";
+ }
+
+ @Override
+ public boolean equals(Object obj) {
+ if (obj == null || !(obj instanceof ReturnNode)) {
+ return false;
+ }
+ ReturnNode other = (ReturnNode) obj;
+ if ((result == null) != (other.result == null)) {
+ return false;
+ }
+ return (result == null || result.equals(other.result));
+ }
+
+ @Override
+ public int hashCode() {
+ return HashCodeUtils.hash(result);
+ }
+
+ @Override
+ public Collection<Node> getOperands() {
+ if (result == null) {
+ return Collections.emptyList();
+ } else {
+ return Collections.singletonList(result);
+ }
+ }
+
+}