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'или даже'?' параметр. Таким образом, вы можете добавить код, который обрабатывает эти случаи.