Bug 394055 - [refactoring] "use supertype where possible" does not work
with declared lifting
- add required treatment to ASTRewriteAnalyzer
- tell SuperTypeRefactoringProcessor how to handle LiftingType
diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
index 5c31a66..90cb23d 100644
--- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
+++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/internal/core/dom/rewrite/ASTRewriteAnalyzer.java
@@ -4402,15 +4402,15 @@
 		return false;
 	}
 
-	//FIXME(SH): XXX COMPLETE THESE!!!
-
 	public boolean visit(LiftingType node)
 	{
 		if (!hasChildrenChanges(node)) {
-//			System.out.println("visit LiftingType unchanged");
 			return doVisitUnchangedChildren(node);
 		}
-//		System.out.println("visit LiftingType changed");
+		rewriteRequiredNode(node, LiftingType.BASE_TYPE_PROPERTY);
+		ensureSpaceAfterReplace(node, LiftingType.BASE_TYPE_PROPERTY);
+		rewriteRequiredNode(node, LiftingType.ROLE_TYPE_PROPERTY);
+		ensureSpaceAfterReplace(node, LiftingType.ROLE_TYPE_PROPERTY);
 		return true;
 	}
 
diff --git a/plugins/org.eclipse.objectteams.otdt.refactoring/src/org/eclipse/objectteams/otdt/internal/refactoring/adaptor/pullup/PullUpAdaptor.java b/plugins/org.eclipse.objectteams.otdt.refactoring/src/org/eclipse/objectteams/otdt/internal/refactoring/adaptor/pullup/PullUpAdaptor.java
index b87e7b6..1669df9 100644
--- a/plugins/org.eclipse.objectteams.otdt.refactoring/src/org/eclipse/objectteams/otdt/internal/refactoring/adaptor/pullup/PullUpAdaptor.java
+++ b/plugins/org.eclipse.objectteams.otdt.refactoring/src/org/eclipse/objectteams/otdt/internal/refactoring/adaptor/pullup/PullUpAdaptor.java
@@ -65,6 +65,7 @@
 import org.eclipse.jdt.internal.corext.refactoring.structure.ImportRewriteUtil;

 import org.eclipse.jdt.internal.corext.refactoring.structure.MemberVisibilityAdjustor.IncomingMemberVisibilityAdjustment;

 import org.eclipse.jdt.internal.corext.refactoring.structure.TypeVariableMaplet;

+import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.CompilationUnitRange;

 import org.eclipse.jdt.internal.corext.refactoring.typeconstraints.types.TType;

 import org.eclipse.jdt.internal.corext.util.JavaModelUtil;

 import org.eclipse.jdt.internal.corext.util.JdtFlags;

@@ -1001,15 +1002,16 @@
 		}

 	}

 

-	// advance fix for Bug 393932 - [refactoring] pull-up with "use the destination type where possible" creates bogus import of nested type

 	protected class UseSuperTypeFix playedBy SuperTypeRefactoringProcessor {

 

-		void rewriteTypeOccurrence(final TType estimate, final CompilationUnitRewrite rewrite, final ASTNode node, final TextEditGroup group)

+		// === advance fix for Bug 393932 - [refactoring] pull-up with "use the destination type where possible" creates bogus import of nested type ===

+

+		void fixRewriteTypeOccurrence(final TType estimate, final CompilationUnitRewrite rewrite, final ASTNode node, final TextEditGroup group)

 		<- replace 

 		void rewriteTypeOccurrence(final TType estimate, final CompilationUnitRewrite rewrite, final ASTNode node, final TextEditGroup group);

 

 		@SuppressWarnings("basecall")

-		callin void rewriteTypeOccurrence(TType estimate, CompilationUnitRewrite rewrite, ASTNode node, TextEditGroup group) {

+		callin void fixRewriteTypeOccurrence(TType estimate, CompilationUnitRewrite rewrite, ASTNode node, TextEditGroup group) {

 			// combined from direct base method plus createCorrespondingNode(..):

 			rewrite.getImportRemover().registerRemovedNode(node);

 			ImportRewrite importRewrite= rewrite.getImportRewrite();

@@ -1017,5 +1019,44 @@
 			ASTNode correspondingNode = importRewrite.addImportFromSignature(new BindingKey(estimate.getBindingKey()).toSignature(), rewrite.getAST(), context);

 			rewrite.getASTRewrite().replace(node, correspondingNode, group);

 		}

+

+		// === tell the base class how to cope with LiftingType references: ===

+		

+		void rewriteTypeOccurrence(TType arg0, CompilationUnitRewrite arg1, ASTNode arg2, TextEditGroup arg3)

+		-> void rewriteTypeOccurrence(TType arg0, CompilationUnitRewrite arg1, ASTNode arg2, TextEditGroup arg3);

+		

+		void rewriteTypeOccurrence(final CompilationUnitRange range, final TType estimate, final ASTRequestor requestor, final CompilationUnitRewrite rewrite, final CompilationUnit copy, final Set<String> replacements, final TextEditGroup group)

+		<- after

+		void rewriteTypeOccurrence(final CompilationUnitRange range, final TType estimate, final ASTRequestor requestor, final CompilationUnitRewrite rewrite, final CompilationUnit copy, final Set<String> replacements, final TextEditGroup group);

+

+		private void rewriteTypeOccurrence(CompilationUnitRange range, TType estimate, ASTRequestor requestor, CompilationUnitRewrite rewrite, CompilationUnit copy, Set<String> replacements, TextEditGroup group) 

+		{

+			ASTNode node= null;

+			IBinding binding= null;

+			final CompilationUnit target= rewrite.getRoot();

+			node= NodeFinder.perform(copy, range.getSourceRange());

+			if (node != null) {

+				node= ASTNodes.getNormalizedNode(node);

+				// OT: remember whether we saw the base side or the role side of a LiftingType:

+				StructuralPropertyDescriptor locationInParent = node.getLocationInParent();

+				node = node.getParent();

+				if (node instanceof LiftingType) {

+					// climb up one more step than base method does to find the argument (LT only occurs as an argument's type):

+					VariableDeclaration argument = (VariableDeclaration) node.getParent();

+					binding= argument.resolveBinding();

+					node= target.findDeclaringNode(binding.getKey());

+					if (node instanceof SingleVariableDeclaration) {

+						// OT: drill into detail of LiftingType:

+						ASTNode oldTypeNode = (ASTNode)((SingleVariableDeclaration)node).getType().getStructuralProperty(locationInParent);

+						rewriteTypeOccurrence(estimate, rewrite, oldTypeNode, group);

+						if (node.getParent() instanceof MethodDeclaration) {

+							binding= ((VariableDeclaration) node).resolveBinding();

+							if (binding != null)

+								replacements.add(binding.getKey());

+						}

+					}

+				}

+			}

+		}

 	}

 }