Skip to content

Commit

Permalink
feat: add CtPackage#getQualifiedName (#1652)
Browse files Browse the repository at this point in the history
  • Loading branch information
surli authored and monperrus committed Oct 26, 2017
1 parent 75f1883 commit d9f2137
Show file tree
Hide file tree
Showing 5 changed files with 61 additions and 2 deletions.
5 changes: 3 additions & 2 deletions src/main/java/spoon/reflect/factory/PackageFactory.java
Original file line number Diff line number Diff line change
Expand Up @@ -44,6 +44,7 @@ public PackageFactory(Factory factory) {

/**
* Creates a reference to an existing package.
* The simple name of the reference will be the FQN of the given package
*/
public CtPackageReference createReference(CtPackage pack) {
if (pack == null) {
Expand All @@ -54,7 +55,7 @@ public CtPackageReference createReference(CtPackage pack) {

/**
* Creates a reference to a package by using its Java runtime
* representation.
* representation. The simple name of the reference will be the FQN of the given package
*
* @param pack
* a runtime package
Expand All @@ -72,7 +73,7 @@ public CtPackageReference topLevel() {
}

/**
* Creates a reference to a package.
* Creates a reference to a package. The given name has to be a fully qualified name.
*
* @param name
* full name of the package to reference
Expand Down
13 changes: 13 additions & 0 deletions src/main/java/spoon/reflect/reference/CtPackageReference.java
Original file line number Diff line number Diff line change
Expand Up @@ -48,4 +48,17 @@ public interface CtPackageReference extends CtReference {

@Override
CtPackageReference clone();

/**
* The simple name of a CtPackageReference is always the fully qualified name of its referenced package. (see {@link spoon.reflect.factory.PackageFactory})
* @return The fully qualified name of its referenced package
*/
@Override
String getSimpleName();

/**
* The qualified name of a CtPackageReference is directly given by its simple name (see {@link CtPackageReference#getSimpleName})
* @return the fully qualified name of its referenced package
*/
String getQualifiedName();
}
Original file line number Diff line number Diff line change
Expand Up @@ -59,6 +59,11 @@ public CtPackageReference clone() {
return (CtPackageReference) super.clone();
}

@Override
public String getQualifiedName() {
return this.getSimpleName();
}

@Override
public boolean isUnnamedPackage() {
return getSimpleName().isEmpty();
Expand Down
35 changes: 35 additions & 0 deletions src/test/java/spoon/test/pkg/PackageTest.java
Original file line number Diff line number Diff line change
Expand Up @@ -11,15 +11,18 @@
import spoon.reflect.declaration.CtAnnotation;
import spoon.reflect.declaration.CtAnnotationType;
import spoon.reflect.declaration.CtClass;
import spoon.reflect.declaration.CtField;
import spoon.reflect.declaration.CtPackage;
import spoon.reflect.factory.Factory;
import spoon.reflect.reference.CtPackageReference;
import spoon.reflect.visitor.DefaultJavaPrettyPrinter;
import spoon.reflect.visitor.PrettyPrinter;
import spoon.reflect.visitor.filter.NamedElementFilter;
import spoon.support.JavaOutputProcessor;
import spoon.test.annotation.testclasses.GlobalAnnotation;
import spoon.test.pkg.name.PackageTestClass;
import spoon.test.pkg.testclasses.ElementProcessor;
import spoon.test.pkg.testclasses.Foo;
import spoon.testing.utils.ModelUtils;

import java.io.BufferedReader;
Expand Down Expand Up @@ -261,4 +264,36 @@ public void testAddAnnotationToPackage() throws Exception {
}
}
}

@Test
public void testGetFQNSimple() {
// contract: CtPackageReference simple name is also the fully qualified name of its referenced package
final Launcher spoon = new Launcher();
spoon.addInputResource("./src/test/java/spoon/test/pkg/testclasses/Foo.java");
spoon.buildModel();

CtClass fooClass = spoon.getFactory().Class().get(Foo.class);
CtField field = fooClass.getField("fieldList");
CtPackageReference fieldPkg = field.getType().getPackage();

assertEquals("java.util", fieldPkg.getSimpleName());
assertEquals("java.util", fieldPkg.getQualifiedName());
}

@Test
public void testGetFQNInNoClassPath() {
// contract: CtPackageReference simple name is also the fully qualified name of its referenced package, even in noclasspath
final Launcher spoon = new Launcher();
spoon.addInputResource("./src/test/resources/noclasspath/TorIntegration.java");
spoon.getEnvironment().setNoClasspath(true);
spoon.buildModel();

CtClass torClass = spoon.getFactory().Class().get("com.duckduckgo.mobile.android.util.TorIntegration");

CtField field = torClass.getField("orbotHelper");
CtPackageReference fieldPkg = field.getType().getPackage();

assertEquals("info.guardianproject.onionkit.ui", fieldPkg.getSimpleName());
assertEquals("info.guardianproject.onionkit.ui", fieldPkg.getQualifiedName());
}
}
5 changes: 5 additions & 0 deletions src/test/java/spoon/test/pkg/testclasses/Foo.java
Original file line number Diff line number Diff line change
@@ -1,4 +1,9 @@
package spoon.test.pkg.testclasses;


import java.util.ArrayList;
import java.util.List;

public class Foo {
List fieldList = new ArrayList();
}

0 comments on commit d9f2137

Please sign in to comment.