package jetbrains.mps.ide.modelchecker.platform.actions; /*Generated by MPS */ import jetbrains.mps.project.Project; import org.jetbrains.annotations.NotNull; import java.util.List; import jetbrains.mps.ide.findusages.model.SearchResult; import org.jetbrains.mps.openapi.model.SModel; import org.jetbrains.mps.openapi.util.ProgressMonitor; import jetbrains.mps.internal.collections.runtime.ListSequence; import java.util.ArrayList; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.model.SNodeUtil; import org.jetbrains.mps.openapi.model.SReference; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.lang.smodel.generator.smodelAdapter.AttributeOperations; import jetbrains.mps.lang.smodel.generator.smodelAdapter.IAttributeDescriptor; import jetbrains.mps.smodel.adapter.structure.MetaAdapterFactory; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SLinkOperations; import jetbrains.mps.resolve.ResolverComponent; import org.jetbrains.mps.openapi.model.SModelReference; import jetbrains.mps.project.dependency.VisibilityUtil; import org.jetbrains.mps.openapi.module.SModuleReference; import org.jetbrains.mps.openapi.module.SModule; import jetbrains.mps.project.AbstractModule; public class UnresolvedReferencesChecker extends SpecificChecker { private final Project myProject; public UnresolvedReferencesChecker(@NotNull Project mpsProject) { myProject = mpsProject; } @Override public List<SearchResult<ModelCheckerIssue>> checkModel(final SModel model, ProgressMonitor monitor) { List<SearchResult<ModelCheckerIssue>> results = ListSequence.fromList(new ArrayList<SearchResult<ModelCheckerIssue>>()); if (model == null || model == null || model.getModule() == null) { return results; } monitor.start("unresolved references", 1); for (SNode node : SNodeUtil.getDescendants(model)) { if (monitor.isCanceled()) { break; } // Check for unresolved references for (final SReference ref : ListSequence.fromList(SNodeOperations.getReferences(node))) { if ((AttributeOperations.getAttribute(node, new IAttributeDescriptor.LinkAttribute(MetaAdapterFactory.getConcept(0xb401a68083254110L, 0x8fd384331ff25befL, 0xfd7f44d616L, "jetbrains.mps.lang.generator.structure.ReferenceMacro"), ref.getLink())) != null)) { continue; } if (jetbrains.mps.util.SNodeOperations.getTargetNodeSilently(ref) == null) { SpecificChecker.addIssue(results, node, "Unresolved reference: " + SLinkOperations.getResolveInfo(ref), ModelChecker.SEVERITY_ERROR, "unresolved reference", new IModelCheckerFix() { public boolean doFix() { return ResolverComponent.getInstance().resolve(ref, myProject.getRepository()); } }); } final SModelReference mref = ref.getTargetSModelReference(); if (mref == null) { continue; } SModel m = mref.resolve(myProject.getRepository()); if (m == null) { continue; } if (VisibilityUtil.isVisible(model, m)) { continue; } SpecificChecker.addIssue(results, node, "Target module " + m.getModule() + " should be imported", ModelChecker.SEVERITY_ERROR, "target module not imported", new IModelCheckerFix() { public boolean doFix() { // check once again as this is executed somewhen in future SModel m2 = mref.resolve(myProject.getRepository()); if (m2 == null) { return false; } if (VisibilityUtil.isVisible(model, m2)) { return false; } SModuleReference moduleReference = check_xiru3y_a0f0f0i0c0d0c(check_xiru3y_a0a5a5a8a2a3a2(m2)); if (moduleReference == null) { return false; } SModule module = check_xiru3y_a0i0f0i0c0d0c(model); if (module == null) { return false; } ((AbstractModule) module).addDependency(moduleReference, false); return true; } }); } } monitor.done(); return results; } private static SModuleReference check_xiru3y_a0f0f0i0c0d0c(SModule checkedDotOperand) { if (null != checkedDotOperand) { return checkedDotOperand.getModuleReference(); } return null; } private static SModule check_xiru3y_a0a5a5a8a2a3a2(SModel checkedDotOperand) { if (null != checkedDotOperand) { return checkedDotOperand.getModule(); } return null; } private static SModule check_xiru3y_a0i0f0i0c0d0c(SModel checkedDotOperand) { if (null != checkedDotOperand) { return checkedDotOperand.getModule(); } return null; } }