GDSL Awesomeness – AutoComplete Script for grails-Mail-Plugin “sendMail” closure

24 / Sep / 2012 by Kushal Likhi 0 comments

Hi,

 

I have been using the Grails mail plugin for a while now, this plugin injects a method named “sendMail” to all controllers and services.

 

Our aim will be to provide auto-completes for this method and the closure inside.

 

The GDSL Script is as follows:

import com.intellij.patterns.PsiJavaPatterns
import com.intellij.patterns.PlatformPatterns

//Let Us first Contribute the "sendMail" method.
def ctx = context(
        ctype: PsiJavaPatterns.psiClass().withName(PlatformPatterns.string().matches(/.*/))
)

contributor(ctx) {
    def path = ""
    try {
        path = psiClass.containingFile.originalFile.virtualFile.path
    } catch (Exception e) {
    }

    //Check for controllers and Services
    if (path =~ ".*/*grails-app/controllers/.*" || path =~ ".*/*grails-app/services/.*") {
        method(name: 'sendMail', type:'void', params: [closure: {}])
    }
}

//Now we will contribute methods to the closure passed to "sendMail"
def ctx2 = context(scope: closureScope())

contributor(ctx2) {
    def call = enclosingCall("sendMail")
    if (call) {
        method name: 'to', type:'void', params: [recepients: "java.lang.String..."]
        method name: 'cc', type:'void', params: [recepients: "java.lang.String..."]
        method name: 'bcc', type:'void', params: [recepients: "java.lang.String..."]
        method name: 'body', type:'void', params: [body: "java.lang.String"]
        method name: 'html', type:'void', params: 1
       //And so on all methods defined here
        
    }
}

 

Image illustrating auto-complete

 

Read Further in the “GDSL AWESOMENESS” Series

  1. GDSL Awesomeness – Introduction to GDSL in IntelliJ Idea
  2. GDSL Awesomeness – Understanding Context And Contributors in Detail
  3. GDSL Awesomeness – Defining dynamic property in a class
  4. GDSL Awesomeness – Defining dynamic method in a class
  5. GDSL Awesomeness – Adding Hinting for missingMethod implementation
  6. GDSL Awesomeness – Setting a global context
  7. GDSL Awesomeness – Delegating Closure Calls
  8. GDSL Awesomeness – Defining methods in a closure passed to method of particular name
  9. GDSL Awesomeness – Defining Properties in a closure passed to method of particular name
  10. GDSL Awesomeness – Contributing to classes which match a path/name pattern
  11. GDSL Awesomeness – contributing methods with current class return types or parameters
  12. GDSL Awesomeness – AutoComplete Script for grails-Mail-Plugin “sendMail” closure
  13. GDSL Awesomeness – Getting Code of a method or Field in GDSL Script
  14. GDSL Awesomeness – Advanced Example showing domain properties implementation

 

 

Hope It Helped.
Kushal Likhi

FOUND THIS USEFUL? SHARE IT

Leave a comment -