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;
  }
}
