Шаблон Groovy для сопоставления значений на карте

#groovy #pattern-matching #intellij-plugin #ofbiz

Вопрос:

Привет, ребята, я работаю над плагином ИДЕИ и пользовательскими ссылками. У меня работает много рекомендаций, но я застрял с одной сложной.

Я хотел бы обнаружить закономерности в groovy, такие как этот :

 result = run service: 'createAgreementItem', with: createAgreementItemInMap
 

В приведенной выше строке я хотел бы, чтобы createAgreementItem элемент соответствовал.

run определяется в базовом скрипте groovy

 package org.apache.ofbiz.service.engine
abstract class GroovyBaseScript extends Script {
    //...
    Map run(Map args) throws ExecutionServiceException {
        return runService((String)args.get('service'), (Map)args.get('with', new HashMap()))
    }
    //...
 

Проблема в том, что то, что я пытаюсь получить, технически не является параметром, это значение из карты с ключом, равным service .
Так что это не сработает :

 GroovyPatterns.groovyLiteralExpression()
        .methodCallParameter(0,
                GroovyPatterns.psiMethod().withName("run")
                        .definedInClass("org.apache.ofbiz.service.engine.GroovyBaseScript"))
 

У вас есть какие-нибудь идеи или какая-нибудь помощь ? Заранее спасибо!

Ответ №1:

Проблема в том, что то, что я пытаюсь получить, технически не является параметром, это значение карты с ключом, равным «сервис».

Если все, что вы хотите сделать, это получить service значение из Map , то вместо args.get('with', new HashMap()) этого вы могли бы сделать args.with.service . Если бы вы хотели нулевой безопасности, вы могли бы это сделать args?.with?.service .

Комментарии:

1. Может быть, моя проблема была недостаточно ясна. Я не работаю над классным run методом DSL. Я работаю над ИДЕЕЙ заводного шаблона

2. Извинения. Я думал, вы хотели знать, как извлечь значение из Map того, что связано с service ключом.

3. Вообще никаких проблем, спасибо за ответ в любом случае 😀