IDEA GDSL如何将方法定义添加到文件夹中的所有文件(类)?

时间:2011-12-09 03:51:43

标签: intellij-idea dsl

在我的Grails应用程序中,有一个文件夹 grails-app / mongoDomain 。在这个文件夹中,在各种包中也有几个类。

我想为文件夹 grails-app / mongoDomain 中的所有类添加一个GDSL Defination方法,例如“save()”。

我成功地将此方法添加到单个类中,但是在 grails-app / mongoDomain 中添加所有类的方法? 。

我试过这样做,但它没有用..

def mongoDomainContext = context(pathRegexp: /.*grails-app\/mongoDomain.*/)

contributor(mongoDomainContext) {
    method(name: 'save', type: 'void', params: [closure: { }])
}

但是上面的代码没有用,做正确的方法是什么?



问候 Kushal

2 个答案:

答案 0 :(得分:3)

不幸的是,还没有这样的GDSL原语。在Griffon中,他们使用未记录的功能获得以下GDSL片段:

['Controller', 'Model', 'View', 'Service'].each { type ->
String artifactPath = type.toLowerCase() + 's'
contributor(ctype: PsiJavaPatterns.psiClass().withName(PlatformPatterns.string().matches(/.*${type}/))) {
    def path = psiClass.containingFile.originalFile.virtualFile.path
    if (path =~ ".*/*griffon-app/${artifactPath}/.*") {
        delegatesTo(findClass("griffon.core.Griffon${type}"))

        if (type == 'View') {
            addNodeContributions(delegate)
        }
    }
}

}

它们在此类名称及其路径上匹配,您只需要第二部分,在电话会议中。

答案 1 :(得分:2)

就是这样,我是怎么做到的,它是有效的,非常感谢“Peter Gromov”提供提示。

def mongoContext = context(
        ctype: PsiJavaPatterns.psiClass().withName(PlatformPatterns.string().matches(/.*/))
)

contributor(mongoContext) {
    def path = ""
    try {
        path = psiClass.containingFile.originalFile.virtualFile.path
    } catch (Exception e) {/*This is to prevent any non Class null matches*/}
    if (path =~ ".*/*grails-app/mongoDomain/.*")//Matches Directory 
    {
        //Code Here to add methods/Properties etc

    }
}

它工作就像一个魅力,感谢所有人,只是想分享给别人.. :)