Bug 408502 - [refactoring] pull-up wrongly claims necessity to adjust
base method visibility
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MethodLocator.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MethodLocator.java
index 8f76c45..4856319 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MethodLocator.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MethodLocator.java
@@ -58,6 +58,7 @@
 import org.eclipse.jdt.internal.core.search.BasicSearchEngine;
 import org.eclipse.objectteams.otdt.internal.core.compiler.ast.BaseCallMessageSend;
 import org.eclipse.objectteams.otdt.internal.core.compiler.ast.MethodSpec;
+import org.eclipse.objectteams.otdt.internal.core.compiler.ast.MethodSpec.ImplementationStrategy;
 import org.eclipse.objectteams.otdt.internal.core.compiler.ast.TSuperMessageSend;
 import org.eclipse.objectteams.otdt.internal.core.compiler.lookup.SyntheticBaseCallSurrogate;
 import org.eclipse.objectteams.otdt.internal.core.compiler.model.RoleModel;
@@ -523,8 +524,10 @@
 protected void matchReportReference(ASTNode reference, IJavaElement element, IJavaElement localElement, IJavaElement[] otherElements, Binding elementBinding, int accuracy, MatchLocator locator) throws CoreException {
 	MethodBinding methodBinding = (reference instanceof MessageSend) ? ((MessageSend)reference).binding: ((elementBinding instanceof MethodBinding) ? (MethodBinding) elementBinding : null);
 //{ObjectTeams: one more chance:
-	if (methodBinding == null && reference instanceof MethodSpec)
-		methodBinding= ((MethodSpec)reference).resolvedMethod;
+	if (methodBinding == null && reference instanceof MethodSpec) {
+		if (this.pattern.findDecapsulationReferences || ((MethodSpec)reference).implementationStrategy == ImplementationStrategy.DIRECT)
+			methodBinding= ((MethodSpec)reference).resolvedMethod;
+	}
 // SH}
 	if (this.isDeclarationOfReferencedMethodsPattern) {
 		if (methodBinding == null) return;
diff --git a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MethodPattern.java b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MethodPattern.java
index 8d67d7b..b5a9c3b 100644
--- a/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MethodPattern.java
+++ b/org.eclipse.jdt.core/search/org/eclipse/jdt/internal/core/search/matching/MethodPattern.java
@@ -55,6 +55,9 @@
 // for tsuper/tsub matching:
 private IType declaringRoleClass= null;
 private ITypeHierarchy cachedRoleHierarchy= null;
+
+// filter decapsulating base method references in callout bindinds?
+public boolean findDecapsulationReferences = true;
 // SH}
 
 // extra reference info
diff --git a/plugins/org.eclipse.objectteams.otdt.refactoring/plugin.xml b/plugins/org.eclipse.objectteams.otdt.refactoring/plugin.xml
index 5523c40..6f75a3e 100644
--- a/plugins/org.eclipse.objectteams.otdt.refactoring/plugin.xml
+++ b/plugins/org.eclipse.objectteams.otdt.refactoring/plugin.xml
@@ -110,6 +110,11 @@
                class="org.eclipse.objectteams.otdt.internal.refactoring.adaptor.MoveAdaptor.MoveCU"
                icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif">
          </team>
+         <team
+               activation="NONE"
+               class="org.eclipse.objectteams.otdt.internal.refactoring.adaptor.pullup.PullUpAdaptor.Visibility"
+               icon="platform:/plugin/org.eclipse.objectteams.otdt.ui/icons/ot/team_obj.gif">
+         </team>
       </aspectBinding>
    </extension>
    <extension
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 a76b6bf..58df625 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
@@ -44,7 +44,6 @@
 import org.eclipse.jdt.core.dom.*;

 import org.eclipse.jdt.core.dom.Modifier.ModifierKeyword;

 import org.eclipse.jdt.core.dom.rewrite.ASTRewrite;

-import org.eclipse.jdt.core.dom.rewrite.ImportRewrite;

 import org.eclipse.jdt.core.dom.rewrite.ImportRewrite.ImportRewriteContext;

 import org.eclipse.jdt.core.search.IJavaSearchConstants;

 import org.eclipse.jdt.core.search.IJavaSearchScope;

@@ -54,6 +53,7 @@
 import org.eclipse.jdt.core.search.SearchParticipant;

 import org.eclipse.jdt.core.search.SearchPattern;

 import org.eclipse.jdt.core.search.SearchRequestor;

+import org.eclipse.jdt.internal.core.search.matching.MethodPattern;

 import org.eclipse.jdt.internal.corext.codemanipulation.ContextSensitiveImportRewriteContext;

 import org.eclipse.jdt.internal.corext.dom.ASTNodeFactory;

 import org.eclipse.jdt.internal.corext.dom.ASTNodes;

@@ -97,6 +97,7 @@
 import org.eclipse.osgi.util.NLS;

 import org.eclipse.text.edits.TextEditGroup;

 

+import base org.eclipse.jdt.internal.core.search.BasicSearchEngine;

 import base org.eclipse.jdt.internal.corext.refactoring.RefactoringAvailabilityTester;

 import base org.eclipse.jdt.internal.corext.refactoring.structure.ASTNodeSearchUtil;

 import base org.eclipse.jdt.internal.corext.refactoring.structure.HierarchyProcessor;

@@ -829,7 +830,7 @@
 	}

 

 	/** Visibility checking for callout mappings. */

-	protected class Visibility playedBy MemberVisibilityAdjustor {

+	protected team class Visibility playedBy MemberVisibilityAdjustor {

 

 		IJavaElement getFReferencing() -> get IJavaElement fReferencing;

 

@@ -931,6 +932,21 @@
 			IMethod method = (IMethod) ((AbstractCalloutMapping)referencedMovedElement).getCorrespondingJavaElement();

 			return base.getVisibilityThreshold(method);

 		}

+

+		adjustVisibility <- replace adjustVisibility;

+

+		// --- during adjustMemberVisibility don't find decapsulating base method references:

+		callin void adjustVisibility() throws JavaModelException {

+			within (this) base.adjustVisibility();			

+		}

+		protected class Search playedBy BasicSearchEngine {

+			searchDeclarations <- before searchDeclarations;

+			private void searchDeclarations(IJavaElement element, SearchRequestor requestor, SearchPattern pattern, IProgressMonitor monitor) {

+				if (pattern instanceof MethodPattern)

+					((MethodPattern) pattern).findDecapsulationReferences = false;				

+			}			

+		}

+		// ---

 	}

 	

 	/**