Download
Getting Started
Members
Projects
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
More
Community
Marketplace
Events
Planet Eclipse
Newsletter
Videos
Participate
Report a Bug
Forums
Mailing Lists
Wiki
IRC
How to Contribute
Working Groups
Automotive
Internet of Things
LocationTech
Long-Term Support
PolarSys
Science
OpenMDM
Toggle navigation
Bugzilla – Attachment 227169 Details for
Bug 378028
[refactor][inline] Inlining statically imported method does not correctly clean up static imports
Home
|
New
|
Browse
|
Search
|
[?]
|
Reports
|
Requests
|
Help
|
Log In
[x]
|
Terms of Use
|
Copyright Agent
Some Eclipse Foundation services are deprecated, or will be soon. Please ensure you've read
this important communication.
[patch]
Proposed patch
bug378028.patch (text/plain), 8.02 KB, created by
Jan Opacki
on 2013-02-17 13:40:21 EST
(
hide
)
Description:
Proposed patch
Filename:
MIME Type:
Creator:
Jan Opacki
Created:
2013-02-17 13:40:21 EST
Size:
8.02 KB
patch
obsolete
>diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/CallContext.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/CallContext.java >index b686b4a..8e47ffb 100644 >--- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/CallContext.java >+++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/CallContext.java >@@ -22,6 +22,7 @@ import org.eclipse.jdt.internal.corext.dom.CodeScopeBuilder; > public class CallContext { > > public ASTNode invocation; >+ public boolean methodStaticallyImported; > public Expression[] arguments; > public String receiver; > public boolean receiverIsStatic; >diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/CallInliner.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/CallInliner.java >index 9d5b0b1..cbe85ab 100644 >--- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/CallInliner.java >+++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/CallInliner.java >@@ -92,6 +92,7 @@ import org.eclipse.jdt.internal.corext.dom.CodeScopeBuilder; > import org.eclipse.jdt.internal.corext.dom.HierarchicalASTVisitor; > import org.eclipse.jdt.internal.corext.dom.LocalVariableIndex; > import org.eclipse.jdt.internal.corext.dom.NecessaryParenthesesChecker; >+import org.eclipse.jdt.internal.corext.dom.ScopeAnalyzer; > import org.eclipse.jdt.internal.corext.dom.Selection; > import org.eclipse.jdt.internal.corext.dom.TypeBindingVisitor; > import org.eclipse.jdt.internal.corext.refactoring.RefactoringCoreMessages; >@@ -302,6 +303,10 @@ public class CallInliner { > return result; > } > >+ public boolean hasStaticallyImported() { >+ return fContext.methodStaticallyImported; >+ } >+ > private void initializeRewriteState() { > fFieldInitializer= false; > ASTNode parent= fInvocation.getParent(); >@@ -565,8 +570,19 @@ public class CallInliner { > > private void computeReceiver() throws BadLocationException { > Expression receiver= Invocations.getExpression(fInvocation); >- if (receiver == null) >+ if (receiver == null) { >+ MethodInvocation inv= (MethodInvocation)fInvocation; >+ IMethodBinding methodBinding= inv.resolveMethodBinding().getMethodDeclaration(); >+ if(methodBinding == null) >+ return; >+ ITypeBinding declaringClass= methodBinding.getDeclaringClass(); >+ if (declaringClass != null && !declaringClass.isLocal() && Modifier.isStatic(methodBinding.getModifiers())) { >+ ASTNode root= fInvocation.getRoot(); >+ if (!new ScopeAnalyzer(root instanceof CompilationUnit ? (CompilationUnit)root : null).isDeclaredInScope(methodBinding, inv.getName(), ScopeAnalyzer.METHODS | ScopeAnalyzer.CHECK_VISIBILITY)) >+ fContext.methodStaticallyImported = true; >+ } > return; >+ } > final boolean isName= receiver instanceof Name; > if (isName) > fContext.receiverIsStatic= ((Name)receiver).resolveBinding() instanceof ITypeBinding; >diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/InlineMethodRefactoring.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/InlineMethodRefactoring.java >index f4c881a..4a2176e 100644 >--- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/InlineMethodRefactoring.java >+++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/InlineMethodRefactoring.java >@@ -297,6 +297,7 @@ public class InlineMethodRefactoring extends Refactoring { > BodyDeclaration[] bodies= fTargetProvider.getAffectedBodyDeclarations(unit, new SubProgressMonitor(pm, 1)); > if (bodies.length == 0) > continue; >+ boolean hasStaticallyImported= false; > inliner= new CallInliner(unit, (CompilationUnit) bodies[0].getRoot(), fSourceProvider); > for (int b= 0; b < bodies.length; b++) { > BodyDeclaration body= bodies[b]; >@@ -307,6 +308,7 @@ public class InlineMethodRefactoring extends Refactoring { > for (int i= 0; i < invocations.length; i++) { > ASTNode invocation= invocations[i]; > result.merge(inliner.initialize(invocation, fTargetProvider.getStatusSeverity())); >+ hasStaticallyImported= hasStaticallyImported || inliner.hasStaticallyImported(); > if (result.hasFatalError()) > break; > if (result.getSeverity() < fTargetProvider.getStatusSeverity()) { >@@ -330,6 +332,11 @@ public class InlineMethodRefactoring extends Refactoring { > } else { > root.addChild(inliner.getModifications()); > ImportRewrite rewrite= inliner.getImportEdit(); >+ if (hasStaticallyImported && fDeleteSource && fCurrentMode == Mode.INLINE_ALL && fInitialNode instanceof MethodInvocation) { >+ MethodInvocation inv= (MethodInvocation)fInitialNode; >+ String methodFqn= inv.resolveMethodBinding().getDeclaringClass().getQualifiedName() + '.' + inv.getName(); >+ rewrite.removeStaticImport(methodFqn); >+ } > if (rewrite.hasRecordedChanges()) { > TextEdit edit= rewrite.rewriteImports(null); > if (edit instanceof MultiTextEdit ? ((MultiTextEdit)edit).getChildrenSize() > 0 : true) { >diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/SourceProvider.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/SourceProvider.java >index 114d29f..540aaf2 100644 >--- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/SourceProvider.java >+++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/code/SourceProvider.java >@@ -484,7 +484,7 @@ public class SourceProvider { > } > > private void updateImplicitReceivers(ASTRewrite rewriter, CallContext context) { >- if (context.receiver == null) >+ if (context.receiver == null && !context.methodStaticallyImported) > return; > List<Expression> implicitReceivers= fAnalyzer.getImplicitReceivers(); > for (Iterator<Expression> iter= implicitReceivers.iterator(); iter.hasNext();) { >@@ -554,24 +554,33 @@ public class SourceProvider { > } > > private Expression createReceiver(ASTRewrite rewriter, CallContext context, IMethodBinding method, ImportRewriteContext importRewriteContext) { >- String receiver= getReceiver(context, method.getModifiers(), importRewriteContext); >+ String receiver= getReceiver(context, method, importRewriteContext); > if (receiver == null) > return null; > return (Expression)rewriter.createStringPlaceholder(receiver, ASTNode.METHOD_INVOCATION); > } > > private Expression createReceiver(ASTRewrite rewriter, CallContext context, IVariableBinding field, ImportRewriteContext importRewriteContext) { >- String receiver= getReceiver(context, field.getModifiers(), importRewriteContext); >+ String receiver= getReceiver(context, field, importRewriteContext); > if (receiver == null) > return null; > return (Expression)rewriter.createStringPlaceholder(receiver, ASTNode.SIMPLE_NAME); > } > >- private String getReceiver(CallContext context, int modifiers, ImportRewriteContext importRewriteContext) { >+ private String getReceiver(CallContext context, IBinding binding, ImportRewriteContext importRewriteContext) { >+ int modifiers = binding.getModifiers(); > String receiver= context.receiver; > ITypeBinding invocationType= ASTNodes.getEnclosingType(context.invocation); > ITypeBinding sourceType= fDeclaration.resolveBinding().getDeclaringClass(); >- if (!context.receiverIsStatic && Modifier.isStatic(modifiers)) { >+ if(context.methodStaticallyImported) { >+ receiver = context.importer.addStaticImport(binding, new ContextSensitiveImportRewriteContext(context.invocation, context.importer)); >+ if(binding.getName().equals(receiver)) >+ receiver = null; >+ else { >+ receiver = receiver.substring(0, receiver.lastIndexOf('.')); >+ } >+ } >+ else if (!context.receiverIsStatic && Modifier.isStatic(modifiers)) { > if ("this".equals(receiver) && invocationType != null && Bindings.equals(invocationType, sourceType)) { //$NON-NLS-1$ > receiver= null; > } else {
You cannot view the attachment while viewing its details because your browser does not support IFRAMEs.
View the attachment on a separate page
.
View Attachment As Diff
View Attachment As Raw
Actions:
View
|
Diff
Attachments on
bug 378028
: 227169