From 8b0b76a3637a820d72ba8fcea36cc4481ebe1195 Mon Sep 17 00:00:00 2001 From: Pavel Vojtechovsky Date: Wed, 6 Dec 2017 19:50:47 +0100 Subject: [PATCH 1/2] feature: Factory#createQuery(Iterable) --- src/main/java/spoon/reflect/factory/Factory.java | 5 +++++ src/main/java/spoon/reflect/factory/FactoryImpl.java | 5 +++++ src/main/java/spoon/reflect/factory/QueryFactory.java | 9 +++++++++ .../java/spoon/reflect/visitor/chain/CtQueryImpl.java | 11 +++++++++++ src/test/java/spoon/test/filters/FilterTest.java | 8 ++++---- 5 files changed, 34 insertions(+), 4 deletions(-) diff --git a/src/main/java/spoon/reflect/factory/Factory.java b/src/main/java/spoon/reflect/factory/Factory.java index 37dd0f60dfb..977d600fe49 100644 --- a/src/main/java/spoon/reflect/factory/Factory.java +++ b/src/main/java/spoon/reflect/factory/Factory.java @@ -800,6 +800,11 @@ public interface Factory { */ CtQuery createQuery(Object... input); + /** + * @see QueryFactory#createQuery(Iterable) + */ + CtQuery createQuery(Iterable input); + /** * * @see AnnotationFactory#create(String) diff --git a/src/main/java/spoon/reflect/factory/FactoryImpl.java b/src/main/java/spoon/reflect/factory/FactoryImpl.java index f7560971187..9732a0fc548 100644 --- a/src/main/java/spoon/reflect/factory/FactoryImpl.java +++ b/src/main/java/spoon/reflect/factory/FactoryImpl.java @@ -1083,6 +1083,11 @@ public CtQuery createQuery(Object[] input) { return Query().createQuery(input); } + @Override + public CtQuery createQuery(Iterable input) { + return Query().createQuery(input); + } + @Override public CtAnnotationType createAnnotationType(String qualifiedName) { return Annotation().create(qualifiedName); diff --git a/src/main/java/spoon/reflect/factory/QueryFactory.java b/src/main/java/spoon/reflect/factory/QueryFactory.java index 3773b38bbc1..b95df36d434 100644 --- a/src/main/java/spoon/reflect/factory/QueryFactory.java +++ b/src/main/java/spoon/reflect/factory/QueryFactory.java @@ -49,6 +49,15 @@ public CtQuery createQuery(Object input) { return new CtQueryImpl(input); } + /** + * Creates a bound query. Use directly + * {@link CtQuery#forEach(spoon.reflect.visitor.chain.CtConsumer)} + * or {@link CtQuery#list()} to evaluate the query + */ + public CtQuery createQuery(Iterable inputs) { + return new CtQueryImpl().addInput(inputs); + } + /** * Creates a bound query with an optional number * of inputs elements to the query (see {@link CtQuery#setInput(Object...)}) diff --git a/src/main/java/spoon/reflect/visitor/chain/CtQueryImpl.java b/src/main/java/spoon/reflect/visitor/chain/CtQueryImpl.java index 197c643e8cc..df8c3891630 100644 --- a/src/main/java/spoon/reflect/visitor/chain/CtQueryImpl.java +++ b/src/main/java/spoon/reflect/visitor/chain/CtQueryImpl.java @@ -86,6 +86,17 @@ public CtQueryImpl addInput(Object... input) { } return this; } + public CtQueryImpl addInput(Iterable input) { + if (this.inputs == null) { + this.inputs = new ArrayList<>(); + } + if (input != null) { + for (Object in : input) { + this.inputs.add(in); + } + } + return this; + } @Override public void forEach(CtConsumer consumer) { diff --git a/src/test/java/spoon/test/filters/FilterTest.java b/src/test/java/spoon/test/filters/FilterTest.java index afc586ecd77..865f805be2d 100644 --- a/src/test/java/spoon/test/filters/FilterTest.java +++ b/src/test/java/spoon/test/filters/FilterTest.java @@ -865,16 +865,16 @@ public void testEmptyQuery() throws Exception { //contract: empty query returns no element assertEquals(0, launcher.getFactory().createQuery().list().size()); - assertEquals(0, launcher.getFactory().createQuery(null).list().size()); + assertEquals(0, launcher.getFactory().createQuery((Object) null).list().size()); //contract: empty query returns no element launcher.getFactory().createQuery().forEach(x->fail()); - launcher.getFactory().createQuery(null).forEach(x->fail()); + launcher.getFactory().createQuery((Object) null).forEach(x->fail()); //contract: empty query calls no mapping assertEquals(0, launcher.getFactory().createQuery().map(x->{fail();return true;}).list().size()); - assertEquals(0, launcher.getFactory().createQuery(null).map(x->{fail();return true;}).list().size()); + assertEquals(0, launcher.getFactory().createQuery((Object) null).map(x->{fail();return true;}).list().size()); //contract: empty query calls no filterChildren assertEquals(0, launcher.getFactory().createQuery().filterChildren(x->{fail();return true;}).list().size()); - assertEquals(0, launcher.getFactory().createQuery(null).filterChildren(x->{fail();return true;}).list().size()); + assertEquals(0, launcher.getFactory().createQuery((Object) null).filterChildren(x->{fail();return true;}).list().size()); } @Test From 85fba34b177cda99ce9171d9284cb9d5dc49ce40 Mon Sep 17 00:00:00 2001 From: Pavel Vojtechovsky Date: Wed, 6 Dec 2017 20:52:47 +0100 Subject: [PATCH 2/2] test --- src/test/java/spoon/test/filters/FilterTest.java | 9 ++++++++- 1 file changed, 8 insertions(+), 1 deletion(-) diff --git a/src/test/java/spoon/test/filters/FilterTest.java b/src/test/java/spoon/test/filters/FilterTest.java index 865f805be2d..9bf402bf7c6 100644 --- a/src/test/java/spoon/test/filters/FilterTest.java +++ b/src/test/java/spoon/test/filters/FilterTest.java @@ -756,6 +756,7 @@ public void testReuseOfBaseQuery() throws Exception { @Test public void testQueryWithOptionalNumberOfInputs() throws Exception { // contract: QueryFactory allows to create query with an optional number of inputs + // the input can be provided as Array or Iterable final Launcher launcher = new Launcher(); launcher.setArgs(new String[] {"--output-type", "nooutput","--level","info" }); launcher.addInputResource("./src/test/java/spoon/test/filters/testclasses"); @@ -768,13 +769,19 @@ public void testQueryWithOptionalNumberOfInputs() throws Exception { // here is the query CtQuery q1 = launcher.getFactory().Query().createQuery(cls, cls2).map((CtClass c) -> c.getSimpleName()); assertArrayEquals(new String[]{"Tacos", "Tostada"}, q1.list().toArray()); + CtQuery q1b = launcher.getFactory().Query().createQuery(Arrays.asList(cls, cls2)).map((CtClass c) -> c.getSimpleName()); + assertArrayEquals(new String[]{"Tacos", "Tostada"}, q1b.list().toArray()); CtQuery q2 = launcher.getFactory().Query().createQuery(cls, cls3).map((CtClass c) -> c.getSimpleName()); assertArrayEquals(new String[]{"Tacos", "Antojito"}, q2.list().toArray()); + CtQuery q2b = launcher.getFactory().Query().createQuery(Arrays.asList(cls, cls3)).map((CtClass c) -> c.getSimpleName()); + assertArrayEquals(new String[]{"Tacos", "Antojito"}, q2b.list().toArray()); CtQuery q3 = launcher.getFactory().Query().createQuery(cls, cls2, cls3).map((CtClass c) -> c.getSimpleName()); assertArrayEquals(new String[]{"Tacos", "Tostada", "Antojito"}, q3.list().toArray()); - } + CtQuery q3b = launcher.getFactory().Query().createQuery(Arrays.asList(cls, cls2, cls3)).map((CtClass c) -> c.getSimpleName()); + assertArrayEquals(new String[]{"Tacos", "Tostada", "Antojito"}, q3b.list().toArray()); +} // now testing map(CtConsumableFunction)