Groovy 2.5 @Macro ?

classic Classic list List threaded Threaded
15 messages Options
12
MG
Reply | Threaded
Open this post in threaded view
|

Groovy 2.5 @Macro ?

MG
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.Expression
import org.codehaus.groovy.ast.expr.VariableExpression
import org.codehaus.groovy.macro.runtime.Macro
import org.codehaus.groovy.macro.runtime.MacroContext
import org.junit.Ignore
import org.junit.Test

import 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


MG
Reply | Threaded
Open this post in threaded view
|

Re: Groovy 2.5 @Macro ?

MG
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/subprojects/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.Expression
import org.codehaus.groovy.ast.expr.VariableExpression
import org.codehaus.groovy.macro.runtime.Macro
import org.codehaus.groovy.macro.runtime.MacroContext
import org.junit.Ignore
import org.junit.Test

import 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



Reply | Threaded
Open this post in threaded view
|

Re: Groovy 2.5 @Macro ?

Cédric Champeau
I didn't check, but I _think_ you can't define a macro and use it in the same file.

Le sam. 26 mai 2018 à 17:15, MG <[hidden email]> a écrit :
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/subprojects/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.Expression
import org.codehaus.groovy.ast.expr.VariableExpression
import org.codehaus.groovy.macro.runtime.Macro
import org.codehaus.groovy.macro.runtime.MacroContext
import org.junit.Ignore
import org.junit.Test

import 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



MG
Reply | Threaded
Open this post in threaded view
|

Re: Groovy 2.5 @Macro ?

MG
Hi Cedric,

thank you for replying. I did try having the @Macro annotated in a (static) method in a seperate class first, then moved it closer to the test. I posted that  for brevity, and since I was banking on the author of the feature to set me straight...

The release notes (http://groovy-lang.org/releasenotes/groovy-2.5.html) currently have the following to say on the topic:

Macro support

With Groovy 2.5, you can write macros in Groovy!

Expressions and statements

TBD

Macro classes

TBD

AST matching

TBD


-------- Ursprüngliche Nachricht --------
Von: Cédric Champeau <[hidden email]>
Datum: 26.05.18 18:12 (GMT+01:00)
Betreff: Re: Groovy 2.5 @Macro ?

I didn't check, but I _think_ you can't define a macro and use it in the same file.

Le sam. 26 mai 2018 à 17:15, MG <[hidden email]> a écrit :
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/subprojects/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.Expression
import org.codehaus.groovy.ast.expr.VariableExpression
import org.codehaus.groovy.macro.runtime.Macro
import org.codehaus.groovy.macro.runtime.MacroContext
import org.junit.Ignore
import org.junit.Test

import 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



Reply | Threaded
Open this post in threaded view
|

Re: Groovy 2.5 @Macro ?

Guillaume Laforge
Administrator
In reply to this post by Cédric Champeau

On Sat, May 26, 2018 at 7:04 PM mg <[hidden email]> wrote:
Hi Cedric,

thank you for replying. I did try having the @Macro annotated in a (static) method in a seperate class first, then moved it closer to the test. I posted that  for brevity, and since I was banking on the author of the feature to set me straight...

The release notes (http://groovy-lang.org/releasenotes/groovy-2.5.html) currently have the following to say on the topic:

Macro support

With Groovy 2.5, you can write macros in Groovy!

Expressions and statements

TBD

Macro classes

TBD

AST matching

TBD


-------- Ursprüngliche Nachricht --------
Von: Cédric Champeau <[hidden email]>
Datum: 26.05.18 18:12 (GMT+01:00)
Betreff: Re: Groovy 2.5 @Macro ?

I didn't check, but I _think_ you can't define a macro and use it in the same file.

Le sam. 26 mai 2018 à 17:15, MG <[hidden email]> a écrit :
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/subprojects/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.Expression
import org.codehaus.groovy.ast.expr.VariableExpression
import org.codehaus.groovy.macro.runtime.Macro
import org.codehaus.groovy.macro.runtime.MacroContext
import org.junit.Ignore
import org.junit.Test

import 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





--
Guillaume Laforge
Apache Groovy committer & PMC Vice-President
Developer Advocate @ Google Cloud Platform

Reply | Threaded
Open this post in threaded view
|

Re: Groovy 2.5 @Macro ?

paulk_asert
In reply to this post by MG
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 <[hidden email]> 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/subprojects/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.Expression
import org.codehaus.groovy.ast.expr.VariableExpression
import org.codehaus.groovy.macro.runtime.Macro
import org.codehaus.groovy.macro.runtime.MacroContext
import org.junit.Ignore
import org.junit.Test

import 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




MG
Reply | Threaded
Open this post in threaded view
|

Re: Groovy 2.5 @Macro ?

MG
In reply to this post by Guillaume Laforge
Hi Guillaume,

yes, there seems to be nothing on @Macro.

Cheers,
mg

-------- Ursprüngliche Nachricht --------
Von: Guillaume Laforge <[hidden email]>
Datum: 26.05.18 21:15 (GMT+01:00)
Betreff: Re: Groovy 2.5 @Macro ?


On Sat, May 26, 2018 at 7:04 PM mg <[hidden email]> wrote:
Hi Cedric,

thank you for replying. I did try having the @Macro annotated in a (static) method in a seperate class first, then moved it closer to the test. I posted that  for brevity, and since I was banking on the author of the feature to set me straight...

The release notes (http://groovy-lang.org/releasenotes/groovy-2.5.html) currently have the following to say on the topic:

Macro support

With Groovy 2.5, you can write macros in Groovy!

Expressions and statements

TBD

Macro classes

TBD

AST matching

TBD


-------- Ursprüngliche Nachricht --------
Von: Cédric Champeau <[hidden email]>
Datum: 26.05.18 18:12 (GMT+01:00)
Betreff: Re: Groovy 2.5 @Macro ?

I didn't check, but I _think_ you can't define a macro and use it in the same file.

Le sam. 26 mai 2018 à 17:15, MG <[hidden email]> a écrit :
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/subprojects/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.Expression
import org.codehaus.groovy.ast.expr.VariableExpression
import org.codehaus.groovy.macro.runtime.Macro
import org.codehaus.groovy.macro.runtime.MacroContext
import org.junit.Ignore
import org.junit.Test

import 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





--
Guillaume Laforge
Apache Groovy committer & PMC Vice-President
Developer Advocate @ Google Cloud Platform

MG
Reply | Threaded
Open this post in threaded view
|

Re: Groovy 2.5 @Macro ?

MG
In reply to this post by paulk_asert
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 <[hidden email]>
Datum: 27.05.18 01:50 (GMT+01:00)
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 <[hidden email]> 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/subprojects/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.Expression
import org.codehaus.groovy.ast.expr.VariableExpression
import org.codehaus.groovy.macro.runtime.Macro
import org.codehaus.groovy.macro.runtime.MacroContext
import org.junit.Ignore
import org.junit.Test

import 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




Reply | Threaded
Open this post in threaded view
|

Re: Groovy 2.5 @Macro ?

paulk_asert
In reply to this post by Guillaume Laforge
I'll try to add in some basic information. I didn't realise that wasn't covered at all.

On Sun, May 27, 2018 at 9:55 AM, mg <[hidden email]> wrote:
Hi Guillaume,

yes, there seems to be nothing on @Macro.

Cheers,
mg

-------- Ursprüngliche Nachricht --------
Von: Guillaume Laforge <[hidden email]>
Datum: 26.05.18 21:15 (GMT+01:00)
Betreff: Re: Groovy 2.5 @Macro ?


On Sat, May 26, 2018 at 7:04 PM mg <[hidden email]> wrote:
Hi Cedric,

thank you for replying. I did try having the @Macro annotated in a (static) method in a seperate class first, then moved it closer to the test. I posted that  for brevity, and since I was banking on the author of the feature to set me straight...

The release notes (http://groovy-lang.org/releasenotes/groovy-2.5.html) currently have the following to say on the topic:

Macro support

With Groovy 2.5, you can write macros in Groovy!

Expressions and statements

TBD

Macro classes

TBD

AST matching

TBD


-------- Ursprüngliche Nachricht --------
Von: Cédric Champeau <[hidden email]>
Datum: 26.05.18 18:12 (GMT+01:00)
Betreff: Re: Groovy 2.5 @Macro ?

I didn't check, but I _think_ you can't define a macro and use it in the same file.

Le sam. 26 mai 2018 à 17:15, MG <[hidden email]> a écrit :
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/subprojects/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.Expression
import org.codehaus.groovy.ast.expr.VariableExpression
import org.codehaus.groovy.macro.runtime.Macro
import org.codehaus.groovy.macro.runtime.MacroContext
import org.junit.Ignore
import org.junit.Test

import 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





--
Guillaume Laforge
Apache Groovy committer & PMC Vice-President
Developer Advocate @ Google Cloud Platform


Reply | Threaded
Open this post in threaded view
|

Re: Groovy 2.5 @Macro ?

paulk_asert
In reply to this post by paulk_asert

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 <[hidden email]> 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:


?

Cheers,
mg


-------- Ursprüngliche Nachricht --------
Von: Paul King <[hidden email]>
Datum: 27.05.18 01:50 (GMT+01:00)
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 <[hidden email]> 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/subprojects/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.Expression
import org.codehaus.groovy.ast.expr.VariableExpression
import org.codehaus.groovy.macro.runtime.Macro
import org.codehaus.groovy.macro.runtime.MacroContext
import org.junit.Ignore
import org.junit.Test

import 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





12