diff options
author | Kalyan Prasad Tatavarthi | 2020-07-01 13:25:08 +0000 |
---|---|---|
committer | Kalyan Prasad Tatavarthi | 2020-07-02 08:06:38 +0000 |
commit | 10e442027167d5d572e303e308b542c97e6ef3e6 (patch) | |
tree | 1beea0b59fe18470d82f6a6eb42032da6020ad7e | |
parent | ddd423c062ad0693ed34a29fb007d923b3f5cfee (diff) | |
download | eclipse.jdt.core-10e442027167d5d572e303e308b542c97e6ef3e6.tar.gz eclipse.jdt.core-10e442027167d5d572e303e308b542c97e6ef3e6.tar.xz eclipse.jdt.core-10e442027167d5d572e303e308b542c97e6ef3e6.zip |
Bug 563375 - [14][inline] Inline method that returns record/class adds code breaking import
Change-Id: I17e94cc3db103d80655cb588f52742c74d562d1d
Signed-off-by: Kalyan Prasad Tatavarthi <kalyan_prasad@in.ibm.com>
3 files changed, 102 insertions, 9 deletions
diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite14Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite14Test.java index 9fa37c5b6c..2d376b862c 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite14Test.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite14Test.java @@ -29,6 +29,7 @@ import org.eclipse.jdt.core.dom.IVariableBinding; import org.eclipse.jdt.core.dom.RecordDeclaration; import org.eclipse.jdt.core.dom.SingleVariableDeclaration; import org.eclipse.jdt.core.dom.Type; +import org.eclipse.jdt.core.dom.TypeDeclaration; import org.eclipse.jdt.core.dom.rewrite.ImportRewrite; import org.eclipse.jdt.core.formatter.DefaultCodeFormatterConstants; import org.eclipse.jdt.core.tests.model.AbstractJavaModelTests; @@ -141,6 +142,46 @@ public class ImportRewrite14Test extends AbstractJavaModelTests { assertEqualStringIgnoreDelim(cu.getSource(), contentsA); } + /* + * Import should not be added in the default package + */ + public void testBug563375_2() throws Exception { + String contents = ""+ + "public class X {\n" + + " public static void main(String[] args) {\n" + + " var i_S = i_s();\n" + + " System.out.println(i_S.i + i_S.s);\n" + + " }\n" + + " \n" + + " static record I_S(int i, String s) {}\n" + + " \n" + + " private static I_S i_s() {\n" + + " return new I_S(1, \"abc\");\n" + + " }\n" + + "}"; + createFile("/" + PROJECT + "/src/X.java", contents); + + ICompilationUnit cu= getCompilationUnit("/" + PROJECT + "/src/X.java"); + ASTParser parser = ASTParser.newParser(getJLS14()); + parser.setSource(cu); + parser.setResolveBindings(true); + parser.setStatementsRecovery(true); + CompilationUnit astRoot = (CompilationUnit) parser.createAST(null); + + + TypeDeclaration clazz= (TypeDeclaration) astRoot.types().get(0); + ITypeBinding binding= clazz.resolveBinding(); + ITypeBinding recBinding= binding.getDeclaredTypes()[0]; + assertNotNull(recBinding); + ImportRewrite rewrite = newImportsRewrite(cu, new String[0], 99, 99, true); + cu = getCompilationUnit("/" + PROJECT + "/src/X.java"); + rewrite = newImportsRewrite(cu, new String[0], 99, 99, true); + String actualType = rewrite.addImport(recBinding); + assertEquals("X.I_S", actualType); + apply(rewrite); + assertEquals(0, cu.getImports().length); + } + protected void assertEqualStringIgnoreDelim(String actual, String expected) throws IOException { StringAsserts.assertEqualStringIgnoreDelim(actual, expected); } diff --git a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite18Test.java b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite18Test.java index ede8cd2628..632e7e6faf 100644 --- a/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite18Test.java +++ b/org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite18Test.java @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2014, 2016 IBM Corporation and others. + * Copyright (c) 2014, 2020 IBM Corporation and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -847,4 +847,43 @@ public class ImportRewrite18Test extends AbstractJavaModelTests { Type actualType = runTest426094andGetType(0, true); assertEquals(this.bug426094TestInput[0][1], actualType.toString()); } + + /* + * Import should not be added in the default package + */ + public void testBug563375() throws Exception { + String contents = ""+ + "public class X {\n" + + " public static void main(String[] args) {\n" + + " var i_S = i_s();\n" + + " System.out.println(i_S.toString());\n" + + " }\n" + + " \n" + + " static class I_S {}\n" + + " \n" + + " private static I_S i_s() {\n" + + " return new I_S();\n" + + " }\n" + + "}"; + createFile("/" + PROJECT + "/src/X.java", contents); + + ICompilationUnit cu= getCompilationUnit("/" + PROJECT + "/src/X.java"); + ASTParser parser = ASTParser.newParser(getJLS8()); + parser.setSource(cu); + parser.setResolveBindings(true); + parser.setStatementsRecovery(true); + CompilationUnit astRoot = (CompilationUnit) parser.createAST(null); + + TypeDeclaration clazz= (TypeDeclaration) astRoot.types().get(0); + ITypeBinding binding= clazz.resolveBinding(); + ITypeBinding iBinding= binding.getDeclaredTypes()[0]; + assertNotNull(iBinding); + ImportRewrite rewrite = newImportsRewrite(cu, new String[0], 99, 99, true); + cu = getCompilationUnit("/" + PROJECT + "/src/X.java"); + rewrite = newImportsRewrite(cu, new String[0], 99, 99, true); + String actualType = rewrite.addImport(iBinding); + assertEquals("X.I_S", actualType); + apply(rewrite); + assertEquals(0, cu.getImports().length); + } } diff --git a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ImportRewrite.java b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ImportRewrite.java index 2e423f8145..039ba29027 100644 --- a/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ImportRewrite.java +++ b/org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ImportRewrite.java @@ -53,6 +53,7 @@ import org.eclipse.jdt.core.dom.IAnnotationBinding; import org.eclipse.jdt.core.dom.IBinding; import org.eclipse.jdt.core.dom.IMemberValuePairBinding; import org.eclipse.jdt.core.dom.IMethodBinding; +import org.eclipse.jdt.core.dom.IPackageBinding; import org.eclipse.jdt.core.dom.ITypeBinding; import org.eclipse.jdt.core.dom.IVariableBinding; import org.eclipse.jdt.core.dom.ImportDeclaration; @@ -773,7 +774,7 @@ public final class ImportRewrite { String erasureName= Signature.toString(erasureSig); if (erasureSig.charAt(0) == Signature.C_RESOLVED) { - erasureName= internalAddImport(erasureName, context); + erasureName= internalAddImport(erasureName, context, false); } Type baseType= ast.newSimpleType(ast.newName(erasureName)); String[] typeArguments= Signature.getTypeArguments(typeSig); @@ -883,7 +884,7 @@ public final class ImportRewrite { String qualifiedName= getRawQualifiedName(normalizedBinding); if (qualifiedName.length() > 0) { - String str= internalAddImport(qualifiedName, context); + String str= internalAddImport(qualifiedName, context, isTypeInUnnamedPackage(normalizedBinding)); ITypeBinding[] typeArguments= normalizedBinding.getTypeArguments(); if (typeArguments.length > 0) { @@ -1053,13 +1054,13 @@ public final class ImportRewrite { public String addImport(String qualifiedTypeName, ImportRewriteContext context) { int angleBracketOffset= qualifiedTypeName.indexOf('<'); if (angleBracketOffset != -1) { - return internalAddImport(qualifiedTypeName.substring(0, angleBracketOffset), context) + qualifiedTypeName.substring(angleBracketOffset); + return internalAddImport(qualifiedTypeName.substring(0, angleBracketOffset), context, false) + qualifiedTypeName.substring(angleBracketOffset); } int bracketOffset= qualifiedTypeName.indexOf('['); if (bracketOffset != -1) { - return internalAddImport(qualifiedTypeName.substring(0, bracketOffset), context) + qualifiedTypeName.substring(bracketOffset); + return internalAddImport(qualifiedTypeName.substring(0, bracketOffset), context, false) + qualifiedTypeName.substring(bracketOffset); } - return internalAddImport(qualifiedTypeName, context); + return internalAddImport(qualifiedTypeName, context, false); } /** @@ -1198,7 +1199,7 @@ public final class ImportRewrite { return simpleName; } - private String internalAddImport(String fullTypeName, ImportRewriteContext context) { + private String internalAddImport(String fullTypeName, ImportRewriteContext context, boolean isTypeInUnnamedPackage) { int idx= fullTypeName.lastIndexOf('.'); String typeContainerName, typeName; if (idx != -1) { @@ -1217,7 +1218,8 @@ public final class ImportRewrite { context= this.defaultContext; int res= context.findInContext(typeContainerName, typeName, ImportRewriteContext.KIND_TYPE); - if (res == ImportRewriteContext.RES_NAME_CONFLICT) { + if (res == ImportRewriteContext.RES_NAME_CONFLICT + || isTypeInUnnamedPackage) { return fullTypeName; } if (res == ImportRewriteContext.RES_NAME_UNKNOWN) { @@ -1518,7 +1520,7 @@ public final class ImportRewrite { boolean annotsPresent = annotationBinding != null && annotationBinding.length > 0; String qualifiedName= getRawQualifiedName(normalizedBinding); - String res = qualifiedName.length() > 0 ? internalAddImport(qualifiedName, context) : getRawName(normalizedBinding); + String res = qualifiedName.length() > 0 ? internalAddImport(qualifiedName, context, isTypeInUnnamedPackage(normalizedBinding)) : getRawName(normalizedBinding); if (annotsPresent) { int dotIndex = res != null ? res.lastIndexOf('.') : -1; @@ -1662,4 +1664,15 @@ public final class ImportRewrite { return null; } } + + private static boolean isTypeInUnnamedPackage(ITypeBinding binding) { + boolean isInUnnamedPackage= false; + if (binding != null) { + IPackageBinding pBinding= binding.getPackage(); + if (pBinding != null) { + isInUnnamedPackage= pBinding.isUnnamed(); + } + } + return isInUnnamedPackage; + } } |