библиотеки для Java на протяжении 9 лет ▪ Придумываю новые возможности IDE для ваших любимых JVM фреймворков в IntelliJ IDEA ▪ Беспристрастный член ПК конференций Joker/JPoint 2
языка ▪ Мета-данные и аннотации требуют строк ▪ Внешние системы принимают строковые запросы (пример: SQL) ▪ В конфигурационных файлах нельзя писать код ▪ Так проще и все привыкли! 6
blocks. > For example, imagine this annotation on top of a text block: > @Language("text/html") Проблемы: 1. Аннотации привязаны к языку 2. Формат MIME Type / Language ID 3. Нужны ли ещё параметры: prefix / suffix ? 4. Должны ли редакторы выводить язык литерала из использований? 5. А что там с @Nullable / @NotNull в JDK ? 11
система (VFS) ▪ Поддержка языков (PSI) ▪ Редактор кода ▪ Инспекции ▪ Индексы ▪ Фоновые процессы ▪ UI библиотека ▪ Точки расширения IntelliJ Platform IDEA CE (Java, Groovy, Kotlin) PHP Support Ruby Support IDEA Ultimate PHP Storm RubyMine 15
между PsiElement и его использованиями: usage ➜ declaration ▪ Можно добавить cсылки без необходимости расширять язык! См. PsiReferenceContributor PsiLanguageInjectionHost 19
для разработчиков. ▪ Internal Actions ▪ View PSI / Dump UAST ▪ Dumb Mode Switch ▪ … Автоматически доступен в режиме отладки плагина. Включить в VM Options своей IDE: -Didea.is.internal=true 20
getReferences(element: PsiElement, context: ProcessingContext, range: TextRange): Array<PsiReference> По шагам: 1. Получаем значение элемента по range 2. Определяем целевой URL 3. Переиспользуем WebReference из platform-impl 23
способа поиска деклараций А какие значения правильные? a. Спецификация на значение b. Белый список c. Здравый смысл 24 (?:[a-z0-9!#$%&'*+/=?^_`{|}~-]+(?:\.[a-z0-9!#$%&'*+/=?^_`{|}~-]+)* |"(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21\x23-\x5b\x5d-\x7f]|\\[\x01-\x 09\x0b\x0c\x0e-\x7f])*")@(?:(?:[a-z0-9](?:[a-z0-9-]*[a-z0-9])?\.)+ [a-z0-9](?:[a-z0-9-]*[a-z0-9])?|\[(?:(?:25[0-5]|2[0-4][0-9]|[01]?[ 0-9][0-9]?)\.){3}(?:25[0-5]|2[0-4][0-9]|[01]?[0-9][0-9]?|[a-z0-9-] *[a-z0-9]:(?:[\x01-\x08\x0b\x0c\x0e-\x1f\x21-\x5a\x53-\x7f]|\\[\x0 1-\x09\x0b\x0c\x0e-\x7f])+)\])
область поиска ссылок и деклараций: getUseScope() и getResolveScope() 2. Найти все файлы, в которых встречается текст по words index 3. Для каждого найденного места определить есть ли там ссылки, resolve() и isEquivalentTo() См. ReferencesSearch.search(SearchParameters) 26
URL Path * 2. Реактивное автодополнение при помощи CompletionContributor, пример - Message Queue *: * новые возможности IntelliJ IDEA Ultimate 2020.1 31
▪ Документация Plugin DevKit: jetbrains.org/intellij/sdk/docs/basics.html ▪ Slack: jetbrains-platform NEW! https://plugins.jetbrains.com/slack ▪ Forum: IntelliJ IDEA Open API and Plugin Development 32