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;
}
}