2014-10-04 4 views
4

У меня есть аннотация, которая добавляет некоторые методы и конструктор по умолчанию в аннотированный класс. Мне удалось создать gdsl, чтобы включить автозаполнение идеи для методов, но я застрял в конструкторе, и документация очень плохая.Intellij idea gdsl. Добавьте конструктор в класс. Документация для GDSL

Есть ли у кого-нибудь идеи, как это сделать?

Возможно, я мог бы найти решение в существующем gdsl, но я не могу вспомнить трансформацию, связанную с конструкторами. Может быть, вы можете напомнить мне о любом из них.

def objectContext = context(ctype: "java.lang.Object") 

contributor(objectContext) { 
    if (hasAnnotation("com.xseagullx.SomeAnnotation")) { 
    // Here I want to add constructor's declaration(with empty arg's) 
    // … 
    // And then my methods. 
    method name: 'someMethod', type: 'void', params: [:] 
    } 
} 

Редакция: Хорошо, если это так @jasp сказать, и нет DSL построить для объявления Конструкторов, я до сих пор прошу хорошие источники документации, кроме страницы впадения JB в. Учебники и другие источники. Я знаком с embedded dsl's for groovy, grails и gradle.

Нужно что-л. более структурированный, если это возможно.

ответ

1

Я знаю, что это немного устарело, но я обнаружил, что искал что-то подобное.

DSL, который вы ищете, это method params: [:], constructor: true, хотя я не понимаю, зачем вам это нужно; если класс не объявляет какие-либо конструкторы, IDEA всегда не предлагает значение по умолчанию?

+0

Да, если класс _doesn't не объявляет никаких конструкторов_ ... Но не в моем случае, поскольку класс может иметь конструкторы, а по умолчанию добавляется аннотация. В любом случае, спасибо за ответ! Хорошо, что это возможно. – Seagull

+1

А, я вижу, справедливо. Что касается документации, то ответ кажется, что нет (http://stackoverflow.com/questions/3584883/where-is-the-jetbrains-intellij-openapi-documentation), но я обнаружил, что OpenAPI сама библиотека (http://www.mvnrepository.com/artifact/com.intellij/openapi/7.0.3) обычно достаточно хороша (если у вас есть это как зависимость в вашем проекте, вы также получите довольно приличное завершение кода в ваших файлах GDSL). – Poundex

3

Все вызовы функций внутри GroovyDSL - это просто вызовы обертки вокруг внутреннего интерфейса программы IDEA (PCI). Однако он не охватывает все возможности PCI, включая функциональные возможности конструкторов по умолчанию, которые, как я полагаю. Одним из доказательств этого является singletonTransform.gdsl, который в комплекте с IDEA из версии 9 и описывает трансформацию @Singleton AST. Вот его код:

contributor(context()) { 
    if (classType?.hasAnnotation("groovy.lang.Singleton")) { 
    property name: "instance", 
      type: classType?.getQualifiedName() ?: "java.lang.Object", 
      isStatic: true 
    } 
} 

Как вы можете видеть, что это не меняет конструктор и его видимость, поэтому IDEA будет автоматически заполнит этот недопустимый код:

@Singleton class Foo {} 
def foo = new Foo() 

Futhermore GDSL that describes the semantics of GroovyDSL (который фактически является частью /plugins/groovy/resources/standardDsls/metaDsl.gdsl источников IDEA) не предоставляет возможности описать конструкторы.

В этом случае я предлагаю вам использовать преобразование newify, которое позволяет вам описать метод targetClass.name, возвращающий созданный экземпляр.

+0

Спасибо! Я ожидал чего-то большего, но отрицательный ответ по-прежнему остается ответом. – Seagull

Смежные вопросы