From 5b34164e35b90cf3e529fc3685845ecd207e90fc Mon Sep 17 00:00:00 2001 From: Nicolas Harrand Date: Wed, 15 May 2019 08:22:06 +0200 Subject: [PATCH] feat(CtPackage): add two utility methods #isEmpty() and #hasPackageInfo() (#2957) --- .../java/spoon/reflect/declaration/CtPackage.java | 10 ++++++++++ .../support/reflect/declaration/CtPackageImpl.java | 11 +++++++++++ src/test/java/spoon/test/pkg/PackageTest.java | 6 ++++++ 3 files changed, 27 insertions(+) diff --git a/src/main/java/spoon/reflect/declaration/CtPackage.java b/src/main/java/spoon/reflect/declaration/CtPackage.java index 4eed2a8fd15..c881f2d5b10 100644 --- a/src/main/java/spoon/reflect/declaration/CtPackage.java +++ b/src/main/java/spoon/reflect/declaration/CtPackage.java @@ -149,4 +149,14 @@ public interface CtPackage extends CtNamedElement, CtShadowable { * See JLS ยง7.4.2. Unnamed Packages. */ boolean isUnnamedPackage(); + + /** + * @return true if the package contains a package-info.java file + */ + boolean hasPackageInfo(); + + /** + * @return true if the package contains no types nor any other packages + */ + boolean isEmpty(); } diff --git a/src/main/java/spoon/support/reflect/declaration/CtPackageImpl.java b/src/main/java/spoon/support/reflect/declaration/CtPackageImpl.java index 3ede164f953..e020f9b9349 100644 --- a/src/main/java/spoon/support/reflect/declaration/CtPackageImpl.java +++ b/src/main/java/spoon/support/reflect/declaration/CtPackageImpl.java @@ -6,6 +6,7 @@ package spoon.support.reflect.declaration; import spoon.reflect.annotations.MetamodelPropertyField; +import spoon.reflect.cu.position.NoSourcePosition; import spoon.reflect.declaration.CtElement; import spoon.reflect.declaration.CtModule; import spoon.reflect.declaration.CtPackage; @@ -231,4 +232,14 @@ public CtPackage clone() { public boolean isUnnamedPackage() { return TOP_LEVEL_PACKAGE_NAME.equals(getSimpleName()); } + + @Override + public boolean hasPackageInfo() { + return !(getPosition() instanceof NoSourcePosition); + } + + @Override + public boolean isEmpty() { + return getPackages().isEmpty() && getTypes().isEmpty(); + } } diff --git a/src/test/java/spoon/test/pkg/PackageTest.java b/src/test/java/spoon/test/pkg/PackageTest.java index be563e5007e..4e4caede13e 100644 --- a/src/test/java/spoon/test/pkg/PackageTest.java +++ b/src/test/java/spoon/test/pkg/PackageTest.java @@ -76,6 +76,8 @@ public void testPackage() throws Exception { assertEquals("spoon.test.pkg.name", ctPackage.getQualifiedName()); assertEquals("", ctPackage.getDocComment()); assertTrue(CtPackage.class.isAssignableFrom(ctPackage.getParent().getClass())); + assertFalse(ctPackage.hasPackageInfo()); + assertFalse(ctPackage.isEmpty()); ctPackage = (CtPackage) ctPackage.getParent(); assertEquals("spoon.test.pkg", ctPackage.getQualifiedName()); @@ -86,6 +88,7 @@ public void testPackage() throws Exception { assertEquals(71, ctPackage.getPosition().getSourceEnd()); assertEquals(1, ctPackage.getAnnotations().size()); assertEquals("This is test\nJavaDoc.", ctPackage.getComments().get(0).getContent()); + assertTrue(ctPackage.hasPackageInfo()); CtAnnotation annotation = ctPackage.getAnnotations().get(0); assertSame(Deprecated.class, annotation.getAnnotationType().getActualClass()); @@ -97,6 +100,9 @@ public void testPackage() throws Exception { ctPackage = (CtPackage) ctPackage.getParent(); assertEquals("spoon.test", ctPackage.getQualifiedName()); assertEquals("", ctPackage.getDocComment()); + + //contract: a freshly created package is empty + assertTrue(factory.createPackage().isEmpty()); } @Test