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()); } }