From a7efb6b0fbe2ce1eb462643c21c8b1868f182062 Mon Sep 17 00:00:00 2001 From: Martin Wittlinger Date: Sat, 27 May 2023 17:48:47 +0200 Subject: [PATCH 1/4] Refactor code to fix runtime exception caused by package name with CtType.INNERTTYPE_SEPARATOR. The check for the CtType.INNERTTYPE_SEPARATOR that caused runtime exceptions has been removed so that valid packages with CtType.INNERTTYPE_SEPARATOR can be found. A new test has been added to verify that a package with a name containing a dollar sign can be successfully retrieved using the PackageFactory. --- .../spoon/reflect/factory/PackageFactory.java | 3 --- .../reflect/factory/PackageFactoryTest.java | 24 +++++++++++++++++-- 2 files changed, 22 insertions(+), 5 deletions(-) diff --git a/src/main/java/spoon/reflect/factory/PackageFactory.java b/src/main/java/spoon/reflect/factory/PackageFactory.java index c918e78a02e..1c7af068852 100644 --- a/src/main/java/spoon/reflect/factory/PackageFactory.java +++ b/src/main/java/spoon/reflect/factory/PackageFactory.java @@ -155,9 +155,6 @@ public CtPackage getOrCreate(String qualifiedName, CtModule rootModule) { * @return a found package or null */ public CtPackage get(String qualifiedName) { - if (qualifiedName.contains(CtType.INNERTTYPE_SEPARATOR)) { - throw new RuntimeException("Invalid package name " + qualifiedName); - } // Find package with the most contained types. If a module exports package "foo.bar" and the // other "foo.bar.baz", *both modules* will contain a "foo.bar" package in spoon. As diff --git a/src/test/java/spoon/reflect/factory/PackageFactoryTest.java b/src/test/java/spoon/reflect/factory/PackageFactoryTest.java index 13cb1897fa1..b97b2cc1a03 100644 --- a/src/test/java/spoon/reflect/factory/PackageFactoryTest.java +++ b/src/test/java/spoon/reflect/factory/PackageFactoryTest.java @@ -3,8 +3,10 @@ import static org.hamcrest.CoreMatchers.equalTo; import static org.hamcrest.CoreMatchers.sameInstance; import static org.hamcrest.MatcherAssert.assertThat; - +import static org.junit.jupiter.api.Assertions.*; +import org.junit.jupiter.api.Test; import spoon.Launcher; +import spoon.reflect.declaration.CtClass; import spoon.reflect.declaration.CtPackage; import spoon.test.GitHubIssue; @@ -25,7 +27,25 @@ void getOrCreate_returnsNestedPackageStructure_whenQualifiedNameRepeatsSimpleNam assertThat(topLevelPackage.getQualifiedName(), equalTo(topLevelPackageName)); assertThat(packageWithDuplicatedSimpleNames.getQualifiedName(), equalTo(nestedPackageName)); - assertThat(topLevelPackage.getPackage(topLevelPackageName), sameInstance(packageWithDuplicatedSimpleNames)); + assertThat(topLevelPackage.getPackage(topLevelPackageName), + sameInstance(packageWithDuplicatedSimpleNames)); assertThat(packageWithDuplicatedSimpleNames.getParent(), sameInstance(topLevelPackage)); } + + @Test + @GitHubIssue(issueNumber = 5140, fixed = true) + void testGetPackageWithNameContainingDollarSign() { + // contract: A package with a name containing a dollar sign can be retrieved using the PackageFactory + + // Create a package with a name containing a dollar sign + String packageName = "com.example.package$with$dollar$sign"; + CtClass clazz = Launcher.parseClass("package " + packageName + ";" + "\n" + "enum Foo { }"); + + // Get the package using the PackageFactory + CtPackage ctPackage = clazz.getFactory().Package().get(packageName); + + // Verify that the package was found + assertNotNull(ctPackage); + assertEquals(packageName, ctPackage.getQualifiedName()); + } } \ No newline at end of file From 8c4be7f2c060d016715d736bbb0a4914fb3a71fe Mon Sep 17 00:00:00 2001 From: Martin Wittlinger Date: Sat, 27 May 2023 17:53:39 +0200 Subject: [PATCH 2/4] remove unused import --- src/main/java/spoon/reflect/factory/PackageFactory.java | 1 - 1 file changed, 1 deletion(-) diff --git a/src/main/java/spoon/reflect/factory/PackageFactory.java b/src/main/java/spoon/reflect/factory/PackageFactory.java index 1c7af068852..a1984c6c75d 100644 --- a/src/main/java/spoon/reflect/factory/PackageFactory.java +++ b/src/main/java/spoon/reflect/factory/PackageFactory.java @@ -16,7 +16,6 @@ import spoon.reflect.declaration.CtModule; import spoon.reflect.declaration.CtPackage; import spoon.reflect.declaration.CtPackageDeclaration; -import spoon.reflect.declaration.CtType; import spoon.reflect.reference.CtPackageReference; From bab109b20a6fe597608fce9a8fceebef58f4bce9 Mon Sep 17 00:00:00 2001 From: Martin Wittlinger Date: Sat, 27 May 2023 17:55:28 +0200 Subject: [PATCH 3/4] fix formatting --- src/test/java/spoon/reflect/factory/PackageFactoryTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/src/test/java/spoon/reflect/factory/PackageFactoryTest.java b/src/test/java/spoon/reflect/factory/PackageFactoryTest.java index b97b2cc1a03..cd183035116 100644 --- a/src/test/java/spoon/reflect/factory/PackageFactoryTest.java +++ b/src/test/java/spoon/reflect/factory/PackageFactoryTest.java @@ -27,8 +27,7 @@ void getOrCreate_returnsNestedPackageStructure_whenQualifiedNameRepeatsSimpleNam assertThat(topLevelPackage.getQualifiedName(), equalTo(topLevelPackageName)); assertThat(packageWithDuplicatedSimpleNames.getQualifiedName(), equalTo(nestedPackageName)); - assertThat(topLevelPackage.getPackage(topLevelPackageName), - sameInstance(packageWithDuplicatedSimpleNames)); + assertThat(topLevelPackage.getPackage(topLevelPackageName), sameInstance(packageWithDuplicatedSimpleNames)); assertThat(packageWithDuplicatedSimpleNames.getParent(), sameInstance(topLevelPackage)); } From 78b64b78ee2711465d9da2078523cf0a16969679 Mon Sep 17 00:00:00 2001 From: Martin Date: Wed, 31 May 2023 11:13:01 +0200 Subject: [PATCH 4/4] fix formatting --- .../reflect/factory/PackageFactoryTest.java | 31 +++++++++---------- 1 file changed, 15 insertions(+), 16 deletions(-) diff --git a/src/test/java/spoon/reflect/factory/PackageFactoryTest.java b/src/test/java/spoon/reflect/factory/PackageFactoryTest.java index ba1a1a5db9d..f5f663e21cd 100644 --- a/src/test/java/spoon/reflect/factory/PackageFactoryTest.java +++ b/src/test/java/spoon/reflect/factory/PackageFactoryTest.java @@ -32,20 +32,19 @@ void getOrCreate_returnsNestedPackageStructure_whenQualifiedNameRepeatsSimpleNam assertThat(packageWithDuplicatedSimpleNames.getParent(), sameInstance(topLevelPackage)); } - @Test - @GitHubIssue(issueNumber = 5140, fixed = true) - void testGetPackageWithNameContainingDollarSign() { - // contract: A package with a name containing a dollar sign can be retrieved using the PackageFactory - - // Create a package with a name containing a dollar sign - String packageName = "com.example.package$with$dollar$sign"; - CtClass clazz = Launcher.parseClass("package " + packageName + ";" + "\n" + "enum Foo { }"); - - // Get the package using the PackageFactory - CtPackage ctPackage = clazz.getFactory().Package().get(packageName); - - // Verify that the package was found - assertNotNull(ctPackage); - assertEquals(packageName, ctPackage.getQualifiedName()); - } + @Test + @GitHubIssue(issueNumber = 5140, fixed = true) + void testGetPackageWithNameContainingDollarSign() { + // contract: A package with a name containing a dollar sign can be retrieved using the PackageFactory + // Create a package with a name containing a dollar sign + String packageName = "com.example.package$with$dollar$sign"; + CtClass clazz = Launcher.parseClass("package " + packageName + ";" + "\n" + "enum Foo { }"); + + // Get the package using the PackageFactory + CtPackage ctPackage = clazz.getFactory().Package().get(packageName); + + // Verify that the package was found + assertNotNull(ctPackage); + assertEquals(packageName, ctPackage.getQualifiedName()); + } } \ No newline at end of file