From 1a4d23d02146c7b99ff6a489074034e39c376bf4 Mon Sep 17 00:00:00 2001
From: Pavel Vojtechovsky
Date: Sun, 28 May 2017 22:15:34 +0200
Subject: [PATCH 1/3] fix Template substitute invocation method name
---
.../support/template/SubstitutionVisitor.java | 17 +++++++++++++----
1 file changed, 13 insertions(+), 4 deletions(-)
diff --git a/src/main/java/spoon/support/template/SubstitutionVisitor.java b/src/main/java/spoon/support/template/SubstitutionVisitor.java
index 2d04b06011d..60f0da47dcc 100644
--- a/src/main/java/spoon/support/template/SubstitutionVisitor.java
+++ b/src/main/java/spoon/support/template/SubstitutionVisitor.java
@@ -47,6 +47,7 @@
import spoon.reflect.reference.CtArrayTypeReference;
import spoon.reflect.reference.CtExecutableReference;
import spoon.reflect.reference.CtFieldReference;
+import spoon.reflect.reference.CtReference;
import spoon.reflect.reference.CtTypeReference;
import spoon.reflect.visitor.CtInheritanceScanner;
import spoon.reflect.visitor.CtScanner;
@@ -131,22 +132,30 @@ public void scanCtNamedElement(CtNamedElement element) {
element.setDocComment(substituteInDocComment(element.getDocComment()));
}
// replace parameters in names
- String name = element.getSimpleName();
+ element.setSimpleName(substituteName(element.getSimpleName(), element));
+ super.scanCtNamedElement(element);
+ }
+
+ @Override
+ public void scanCtReference(CtReference reference) {
+ reference.setSimpleName(substituteName(reference.getSimpleName(), reference));
+ super.scanCtReference(reference);
+ }
+
+ private String substituteName(String name, CtElement element) {
for (String pname : parameterNames) {
if (name.contains(pname)) {
Object value = Parameters.getValue(template, pname, null);
if (value instanceof String) {
// replace with the string value
name = name.replace(pname, (String) value);
- element.setSimpleName(name);
} else if ((value instanceof CtTypeReference) && (element instanceof CtType)) {
// replace with the type reference's name
name = name.replace(pname, ((CtTypeReference>) value).getSimpleName());
- element.setSimpleName(name);
}
}
}
- super.scanCtNamedElement(element);
+ return name;
}
private String substituteInDocComment(String docComment) {
From 2f06ed4cb27ad9f1b5411bed0cc067a84bc332cc Mon Sep 17 00:00:00 2001
From: Pavel Vojtechovsky
Date: Sun, 28 May 2017 22:24:51 +0200
Subject: [PATCH 2/3] test template substitution of invocation
---
.../test/template/InvocationTemplate.java | 34 +++++++++++++++++++
.../spoon/test/template/TemplateTest.java | 14 ++++++++
2 files changed, 48 insertions(+)
create mode 100644 src/test/java/spoon/test/template/InvocationTemplate.java
diff --git a/src/test/java/spoon/test/template/InvocationTemplate.java b/src/test/java/spoon/test/template/InvocationTemplate.java
new file mode 100644
index 00000000000..64f27dba80a
--- /dev/null
+++ b/src/test/java/spoon/test/template/InvocationTemplate.java
@@ -0,0 +1,34 @@
+package spoon.test.template;
+
+import spoon.reflect.reference.CtTypeReference;
+import spoon.template.ExtensionTemplate;
+import spoon.template.Local;
+import spoon.template.Parameter;
+
+public class InvocationTemplate extends ExtensionTemplate {
+
+ IFace iface;
+
+ void invoke() {
+ iface.$method$();
+ }
+
+ @Local
+ public InvocationTemplate(CtTypeReference> ifaceType, String methodName) {
+ this.ifaceType = ifaceType;
+ this.methodName = methodName;
+ }
+
+ @Parameter("IFace")
+ CtTypeReference> ifaceType;
+
+ @Parameter("$method$")
+ String methodName;
+
+
+
+ @Local
+ interface IFace {
+ void $method$();
+ }
+}
diff --git a/src/test/java/spoon/test/template/TemplateTest.java b/src/test/java/spoon/test/template/TemplateTest.java
index a8ba53e4581..019aaa05904 100644
--- a/src/test/java/spoon/test/template/TemplateTest.java
+++ b/src/test/java/spoon/test/template/TemplateTest.java
@@ -436,4 +436,18 @@ public void testTemplateMatcherMatchTwoSnippets() throws Exception {
assertTrue(match1.equals(match2));
}
+ @Test
+ public void testTemplateInvocationSubstitution() throws Exception {
+ Launcher spoon = new Launcher();
+ spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/InvocationTemplate.java"));
+
+ spoon.buildModel();
+ Factory factory = spoon.getFactory();
+
+ CtClass> resultKlass = factory.Class().create("Result");
+ new InvocationTemplate(factory.Type().OBJECT, "hashCode").apply(resultKlass);
+ CtMethod> templateMethod = (CtMethod>) resultKlass.getElements(new NameFilter("invoke")).get(0);
+ CtStatement templateRoot = (CtStatement) templateMethod.getBody().getStatement(0);
+ assertEquals("iface.hashCode()", templateRoot.toString());
+ }
}
From 5ae91b58b59e9bf0b88a8e7797ae43f39a74391b Mon Sep 17 00:00:00 2001
From: Pavel Vojtechovsky
Date: Mon, 29 May 2017 12:46:36 +0200
Subject: [PATCH 3/3] added proposed comments
---
src/test/java/spoon/test/template/TemplateTest.java | 2 ++
1 file changed, 2 insertions(+)
diff --git a/src/test/java/spoon/test/template/TemplateTest.java b/src/test/java/spoon/test/template/TemplateTest.java
index 019aaa05904..97080a22bb5 100644
--- a/src/test/java/spoon/test/template/TemplateTest.java
+++ b/src/test/java/spoon/test/template/TemplateTest.java
@@ -438,6 +438,7 @@ public void testTemplateMatcherMatchTwoSnippets() throws Exception {
}
@Test
public void testTemplateInvocationSubstitution() throws Exception {
+ //contract: the template engine supports substitution of method names in method calls.
Launcher spoon = new Launcher();
spoon.addTemplateResource(new FileSystemFile("./src/test/java/spoon/test/template/InvocationTemplate.java"));
@@ -448,6 +449,7 @@ public void testTemplateInvocationSubstitution() throws Exception {
new InvocationTemplate(factory.Type().OBJECT, "hashCode").apply(resultKlass);
CtMethod> templateMethod = (CtMethod>) resultKlass.getElements(new NameFilter("invoke")).get(0);
CtStatement templateRoot = (CtStatement) templateMethod.getBody().getStatement(0);
+ //iface.$method$() becomes iface.hashCode()
assertEquals("iface.hashCode()", templateRoot.toString());
}
}