package jetbrains.mps.ide.modelchecker.platform.actions;
/*Generated by MPS */
import com.intellij.openapi.components.State;
import com.intellij.openapi.components.Storage;
import com.intellij.openapi.components.PersistentStateComponent;
import com.intellij.openapi.components.ApplicationComponent;
import org.jetbrains.annotations.NonNls;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import javax.swing.Icon;
import com.intellij.openapi.application.ApplicationManager;
import java.util.List;
import jetbrains.mps.project.Project;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.ArrayList;
import jetbrains.mps.checkers.TypesystemChecker;
import jetbrains.mps.checkers.AbstractConstraintsCheckerRootCheckerAdapter;
import jetbrains.mps.checkers.ConstraintsChecker;
import jetbrains.mps.checkers.RefScopeChecker;
import jetbrains.mps.checkers.TargetConceptChecker;
import jetbrains.mps.checkers.UsedLanguagesChecker;
import jetbrains.mps.checkers.StructureChecker;
@State(name = "ModelCheckerSettings", storages = @Storage(value = "modelCheckerSettings.xml")
)
public class ModelCheckerSettings implements PersistentStateComponent<ModelCheckerSettings.MyState>, ApplicationComponent {
private ModelCheckerSettings.MyState myState = new ModelCheckerSettings.MyState();
public ModelCheckerSettings() {
}
@NonNls
@NotNull
@Override
public String getComponentName() {
return "Model Checker Settings";
}
@Override
public void initComponent() {
}
@Override
public void disposeComponent() {
}
@Override
public ModelCheckerSettings.MyState getState() {
return myState;
}
@Override
public void loadState(ModelCheckerSettings.MyState state) {
myState = state;
}
@Nullable
public Icon getIcon() {
return null;
}
public static ModelCheckerSettings getInstance() {
return ApplicationManager.getApplication().getComponent(ModelCheckerSettings.class);
}
public List<SpecificChecker> getSpecificCheckers(@NotNull Project mpsProject) {
List<SpecificChecker> checkers = ListSequence.fromList(new ArrayList<SpecificChecker>());
switch (myState.myCheckingLevel) {
case TYPESYSTEM:
ListSequence.fromList(checkers).addElement(new RootCheckerSpecificCheckerAdapter(new TypesystemChecker(), "typesystem", mpsProject.getRepository()));
case CONSTRAINTS:
ListSequence.fromList(checkers).addElement(new RootCheckerSpecificCheckerAdapter(new AbstractConstraintsCheckerRootCheckerAdapter(AbstractConstraintsCheckerRootCheckerAdapter.SKIP_CONSTRAINTS_CONDITION, new ConstraintsChecker(), new RefScopeChecker(), new TargetConceptChecker()), "constraints", mpsProject.getRepository()));
ListSequence.fromList(checkers).addElement(new RootCheckerSpecificCheckerAdapter(new AbstractConstraintsCheckerRootCheckerAdapter(new UsedLanguagesChecker()), "constraints", mpsProject.getRepository()));
case STRUCTURE:
ListSequence.fromList(checkers).addElement(new RootCheckerSpecificCheckerAdapter(new AbstractConstraintsCheckerRootCheckerAdapter(AbstractConstraintsCheckerRootCheckerAdapter.SUPRESS_ERRORS_CONDITION, new StructureChecker()), "structure", mpsProject.getRepository()));
default:
ListSequence.fromList(checkers).addElement(new ModelPropertiesChecker());
ListSequence.fromList(checkers).addElement(new UnresolvedReferencesChecker(mpsProject));
}
if (isIncludeAdditionalChecks()) {
ListSequence.fromList(checkers).addElement(new GeneratorTemplatesChecker());
}
return checkers;
}
public ModelCheckerSettings.CheckingLevel getCheckingLevel() {
return myState.myCheckingLevel;
}
public void setCheckingLevel(ModelCheckerSettings.CheckingLevel checkingLevel) {
myState.myCheckingLevel = checkingLevel;
}
public boolean isIncludeAdditionalChecks() {
return myState.myIncludeAdditionalChecks;
}
public void setIncludeAdditionalChecks(boolean checkSpecific) {
myState.myIncludeAdditionalChecks = checkSpecific;
}
public boolean isCheckStubs() {
return myState.myCheckStubs;
}
public void setCheckStubs(boolean checkStubs) {
myState.myCheckStubs = checkStubs;
}
public boolean isCheckBeforeCommit() {
return myState.myCheckBeforeCommit;
}
public void setCheckBeforeCommit(boolean checkBeforeCommit) {
myState.myCheckBeforeCommit = checkBeforeCommit;
}
public static class MyState {
public ModelCheckerSettings.CheckingLevel myCheckingLevel = ModelCheckerSettings.CheckingLevel.TYPESYSTEM;
public boolean myIncludeAdditionalChecks = true;
public boolean myCheckBeforeCommit = true;
public boolean myCheckStubs = false;
public MyState() {
}
}
public enum CheckingLevel {
BASIC("Basic", "Project structure is correct", "Each reference has target"),
STRUCTURE("Structure", "Code conforms with languages' structure"),
CONSTRAINTS("Constraints", "Code satisfies languages' constraints"),
TYPESYSTEM("Typesystem", "Code passes typesystem checks");
private String myPresentation;
private String[] myChecks;
CheckingLevel(String presentation, String... checks) {
myPresentation = presentation;
myChecks = checks;
}
public String getPresentation() {
return myPresentation;
}
public String getLongDescription() {
StringBuilder sb = new StringBuilder("Checks that:\n");
for (int i = 0; i <= this.ordinal(); i++) {
for (String s : ModelCheckerSettings.CheckingLevel.values()[i].myChecks) {
sb.append("-").append(s).append("\n");
}
}
return sb.toString();
}
}
}