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)