Статьи

Пользовательская поддержка Groovy DSL

На этот раз у меня в рукаве маленький сюрприз. Экспериментальная функция, о которой мы хотели бы узнать ваше мнение. Посмотрите внимательно на скриншот IntelliJ IDEA Community Edition ниже.

 

Вы видите, что я редактирую Groovy-код с какой-то валютой DSL. Видно диалоговое окно завершения кода, показывая мне варианты … ЖДИТЕ МИНУТУ! Диалог предлагает валюты как действительные свойства для чисел! Валюты , как евро или доллары США в настоящее время предлагаются! И после ввода действительные валюты больше не подчеркиваются как неразрешимые, в то время как недопустимые символы валюты по-прежнему получают подчеркивание.

Какая? Научили ли мы IntelliJ IDEA мировым валютам? Ни в коем случае, только я использую одну из многих новых возможностей Groovy, доступных в Maia , следующей версии IntelliJ IDEA , доступной в настоящее время под EAP.
IntelliJ IDEA 9позволит вам описать ваши собственные DSL с помощью скрипта Groovy . Затем сценарий с расширением .gdsl должен быть помещен в classpath проекта (вами или библиотекой), чтобы IDEA мог его увидеть. Следующий простой скрипт сделал всю магию для валют.

def ctx1 = context(ctype: "java.lang.Number")

contributor(ctx1) {
property name: "eur", type: "test.Money"
property name: "usd", type: "test.Money"
property name: "chf", type: "test.Money"
property name: "rur", type: "test.Money"
}

IDEA забирает файл и начинает распознавать упомянутые свойства в вашем коде сразу после сохранения файла gdsl .

методы

Это все не только о свойствах. Методы также могут быть добавлены. Например, довольно удобное расширение класса ReentrantLock с помощью метода withLock () для безопасной блокировки и разблокировки повторной входящей блокировки до и после использования, которое можно определить следующим образом:

ReentrantLock.metaClass.withLock = {nestedCode ->
delegate.lock()
try {
nestedCode()
} finally { delegate.unlock() }
}

будет распознаваться IDEA, если вы добавите дополнительный файл сценария .gdsl в ваш проект.

def ctx2 = context(ctype: "java.util.concurrent.locks.ReentrantLock")

contributor(ctx2) {
method name: 'withLock', type: 'void', params: [closure: { } ]
}

Теперь метод withLock () распознается и автоматически заполняется автоматически.

Универсальные методы

Поскольку файлы .gdsl представляют собой обычные скрипты Groovy, с помощью итераций вы можете быстро создать целые семейства динамических методов для подачи в IDEA.

def ctx3 = context(ctype: "demo.introduction.domain.Company")

contributor(ctx3) {
['Senior', 'Expert', 'Junior'].each {
method name: "findAll${it}Employees", type: 'java.util.Collection'
}
}

Теперь вы получаете поддержку динамических методов с довольно общими именами. И вы можете легко обнаружить опечатку, например. Вы видите название метода с ошибкой?

Библиотеки также могут поставляться со своими файлами .gdsl в комплекте, поэтому вы можете получить помощь по DSL-коду из коробки.

Вывод

Вся эта функция все еще является экспериментальной и может измениться до финального выпуска IntelliJ IDEA 9 , но мы хотели, чтобы вы знали, чтобы стимулировать обратную связь достаточно рано. Пожалуйста, прочитайте больше в вики JetBrains или в блоге mrhaki . Если у вас есть какие-либо идеи относительно этой функции, сообщите нам об этом , чтобы мы могли настроить ее именно для ваших нужд.

Наслаждайтесь Groovy кодированием.