IntelliJ GroovyDSL для статического метода

Я использую GroovyDSL для IntelliJ, и я хотел бы описать статический метод, который возвращает экземпляр того же класса. Это метод как:

MyEntity x = MyEntity.get(1)

Как я понимаю, я должен использовать контекст с ctype за java.lang.Class, Но я не знаю, как указать тип возвращаемого значения, в настоящее время я задаю его просто как java.lang.Object:

def domainCtx = context(
        ctype: 'java.lang.Class'
)
contributor([domainCtx]) {
    method name: 'get',
           params: [id: 'long'],
           type: 'java.lang.Object'
}

Вопрос: как я могу установить type как фактическое имя класса? не "Объект", а "MyEntity"

PS Есть ли документация о GroovyDSL, JavaDoc, описывающая contributor?

1 ответ

Решение

Использовать что-то вроде этого

private String extractParameter(def type) {
  def parameters = type.parameters
  if (!parameters || parameters.length != 1) return 'java.lang.Object'
  return parameters[0].canonicalText
}

contributor(ctype:'java.lang.Class') {
    method(type:extractParameter(psiType), name: 'create')
}

Свойство 'psiType' имеет тип 'com.intellij.psi.PsiClassType' в вашем случае. У него есть метод getParameters(), который возвращает общие параметры или тип. getCanonicalText() возвращает каноническое представление типа (квалифицированное имя класса с обобщениями).

В некоторых случаях java.lang.Class может иметь '? расширяет MyEntity'или даже'?' параметр. Таким образом, вы можете добавить код, который обрабатывает эти случаи.

Другие вопросы по тегам