package typesystemIntegration.languageChecker;
/*Generated by MPS */
import jetbrains.mps.checkers.RefScopeChecker;
import jetbrains.mps.nodeEditor.EditorComponent;
import jetbrains.mps.errors.QuickFixProvider;
import org.jetbrains.mps.openapi.model.SReference;
import org.jetbrains.mps.openapi.module.SRepository;
import jetbrains.mps.errors.QuickFix_Runtime;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.resolve.ResolverComponent;
import jetbrains.mps.resolve.ReferenceResolverUtils;
import jetbrains.mps.openapi.editor.cells.SubstituteAction;
import jetbrains.mps.openapi.editor.cells.SubstituteInfo;
import jetbrains.mps.internal.collections.runtime.ListSequence;
public class RefScopeCheckerInEditor extends RefScopeChecker {
private EditorComponent myEditorComponent;
/*package*/ void setEditorComponent(EditorComponent editorContext) {
myEditorComponent = editorContext;
}
@Override
protected QuickFixProvider createResolveReferenceQuickfix(SReference reference, SRepository repository, boolean executeImmediately) {
return new RefScopeCheckerInEditor.ResolveReferenceEditorBasedQuickFix(reference, repository, executeImmediately, myEditorComponent);
}
private class ResolveReferenceEditorBasedQuickFix extends RefScopeChecker.ResolveReferenceQuickFix {
private EditorComponent myEditorComponent;
public ResolveReferenceEditorBasedQuickFix(SReference reference, SRepository repository, boolean executeImmediately, EditorComponent editorComponent) {
super(reference, repository, executeImmediately);
myEditorComponent = editorComponent;
}
@Override
public QuickFix_Runtime getQuickFix() {
return new QuickFix_Runtime() {
@Override
public void execute(SNode node) {
if (ResolverComponent.getInstance().resolveScopesOnly(myReference, myRepository)) {
return;
}
SNode sourceNode = myReference.getSourceNode();
if (sourceNode == null) {
return;
}
final String resolveInfo = ReferenceResolverUtils.getResolveInfo(myReference, sourceNode);
if (resolveInfo == null) {
return;
}
EditorBasedReferenceResolverUtils.resolveInEditor(myEditorComponent, sourceNode, resolveInfo, myReference.getRole());
}
@Override
public String getDescription(SNode node) {
return "Resolve \"" + myReference.getRole() + "\" reference";
}
};
}
private SubstituteAction getApplicableSubstituteAction(SubstituteInfo substituteInfo, String resolveInfo) {
SubstituteAction result = null;
for (SubstituteAction nextAction : ListSequence.fromList(substituteInfo.getMatchingActions(resolveInfo, true))) {
if (nextAction.canSubstitute(resolveInfo)) {
if (result != null) {
return null;
}
result = nextAction;
}
}
return result;
}
}
}