What’s new in Groovy & Grails Support?
DSL Support in Groovy-Eclipse
Andrew Eisenberg, SpringSource Tools Team




                                            © 2011 SpringSource, A division of VMware. All rights reserved
What’s new in Groovy & Grails Support?

Part 1




                                 © 2011 SpringSource, A division of VMware. All rights reserved
New Groovy-Eclipse Support in 2.5.0

  DSL Descriptors (discussed later)
  Groovy 1.8
  Parameter guessing content assist
  Script outline view
  Distinguish read vs. write access in search
  Conditional breakpoints in Groovy files (STS only)




                                                        3
New Grails tooling support in STS 2.7.0.M1

  Service field content assist
  Groovy search results in GSPs




                                             4
Gradle support in STS

Part 1.5




                        © 2011 SpringSource, A division of VMware. All rights reserved
First cut at Gradle support now available in STS

  Demoed this morning in the Gradle talk
  Yay!




                                                   6
DSL Support in Groovy-Eclipse

Part 2




                                © 2011 SpringSource, A division of VMware. All rights reserved
The Problem




              8
A DSL for distance calculations




                  3.m + 2.yd + 2.mi - 1.km
       In the Groovy editor:




                                  Uh oh!


      Can we do better???
                                             9
The Solution:
DSL Descriptors (DSLDs)




                          10
DSL Descriptors

  Teach the IDE about DSLs through scripting




                               CONFIDENTIAL     11
DSL Descriptors

  In English:
  •  “Any subtype of Number should have the following properties: m, yd, mi, km”
  In DSLD:
  •  “Any subtype of Number”:
      currentType( subType( Number ) )!
  •  “…the following properties…”:
       [ “m”, “yd”, “cm”, “mi”, “km” ].each {!
            property name:it, type:"Distance”!
       }!




               3.m + 2.yd + 2.mi - 1.km

                                                                                   12
Let’s see that

  Ex 1: Distances




                     13
Anatomy of a DSLD file




                         14
DSLD and the Inferencing Engine
  Hooks into Groovy-Eclipse’s type inferencing engine
 •  Visit each expression AST node
 •  Determine type using previous expression
 •  Move to next expression
  DSLD operates on Groovy AST Expression nodes
 •  Exposes Groovy AST nodes and uses Groovy API
  In the background, while typing (reconciling)
              org.codehaus.groovy.ast.expr.Expression!




                                                         15
Pointcuts and Contribution blocks
  Pointcuts:
  •  Where to do it.
  •  What is the current expression?
  •  Declaring type?                             class Other {!
  •  Enclosing class?                               def x!
                                                 }!
  Contribution blocks:                          class Foo {!
  •  What to do                                     def method() {!
  •  “Add” method                                      new Other().x!
  •  “Add” property                                 }!
                                                 }!
       •  (not at runtime, in the editor only)




                                                                        16
What goes in a Contribution Block?

  property : “adds” a property                  (…).accept {!
 •  arguments                                       property name: “myName”!
   •  name: “blarb”                                 method name: “getMyName”!
                                                 }!
   •  type: “java.lang.String”
   •  declaringType :”com.foo.Frumble”
   •  isStatic: false
   •  doc: “Some html”
   •  provider: “My DSL”
  method : “adds” a method
 •  all arguments above, and
   •  params: [firstName:“java.lang.String”, lastName:“java.lang.String”]
   •  useNamedArgs: true


  name is required, others optional

                                                                            17
Pointcuts

  currentType() : Matches on the current declaring type
  enclosingClass() : Matches on the enclosing class
  currentType(“com.bar.Foo”)
  methods(“run”)
  annotatedBy(“org.junit.runner.RunWith”)
  enclosingClass(
  annotatedBy(“org.junit.runner.RunWith”) ) &
 currentType(methods(“run”) )




                                                           18
Where does this pointcut match? What does it add?
(enclosingClass(annotatedBy(“org.junit.runner.RunWith”)) & 

currentType(methods(“run”))).accept { property name:”blarb” }!

                                       Looking for an expression that:
@RunWith(Sumthin) !
class Foo {!
   def someTest() {!                         enclosed by
                                             @RunWith
      print “Hello”!
      def x = new MyRunner()!
      x.blarb!                                          has run method
   }!
                                                blarb
}!
 class MyRunner { def run() {…} }!




                                                                    19
Wait…isn’t this Aspect-Oriented Programming?

  Pointcut
  •  Intentionally borrowed from AOP
  AspectJ: pointcuts and advice
  •  operates on Java instructions at runtime
                                                               class Foo {!
  DSLD: pointcuts and contribution blocks                       def x = {!
  •  operates on AST                                               def i = 0!
   org.codehaus.groovy.ast.expr.*!
  Join Point Model                                                      i++!
                                                                    }!
  •  Join points (e.g., instructions, expressions)
                                                               }!
  •  Mechanism for quantifying join points (e.g., pointcuts)
  •  Means of affect at a join point (e.g., advice,
   contribution blocks)




                                                                                20
Other things to help with DSLDs




                                  21
New DSLD Wizard

  File  New  Groovy DSL Descriptor




                                        22
DSLD Preferences Page




                        23
Groovy Event Console

  Keep this open while implementing DSLDs:
 •  Shows exceptions
 •  Pointcuts
 •  Matches




  Find the Console here:




                                              24
Groovy AST Viewer

  Exploration of AST of current Groovy file




                                               25
Examples




           26
Basic Script
Ex 2: Using the DSLD wizard




                              27
Meta DSL
Ex 3: DSLD script for editing DSLDs




                                      28
AST Transforms
Ex 3: Standard AST Transforms




                                29
SwingBuilder
Ex 4: Long script, but simple to understand




                                              30
Grails Constraints DSL
Ex 5: encapsulate Grails domain knowledge in a script




                                                        31
Criteria Queries
Ex 6: simple script, large effect




                                    32
Griffon
Ex 7: from last night




                        33
What’s next?




               34
DSLD is not complete

  Guided by user feedback
  Collaboration with library developers
 •  Grails, Gaelyk, Griffon, etc.
  Release standard DSLDs (AST Transforms, Builders, etc.)
 •  With Groovy-Eclipse?
 •  With Groovy core?
  More pointcuts
 •  What do users need that isn’t implemented?
 •  regex(), instanceof(), superType(), enclosingEnum(), etc.
  What about IntelliJ’s GDSL?




                                                                35
Thanks!

  More information:
  •  Google: groovy eclipse dsld
  Full documentation on Codehaus.org:
  •  http://docs.codehaus.org/display/GROOVY/DSL+Descriptors+for+Groovy-Eclipse
  Install from update site:
  •  http://dist.codehaus.org/groovy/distributions/greclipse/snapshot/e3.6/
  Mailing list:
  •  eclipse-plugin-users@codehaus.org
  Or chat with me whenever




                                                                                  36

Better DSL Support for Groovy-Eclipse

  • 1.
    What’s new inGroovy & Grails Support? DSL Support in Groovy-Eclipse Andrew Eisenberg, SpringSource Tools Team © 2011 SpringSource, A division of VMware. All rights reserved
  • 2.
    What’s new inGroovy & Grails Support? Part 1 © 2011 SpringSource, A division of VMware. All rights reserved
  • 3.
    New Groovy-Eclipse Supportin 2.5.0   DSL Descriptors (discussed later)   Groovy 1.8   Parameter guessing content assist   Script outline view   Distinguish read vs. write access in search   Conditional breakpoints in Groovy files (STS only) 3
  • 4.
    New Grails toolingsupport in STS 2.7.0.M1   Service field content assist   Groovy search results in GSPs 4
  • 5.
    Gradle support inSTS Part 1.5 © 2011 SpringSource, A division of VMware. All rights reserved
  • 6.
    First cut atGradle support now available in STS   Demoed this morning in the Gradle talk   Yay! 6
  • 7.
    DSL Support inGroovy-Eclipse Part 2 © 2011 SpringSource, A division of VMware. All rights reserved
  • 8.
  • 9.
    A DSL fordistance calculations 3.m + 2.yd + 2.mi - 1.km In the Groovy editor: Uh oh! Can we do better??? 9
  • 10.
  • 11.
    DSL Descriptors   Teachthe IDE about DSLs through scripting CONFIDENTIAL 11
  • 12.
    DSL Descriptors   InEnglish: •  “Any subtype of Number should have the following properties: m, yd, mi, km”   In DSLD: •  “Any subtype of Number”: currentType( subType( Number ) )! •  “…the following properties…”: [ “m”, “yd”, “cm”, “mi”, “km” ].each {! property name:it, type:"Distance”! }! 3.m + 2.yd + 2.mi - 1.km 12
  • 13.
    Let’s see that  Ex 1: Distances 13
  • 14.
    Anatomy of aDSLD file 14
  • 15.
    DSLD and theInferencing Engine   Hooks into Groovy-Eclipse’s type inferencing engine •  Visit each expression AST node •  Determine type using previous expression •  Move to next expression   DSLD operates on Groovy AST Expression nodes •  Exposes Groovy AST nodes and uses Groovy API   In the background, while typing (reconciling) org.codehaus.groovy.ast.expr.Expression! 15
  • 16.
    Pointcuts and Contributionblocks   Pointcuts: •  Where to do it. •  What is the current expression? •  Declaring type? class Other {! •  Enclosing class? def x! }!   Contribution blocks: class Foo {! •  What to do def method() {! •  “Add” method new Other().x! •  “Add” property }! }! •  (not at runtime, in the editor only) 16
  • 17.
    What goes ina Contribution Block?   property : “adds” a property (…).accept {! •  arguments property name: “myName”! •  name: “blarb” method name: “getMyName”! }! •  type: “java.lang.String” •  declaringType :”com.foo.Frumble” •  isStatic: false •  doc: “Some html” •  provider: “My DSL”   method : “adds” a method •  all arguments above, and •  params: [firstName:“java.lang.String”, lastName:“java.lang.String”] •  useNamedArgs: true   name is required, others optional 17
  • 18.
    Pointcuts   currentType() :Matches on the current declaring type   enclosingClass() : Matches on the enclosing class   currentType(“com.bar.Foo”)   methods(“run”)   annotatedBy(“org.junit.runner.RunWith”)   enclosingClass( annotatedBy(“org.junit.runner.RunWith”) ) & currentType(methods(“run”) ) 18
  • 19.
    Where does thispointcut match? What does it add? (enclosingClass(annotatedBy(“org.junit.runner.RunWith”)) & 
 currentType(methods(“run”))).accept { property name:”blarb” }! Looking for an expression that: @RunWith(Sumthin) ! class Foo {! def someTest() {! enclosed by @RunWith print “Hello”! def x = new MyRunner()! x.blarb! has run method }! blarb }! class MyRunner { def run() {…} }! 19
  • 20.
    Wait…isn’t this Aspect-OrientedProgramming?   Pointcut •  Intentionally borrowed from AOP   AspectJ: pointcuts and advice •  operates on Java instructions at runtime class Foo {!   DSLD: pointcuts and contribution blocks def x = {! •  operates on AST def i = 0! org.codehaus.groovy.ast.expr.*!   Join Point Model i++! }! •  Join points (e.g., instructions, expressions) }! •  Mechanism for quantifying join points (e.g., pointcuts) •  Means of affect at a join point (e.g., advice, contribution blocks) 20
  • 21.
    Other things tohelp with DSLDs 21
  • 22.
    New DSLD Wizard  File  New  Groovy DSL Descriptor 22
  • 23.
  • 24.
    Groovy Event Console  Keep this open while implementing DSLDs: •  Shows exceptions •  Pointcuts •  Matches   Find the Console here: 24
  • 25.
    Groovy AST Viewer  Exploration of AST of current Groovy file 25
  • 26.
  • 27.
    Basic Script Ex 2:Using the DSLD wizard 27
  • 28.
    Meta DSL Ex 3:DSLD script for editing DSLDs 28
  • 29.
    AST Transforms Ex 3:Standard AST Transforms 29
  • 30.
    SwingBuilder Ex 4: Longscript, but simple to understand 30
  • 31.
    Grails Constraints DSL Ex5: encapsulate Grails domain knowledge in a script 31
  • 32.
    Criteria Queries Ex 6:simple script, large effect 32
  • 33.
    Griffon Ex 7: fromlast night 33
  • 34.
  • 35.
    DSLD is notcomplete   Guided by user feedback   Collaboration with library developers •  Grails, Gaelyk, Griffon, etc.   Release standard DSLDs (AST Transforms, Builders, etc.) •  With Groovy-Eclipse? •  With Groovy core?   More pointcuts •  What do users need that isn’t implemented? •  regex(), instanceof(), superType(), enclosingEnum(), etc.   What about IntelliJ’s GDSL? 35
  • 36.
    Thanks!   More information: •  Google: groovy eclipse dsld   Full documentation on Codehaus.org: •  http://docs.codehaus.org/display/GROOVY/DSL+Descriptors+for+Groovy-Eclipse   Install from update site: •  http://dist.codehaus.org/groovy/distributions/greclipse/snapshot/e3.6/   Mailing list: •  [email protected]   Or chat with me whenever 36