Search in sources :

Example 1 with ReferenceTypeFilter

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());
}
Also used : CtTypeReference(spoon.reflect.reference.CtTypeReference) Factory(spoon.reflect.factory.Factory) ReferenceTypeFilter(spoon.reflect.visitor.filter.ReferenceTypeFilter) Test(org.junit.Test)

Example 2 with ReferenceTypeFilter

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());
}
Also used : CtElement(spoon.reflect.declaration.CtElement) CtTypeReference(spoon.reflect.reference.CtTypeReference) Launcher(spoon.Launcher) ReferenceTypeFilter(spoon.reflect.visitor.filter.ReferenceTypeFilter) CtPackage(spoon.reflect.declaration.CtPackage) Test(org.junit.Test)

Example 3 with ReferenceTypeFilter

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);
}
Also used : CtConstructorCall(spoon.reflect.code.CtConstructorCall) CtTypeReference(spoon.reflect.reference.CtTypeReference) CtElement(spoon.reflect.declaration.CtElement) Launcher(spoon.Launcher) TypeFilter(spoon.reflect.visitor.filter.TypeFilter) ReferenceTypeFilter(spoon.reflect.visitor.filter.ReferenceTypeFilter) MainTest(spoon.test.main.MainTest) Test(org.junit.Test)

Example 4 with ReferenceTypeFilter

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());
}
Also used : SpoonModelBuilder(spoon.SpoonModelBuilder) ModelUtils.createFactory(spoon.testing.utils.ModelUtils.createFactory) Factory(spoon.reflect.factory.Factory) CtTypeReference(spoon.reflect.reference.CtTypeReference) Launcher(spoon.Launcher) ReferenceTypeFilter(spoon.reflect.visitor.filter.ReferenceTypeFilter) ModelUtils.buildClass(spoon.testing.utils.ModelUtils.buildClass) CtNewClass(spoon.reflect.code.CtNewClass) CtClass(spoon.reflect.declaration.CtClass) SpoonResource(spoon.compiler.SpoonResource) Test(org.junit.Test)

Example 5 with ReferenceTypeFilter

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());
}
Also used : CtTypeReference(spoon.reflect.reference.CtTypeReference) Launcher(spoon.Launcher) ReferenceTypeFilter(spoon.reflect.visitor.filter.ReferenceTypeFilter) Test(org.junit.Test)

Aggregations

Test (org.junit.Test)5 CtTypeReference (spoon.reflect.reference.CtTypeReference)5 ReferenceTypeFilter (spoon.reflect.visitor.filter.ReferenceTypeFilter)5 Launcher (spoon.Launcher)4 CtElement (spoon.reflect.declaration.CtElement)2 Factory (spoon.reflect.factory.Factory)2 SpoonModelBuilder (spoon.SpoonModelBuilder)1 SpoonResource (spoon.compiler.SpoonResource)1 CtConstructorCall (spoon.reflect.code.CtConstructorCall)1 CtNewClass (spoon.reflect.code.CtNewClass)1 CtClass (spoon.reflect.declaration.CtClass)1 CtPackage (spoon.reflect.declaration.CtPackage)1 TypeFilter (spoon.reflect.visitor.filter.TypeFilter)1 MainTest (spoon.test.main.MainTest)1 ModelUtils.buildClass (spoon.testing.utils.ModelUtils.buildClass)1 ModelUtils.createFactory (spoon.testing.utils.ModelUtils.createFactory)1