Skip to content

Commit

Permalink
Support nested Extract and Move Method refactoring through delegate
Browse files Browse the repository at this point in the history
apache/hadoop@87fb977
hadoop-common-project/hadoop-common/src/test/java/org/apache/hadoop/fs/contract/ContractTestUtils.java

public static List<FileRange> range(
      final long offset,
      final int length) {
    return range(new ArrayList<>(), offset, length);
  }

  /**
   * Create a range and add it to the supplied list.
   * @param fileRanges list of ranges
   * @param offset offset
   * @param length length
   * @return the list.
   */
  public static List<FileRange> range(
      final List<FileRange> fileRanges,
      final long offset,
      final int length) {
    fileRanges.add(FileRange.createFileRange(offset, length));
    return fileRanges;
  }
  • Loading branch information
tsantalis committed Jan 8, 2025
1 parent 87a5fee commit 283f2dc
Show file tree
Hide file tree
Showing 2 changed files with 69 additions and 42 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -579,9 +579,10 @@ else if(isPrimitiveType(type2) && !isPrimitiveType(type1)) {
}

private static boolean collectionMatch(UMLType parameterType, UMLType type) {
if(parameterType.getClassType().equals("Iterable") || parameterType.getClassType().equals("Collection") ) {
if(parameterType.getClassType().equals("Iterable") || parameterType.getClassType().equals("Collection") ||
parameterType.getClassType().equals("List") || parameterType.getClassType().equals("Set")) {
if(type.getClassType().endsWith("List") || type.getClassType().endsWith("Set") || type.getClassType().endsWith("Collection")) {
if(parameterType.getTypeArguments().equals(type.getTypeArguments())) {
if(parameterType.getTypeArguments().equals(type.getTypeArguments()) || type.getTypeArguments().isEmpty()) {
return true;
}
if(parameterType.getTypeArguments().size() == 1) {
Expand Down
106 changes: 66 additions & 40 deletions src/main/java/gr/uom/java/xmi/diff/UMLModelDiff.java
Original file line number Diff line number Diff line change
Expand Up @@ -4337,6 +4337,7 @@ else if(inlineOperationRefactoring.getRefactoringType().equals(RefactoringType.M
private void checkForExtractedAndMovedOperations(List<UMLOperationBodyMapper> mappers, List<UMLOperation> addedOperations) throws RefactoringMinerTimedOutException {
for(Iterator<UMLOperation> addedOperationIterator = addedOperations.iterator(); addedOperationIterator.hasNext();) {
UMLOperation addedOperation = addedOperationIterator.next();
AbstractCall delegateCall = addedOperation.isDelegate();
if(!getterOrSetterCorrespondingToRenamedAttribute(addedOperation)) {
for(UMLOperationBodyMapper mapper : mappers) {
Pair<VariableDeclarationContainer, VariableDeclarationContainer> pair = Pair.of(mapper.getContainer1(), addedOperation);
Expand Down Expand Up @@ -4393,48 +4394,26 @@ else if(childFieldDeclarationMap != null) {
UMLOperationBodyMapper operationBodyMapper = createMapperForExtractAndMove(addedOperation,
mapper, className, addedOperationInvocation, Optional.empty());
if(extractAndMoveMatchCondition(operationBodyMapper, mapper, addedOperationInvocation) && !skipRefactoring(operationBodyMapper.getMappings())) {
if(className.equals(addedOperation.getClassName())) {
//extract inside moved or renamed class
createExtractAndMoveMethodRefactoring(addedOperation, mapper, addedOperationInvocations, operationBodyMapper);
}
else if(isSubclassOf(className, addedOperation.getClassName())) {
createExtractAndMoveMethodRefactoring(addedOperation, mapper, addedOperationInvocations, operationBodyMapper);
}
else if(isSubclassOf(addedOperation.getClassName(), className)) {
createExtractAndMoveMethodRefactoring(addedOperation, mapper, addedOperationInvocations, operationBodyMapper);
}
else if(addedOperation.getClassName().startsWith(className + ".")) {
createExtractAndMoveMethodRefactoring(addedOperation, mapper, addedOperationInvocations, operationBodyMapper);
}
else if(className.startsWith(addedOperation.getClassName() + ".")) {
createExtractAndMoveMethodRefactoring(addedOperation, mapper, addedOperationInvocations, operationBodyMapper);
}
else if(sourceClassImportsTargetClass(className, addedOperation.getClassName()) ||
sourceClassImportsSuperclassOfTargetClass(className, addedOperation.getClassName()) ||
targetClassImportsSourceClass(className, addedOperation.getClassName())) {
createExtractAndMoveMethodRefactoring(addedOperation, mapper, addedOperationInvocations, operationBodyMapper);
}
for(CandidateAttributeRefactoring candidate : operationBodyMapper.getCandidateAttributeRenames()) {
String before = PrefixSuffixUtils.normalize(candidate.getOriginalVariableName());
String after = PrefixSuffixUtils.normalize(candidate.getRenamedVariableName());
if(before.contains(".") && after.contains(".")) {
String prefix1 = before.substring(0, before.lastIndexOf(".") + 1);
String prefix2 = after.substring(0, after.lastIndexOf(".") + 1);
if(prefix1.equals(prefix2)) {
before = before.substring(prefix1.length(), before.length());
after = after.substring(prefix2.length(), after.length());
}
}
Replacement renamePattern = new Replacement(before, after, ReplacementType.VARIABLE_NAME);
if(renameMap.containsKey(renamePattern)) {
renameMap.get(renamePattern).add(candidate);
}
else {
Set<CandidateAttributeRefactoring> set = new LinkedHashSet<CandidateAttributeRefactoring>();
set.add(candidate);
renameMap.put(renamePattern, set);
createExtractAndMoveMethodRefactoringBasedOnClassName(addedOperation, mapper,
className, addedOperationInvocations, operationBodyMapper);
}
else if(delegateCall != null) {
//find added operation that delegates to
UMLOperation delegateDeclaration = null;
for(UMLOperation op : new ArrayList<>(addedOperations)) {
if(delegateCall.matchesOperation(op, addedOperation, mapper.getClassDiff(), this)) {
delegateDeclaration = op;
break;
}
}
if(delegateDeclaration != null) {
UMLOperationBodyMapper nestedOperationBodyMapper = createMapperForExtractAndMove(delegateDeclaration,
mapper, className, delegateCall, Optional.empty());
if(extractAndMoveMatchCondition(nestedOperationBodyMapper, mapper, delegateCall)) {
createExtractAndMoveMethodRefactoringBasedOnClassName(addedOperation, mapper,
className, addedOperationInvocations, nestedOperationBodyMapper);
}
}
}
else {
for(AbstractCodeMapping mapping : operationBodyMapper.getMappings()) {
Expand All @@ -4455,6 +4434,53 @@ else if(mapping instanceof CompositeStatementObjectMapping && !mapper.getNonMapp
}
}

private void createExtractAndMoveMethodRefactoringBasedOnClassName(UMLOperation addedOperation,
UMLOperationBodyMapper mapper, String className, List<AbstractCall> addedOperationInvocations,
UMLOperationBodyMapper operationBodyMapper) throws RefactoringMinerTimedOutException {
if(className.equals(addedOperation.getClassName())) {
//extract inside moved or renamed class
createExtractAndMoveMethodRefactoring(addedOperation, mapper, addedOperationInvocations, operationBodyMapper);
}
else if(isSubclassOf(className, addedOperation.getClassName())) {
createExtractAndMoveMethodRefactoring(addedOperation, mapper, addedOperationInvocations, operationBodyMapper);
}
else if(isSubclassOf(addedOperation.getClassName(), className)) {
createExtractAndMoveMethodRefactoring(addedOperation, mapper, addedOperationInvocations, operationBodyMapper);
}
else if(addedOperation.getClassName().startsWith(className + ".")) {
createExtractAndMoveMethodRefactoring(addedOperation, mapper, addedOperationInvocations, operationBodyMapper);
}
else if(className.startsWith(addedOperation.getClassName() + ".")) {
createExtractAndMoveMethodRefactoring(addedOperation, mapper, addedOperationInvocations, operationBodyMapper);
}
else if(sourceClassImportsTargetClass(className, addedOperation.getClassName()) ||
sourceClassImportsSuperclassOfTargetClass(className, addedOperation.getClassName()) ||
targetClassImportsSourceClass(className, addedOperation.getClassName())) {
createExtractAndMoveMethodRefactoring(addedOperation, mapper, addedOperationInvocations, operationBodyMapper);
}
for(CandidateAttributeRefactoring candidate : operationBodyMapper.getCandidateAttributeRenames()) {
String before = PrefixSuffixUtils.normalize(candidate.getOriginalVariableName());
String after = PrefixSuffixUtils.normalize(candidate.getRenamedVariableName());
if(before.contains(".") && after.contains(".")) {
String prefix1 = before.substring(0, before.lastIndexOf(".") + 1);
String prefix2 = after.substring(0, after.lastIndexOf(".") + 1);
if(prefix1.equals(prefix2)) {
before = before.substring(prefix1.length(), before.length());
after = after.substring(prefix2.length(), after.length());
}
}
Replacement renamePattern = new Replacement(before, after, ReplacementType.VARIABLE_NAME);
if(renameMap.containsKey(renamePattern)) {
renameMap.get(renamePattern).add(candidate);
}
else {
Set<CandidateAttributeRefactoring> set = new LinkedHashSet<CandidateAttributeRefactoring>();
set.add(candidate);
renameMap.put(renamePattern, set);
}
}
}

private static boolean samePackage(AbstractCodeMapping mapping) {
String filePath1 = mapping.getFragment1().getLocationInfo().getFilePath();
String filePath2 = mapping.getFragment2().getLocationInfo().getFilePath();
Expand Down

0 comments on commit 283f2dc

Please sign in to comment.