Pull to refresh

Comments 13

Спасибо, таких статей очень не хватает. Если есть возможность, напишите пож-ста про PSI-Model проекта и навигацию между компонентами.
Про PSI обязательно будет, это, как ни крути, одна из ключевых особенностей IDEA.
Насчет навигации — не понятно между какими именно компонентами?
Я может не очень удачно выразился, я имел ввиду переход по Ctrl+Click к файлу, xml-конфигурации, определенному месту в коде и т.п. Спасибо.
Незнаю насколько это полезно в общем случае, но когда я начинал у меня были следующие вопросы по PSI:

1) Что такое стабы и как они используются.
2) Чем AST отличается от PSI, при том что часть AST нод также является и PSI нодами. В чём польза AST нод, когда их надо отделять от PSI элементов, а когда нет?
3) Что такое лёгкие AST ноды и зачем они нужны?
4) Ленивые AST ноды.
5) Собственно, полный цикл от лексер->IElementType->парсер->AST дерево или лёгкое AST дерево->стаб или PSI. Зачем делают несколько лексеров, обычный и highlighting, в чём их разница? Почему некоторые языки объявляют парсер в ParserDefinition, а некоторые (типа Java) — делают это как-то совсем по-другому, и.т.д, аналогично про создание PSI по ASTNode, когда-то через ParserDefinition, когда-то через createPsi.

Начиная с момента когда PSI уже построен всё было понятно более-менее сразу, там, конечно, порой тоже чёрт ногу сломит, но по крайней мере концепции ясны.

P.S. Возможно половина вопросов от того, что я сразу на реализацию Java смотрел.
2) AST конкретное языконезависимое синтаксическое дерево, PSI языкозависимый набор интерфейсов сверху. Разделение появилось в процессе развития. У новых плагинов поверх Open API разделение AST / PSI происходит автоматом.
1) Стабы — абстрактное (существенное компактное) дерево, которое хранится на диске и может использоваться PSI для определенных (но не всех) операций. Если используется неподдерживаемая операция, то стабы замещаются AST. Например, для файлов, загруженных в редактор, используется AST.
2) А вот реализация Java реализует свои ASTNode, в частности, с целью поиска детей (findChildByRole, например). Это теперь неправильно, что-ли? Получается, что такие ASTNode не совсем языконезависимы, т.к они специфичны для конкретного языка. Я вообще так и думал поначалу, что AST строится само собой, грубо, говоря по типу элементов (композитный-не композитный), пока на Java не посмотрел. Там как-то сложно всё. В Java не-стабовые PSI зачастую сами же AST нодами и являются.

Плагины поверх Open API — это которые, например?
смешивать AST / PSI можно, но это делает код сложнее, чем надо. Например, для java пришлось делать light psi elements, которые уже отвязаны от дерева.
Groovy, Scala, Ruby, JavaScript, Python, PHP, etc уже работают в разделении AST и PSI. Дерево строится унифицированно посредством PsiBuilder, а PSI лениво создается по дереву
3. Light элементы — это теже элементы синтаксического дерева, ток его можно создать не через Лексику, а вручную. Зачастую ипользуется когда нужно возратить PSI елемент, который не является частью дерева.

4. Ленивые ноды, ноды которые парсятся при первом вызове. Это теже PsiFile работает через Lazy. Лейзи ноды используются например, ещё для Иньекций в основоное PSI дерево, другое PSI дерево другого языка(например JavaDoc парсинг в комментах явы)

5. В яве это сделано ибо — там есть поддержка уровней языка. Для каждого уровня — лексика немного отличается(кейворды), да и парсинг тоже.

Java имеет очень специфичную AST + PSI реализация
Если точно помню — XML плагин имеет подобную реализацию
Отлично! А вот подскажите, как вот такое сделать в виде плагина? youtrack.jetbrains.com/issue/IDEA-80019
Сам пытался разобраться в прошлом году, неудачно. Может, подскажете, в какую сторону копать? А с меня статья :)
К сожалению не сталкивался с VCS-плагинами. Возможно стоит посмотреть как это реализовано в git или mercurial плагинах (исходный код есть на гитхабе).
Большое спасибо за статью!
К сожалению, очень не хватает информации по разработке плагинов к идее. Никакой полноценной информации по API идеи нет, а лазить в чужом коде и пытаться понять, что там к чему, очень трудно.
Согласен. Сам достаточно много времени провел за чтением JavaDoc и исходников.
Sign up to leave a comment.

Articles