IntelliJ GSDL: определение метода с необязательными аргументами - PullRequest
0 голосов
/ 27 февраля 2019

У меня есть конвейер Jenkins разделяемая библиотека , которая задает глобальную переменную foo, которая предоставляет два метода.Один из них не имеет аргументов, другой имеет один необязательный аргумент:

/ vars / foo.groovy

def getBarOne() {
    //...
}

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

Теперь я хочу предоставить файл IntellJ GSDLкоторый поддерживает полезное завершение кода для обоих этих методов.(GSDL, предоставленный моим Jenkins, содержит только определение для глобальной переменной, но не для ее методов, поэтому я пытаюсь добавить это.)

pipeline.gsdl (от Jenkins)

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

pipe.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, что аргумент является необязательным, так что мне предложили все три (допустимые groovy) опции: barTwo, getBarTwo() и getBarTwo(String value)?(К сожалению, серия «GDSL AWESOMENESS» не помогла.)

1 Ответ

0 голосов
/ 27 февраля 2019

Чтобы обеспечить все три опции, нужно указать две сигнатуры метода в файле GDSL.Один с (необязательным) аргументом, другой без него:

pipe.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

Бонус-трек: несколько глобальных переменных

Поскольку у меня есть не только одна глобальная переменная, но и две, я также хотел иметь автозаполнение для поддержки этого.

Хитрость заключается в том, чтобы указать различные типы для ваших глобальных переменных:

pipe.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 с определениями типа.

...