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;
+ }
+ }
+ // ---
}
/**