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.