package jetbrains.mps.checkers; /*Generated by MPS */ import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.module.SRepository; import jetbrains.mps.internal.collections.runtime.ListSequence; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import org.jetbrains.mps.openapi.language.SContainmentLink; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SConceptOperations; import org.jetbrains.mps.openapi.model.SReference; import org.jetbrains.mps.openapi.language.SReferenceLink; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations; import jetbrains.mps.errors.messageTargets.ReferenceMessageTarget; public class TargetConceptChecker extends AbstractNodeChecker { public TargetConceptChecker() { } @Override public void checkNode(SNode node, LanguageErrorsCollector errorsCollector, SRepository repository) { for (SNode child : ListSequence.fromList(SNodeOperations.getChildren(node)).where(new IWhereFilter<SNode>() { public boolean accept(SNode it) { return !(SNodeOperations.isAttribute(it)); } })) { SContainmentLink link = SNodeOperations.getContainingLink(child); if (!(SConceptOperations.isSuperConceptOf(SNodeOperations.asSConcept(link.getTargetConcept()), SNodeOperations.asSConcept(SNodeOperations.getConcept(child))))) { errorsCollector.addError(child, "incompatible target concept in role \"" + SNodeOperations.getContainingLink(child) + "\": subconcept of \"" + link.getTargetConcept().getQualifiedName() + "\" expected, \"" + SNodeOperations.getConcept(child) + "\" found", null); } } for (SReference reference : ListSequence.fromList(SNodeOperations.getReferences(node))) { SReferenceLink link = SLinkOperations.getRefLink(reference); SNode target = SLinkOperations.getTargetNode(reference); if (target == null) { continue; } if (!(SConceptOperations.isSuperConceptOf(SNodeOperations.asSConcept(link.getTargetConcept()), SNodeOperations.asSConcept(SNodeOperations.getConcept(target))))) { errorsCollector.addError(node, "incompatible target concept in role \"" + ((SReference) reference).getLink().getName() + "\": subconcept of \"" + link.getTargetConcept().getQualifiedName() + "\" expected, \"" + SNodeOperations.getConcept(target) + "\" found", null, new ReferenceMessageTarget(link.getName())); } } } }