package jetbrains.mps.lang.test.runtime;
/*Generated by MPS */
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.typesystem.inference.TypeCheckingContext;
import jetbrains.mps.typesystem.inference.TypeContextManager;
import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations;
import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory;
import org.jetbrains.mps.openapi.language.SAbstractConcept;
import junit.framework.Assert;
import jetbrains.mps.newTypesystem.TypesUtil;
import jetbrains.mps.newTypesystem.state.State;
import jetbrains.mps.newTypesystem.operation.AbstractOperation;
import java.util.List;
import java.util.Collections;
import jetbrains.mps.newTypesystem.test.StateMatcher;
public class TypeSystemCheckUtil {
public TypeSystemCheckUtil() {
}
public static void checkGenerationMode(SNode node) {
TypeCheckingContext typeCheckingContext = TypeContextManager.getInstance().createTypeCheckingContext(node.getContainingRoot());
typeCheckingContext.checkRoot(true);
for (SNode child : SNodeOperations.getNodeDescendants(node, MetaAdapterFactory.getConcept(0xceab519525ea4f22L, 0x9b92103b95ca8c0cL, 0x10802efe25aL, "jetbrains.mps.lang.core.structure.BaseConcept"), false, new SAbstractConcept[]{})) {
TypeCheckingContext typeCheckingContext2 = TypeContextManager.getInstance().createTracingTypeCheckingContext(node.getContainingRoot());
SNode type1 = typeCheckingContext.getTypeDontCheck(child);
if (type1 == null) {
continue;
}
SNode type2 = typeCheckingContext2.getTypeInGenerationMode(child);
Assert.assertTrue(TypesUtil.match(type1, type2));
}
}
public static void checkRollBacks(SNode node) {
TypeCheckingContext typeCheckingContext = TypeContextManager.getInstance().createTracingTypeCheckingContext(node.getContainingRoot());
State state = typeCheckingContext.getState();
State state2 = new State(state.getTypeCheckingContext());
AbstractOperation rootOperation = state.getOperation();
List<AbstractOperation> operations = state.getOperationsAsList();
int num = operations.size() / 3;
AbstractOperation operation = operations.get(num);
Collections.reverse(operations);
state2.executeOperationsBeforeAnchor(rootOperation, operation);
for (AbstractOperation toRevert : operations) {
if (toRevert.equals(operation)) {
break;
}
toRevert.undo(state);
}
Assert.assertTrue(StateMatcher.match(state, state2));
}
}