Skip to content

Commit

Permalink
ASTDiff: Refactor Optimization Mappings
Browse files Browse the repository at this point in the history
  • Loading branch information
pouryafard75 committed Apr 5, 2024
1 parent e530ee1 commit d7deb9c
Showing 1 changed file with 28 additions and 31 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -29,9 +29,8 @@ public class ProjectASTDiffer
{
private final static Logger logger = LoggerFactory.getLogger(ProjectASTDiffer.class);
private final UMLModelDiff modelDiff;
private List<AbstractCodeMapping> lastStepMappings;
private ExtendedMultiMappingStore optimizationMappingStore;
private List<AbstractCodeMapping> mustOverrideMappings;
private final Map<String, OptimizationData> optimizationDataMap = new HashMap<>();
private OptimizationData optimizationData;
private List<Refactoring> modelDiffRefactorings;
private final ProjectASTDiff projectASTDiff;

Expand Down Expand Up @@ -154,16 +153,10 @@ private ASTDiff process(UMLAbstractClassDiff classDiff, Pair<TreeContext, TreeCo
ExtendedMultiMappingStore mappingStore = new ExtendedMultiMappingStore(srcTree,dstTree);

String key = classDiff.getOriginalClass().getLocationInfo().getFilePath();
if (optimizationDataMap.containsKey(key)) {
this.lastStepMappings = optimizationDataMap.get(key).lastStepMappings;
this.optimizationMappingStore = optimizationDataMap.get(key).optimizationMappingStore;
this.mustOverrideMappings = optimizationDataMap.get(key).mustOverrideMappings;
}
else {
this.lastStepMappings = new ArrayList<>();
this.optimizationMappingStore = new ExtendedMultiMappingStore(srcTree,dstTree);
this.mustOverrideMappings = new ArrayList<>();
}
if (optimizationDataMap.containsKey(key))
optimizationData = optimizationDataMap.get(key);
else
optimizationData = new OptimizationData(srcTree, dstTree);
if (!mergeFlag) {
mappingStore.addMapping(srcTree, dstTree);
processPackageDeclaration(srcTree,dstTree,mappingStore);
Expand All @@ -185,7 +178,6 @@ private ASTDiff process(UMLAbstractClassDiff classDiff, Pair<TreeContext, TreeCo
UMLClassBaseDiff baseClassDiff = (UMLClassBaseDiff) classDiff;
processRefactorings(srcTree,dstTree,getClassDiffRefactorings(baseClassDiff),mappingStore);
}
OptimizationData optimizationData = new OptimizationData(lastStepMappings, optimizationMappingStore, mustOverrideMappings);
optimizationDataMap.put(key, optimizationData);
return new ASTDiff(classDiff.getOriginalClass().getLocationInfo().getFilePath(),
classDiff.getNextClass().getLocationInfo().getFilePath(), treeContextPair.first, treeContextPair.second, mappingStore);
Expand Down Expand Up @@ -505,14 +497,14 @@ private void processLeafMapping(Tree srcTree, Tree dstTree, AbstractCodeMapping
_abstractExpWithNonCompositeOwner = false;
}
if (_abstractExpWithNonCompositeOwner || _leafExp) {
lastStepMappings.add(abstractCodeMapping);
optimizationData.lastStepMappings.add(abstractCodeMapping);
} else {
new LeafMatcher().match(srcStatementNode,dstStatementNode,mappingStore);
additionallyMatchedStatements(srcTree, dstTree, srcStatementNode, dstStatementNode, abstractCodeMapping, mappingStore);
}
optimizeVariableDeclarations(abstractCodeMapping);
if (!isPartOfExtractedMethod && srcStatementNode.getType().name.equals(Constants.RETURN_STATEMENT) && dstStatementNode.getType().name.equals(Constants.RETURN_STATEMENT)) {
optimizationMappingStore.addMapping(srcStatementNode,dstStatementNode);
optimizationData.optimizationMappingStore.addMapping(srcStatementNode,dstStatementNode);
}
if (abstractCodeMapping.getRefactorings().size() > 0) {
leafMappingRefactoringAwareness(dstTree, abstractCodeMapping, mappingStore);
Expand Down Expand Up @@ -552,12 +544,12 @@ private void optimizeVariableDeclarations(AbstractCodeMapping abstractCodeMappin
if (variableDeclarations1.size() == 1 && variableDeclarations2.size() == 0){
if (variableDeclarations1.get(0).getInitializer() != null)
if (abstractCodeMapping.getFragment2().toString().contains(variableDeclarations1.get(0).getInitializer().toString()))
lastStepMappings.add(new LeafMapping(variableDeclarations1.get(0).getInitializer(), abstractCodeMapping.getFragment2(),null,null));
optimizationData.lastStepMappings.add(new LeafMapping(variableDeclarations1.get(0).getInitializer(), abstractCodeMapping.getFragment2(),null,null));
}
if (variableDeclarations1.size() == 0 && variableDeclarations2.size() == 1){
if (variableDeclarations2.get(0).getInitializer() != null)
if (abstractCodeMapping.getFragment1().toString().contains(variableDeclarations2.get(0).getInitializer().toString()))
lastStepMappings.add(new LeafMapping(abstractCodeMapping.getFragment1(),variableDeclarations2.get(0).getInitializer(),null,null));
optimizationData.lastStepMappings.add(new LeafMapping(abstractCodeMapping.getFragment1(),variableDeclarations2.get(0).getInitializer(),null,null));
}
}

Expand Down Expand Up @@ -758,29 +750,29 @@ private void processRefactorings(Tree srcTree, Tree dstTree, List<Refactoring> r
processBodyMapper(srcTree,dstTree,bodyMapper,mappingStore, false);
} else if (refactoring instanceof ExtractVariableRefactoring) {
ExtractVariableRefactoring extractVariableRefactoring = (ExtractVariableRefactoring) refactoring;
lastStepMappings.addAll(extractVariableRefactoring.getSubExpressionMappings());
optimizationData.lastStepMappings.addAll(extractVariableRefactoring.getSubExpressionMappings());
} else if (refactoring instanceof InlineVariableRefactoring) {
InlineVariableRefactoring inlineVariableRefactoring = (InlineVariableRefactoring) refactoring;
lastStepMappings.addAll(inlineVariableRefactoring.getSubExpressionMappings());
optimizationData.lastStepMappings.addAll(inlineVariableRefactoring.getSubExpressionMappings());
} else if (refactoring instanceof AssertThrowsRefactoring) {
AssertThrowsRefactoring assertThrowsRefactoring = (AssertThrowsRefactoring) refactoring;
lastStepMappings.addAll(assertThrowsRefactoring.getSubExpressionMappings());
optimizationData.lastStepMappings.addAll(assertThrowsRefactoring.getSubExpressionMappings());
} else if (refactoring instanceof InlineAttributeRefactoring) {
InlineAttributeRefactoring inlineAttributeRefactoring = (InlineAttributeRefactoring) refactoring;
//Tree srcAttrDeclaration = TreeUtilFunctions.findByLocationInfo(srcTree, inlineAttributeRefactoring.getVariableDeclaration().getLocationInfo());
//for (AbstractCodeMapping reference : inlineAttributeRefactoring.getReferences()) {
// Tree dstStatementTree = TreeUtilFunctions.findByLocationInfo(dstTree,reference.getFragment2().getLocationInfo());
// new LeafMatcher().match(srcAttrDeclaration,dstStatementTree,mappingStore);
//}
lastStepMappings.addAll(inlineAttributeRefactoring.getSubExpressionMappings());
optimizationData.lastStepMappings.addAll(inlineAttributeRefactoring.getSubExpressionMappings());
} else if (refactoring instanceof ExtractAttributeRefactoring) {
ExtractAttributeRefactoring extractAttributeRefactoring = (ExtractAttributeRefactoring) refactoring;
//Tree dstAttrDeclaration = TreeUtilFunctions.findByLocationInfo(dstTree, extractAttributeRefactoring.getVariableDeclaration().getLocationInfo());
//for (AbstractCodeMapping reference : extractAttributeRefactoring.getReferences()) {
// Tree srcStatementTree = TreeUtilFunctions.findByLocationInfo(srcTree,reference.getFragment1().getLocationInfo());
// new LeafMatcher().match(srcStatementTree,dstAttrDeclaration,mappingStore);
//}
lastStepMappings.addAll(extractAttributeRefactoring.getSubExpressionMappings());
optimizationData.lastStepMappings.addAll(extractAttributeRefactoring.getSubExpressionMappings());
for (UMLAnonymousClassDiff umlAnonymousClassDiff : extractAttributeRefactoring.getAnonymousClassDiffList()) {
processAnonymousClassDiff(srcTree,dstTree,umlAnonymousClassDiff,mappingStore);
}
Expand All @@ -804,13 +796,13 @@ private void processRefactorings(Tree srcTree, Tree dstTree, List<Refactoring> r
}
} else if (refactoring instanceof SplitConditionalRefactoring) {
SplitConditionalRefactoring splitConditionalRefactoring = (SplitConditionalRefactoring) refactoring;
lastStepMappings.addAll(splitConditionalRefactoring.getSubExpressionMappings());
optimizationData.lastStepMappings.addAll(splitConditionalRefactoring.getSubExpressionMappings());
} else if (refactoring instanceof MergeConditionalRefactoring) {
MergeConditionalRefactoring mergeConditionalRefactoring = (MergeConditionalRefactoring) refactoring;
lastStepMappings.addAll(mergeConditionalRefactoring.getSubExpressionMappings());
optimizationData.lastStepMappings.addAll(mergeConditionalRefactoring.getSubExpressionMappings());
} else if (refactoring instanceof ReplaceGenericWithDiamondRefactoring) {
ReplaceGenericWithDiamondRefactoring replaceGenericWithDiamondRefactoring = (ReplaceGenericWithDiamondRefactoring) refactoring;
mustOverrideMappings.addAll(replaceGenericWithDiamondRefactoring.getSubExpressionMappings());
optimizationData.mustOverrideMappings.addAll(replaceGenericWithDiamondRefactoring.getSubExpressionMappings());
} else if (refactoring instanceof MergeCatchRefactoring) {
MergeCatchRefactoring mergeCatchRefactoring = (MergeCatchRefactoring) refactoring;
Tree dstSubTree = TreeUtilFunctions.findByLocationInfo(dstTree,mergeCatchRefactoring.getNewCatchBlock().getLocationInfo());
Expand Down Expand Up @@ -924,7 +916,7 @@ else if (refactoring instanceof RenameAttributeRefactoring) {
Tree srcSimpleName = TreeUtilFunctions.findByLocationInfo(srcTree, subExpressionMapping.getFragment1().getLocationInfo(), Constants.SIMPLE_NAME);
Tree dstSimpleName = TreeUtilFunctions.findByLocationInfo(dstTree, subExpressionMapping.getFragment2().getLocationInfo(), Constants.SIMPLE_NAME);
if (srcSimpleName != null && dstSimpleName != null)
optimizationMappingStore.addMapping(srcSimpleName,dstSimpleName);
optimizationData.optimizationMappingStore.addMapping(srcSimpleName,dstSimpleName);
}
}
}
Expand All @@ -948,7 +940,7 @@ private void processArgumentMappings(Tree srcTree, Tree dstTree, List<Refactorin
for(AbstractCodeMapping expressionMapping : argumentMappings) {
Tree t1 = TreeUtilFunctions.findByLocationInfo(srcTree,expressionMapping.getFragment1().getLocationInfo());
Tree t2 = TreeUtilFunctions.findByLocationInfo(dstTree,expressionMapping.getFragment2().getLocationInfo());
new LeafMatcher().match(t1,t2,optimizationMappingStore);
new LeafMatcher().match(t1,t2,optimizationData.optimizationMappingStore);
}
}
}
Expand Down Expand Up @@ -986,12 +978,12 @@ private void findVariablesAndMatch(Tree srcTree, Tree dstTree, AbstractCodeMappi
List<Tree> dstRefs = TreeUtilFunctions.findVariable(dstStatement ,renamedVariableName);
if (srcRefs == null || dstRefs == null) return;
if (srcRefs.size() == 1 && dstRefs.size() == 1)
optimizationMappingStore.addMapping(srcRefs.get(0),dstRefs.get(0));
optimizationData.optimizationMappingStore.addMapping(srcRefs.get(0),dstRefs.get(0));
else{
if (srcRefs.size() == dstRefs.size())
{
for (int i = 0; i < srcRefs.size(); i++) {
optimizationMappingStore.addMapping(srcRefs.get(i),dstRefs.get(i));
optimizationData.optimizationMappingStore.addMapping(srcRefs.get(i),dstRefs.get(i));
}
}
}
Expand Down Expand Up @@ -1342,7 +1334,6 @@ private void matchModifier(Tree srcTypeDeclaration, Tree dstTypeDeclaration, Str
mappingStore.addMapping(srcTree,dstTree);
}
}
private final Map<String, OptimizationData> optimizationDataMap = new HashMap<>();

private static class OptimizationData{
List<AbstractCodeMapping> lastStepMappings; //ProjectASTDiff decides whether to overwrite or add these mappings
Expand All @@ -1353,5 +1344,11 @@ public OptimizationData(List<AbstractCodeMapping> lastStepMappings, ExtendedMult
this.optimizationMappingStore = optimizationMappingStore;
this.mustOverrideMappings = mustOverrideMappings;
}

public OptimizationData(Tree srcTree, Tree dstTree) {
this.lastStepMappings = new ArrayList<>();
this.optimizationMappingStore = new ExtendedMultiMappingStore(srcTree,dstTree);
this.mustOverrideMappings = new ArrayList<>();
}
}
}

0 comments on commit d7deb9c

Please sign in to comment.