package jetbrains.mps.ide.actions; /*Generated by MPS */ import jetbrains.mps.refactoring.participant.RefactoringParticipantBase; import org.jetbrains.mps.openapi.model.SModelReference; import org.jetbrains.mps.openapi.model.SModel; import jetbrains.mps.refactoring.participant.MoveModelRefactoringParticipant; 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 org.jetbrains.mps.openapi.util.ProgressMonitor; import jetbrains.mps.baseLanguage.closures.runtime.Wrappers; import java.util.Set; import org.jetbrains.mps.openapi.module.FindUsagesFacade; import jetbrains.mps.project.GlobalScope; import java.util.Collections; import jetbrains.mps.internal.collections.runtime.SetSequence; import jetbrains.mps.internal.collections.runtime.ISelector; import jetbrains.mps.ide.findusages.model.SearchResults; import java.util.HashSet; import jetbrains.mps.ide.findusages.model.SearchResult; import jetbrains.mps.refactoring.participant.MoveNodeRefactoringParticipant; import jetbrains.mps.refactoring.participant.RefactoringSession; import jetbrains.mps.smodel.SModelInternal; import org.jetbrains.mps.openapi.model.EditableSModel; import org.jetbrains.mps.openapi.model.SNode; import org.jetbrains.mps.openapi.model.SNodeUtil; import jetbrains.mps.internal.collections.runtime.Sequence; import jetbrains.mps.internal.collections.runtime.ITranslator2; import org.jetbrains.mps.openapi.model.SReference; import jetbrains.mps.lang.smodel.generator.smodelAdapter.SNodeOperations; import jetbrains.mps.internal.collections.runtime.IWhereFilter; import jetbrains.mps.internal.collections.runtime.IVisitor; import jetbrains.mps.smodel.SReferenceBase; public class UpdateDependentModelsRefactoringParticipant extends RefactoringParticipantBase<SModelReference, SModelReference, SModel, SModel> implements MoveModelRefactoringParticipant<SModelReference, SModelReference> { public static class UpdateDependentModelsRefactoringParticipant_extension extends Extension.Default<MoveModelRefactoringParticipant<?, ?>> { public UpdateDependentModelsRefactoringParticipant_extension() { super("jetbrains.mps.refactoring.participant.MoveModelParticipantEP"); } public MoveModelRefactoringParticipant<?, ?> get() { return new UpdateDependentModelsRefactoringParticipant(); } } private final RefactoringParticipant.RefactoringDataCollector<SModelReference, SModelReference, SModel, SModel> myDataCollector = new RefactoringParticipant.RefactoringDataCollector<SModelReference, SModelReference, SModel, SModel>() { public SModelReference beforeMove(SModel modelToMove) { return modelToMove.getReference(); } public SModelReference afterMove(SModel movedModel) { return movedModel.getReference(); } }; public RefactoringParticipant.RefactoringDataCollector<SModelReference, SModelReference, SModel, SModel> getDataCollector() { return myDataCollector; } private RefactoringParticipant.Option myOption = new RefactoringParticipant.Option("moveModel.options.updateNodeReferences", "Update node references"); @Override public List<RefactoringParticipant.Option> getAvailableOptions(SModelReference initialState, SRepository repository) { return ListSequence.fromListAndArray(new ArrayList<RefactoringParticipant.Option>(), myOption); } @Override public List<RefactoringParticipant.Change<SModelReference, SModelReference>> getChanges(final SModelReference initialState, final SRepository repository, List<RefactoringParticipant.Option> selectedOptions, SearchScope searchScope, final ProgressMonitor progressMonitor) { if (!(ListSequence.fromList(selectedOptions).contains(myOption))) { return ListSequence.fromList(new ArrayList<RefactoringParticipant.Change<SModelReference, SModelReference>>()); } progressMonitor.start(myOption.getDescription(), 1); final Wrappers._T<Set<SModel>> usages = new Wrappers._T<Set<SModel>>(); final Wrappers._T<SModel> sourceModel = new Wrappers._T<SModel>(); repository.getModelAccess().runReadAction(new Runnable() { public void run() { usages.value = FindUsagesFacade.getInstance().findModelUsages(GlobalScope.getInstance(), Collections.singleton(initialState), progressMonitor.subTask(1)); sourceModel.value = initialState.resolve(repository); } }); return SetSequence.fromSet(usages.value).select(new ISelector<SModel, RefactoringParticipant.Change<SModelReference, SModelReference>>() { public RefactoringParticipant.Change<SModelReference, SModelReference> select(SModel it) { final SModelReference usageRef = it.getReference(); final SearchResults searchResults = new SearchResults(SetSequence.fromSetAndArray(new HashSet<SModel>(), sourceModel.value), ListSequence.fromListAndArray(new ArrayList<SearchResult<SModel>>(), new SearchResult<SModel>(it, "dependent model"))); RefactoringParticipant.Change<SModelReference, SModelReference> change = new MoveNodeRefactoringParticipant.ChangeBase<SModelReference, SModelReference>() { public SearchResults getSearchResults() { return searchResults; } public void confirm(final SModelReference finalState, final SRepository repository, RefactoringSession refactoringSession) { refactoringSession.registerChange(new Runnable() { public void run() { SModel usage = usageRef.resolve(repository); if (usage instanceof SModelInternal && usage instanceof EditableSModel) { ((SModelInternal) usage).addModelImport(finalState); updateUsages((EditableSModel) usage, initialState, finalState); ((SModelInternal) usage).deleteModelImport(initialState); } } }); } }; return change; } }).toListSequence(); } public static void updateUsages(EditableSModel usageModel, final SModelReference oldModelReference, final SModelReference newModelReference) { Iterable<SNode> nodes = (Iterable<SNode>) SNodeUtil.getDescendants(usageModel); Sequence.fromIterable(nodes).translate(new ITranslator2<SNode, SReference>() { public Iterable<SReference> translate(SNode it) { return SNodeOperations.getReferences(it); } }).where(new IWhereFilter<SReference>() { public boolean accept(SReference it) { return eq_qwsmwp_a0a0a0a0a0a1a31(it.getTargetSModelReference(), oldModelReference); } }).visitAll(new IVisitor<SReference>() { public void visit(SReference it) { ((SReferenceBase) (SReference) it).setTargetSModelReference(newModelReference); } }); usageModel.setChanged(true); } private static boolean eq_qwsmwp_a0a0a0a0a0a1a31(Object a, Object b) { return (a != null ? a.equals(b) : a == b); } }