Tuesday, October 20, 2009

Use GroovyDSL in IntelliJ IDEA Community Edition

If we define our own DSL or use dynamically added methods or properties we can use GroovyDSL to enable code completion in our project. Normally IntelliJ IDEA doesn't know about a DSL or dynamically added properties and methods, but we can describe them in GroovyDSL. GroovyDSL is a small framework we use to describe new behaviour of Groovy scripts. In an earlier post we saw how can use Dynamic properties to get a similar effect.

In this post we write a GroovyDSL script to enable code completion for Groovlets' implicit variables, like request, repsonse and application. We start by creating a new Groovy script in our project. We right-click on the src node and select Groovy script from the popup menu. We get a dialog window where we fill in the name of our script, groovletTransform, and change the Kind to GroovyDSL script:

We click the OK button and IntelliJ IDEA adds the file groovletTransform.gdsl to our project. We use the following code to define the DSL:

// Create context for Groovy script files which names end with groovlet.
def groovletContext = context(filetypes: ['groovlet'], scope: scriptScope())

contributor(groovletContext) {
    property name: 'request', type: 'javax.servlet.http.HttpServletRequest'
    property name: 'response', type: 'javax.servlet.http.HttpServletResponse'
    property name: 'session', type: 'javax.servlet.http.HttpSession'
    property name: 'application', type: 'javax.servlet.ServletContext'
    property name: 'context', type: 'javax.servlet.ServletContext'
    property name: 'params', type: 'java.util.LinkedHashMap'
    property name: 'headers', type: 'java.util.LinkedHashMap'
    property name: 'html', type: 'groovy.xml.MarkupBuilder'
    property name: 'out', type: 'java.io.PrintWriter'
    property name: 'sout', type: 'javax.servlet.ServletOutputStream'

    method name: 'forward', type: 'void', params: [path: 'java.lang.String']
    method name: 'include', type: 'void', params: [path: 'java.lang.String']
    method name: 'redirect', type: 'void', params: [path: 'java.lang.String']

At the top of our editor window we get the following message: DSL descriptor file has been changed and isn't currently executed. Click to activate it back. We click on this message and a popup menu with the action Activate appears:

We select Activate and now the rules in our DSL are active for our project. So we can create a new Groovy script with the extension groovlet and in the editor we get code completion for the variables and methods that are available for Groovlets:

It takes some extra effort, but especially when we define our own DSL or on a large project adding code completion for dynamic properties and methods can save a lot of time (and errors) in the long run.


Václav Pech said...

Cool! And once you create a gdsl file, you can distribute it with your library. Whoever downloads the library will get code-completion in IDEA out-of-the-box.

mrhaki said...

@Václav Pech: Didn't think of that, but that is of course true. Even more points for IntelliJ IDEA.

arnon said...

I have IDEA 9.0.3, but I don't seem to detect any support for GroovyDSL in it. Do you know whether the feature got dropped? Is there a special plugin needed to support it?

mrhaki said...

@arnon: I've tried it with 9.0.3, but it still works for me. I created a simple Groovy project and added a new Groovy script and choose "GroovyDSL script".

Anonymous said...

I had to add the File Type *.groovlet as a registered pattern associated with 'Groovy Files' in IntelliJ 11.1.1 (File > Settings > File Types).

Post a Comment