All Downloads are FREE. Search and download functionalities are using the official Maven repository.

org.refactoringminer.astDiff.actions.SimplifiedChawatheScriptGenerator Maven / Gradle / Ivy

package org.refactoringminer.astDiff.actions;

import com.github.gumtreediff.actions.EditScript;
import com.github.gumtreediff.actions.model.*;
import com.github.gumtreediff.tree.Tree;
import com.github.gumtreediff.tree.TreeContext;
import org.refactoringminer.astDiff.actions.model.MoveIn;
import org.refactoringminer.astDiff.actions.model.MoveOut;
import org.refactoringminer.astDiff.matchers.ExtendedMultiMappingStore;

import java.util.HashMap;
import java.util.Map;

/**
 * @author  Pourya Alikhani Fard [email protected]
 */
public class SimplifiedChawatheScriptGenerator implements EditScriptGenerator {

	@Override
	public EditScript computeActions(ExtendedMultiMappingStore ms, Map parentContextMap, Map childContextMap) {
		EditScript actions = new ChawatheScriptGenerator().computeActions(ms,parentContextMap,childContextMap);
		//return actions;
		return simplify(actions);
	}

	private static EditScript simplify(EditScript actions) {
		Map addedTrees = new HashMap<>();
		Map deletedTrees = new HashMap<>();
		Map MoveInTrees = new HashMap<>();
		Map MoveOutTrees = new HashMap<>();

		for (Action a: actions)
			if (a instanceof Insert)
				addedTrees.put(a.getNode(), a);
			else if (a instanceof Delete)
				deletedTrees.put(a.getNode(), a);
			else if (a instanceof MoveIn)
				MoveInTrees.put(a.getNode(), a);
			else if (a instanceof MoveOut)
				MoveOutTrees.put(a.getNode(), a);

		for (Tree t : addedTrees.keySet()) {
			if (addedTrees.containsKey(t.getParent())
					&& addedTrees.keySet().containsAll(t.getParent().getDescendants()))
				actions.remove(addedTrees.get(t));
			else {
				if (t.getChildren().size() > 0 && addedTrees.keySet().containsAll(t.getDescendants())) {
					Insert originalAction = (Insert) addedTrees.get(t);
					TreeInsert ti = new TreeInsert(originalAction.getNode(),
							originalAction.getParent(), originalAction.getPosition());
					int index = actions.lastIndexOf(originalAction);
					actions.add(index, ti);
					actions.remove(index +  1);
				}
			}
		}

		for (Tree t : deletedTrees.keySet()) {
			if (deletedTrees.containsKey(t.getParent())
					&& deletedTrees.keySet().containsAll(t.getParent().getDescendants()))
				actions.remove(deletedTrees.get(t));
			else {
				if (t.getChildren().size() > 0 && deletedTrees.keySet().containsAll(t.getDescendants())) {
					Delete originalAction = (Delete) deletedTrees.get(t);
					TreeDelete ti = new TreeDelete(originalAction.getNode());
					int index = actions.lastIndexOf(originalAction);
					actions.add(index, ti);
					actions.remove(index +  1);
				}
			}
		}
//		for (Tree t : MoveInTrees.keySet()) {
//			if (MoveInTrees.containsKey(t.getParent())
//					&& MoveInTrees.keySet().containsAll(t.getParent().getDescendants())) {
////				actions.remove(MoveInTrees.get(t));
//			}
//			else {
//				if (t.getChildren().size() > 0 && deletedTrees.keySet().containsAll(t.getDescendants())) {
//
//				}
//			}
//		}
//		for (Tree t : MoveOutTrees.keySet()) {
//			if (MoveOutTrees.containsKey(t.getParent())
//					&& MoveOutTrees.keySet().containsAll(t.getParent().getDescendants())) {
////				actions.remove(MoveOutTrees.get(t));
//			}
//			else {
//				if (t.getChildren().size() > 0 && deletedTrees.keySet().containsAll(t.getDescendants())) {
//
//				}
//			}
//		}
		return actions;
	}
}




© 2015 - 2024 Weber Informatics LLC | Privacy Policy