Skip to main content
aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorKalyan Prasad Tatavarthi2020-07-01 13:25:08 +0000
committerKalyan Prasad Tatavarthi2020-07-02 08:06:38 +0000
commit10e442027167d5d572e303e308b542c97e6ef3e6 (patch)
tree1beea0b59fe18470d82f6a6eb42032da6020ad7e
parentddd423c062ad0693ed34a29fb007d923b3f5cfee (diff)
downloadeclipse.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>
-rw-r--r--org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite14Test.java41
-rw-r--r--org.eclipse.jdt.core.tests.model/src/org/eclipse/jdt/core/tests/rewrite/describing/ImportRewrite18Test.java41
-rw-r--r--org.eclipse.jdt.core/dom/org/eclipse/jdt/core/dom/rewrite/ImportRewrite.java29
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;
+ }
}

Back to the top