diff options
Diffstat (limited to 'plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/AbstractMergeRunnable.java')
-rw-r--r-- | plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/AbstractMergeRunnable.java | 77 |
1 files changed, 22 insertions, 55 deletions
diff --git a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/AbstractMergeRunnable.java b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/AbstractMergeRunnable.java index 851d36395..cdec275b8 100644 --- a/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/AbstractMergeRunnable.java +++ b/plugins/org.eclipse.emf.compare.ide.ui/src/org/eclipse/emf/compare/ide/ui/internal/structuremergeviewer/actions/AbstractMergeRunnable.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2014, 2015 Obeo. + * Copyright (c) 2014, 2017 Obeo. * All rights reserved. This program and the accompanying materials * are made available under the terms of the Eclipse Public License v1.0 * which accompanies this distribution, and is available at @@ -10,19 +10,20 @@ *******************************************************************************/ package org.eclipse.emf.compare.ide.ui.internal.structuremergeviewer.actions; +import static org.eclipse.emf.compare.DifferenceState.DISCARDED; +import static org.eclipse.emf.compare.DifferenceState.MERGED; +import static org.eclipse.emf.compare.merge.AbstractMerger.isAccepting; +import static org.eclipse.emf.compare.merge.AbstractMerger.isInTerminalState; + import com.google.common.collect.Sets; import java.util.Collection; import java.util.Set; import org.eclipse.emf.compare.Diff; -import org.eclipse.emf.compare.DifferenceState; -import org.eclipse.emf.compare.internal.merge.IMergeData; -import org.eclipse.emf.compare.internal.merge.MergeDataImpl; import org.eclipse.emf.compare.internal.merge.MergeDependenciesUtil; import org.eclipse.emf.compare.internal.merge.MergeMode; import org.eclipse.emf.compare.merge.IMerger.Registry; -import org.eclipse.emf.ecore.util.EcoreUtil; /** * Provides inheritable default behavior for the merge runnables. @@ -99,60 +100,26 @@ public abstract class AbstractMergeRunnable { */ protected void markAsMerged(Diff diff, MergeMode mode, boolean mergeRightToLeft, Registry mergerRegistry) { - if (diff.getState() == DifferenceState.MERGED) { + if (isInTerminalState(diff)) { return; } - - final Set<Diff> implied = MergeDependenciesUtil.getAllResultingMerges(diff, mergerRegistry, - mergeRightToLeft); - final Set<Diff> rejections = MergeDependenciesUtil.getAllResultingRejections(diff, mergerRegistry, - mergeRightToLeft); - for (Diff impliedDiff : Sets.difference(implied, rejections)) { - impliedDiff.setState(DifferenceState.MERGED); - addOrUpdateMergeData(impliedDiff, mode); - } - - for (Diff impliedRejection : rejections) { - impliedRejection.setState(DifferenceState.MERGED); - if (mergeMode == MergeMode.LEFT_TO_RIGHT || mergeMode == MergeMode.RIGHT_TO_LEFT) { - addOrUpdateMergeData(impliedRejection, mode); - } else { - addOrUpdateMergeData(impliedRejection, mode.inverse()); + if (isAccepting(diff, mergeRightToLeft)) { + final Set<Diff> implied = MergeDependenciesUtil.getAllResultingMerges(diff, mergerRegistry, + mergeRightToLeft); + final Set<Diff> rejections = MergeDependenciesUtil.getAllResultingRejections(diff, mergerRegistry, + mergeRightToLeft); + for (Diff impliedDiff : Sets.difference(implied, rejections)) { + impliedDiff.setState(MERGED); + } + for (Diff impliedRejection : rejections) { + impliedRejection.setState(DISCARDED); } - } - } - - /** - * Updates the IMergeData adapter for all of the given diffs. - * - * @param differences - * The differences for which to set or update the IMergeData adapter. - * @param mode - * Merge mode we wish to keep track of. - */ - protected void addOrUpdateMergeData(Collection<Diff> differences, MergeMode mode) { - for (Diff difference : differences) { - addOrUpdateMergeData(difference, mode); - } - } - - /** - * Updates the IMergeData adapter for the given diff. - * - * @param diff - * The difference for which to set or update the IMergeData adapter. - * @param mode - * Merge mode we wish to keep track of. - */ - private void addOrUpdateMergeData(Diff diff, MergeMode mode) { - IMergeData mergeData = (IMergeData)EcoreUtil.getExistingAdapter(diff, IMergeData.class); - if (mergeData != null) { - mergeData.setMergeMode(mode); - mergeData.setLeftEditable(isLeftEditable); - mergeData.setRightEditable(isRightEditable); } else { - mergeData = new MergeDataImpl(mode, isLeftEditable, isRightEditable); - diff.eAdapters().add(mergeData); + final Set<Diff> implied = MergeDependenciesUtil.getAllResultingMerges(diff, mergerRegistry, + mergeRightToLeft); + for (Diff impliedDiff : implied) { + impliedDiff.setState(DISCARDED); + } } } } |