blob: 4db2e334090354394da850071030b5b782fb8250 [file] [log] [blame]
package org.checkerframework.dataflow.cfg.builder;
import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.Map;
import javax.lang.model.element.Name;
import org.checkerframework.checker.nullness.qual.Nullable;
/**
* A map that keeps track of new labels added within a try block. For names that are outside of the
* try block, the finally label is returned. This ensures that a finally block is executed when
* control flows outside of the try block.
*/
@SuppressWarnings("serial")
class TryFinallyScopeMap extends HashMap<Name, Label> {
/** New labels within a try block that were added by this implementation. */
private final Map<Name, Label> accessedNames;
/** Create a new TryFinallyScopeMap. */
protected TryFinallyScopeMap() {
this.accessedNames = new LinkedHashMap<>(2);
}
@Override
public Label get(@Nullable Object key) {
if (key == null) {
throw new IllegalArgumentException();
}
if (super.containsKey(key)) {
return super.get(key);
} else {
if (accessedNames.containsKey(key)) {
return accessedNames.get(key);
}
Label l = new Label();
accessedNames.put((Name) key, l);
return l;
}
}
@Override
@SuppressWarnings("keyfor:contracts.conditional.postcondition") // get adds everything
public boolean containsKey(@Nullable Object key) {
return true;
}
public Map<Name, Label> getAccessedNames() {
return accessedNames;
}
}