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 236294 Details for
Bug 394549
[extract class] Extract class on a field with inner non-static type in generic class yields compilation error
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
eclipse.jdt.ui.394549.patch (text/plain), 15.65 KB, created by
Nikolay Metchev
on 2013-10-09 11:23:08 EDT
(
hide
)
Description:
proposed patch
Filename:
MIME Type:
Creator:
Nikolay Metchev
Created:
2013-10-09 11:23:08 EDT
Size:
15.65 KB
patch
obsolete
>diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractClass/testGenericNested/in/GenericNested.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractClass/testGenericNested/in/GenericNested.java >new file mode 100644 >index 0000000..5b475dc >--- /dev/null >+++ b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractClass/testGenericNested/in/GenericNested.java >@@ -0,0 +1,8 @@ >+package p; >+ >+class GenericNested<T> { >+ C m; >+ >+ class C { >+ } >+} >\ No newline at end of file >diff --git a/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractClass/testGenericNested/out/GenericNested.java b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractClass/testGenericNested/out/GenericNested.java >new file mode 100644 >index 0000000..fb89147 >--- /dev/null >+++ b/org.eclipse.jdt.ui.tests.refactoring/resources/ExtractClass/testGenericNested/out/GenericNested.java >@@ -0,0 +1,14 @@ >+package p; >+ >+class GenericNested<T> { >+ public static class Extracted<T> { >+ public GenericNested<T>.C m; >+ public Extracted() { >+ } >+ } >+ >+ Extracted<T> parameterObject = new Extracted<T>(); >+ >+ class C { >+ } >+} >\ No newline at end of file >diff --git a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractClassTests.java b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractClassTests.java >index d2b0ff6..6b21443 100644 >--- a/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractClassTests.java >+++ b/org.eclipse.jdt.ui.tests.refactoring/test cases/org/eclipse/jdt/ui/tests/refactoring/ExtractClassTests.java >@@ -6,11 +6,12 @@ > * http://www.eclipse.org/legal/epl-v10.html > * > * Contributors: > * IBM Corporation - initial API and implementation > * Nikolay Metchev <nikolaymetchev@gmail.com> - [extract class] Extract class refactoring on a field in an inner non-static class yields compilation error - https://bugs.eclipse.org/394547 >- * Samrat Dhillon samrat.dhillon@gmail.com - [extract class] Extract class on a field with generic type yields compilation error - https://bugs.eclipse.org/bugs/show_bug.cgi?id=394548 >+ * - [extract class] Extract class on a field with inner non-static type in generic class yields compilation error - https://bugs.eclipse.org/394549 >+ * Samrat Dhillon samrat.dhillon@gmail.com - [extract class] Extract class on a field with generic type yields compilation error - https://bugs.eclipse.org/394548 > *******************************************************************************/ > package org.eclipse.jdt.ui.tests.refactoring; > > import java.io.IOException; > import java.util.HashMap; >@@ -431,10 +432,20 @@ > fDescriptor.setType(inner); > fDescriptor.setClassName("Extracted"); > fDescriptor.setCreateTopLevel(false); > runRefactoring(false); > } >+ >+ // see bug 394549 >+ public void testGenericNested() throws Exception { >+ IType outer= setupType(); >+ fDescriptor.setType(outer); >+ fDescriptor.setClassName("Extracted"); >+ fDescriptor.setCreateTopLevel(false); >+ runRefactoring(false); >+ } >+ > // see bug 394548 > public void testTypeParameter() throws Exception { > fDescriptor.setType(setupType()); > fDescriptor.setCreateTopLevel(false); > fDescriptor.setFieldName("data"); >diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ExtractClassRefactoring.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ExtractClassRefactoring.java >index ae3ea70..9581575 100644 >--- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ExtractClassRefactoring.java >+++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ExtractClassRefactoring.java >@@ -6,10 +6,11 @@ > * http://www.eclipse.org/legal/epl-v10.html > * > * Contributors: > * IBM Corporation - initial API and implementation > * Nikolay Metchev <nikolaymetchev@gmail.com> - [extract class] Extract class refactoring on a field in an inner non-static class yields compilation error - https://bugs.eclipse.org/394547 >+ * - [extract class] Extract class on a field with inner non-static type in generic class yields compilation error - https://bugs.eclipse.org/394549 > *******************************************************************************/ > package org.eclipse.jdt.internal.corext.refactoring.structure; > > import java.util.ArrayList; > import java.util.Arrays; >@@ -357,12 +358,13 @@ > } > } > } > pm.worked(5); > fChangeManager= new TextChangeManager(); >- fParameterObjectFactory= initializeFactory(); > IType type= fDescriptor.getType(); >+ fBaseCURewrite= new CompilationUnitRewrite(type.getCompilationUnit()); >+ fParameterObjectFactory= initializeFactory(); > pm.worked(5); > > FieldDeclaration field= performFieldRewrite(type, fParameterObjectFactory, result); > int flags= RefactoringDescriptor.STRUCTURAL_CHANGE | JavaRefactoringDescriptor.JAR_MIGRATION | JavaRefactoringDescriptor.JAR_REFACTORING | JavaRefactoringDescriptor.JAR_SOURCE_ATTACHMENT; > if (!Modifier.isPrivate(field.getModifiers())) >@@ -498,17 +500,21 @@ > ITypeBinding binding= enclosingTypeDecl.resolveBinding(); > int modifiers= binding != null ? binding.getModifiers() : enclosingTypeDecl.getModifiers(); > return Modifier.isStatic(modifiers); > } > >- private ParameterObjectFactory initializeFactory() { >+ private ParameterObjectFactory initializeFactory() throws JavaModelException { > ParameterObjectFactory pof= new ParameterObjectFactory(); > pof.setClassName(fDescriptor.getClassName()); > pof.setPackage(fDescriptor.getPackage()); > pof.setEnclosingType(fDescriptor.getType().getFullyQualifiedName('.')); > pof.setCreateGetter(fDescriptor.isCreateGetterSetter()); > pof.setCreateSetter(fDescriptor.isCreateGetterSetter()); >+ TypeDeclaration typeDecl= ASTNodeSearchUtil.getTypeDeclarationNode(fDescriptor.getType(), fBaseCURewrite.getRoot()); >+ if (!fDescriptor.isCreateTopLevel()) { >+ pof.setImportRewriteContext(pof.createParameterClassAwareContext(fDescriptor.isCreateTopLevel(), fBaseCURewrite, typeDecl.getStartPosition())); >+ } > List<ParameterInfo> variables= new ArrayList<ParameterInfo>(); > for (Iterator<FieldInfo> iterator= fVariables.values().iterator(); iterator.hasNext();) { > FieldInfo info= iterator.next(); > boolean createField= isCreateField(info); > info.pi.setCreateField(createField); >@@ -720,11 +726,10 @@ > private FieldInfo getFieldInfo(String identifier) { > return fVariables.get(identifier); > } > > private FieldDeclaration performFieldRewrite(IType type, ParameterObjectFactory pof, RefactoringStatus status) throws CoreException { >- fBaseCURewrite= new CompilationUnitRewrite(type.getCompilationUnit()); > SimpleName name= (SimpleName) NodeFinder.perform(fBaseCURewrite.getRoot(), type.getNameRange()); > TypeDeclaration typeNode= (TypeDeclaration) ASTNodes.getParent(name, ASTNode.TYPE_DECLARATION); > ASTRewrite rewrite= fBaseCURewrite.getASTRewrite(); > int modifier= Modifier.PRIVATE; > TextEditGroup removeFieldGroup= fBaseCURewrite.createGroupDescription(RefactoringCoreMessages.ExtractClassRefactoring_group_remove_field); >@@ -820,11 +825,11 @@ > ASTNode createMoveTarget= fBaseCURewrite.getASTRewrite().createMoveTarget(expression); > if (expression instanceof ArrayInitializer) { > ArrayInitializer ai= (ArrayInitializer) expression; > ITypeBinding componentType= ai.resolveTypeBinding().getComponentType(); > ArrayCreation arrayCreation= ast.newArrayCreation(); >- Type addImport= fBaseCURewrite.getImportRewrite().addImport(componentType, ast); >+ Type addImport= fBaseCURewrite.getImportRewrite().addImport(componentType, ast, fParameterObjectFactory.getImportRewriteContext()); > fBaseCURewrite.getImportRemover().registerAddedImports(addImport); > arrayCreation.setType(ast.newArrayType(addImport)); > arrayCreation.setInitializer((ArrayInitializer) createMoveTarget); > listRewrite.insertLast(arrayCreation, null); > } else { >@@ -855,11 +860,11 @@ > } > > private void importNodeTypes(ASTNode node, final CompilationUnitRewrite cuRewrite) { > ASTResolving.visitAllBindings(node, new TypeBindingVisitor() { > public boolean visit(ITypeBinding nodeBinding) { >- ParameterObjectFactory.importBinding(nodeBinding, cuRewrite); >+ fParameterObjectFactory.importBinding(nodeBinding, cuRewrite); > return false; > } > }); > } > >diff --git a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ParameterObjectFactory.java b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ParameterObjectFactory.java >index 4ba10fa..6b0fc5b 100644 >--- a/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ParameterObjectFactory.java >+++ b/org.eclipse.jdt.ui/core refactoring/org/eclipse/jdt/internal/corext/refactoring/structure/ParameterObjectFactory.java >@@ -5,11 +5,12 @@ > * which accompanies this distribution, and is available at > * http://www.eclipse.org/legal/epl-v10.html > * > * Contributors: > * IBM Corporation - initial API and implementation >- * Samrat Dhillon samrat.dhillon@gmail.com https://bugs.eclipse.org/bugs/show_bug.cgi?id=395558 , https://bugs.eclipse.org/bugs/show_bug.cgi?id=395561 and https://bugs.eclipse.org/bugs/show_bug.cgi?id=394548 >+ * Samrat Dhillon samrat.dhillon@gmail.com https://bugs.eclipse.org/395558 , https://bugs.eclipse.org/395561 and https://bugs.eclipse.org/394548 >+ * Nikolay Metchev <nikolaymetchev@gmail.com> - [extract class] Extract class on a field with inner non-static type in generic class yields compilation error - https://bugs.eclipse.org/394549 > *******************************************************************************/ > package org.eclipse.jdt.internal.corext.refactoring.structure; > > import java.util.ArrayList; > import java.util.Iterator; >@@ -54,11 +55,14 @@ > import org.eclipse.jdt.core.dom.MethodDeclaration; > import org.eclipse.jdt.core.dom.MethodInvocation; > import org.eclipse.jdt.core.dom.Modifier; > import org.eclipse.jdt.core.dom.Modifier.ModifierKeyword; > import org.eclipse.jdt.core.dom.Name; >+import org.eclipse.jdt.core.dom.ParameterizedType; >+import org.eclipse.jdt.core.dom.QualifiedType; > import org.eclipse.jdt.core.dom.SimpleName; >+import org.eclipse.jdt.core.dom.SimpleType; > import org.eclipse.jdt.core.dom.SingleVariableDeclaration; > import org.eclipse.jdt.core.dom.Statement; > import org.eclipse.jdt.core.dom.SuperFieldAccess; > import org.eclipse.jdt.core.dom.Type; > import org.eclipse.jdt.core.dom.TypeDeclaration; >@@ -90,10 +94,12 @@ > private String fClassName; > private boolean fCreateGetter; > private boolean fCreateSetter; > private String fEnclosingType; > private String fPackage; >+ >+ private ImportRewriteContext fImportRewriteContext; > private List<ParameterInfo> fVariables; > > public ParameterObjectFactory() { > super(); > } >@@ -198,10 +204,21 @@ > if(oldTypeBinding != null && oldTypeBinding.isTypeVariable()){ > TypeParameter param= ast.newTypeParameter(); > param.setName(ast.newSimpleName(pi.getNewTypeName())); > typeDeclaration.typeParameters().add(param); > } >+ Type declarationType= declaration.getType(); >+ if (declarationType.getNodeType() == ASTNode.QUALIFIED_TYPE) { >+ Type qualifier= ((QualifiedType) declarationType).getQualifier(); >+ if (qualifier.isParameterizedType()) { >+ for (Type type : (List<Type>) ((ParameterizedType) qualifier).typeArguments()) { >+ TypeParameter typeParameter= ast.newTypeParameter(); >+ typeParameter.setName(ast.newSimpleName(((SimpleType) type).getName().getFullyQualifiedName())); >+ typeDeclaration.typeParameters().add(typeParameter); >+ } >+ } >+ } > } > } > MethodDeclaration constructor= createConstructor(declaringType, cuRewrite, listener); > listener.constructorCreated(cuRewrite, constructor); > body.add(constructor); >@@ -296,18 +313,27 @@ > String[] suggestions= StubUtility.getVariableNameSuggestions(NamingConventions.VK_PARAMETER, project, strippedName, 0, usedParameter, true); > return suggestions[0]; > } > > >- public static Type importBinding(ITypeBinding typeBinding, CompilationUnitRewrite cuRewrite) { >+ public Type importBinding(ITypeBinding typeBinding, CompilationUnitRewrite cuRewrite) { > int declaredModifiers= typeBinding.getDeclaredModifiers(); > AST ast= cuRewrite.getAST(); > if (Modifier.isPrivate(declaredModifiers) || Modifier.isProtected(declaredModifiers)) { > return ast.newSimpleType(ast.newSimpleName(typeBinding.getName())); > } >- Type type= cuRewrite.getImportRewrite().addImport(typeBinding, cuRewrite.getAST()); >+ Type type= cuRewrite.getImportRewrite().addImport(typeBinding, cuRewrite.getAST(), fImportRewriteContext); > cuRewrite.getImportRemover().registerAddedImports(type); >+ if (typeBinding.isNested()) { >+ ITypeBinding declaringClass= typeBinding.getDeclaringClass(); >+ if (Modifier.isStatic(typeBinding.getModifiers())) { >+ declaringClass= declaringClass.getErasure(); >+ } >+ Type newQualification= importBinding(declaringClass, cuRewrite); >+ cuRewrite.getImportRemover().registerAddedImports(type); >+ type= ast.newQualifiedType(newQualification, (SimpleName) ASTNode.copySubtree(ast, ((SimpleType) type).getName())); >+ } > return type; > } > > private FieldDeclaration createField(ParameterInfo pi, CompilationUnitRewrite cuRewrite) throws CoreException { > AST ast= cuRewrite.getAST(); >@@ -477,11 +503,31 @@ > ImportRewrite importRewrite= cuRewrite.getImportRewrite(); > ContextSensitiveImportRewriteContext context= createParameterClassAwareContext(asTopLevelClass, cuRewrite, position); > String addedImport= importRewrite.addImport(concatenateName, context); > cuRewrite.getImportRemover().registerAddedImport(addedImport); > AST ast= cuRewrite.getAST(); >- return ast.newSimpleType(ast.newName(addedImport)); >+ SimpleType newSimpleType= ast.newSimpleType(ast.newName(addedImport)); >+ ParameterizedType parameterizedType= null; >+ CompilationUnitRewrite dummyCuRewrite= new CompilationUnitRewrite(cuRewrite.getCu()); >+ for (Iterator<ParameterInfo> iter= fVariables.iterator(); iter.hasNext();) { >+ ParameterInfo pi= iter.next(); >+ if (isValidField(pi)) { >+ Type importBinding= importBinding(pi.getNewTypeBinding(), dummyCuRewrite); >+ if (importBinding.getNodeType() == ASTNode.QUALIFIED_TYPE) { >+ Type fieldQualifier= ((QualifiedType) importBinding).getQualifier(); >+ if (fieldQualifier.isParameterizedType()) { >+ if (parameterizedType == null) { >+ parameterizedType= ast.newParameterizedType(newSimpleType); >+ } >+ for (Type type : (List<Type>) ((ParameterizedType) fieldQualifier).typeArguments()) { >+ parameterizedType.typeArguments().add(ASTNode.copySubtree(ast, type)); >+ } >+ } >+ } >+ } >+ } >+ return parameterizedType == null ? newSimpleType : parameterizedType; > } > > ContextSensitiveImportRewriteContext createParameterClassAwareContext(final boolean asTopLevelClass, final CompilationUnitRewrite cuRewrite, int position) { > ContextSensitiveImportRewriteContext context= new ContextSensitiveImportRewriteContext(cuRewrite.getRoot(), position, cuRewrite.getImportRewrite()) { > @Override >@@ -598,10 +644,18 @@ > > public void setVariables(List<ParameterInfo> parameters) { > fVariables= parameters; > } > >+ public void setImportRewriteContext(ImportRewriteContext importRewriteContext) { >+ fImportRewriteContext= importRewriteContext; >+ } >+ >+ public ImportRewriteContext getImportRewriteContext() { >+ return fImportRewriteContext; >+ } >+ > /** > * Updates the position of the newly inserted parameterObject so that it is > * directly after the first checked parameter > * > * @param parameterObjectReference the inserted parameterObject
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 394549
: 236294