package jetbrains.mps.lang.core.plugin;
/*Generated by MPS */
import jetbrains.mps.refactoring.participant.RefactoringParticipantBase;
import org.jetbrains.mps.openapi.model.SNodeReference;
import org.jetbrains.mps.openapi.model.SNode;
import jetbrains.mps.refactoring.participant.MoveNodeRefactoringParticipant;
import jetbrains.mps.smodel.structure.Extension;
import jetbrains.mps.refactoring.participant.RefactoringParticipant;
import java.util.List;
import org.jetbrains.mps.openapi.module.SRepository;
import jetbrains.mps.internal.collections.runtime.ListSequence;
import java.util.ArrayList;
import org.jetbrains.mps.openapi.module.SearchScope;
import jetbrains.mps.ide.findusages.model.SearchResults;
import jetbrains.mps.refactoring.participant.RefactoringSession;
import org.jetbrains.mps.openapi.model.SModel;
import org.jetbrains.mps.openapi.model.SReference;
import jetbrains.mps.internal.collections.runtime.Sequence;
import org.jetbrains.mps.openapi.language.SLanguage;
import jetbrains.mps.smodel.SModelInternal;
import jetbrains.mps.module.ReloadableModuleBase;
import jetbrains.mps.project.AbstractModule;
import org.jetbrains.mps.openapi.module.SModule;
import jetbrains.mps.smodel.SModelOperations;
import jetbrains.mps.project.dependency.GlobalModuleDependenciesManager;
public class UpdateModelImports extends RefactoringParticipantBase<SNodeReference, SNodeReference, SNode, SNode> implements MoveNodeRefactoringParticipant<SNodeReference, SNodeReference> {
public static class UpdateModelImports_extension extends Extension.Default<MoveNodeRefactoringParticipant<?, ?>> {
public UpdateModelImports_extension() {
super("jetbrains.mps.refactoring.participant.MoveNodeParticipantEP");
}
public MoveNodeRefactoringParticipant<?, ?> get() {
return new UpdateModelImports();
}
}
public static final RefactoringParticipant.Option OPTION = new RefactoringParticipant.Option("moveNode.options.updateModelImports", "Update model imports");
private MoveNodeRefactoringParticipant.MoveNodeRefactoringDataCollector<SNodeReference, SNodeReference> myDataCollector = new MoveNodeRefactoringParticipant.MoveNodeRefactoringDataCollector<SNodeReference, SNodeReference>() {
public SNodeReference beforeMove(SNode nodeToMove) {
return nodeToMove.getReference();
}
public SNodeReference afterMove(SNode movedNode) {
return movedNode.getReference();
}
};
public MoveNodeRefactoringParticipant.MoveNodeRefactoringDataCollector<SNodeReference, SNodeReference> getDataCollector() {
return myDataCollector;
}
public List<RefactoringParticipant.Option> getAvailableOptions(SNodeReference initialState, SRepository repository) {
return ListSequence.fromListAndArray(new ArrayList<RefactoringParticipant.Option>(), OPTION);
}
public List<RefactoringParticipant.Change<SNodeReference, SNodeReference>> getChanges(SNodeReference initialState, SRepository repository, List<RefactoringParticipant.Option> selectedOptions, SearchScope searchScope) {
if (!(ListSequence.fromList(selectedOptions).contains(OPTION))) {
return ListSequence.fromList(new ArrayList<RefactoringParticipant.Change<SNodeReference, SNodeReference>>());
}
return ListSequence.fromListAndArray(new ArrayList<RefactoringParticipant.Change<SNodeReference, SNodeReference>>(), new MoveNodeRefactoringParticipant.ChangeBase<SNodeReference, SNodeReference>() {
public MoveNodeRefactoringParticipant<SNodeReference, SNodeReference> getParticipant() {
return UpdateModelImports.this;
}
public SearchResults getSearchResults() {
return new SearchResults();
}
public void confirm(final SNodeReference finalState, final SRepository repository, RefactoringSession refactoringSession) {
refactoringSession.registerChange(new Runnable() {
public void run() {
SNode node = finalState.resolve(repository);
SModel model = node.getModel();
addLanguageImport(model, node.getConcept().getLanguage());
for (SReference ref : Sequence.fromIterable(node.getReferences())) {
addModelImport(model, ref.getTargetSModelReference().resolve(repository));
}
}
});
}
});
}
public static void addLanguageImport(SModel model, SLanguage language) {
if (!(model instanceof SModelInternal)) {
return;
}
SModelInternal modelInternal = (SModelInternal) model;
if (!(modelInternal.importedLanguageIds().contains(language))) {
modelInternal.addLanguage(language);
}
}
public static void addModelImport(SModel model, SModel targetModel) {
if (!(model instanceof SModelInternal)) {
return;
}
if (!(model.getModule() instanceof ReloadableModuleBase)) {
return;
}
if (targetModel == null) {
return;
}
if (targetModel.getModule() == null) {
return;
}
SModelInternal modelInternal = (SModelInternal) model;
AbstractModule module = (ReloadableModuleBase) model.getModule();
SModule targetModule = targetModel.getModule();
if (targetModel != model) {
if (!(SModelOperations.getImportedModelUIDs(model).contains(targetModel.getReference()))) {
modelInternal.addModelImport(targetModel.getReference());
}
}
if (!(new GlobalModuleDependenciesManager(module).getModules(GlobalModuleDependenciesManager.Deptype.VISIBLE).contains(targetModule))) {
module.addDependency(targetModule.getModuleReference(), false);
}
}
}