package org.checkerframework.checker.lock;

import java.util.List;
import java.util.Set;
import javax.lang.model.element.AnnotationMirror;
import javax.lang.model.element.VariableElement;
import javax.lang.model.type.TypeMirror;
import org.checkerframework.common.basetype.BaseTypeChecker;
import org.checkerframework.framework.flow.CFAbstractAnalysis;
import org.checkerframework.framework.flow.CFStore;
import org.checkerframework.framework.flow.CFValue;
import org.checkerframework.javacutil.Pair;

/**
 * The analysis class for the lock type system.
 *
 * <p>This class extends {@link CFAbstractAnalysis} so that {@link LockStore} is used rather than
 * {@link CFStore}.
 */
public class LockAnalysis extends CFAbstractAnalysis<CFValue, LockStore, LockTransfer> {

  public LockAnalysis(
      BaseTypeChecker checker,
      LockAnnotatedTypeFactory factory,
      List<Pair<VariableElement, CFValue>> fieldValues) {
    super(checker, factory, fieldValues);
  }

  @Override
  public LockTransfer createTransferFunction() {
    return new LockTransfer(this, (LockChecker) checker);
  }

  @Override
  public LockStore createEmptyStore(boolean sequentialSemantics) {
    return new LockStore(this, sequentialSemantics);
  }

  @Override
  public LockStore createCopiedStore(LockStore s) {
    return new LockStore(this, s);
  }

  @Override
  public CFValue createAbstractValue(Set<AnnotationMirror> annotations, TypeMirror underlyingType) {
    return defaultCreateAbstractValue(this, annotations, underlyingType);
  }
}
