Search in sources :

Example 11 with Node

use of org.checkerframework.dataflow.cfg.node.Node in project error-prone by google.

the class NullnessPropagationTransfer method visitAssignment.

@Override
Nullness visitAssignment(AssignmentNode node, SubNodeValues inputs, LocalVariableUpdates updates) {
    Nullness value = inputs.valueOfSubNode(node.getExpression());
    Node target = node.getTarget();
    if (target instanceof LocalVariableNode) {
        updates.set((LocalVariableNode) target, value);
    }
    if (target instanceof ArrayAccessNode) {
        setNonnullIfLocalVariable(updates, ((ArrayAccessNode) target).getArray());
    }
    if (target instanceof FieldAccessNode) {
        FieldAccessNode fieldAccess = (FieldAccessNode) target;
        ClassAndField targetField = tryGetFieldSymbol(target.getTree());
        setReceiverNonnull(updates, fieldAccess.getReceiver(), targetField);
    }
    /*
     * We propagate the value of the target to the value of the assignment expressions as a whole.
     * We do this regardless of whether the target is a local variable. For example:
     *
     * String s = object.field = "foo"; // Now |s| is non-null.
     *
     * It's not clear to me that this is technically correct, but it works in practice with the
     * bytecode generated by both javac and ecj.
     *
     * http://stackoverflow.com/q/12850676/28465
     */
    return value;
}
Also used : TypeCastNode(org.checkerframework.dataflow.cfg.node.TypeCastNode) ArrayCreationNode(org.checkerframework.dataflow.cfg.node.ArrayCreationNode) LocalVariableNode(org.checkerframework.dataflow.cfg.node.LocalVariableNode) EqualToNode(org.checkerframework.dataflow.cfg.node.EqualToNode) VariableDeclarationNode(org.checkerframework.dataflow.cfg.node.VariableDeclarationNode) InstanceOfNode(org.checkerframework.dataflow.cfg.node.InstanceOfNode) AssignmentNode(org.checkerframework.dataflow.cfg.node.AssignmentNode) FieldAccessNode(org.checkerframework.dataflow.cfg.node.FieldAccessNode) NotEqualNode(org.checkerframework.dataflow.cfg.node.NotEqualNode) ArrayAccessNode(org.checkerframework.dataflow.cfg.node.ArrayAccessNode) MethodInvocationNode(org.checkerframework.dataflow.cfg.node.MethodInvocationNode) FunctionalInterfaceNode(org.checkerframework.dataflow.cfg.node.FunctionalInterfaceNode) Node(org.checkerframework.dataflow.cfg.node.Node) ArrayAccessNode(org.checkerframework.dataflow.cfg.node.ArrayAccessNode) FieldAccessNode(org.checkerframework.dataflow.cfg.node.FieldAccessNode) LocalVariableNode(org.checkerframework.dataflow.cfg.node.LocalVariableNode)

Aggregations

Node (org.checkerframework.dataflow.cfg.node.Node)11 LocalVariableNode (org.checkerframework.dataflow.cfg.node.LocalVariableNode)9 AssignmentNode (org.checkerframework.dataflow.cfg.node.AssignmentNode)5 IntegerLiteralNode (org.checkerframework.dataflow.cfg.node.IntegerLiteralNode)4 RegularBlock (org.checkerframework.dataflow.cfg.block.RegularBlock)3 ArrayAccessNode (org.checkerframework.dataflow.cfg.node.ArrayAccessNode)3 EqualToNode (org.checkerframework.dataflow.cfg.node.EqualToNode)3 FieldAccessNode (org.checkerframework.dataflow.cfg.node.FieldAccessNode)3 MethodInvocationNode (org.checkerframework.dataflow.cfg.node.MethodInvocationNode)3 Block (org.checkerframework.dataflow.cfg.block.Block)2 ExceptionBlock (org.checkerframework.dataflow.cfg.block.ExceptionBlock)2 SpecialBlock (org.checkerframework.dataflow.cfg.block.SpecialBlock)2 ClassNameNode (org.checkerframework.dataflow.cfg.node.ClassNameNode)2 ExplicitThisLiteralNode (org.checkerframework.dataflow.cfg.node.ExplicitThisLiteralNode)2 NarrowingConversionNode (org.checkerframework.dataflow.cfg.node.NarrowingConversionNode)2 ReturnNode (org.checkerframework.dataflow.cfg.node.ReturnNode)2 StringConversionNode (org.checkerframework.dataflow.cfg.node.StringConversionNode)2 SuperNode (org.checkerframework.dataflow.cfg.node.SuperNode)2 ThisLiteralNode (org.checkerframework.dataflow.cfg.node.ThisLiteralNode)2 ValueLiteralNode (org.checkerframework.dataflow.cfg.node.ValueLiteralNode)2