IntelliJ GSDL:使用可选参数定义方法

时间:2019-02-27 19:10:07

标签: intellij-idea jenkins-pipeline jenkins-shared-libraries

我有Jenkins管道shared library,它指定了全局变量 foo,它提供了两种方法。 一个没有参数,另一个有一个可选参数:

/vars/foo.groovy

def getBarOne() {
    //...
}

def getBarTwo(String value = '') {
    //...
}

现在,我想提供一个IntellJ GSDL文件,该文件支持这两种方法的有用代码完成。 (我的詹金斯提供的GSDL仅包含全局变量的定义,而不包含其方法的定义,因此,我尝试添加它。)

pipeline.gsdl(作者詹金斯)

//The global script scope
def ctx = context(scope: scriptScope())
contributor(ctx) {
//...
property(name: 'foo', type: 'org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable')
}
//..

pipeline.gsdl(由我拉皮)

//The global script scope
def ctx = context(scope: scriptScope())
contributor(ctx) {
//...
property(name: 'foo', type: 'org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable')
}
def uservarCtx = context(ctype: 'org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable')
contributor (uservarCtx) {
    method name: 'getBarOne', type: 'java.lang.String', params: [:]
    method name: 'getBarTwo', params: [value:'java.lang.String'], type: 'List<String>'
}
//..

到目前为止一切都很好。
但是,我的Jenkinsfile中的代码完成并不完全令人满意,这表明

IntelliJ code completion suggestions

对于getBarOne(),它同时建议.barOne.getBarOne();对于getBarTwo(..)仅建议使用.getBarTwo(String value),尽管该参数是可选的。

如何在GDSL文件中指定该参数为可选参数,以便为我提供建议的三个(有效的常规)选项:barTwogetBarTwo()getBarTwo(String value)? (不幸的是,“GDSL AWESOMENESS” Series没有帮助。)

1 个答案:

答案 0 :(得分:1)

要提供所有三个选项,必须在GDSL文件中指定两个方法签名。 一个带有(可选)参数,一个没有参数:

pipeline.gdsl

//...
def uservarCtx = context(ctype: 'org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable')
contributor (uservarCtx) {
    method name: 'getBarOne', type: 'java.lang.String', params: [:]
    method name: 'getBarTwo', params: [:], type: 'List<String>'     //<---
    method name: 'getBarTwo', params: [value:'java.lang.String'], type: 'List<String>'
}

自动完成建议:

full autocomplete suggestions

奖金轨迹:多个全局变量

由于我不仅有一个全局变量,而且还有两个全局变量,所以我也想具有自动补全功能以支持该变量。

这样做的诀窍是为全局变量指定不同的类型:

pipeline.gsdl

//The global script scope
def ctx = context(scope: scriptScope())
contributor(ctx) {
//...
property(name: 'foo', type: 'org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable.Foo')
property(name: 'bar', type: 'org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable.Bar')
}
def varCtxFoo = context(ctype: 'org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable.Foo')
contributor (varCtxFoo) {
    //...
}
def varCtxBar = context(ctype: 'org.jenkinsci.plugins.workflow.cps.global.UserDefinedGlobalVariable.Bar')
contributor (varCtxBar) {
    //...
}
//..

注意.Foo.Bar的后缀为类型定义为UserDefinedGlobalVariable的类型。