groovy-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Paul King <pa...@asert.com.au>
Subject Re: Groovy 2.5 @Macro ?
Date Sun, 27 May 2018 01:21:22 GMT
Macro expansion is done early (CONVERSION) and it expects to find the
method it
will be expanding into available on the classpath at that point.

It is pretty much the same reasons as for extension modules:
http://groovy-lang.org/metaprogramming.html#_extension_modules_and_classpath



On Sun, May 27, 2018 at 10:02 AM, mg <mgbiz@arscreat.com> wrote:

> Hi Paul,
>
> why this restriction ? I thought this feature was here to e.g. simply
> support logging of the form "$variableExpression.name=$variableExpression.value",
> etc:
>
> https://github.com/bsideup/macro-methods-workshop/blob/
> master/src/test/groovy/com/example/SuperLoggerMacroTest.groovy
>
> ?
>
> Cheers,
> mg
>
>
> -------- Urspr√ľngliche Nachricht --------
> Von: Paul King <paulk@asert.com.au>
> Datum: 27.05.18 01:50 (GMT+01:00)
> An: dev@groovy.apache.org
> Betreff: Re: Groovy 2.5 @Macro ?
>
> Your best bet is to have the macro class and META-INF/services file under
> src/main and your usage under src/test.
> If you want to do it all in one file, you can create a temp directory,
> stuff the META-INF/services file in it, add that directory
> to the classpath dynamically and then run your code using the macro with a
> new GroovyShell().
>
> On Sun, May 27, 2018 at 1:15 AM, MG <mgbiz@arscreat.com> wrote:
>
>> I would have expected a quick "you can't use it like that / you just have
>> to / here is some documentation" reply...
>> Then let me rephrase my question: Why are these Groovy 2.5 tests green:
>> https://github.com/apache/groovy/blob/GROOVY_2_5_X/subprojec
>> ts/groovy-macro/src/test/groovy/org/codehaus/groovy/
>> macro/MacroTransformationTest.groovy
>> ?
>> Cheers,
>> mg
>>
>>
>> On 26.05.2018 00:00, MG wrote:
>>
>> Hi guys,
>>
>> giving the new Groovy 2.5 macro functionality a spin, and would have
>> expected the code below to replace the "call" to nv(x) with the AST
>> expression created in the method, i.e. returning the name of the "passed"
>> variable. Instead no macro magic happens, and the compilation accordingly
>> fails with "groovy.lang.MissingMethodException: No signature of method:
>> groovy.GroovyMacroSpike.nv() is applicable for argument types: (Integer)
>> values: [123]":
>>
>> import org.codehaus.groovy.ast.expr.Expressionimport org.codehaus.groovy.ast.expr.VariableExpressionimport
org.codehaus.groovy.macro.runtime.Macroimport org.codehaus.groovy.macro.runtime.MacroContextimport
org.junit.Ignoreimport org.junit.Testimport static org.codehaus.groovy.ast.tools.GeneralUtils.constX
>> class GroovyMacroSpike {
>>   @Test  @Ignore  void nvTest() {
>>     final x = 123    assert x == 123    assert nv(x) == "x"  }
>>
>>   @Macro  Expression nv(MacroContext ctx, VariableExpression variable) {
>>     return constX(variable.getName());
>>   }
>> }
>>
>> What is missing to make this work ?
>> mg
>>
>>
>>
>>
>

Mime
View raw message