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();
}
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;
}
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);
}
}
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();
}
Aggregations