use of spoon.reflect.visitor.filter.ReferenceTypeFilter in project spoon by INRIA.
the class ParentTest method testParentOfGenericInTypeReference.
@Test
public void testParentOfGenericInTypeReference() throws Exception {
// contract: parent of a generic in a type reference is the type reference.
final Factory factory = build(Tacos.class);
final CtTypeReference referenceWithGeneric = Query.getElements(factory, new ReferenceTypeFilter<CtTypeReference>(CtTypeReference.class) {
@Override
public boolean matches(CtTypeReference reference) {
return reference.getActualTypeArguments().size() > 0 && super.matches(reference);
}
}).get(0);
final CtTypeReference<?> generic = referenceWithGeneric.getActualTypeArguments().get(0);
assertNotNull(generic.getParent());
assertEquals(referenceWithGeneric, generic.getParent());
}
use of spoon.reflect.visitor.filter.ReferenceTypeFilter in project spoon by INRIA.
the class ParentTest method testParentOfCtPackageReference.
@Test
public void testParentOfCtPackageReference() throws Exception {
// contract: a parent at a top level must be the root package and in the code, the element which call getParent().
final Launcher launcher = new Launcher();
launcher.setArgs(new String[] { "--output-type", "nooutput" });
launcher.getEnvironment().setNoClasspath(true);
launcher.addInputResource("./src/test/resources/reference-package");
launcher.run();
final CtType<Object> panini = launcher.getFactory().Type().get("Panini");
CtElement topLevelParent = panini.getPackage().getParent();
assertNotNull(topLevelParent);
assertEquals(CtPackage.TOP_LEVEL_PACKAGE_NAME, panini.getPackage().getSimpleName());
CtPackage pack1 = factory.Package().getRootPackage();
// the factory are not the same
assertNotEquals(factory, launcher.getFactory());
// so the root packages are not deeply equals
assertNotEquals(pack1, topLevelParent);
final CtTypeReference<?> burritos = panini.getElements(new ReferenceTypeFilter<CtTypeReference<?>>(CtTypeReference.class) {
@Override
public boolean matches(CtTypeReference<?> reference) {
return "Burritos".equals(reference.getSimpleName()) && super.matches(reference);
}
}).get(0);
assertNotNull(burritos.getPackage().getParent());
assertEquals("com.awesome", burritos.getPackage().getSimpleName());
assertEquals(burritos, burritos.getPackage().getParent());
}
use of spoon.reflect.visitor.filter.ReferenceTypeFilter in project spoon by INRIA.
the class GenericsTest method testConstructorCallGenerics.
@Test
public void testConstructorCallGenerics() throws Exception {
final Launcher launcher = new Launcher();
launcher.run(new String[] { "-i", "./src/test/java/spoon/test/generics/testclasses/", "-o", "./target/spooned/" });
final CtClass<?> aTacos = launcher.getFactory().Class().get(Tacos.class);
assertEquals(2, aTacos.getFormalCtTypeParameters().size());
final CtTypeReference interfaces = aTacos.getSuperInterfaces().toArray(new CtTypeReference[0])[0];
assertEquals(1, interfaces.getActualTypeArguments().size());
final CtMethod<?> m = aTacos.getMethodsByName("m").get(0);
final CtElement local1 = m.getBody().getStatement(0).getElements(new TypeFilter<>(CtLocalVariable.class)).get(0);
final CtTypeReference<Object> leftSideLocal1 = (CtTypeReference<Object>) local1.getElements(new ReferenceTypeFilter<>(CtTypeReference.class)).get(0);
final CtConstructorCall<Object> rightSideLocal1 = (CtConstructorCall<Object>) local1.getElements(new TypeFilter<>(CtConstructorCall.class)).get(0);
assertEquals(1, leftSideLocal1.getActualTypeArguments().size());
assertEquals(1, rightSideLocal1.getType().getActualTypeArguments().size());
assertEquals("java.util.List<java.lang.String> l = new java.util.ArrayList<>()", local1.toString());
final CtElement local2 = m.getBody().getStatement(1).getElements(new TypeFilter<>(CtLocalVariable.class)).get(0);
final CtTypeReference<Object> leftSideLocal2 = (CtTypeReference<Object>) local2.getElements(new ReferenceTypeFilter<>(CtTypeReference.class)).get(0);
assertEquals(0, leftSideLocal2.getActualTypeArguments().size());
assertEquals("java.util.List l2", local2.toString());
final CtElement local3 = m.getBody().getStatement(2).getElements(new TypeFilter<>(CtLocalVariable.class)).get(0);
final CtTypeReference<Object> leftSideLocal3 = (CtTypeReference<Object>) local3.getElements(new ReferenceTypeFilter<>(CtTypeReference.class)).get(0);
final CtConstructorCall<Object> rightSideLocal3 = (CtConstructorCall<Object>) local3.getElements(new TypeFilter<>(CtConstructorCall.class)).get(0);
assertEquals(2, leftSideLocal3.getActualTypeArguments().size());
assertEquals(2, rightSideLocal3.getType().getActualTypeArguments().size());
assertEquals("spoon.test.generics.testclasses.IBurritos<?, ?> burritos = new Burritos<>()", local3.toString());
final CtElement local4 = m.getBody().getStatement(3).getElements(new TypeFilter<>(CtLocalVariable.class)).get(0);
final CtTypeReference<Object> leftSideLocal4 = (CtTypeReference<Object>) local4.getElements(new ReferenceTypeFilter<>(CtTypeReference.class)).get(0);
final CtConstructorCall<Object> rightSideLocal4 = (CtConstructorCall<Object>) local4.getElements(new TypeFilter<>(CtConstructorCall.class)).get(0);
assertEquals(1, leftSideLocal4.getActualTypeArguments().size());
assertEquals(1, rightSideLocal4.getType().getActualTypeArguments().size());
assertEquals("java.util.List<?> l3 = new java.util.ArrayList<java.lang.Object>()", local4.toString());
final CtConstructorCall constructorCall1 = (CtConstructorCall) m.getBody().getStatement(4).getElements(new TypeFilter<>(CtConstructorCall.class)).get(0);
assertEquals(1, constructorCall1.getActualTypeArguments().size());
assertEquals(2, constructorCall1.getType().getActualTypeArguments().size());
assertEquals("new <java.lang.Integer>spoon.test.generics.testclasses.Tacos<java.lang.Object, java.lang.String>()", constructorCall1.toString());
final CtConstructorCall constructorCall2 = (CtConstructorCall) m.getBody().getStatement(5).getElements(new TypeFilter<>(CtConstructorCall.class)).get(0);
assertEquals(0, constructorCall2.getActualTypeArguments().size());
assertEquals(2, constructorCall2.getType().getActualTypeArguments().size());
assertEquals("new spoon.test.generics.testclasses.Tacos<>()", constructorCall2.toString());
canBeBuilt("./target/spooned/spoon/test/generics/testclasses/", 8);
}
use of spoon.reflect.visitor.filter.ReferenceTypeFilter in project spoon by INRIA.
the class TypeReferenceTest method loadReferencedClassFromClasspath.
@SuppressWarnings("rawtypes")
@Test
public void loadReferencedClassFromClasspath() throws Exception {
SpoonModelBuilder comp = new Launcher().createCompiler();
Factory factory = comp.getFactory();
String packageName = "spoon.test.reference";
String className = "ReferencingClass";
String qualifiedName = packageName + "." + className;
String referencedQualifiedName = packageName + "." + "ReferencedClass";
// we only create the model for ReferecingClass
List<SpoonResource> fileToBeSpooned = SpoonResourceHelper.resources("./src/test/resources/reference-test/input/" + qualifiedName.replace('.', '/') + ".java");
comp.addInputSources(fileToBeSpooned);
// for ReferecingClass
assertEquals(1, fileToBeSpooned.size());
// Spoon requires the binary version of ReferencedClass
List<SpoonResource> classpath = SpoonResourceHelper.resources("./src/test/resources/reference-test/ReferenceTest.jar");
String[] dependencyClasspath = new String[] { classpath.get(0).getPath() };
factory.getEnvironment().setSourceClasspath(dependencyClasspath);
assertEquals(1, classpath.size());
// now we can build the model
comp.build();
// we can get the model of ReferecingClass
CtType<?> theClass = factory.Type().get(qualifiedName);
// now we retrieve the reference to ReferencedClass
CtTypeReference referencedType = null;
ReferenceTypeFilter<CtTypeReference> referenceTypeFilter = new ReferenceTypeFilter<CtTypeReference>(CtTypeReference.class);
List<CtTypeReference> elements = Query.getElements(theClass, referenceTypeFilter);
for (CtTypeReference reference : elements) {
if (reference.getQualifiedName().equals(referencedQualifiedName)) {
referencedType = reference;
break;
}
}
assertFalse(referencedType == null);
// we can get the actual class from the reference, because it is loaded from the class path
Class referencedClass = referencedType.getActualClass();
assertEquals(referencedQualifiedName, referencedClass.getName());
}
use of spoon.reflect.visitor.filter.ReferenceTypeFilter in project spoon by INRIA.
the class ReplaceTest method testReplaceAPackageReferenceByAnotherOne.
@Test
public void testReplaceAPackageReferenceByAnotherOne() throws Exception {
// contract: replace a package reference of a reference to another package.
final Launcher launcher = new Launcher();
launcher.setArgs(new String[] { "--output-type", "nooutput" });
launcher.getEnvironment().setNoClasspath(true);
launcher.addInputResource("./src/test/resources/reference-package");
launcher.run();
final CtType<Object> panini = launcher.getFactory().Type().get("Panini");
final CtTypeReference<?> burritos = panini.getElements(new ReferenceTypeFilter<CtTypeReference<?>>(CtTypeReference.class) {
@Override
public boolean matches(CtTypeReference<?> reference) {
return "Burritos".equals(reference.getSimpleName()) && super.matches(reference);
}
}).get(0);
assertEquals("com.awesome", burritos.getPackage().toString());
assertEquals("com.awesome.Burritos", panini.getMethodsByName("m").get(0).getType().toString());
burritos.getPackage().replace(launcher.getFactory().Package().createReference("com.best"));
assertEquals("com.best", burritos.getPackage().toString());
assertEquals("com.best.Burritos", panini.getMethodsByName("m").get(0).getType().toString());
}
Aggregations