Search in sources :

Example 1 with KeyFor

use of org.checkerframework.checker.nullness.qual.KeyFor in project checker-framework by typetools.

the class DOTCFGVisualizer method visualizeNodes.

@SuppressWarnings("keyfor:enhancedfor")
@Override
public String visualizeNodes(Set<Block> blocks, ControlFlowGraph cfg, @Nullable Analysis<V, S, T> analysis) {
    StringBuilder sbDotNodes = new StringBuilder();
    IdentityHashMap<Block, List<Integer>> processOrder = getProcessOrder(cfg);
    // Definition of all nodes including their labels.
    for (@KeyFor("processOrder") Block v : blocks) {
        sbDotNodes.append("    ").append(v.getUid()).append(" [");
        if (v.getType() == BlockType.CONDITIONAL_BLOCK) {
            sbDotNodes.append("shape=polygon sides=8 ");
        } else if (v.getType() == BlockType.SPECIAL_BLOCK) {
            sbDotNodes.append("shape=oval ");
        } else {
            sbDotNodes.append("shape=rectangle ");
        }
        sbDotNodes.append("label=\"");
        if (verbose) {
            sbDotNodes.append(getProcessOrderSimpleString(processOrder.get(v))).append(getSeparator());
        }
        String strBlock = visualizeBlock(v, analysis);
        if (strBlock.length() == 0) {
            if (v.getType() == BlockType.CONDITIONAL_BLOCK) {
                // The footer of the conditional block.
                sbDotNodes.append("\"];");
            } else {
                // The footer of the block which has no content and is not a special or conditional block.
                sbDotNodes.append("?? empty ??\"];");
            }
        } else {
            sbDotNodes.append(strBlock).append("\"];");
        }
        sbDotNodes.append(System.lineSeparator());
    }
    return sbDotNodes.toString();
}
Also used : KeyFor(org.checkerframework.checker.nullness.qual.KeyFor) SpecialBlock(org.checkerframework.dataflow.cfg.block.SpecialBlock) Block(org.checkerframework.dataflow.cfg.block.Block) ConditionalBlock(org.checkerframework.dataflow.cfg.block.ConditionalBlock) List(java.util.List)

Example 2 with KeyFor

use of org.checkerframework.checker.nullness.qual.KeyFor in project checker-framework by typetools.

the class KeyForTransfer method visitMethodInvocation.

/*
   * Provided that m is of a type that implements interface java.util.Map:
   * <ul>
   * <li>Given a call m.containsKey(k), ensures that k is @KeyFor("m") in the thenStore of the transfer result.
   * <li>Given a call m.put(k, ...), ensures that k is @KeyFor("m") in the thenStore and elseStore of the transfer result.
   * </ul>
   */
@Override
public TransferResult<KeyForValue, KeyForStore> visitMethodInvocation(MethodInvocationNode node, TransferInput<KeyForValue, KeyForStore> in) {
    TransferResult<KeyForValue, KeyForStore> result = super.visitMethodInvocation(node, in);
    KeyForAnnotatedTypeFactory factory = (KeyForAnnotatedTypeFactory) analysis.getTypeFactory();
    if (factory.isMapContainsKey(node) || factory.isMapPut(node)) {
        Node receiver = node.getTarget().getReceiver();
        JavaExpression receiverJe = JavaExpression.fromNode(receiver);
        String mapName = receiverJe.toString();
        JavaExpression keyExpr = JavaExpression.fromNode(node.getArgument(0));
        LinkedHashSet<String> keyForMaps = new LinkedHashSet<>();
        keyForMaps.add(mapName);
        final KeyForValue previousKeyValue = in.getValueOfSubNode(node.getArgument(0));
        if (previousKeyValue != null) {
            for (AnnotationMirror prevAm : previousKeyValue.getAnnotations()) {
                if (prevAm != null && factory.areSameByClass(prevAm, KeyFor.class)) {
                    keyForMaps.addAll(getKeys(prevAm));
                }
            }
        }
        AnnotationMirror am = factory.createKeyForAnnotationMirrorWithValue(keyForMaps);
        if (factory.isMapContainsKey(node)) {
            // method is Map.containsKey
            result.getThenStore().insertValue(keyExpr, am);
        } else {
            // method is Map.put
            result.getThenStore().insertValue(keyExpr, am);
            result.getElseStore().insertValue(keyExpr, am);
        }
    }
    return result;
}
Also used : LinkedHashSet(java.util.LinkedHashSet) AnnotationMirror(javax.lang.model.element.AnnotationMirror) JavaExpression(org.checkerframework.dataflow.expression.JavaExpression) MethodInvocationNode(org.checkerframework.dataflow.cfg.node.MethodInvocationNode) Node(org.checkerframework.dataflow.cfg.node.Node) KeyFor(org.checkerframework.checker.nullness.qual.KeyFor)

Example 3 with KeyFor

use of org.checkerframework.checker.nullness.qual.KeyFor in project checker-framework by typetools.

the class NonNullMapValue method process_unmatched_procedure_entries.

public static void process_unmatched_procedure_entries() {
    HashMap<Integer, Date> call_hashmap = new HashMap<>();
    for (Integer i : call_hashmap.keySet()) {
        @NonNull Date d = call_hashmap.get(i);
    }
    Set<@KeyFor("call_hashmap") Integer> keys = call_hashmap.keySet();
    for (Integer i : keys) {
        @NonNull Date d = call_hashmap.get(i);
    }
    Set<@KeyFor("call_hashmap") Integer> keys_sorted = new TreeSet<@KeyFor("call_hashmap") Integer>(call_hashmap.keySet());
    for (Integer i : keys_sorted) {
        @NonNull Date d = call_hashmap.get(i);
    }
}
Also used : HashMap(java.util.HashMap) TreeSet(java.util.TreeSet) NonNull(org.checkerframework.checker.nullness.qual.NonNull) KeyFor(org.checkerframework.checker.nullness.qual.KeyFor) Date(java.util.Date)

Example 4 with KeyFor

use of org.checkerframework.checker.nullness.qual.KeyFor in project checker-framework by typetools.

the class StringCFGVisualizer method visualizeNodes.

@SuppressWarnings("keyfor:enhancedfor")
@Override
public String visualizeNodes(Set<Block> blocks, ControlFlowGraph cfg, @Nullable Analysis<V, S, T> analysis) {
    StringJoiner sjStringNodes = new StringJoiner(lineSeparator);
    IdentityHashMap<Block, List<Integer>> processOrder = getProcessOrder(cfg);
    // Generate all the Nodes.
    for (@KeyFor("processOrder") Block v : blocks) {
        sjStringNodes.add(v.getUid() + ":");
        if (verbose) {
            sjStringNodes.add(getProcessOrderSimpleString(processOrder.get(v)));
        }
        sjStringNodes.add(visualizeBlock(v, analysis));
        sjStringNodes.add("");
    }
    return sjStringNodes.toString().trim();
}
Also used : KeyFor(org.checkerframework.checker.nullness.qual.KeyFor) SpecialBlock(org.checkerframework.dataflow.cfg.block.SpecialBlock) Block(org.checkerframework.dataflow.cfg.block.Block) ConditionalBlock(org.checkerframework.dataflow.cfg.block.ConditionalBlock) List(java.util.List) StringJoiner(java.util.StringJoiner)

Aggregations

KeyFor (org.checkerframework.checker.nullness.qual.KeyFor)4 List (java.util.List)2 Block (org.checkerframework.dataflow.cfg.block.Block)2 ConditionalBlock (org.checkerframework.dataflow.cfg.block.ConditionalBlock)2 SpecialBlock (org.checkerframework.dataflow.cfg.block.SpecialBlock)2 Date (java.util.Date)1 HashMap (java.util.HashMap)1 LinkedHashSet (java.util.LinkedHashSet)1 StringJoiner (java.util.StringJoiner)1 TreeSet (java.util.TreeSet)1 AnnotationMirror (javax.lang.model.element.AnnotationMirror)1 NonNull (org.checkerframework.checker.nullness.qual.NonNull)1 MethodInvocationNode (org.checkerframework.dataflow.cfg.node.MethodInvocationNode)1 Node (org.checkerframework.dataflow.cfg.node.Node)1 JavaExpression (org.checkerframework.dataflow.expression.JavaExpression)1