В настоящее время я изучаю написание плагинов для IntelliJ IDE. Я особенно заинтересован в разработке плагинов для CLion. Поэтому я хотел бы добавить поддержку c ++ в свой проект плагина.
Моя проблема:
Я прочитал в документации, как разрабатывать плагины для c ++. Однако описанный способ не работает для меня. IntelliJ не может разрешить зависимость, которую я хочу добавить.
То, что я в настоящее время знаю:
1. В этой части документации объясняется, что плагины могут зависеть от других плагинов, и как добавлять зависимости ,
Зависимости плагинов
Ваш плагин может зависеть от классов из других плагинов. В этом случае плагины могут быть в комплекте, сторонними или даже вашими. Инструкции по express зависимостям см. В разделе Зависимости плагинов.
Ваш плагин должен указывать, с каким продуктом или продуктами он будет совместим (все IDE на основе IntelliJ, только CLion или некоторые подмножества). Вы можете сделать это , объявив зависимости модуля с тегом в плагине. xml (см. Совместимость плагина с продуктами IntelliJ).
2. Эта часть документации объясняет, какие функции есть в каком плагине. Каждый указанный c язык выглядит как плагин. Поэтому разработка плагина, который хочет анализировать c ++, будет зависеть от плагина c ++.
Модули Specifi c to Functionality Более специализированная функциональность также предоставляется через модули и плагины в Продукты на базе платформы IntelliJ. Например, модуль com.intellij.modules. python поддерживает функциональность Python языковой c. Если плагин использует функциональные возможности этого модуля, такие как Python -specifi c проверки и рефакторинг, он должен объявить зависимость от этого модуля.
...
Следующая таблица перечисляет (1) модули или встроенные плагины, которые обеспечивают определенные c функциональные возможности, и продукты, которые в настоящее время поставляются с ними.
В соответствии с таблицей, упомянутой выше, мне нужно добавить <depends>com.intellij.modules.cidr.lang</depends>
как зависимость для c ++. Однако, когда я добавляю эту строку в мой файл plugins.xml
, часть cidr.lang не распознается.
3. В этом вопросе Stackoverflow, посвященном java разработке плагинов, кто-то ответил, что недавно произошли изменения, которые теперь тоже нужно добавить необходимые плагины для build.gradle. Кроме того, было изменено, что java языковая поддержка теперь является встроенным плагином.
Полагаю, что делать
Полагаю, поддержка c ++ теперь также является плагином для сборки? Но как я могу добавить это?
Так что вместо
intellij {
version '2019.2'
plugins 'java'
}
Может быть, мне нужно что-то подобное?
intellij {
version '2019.2'
plugins 'c++' // or maybe cidr??
}
Приложение
Мой java класс:
import com.intellij.openapi.actionSystem.AnAction;
import com.intellij.openapi.actionSystem.AnActionEvent;
import com.intellij.openapi.actionSystem.CommonDataKeys;
import com.intellij.openapi.editor.Editor;
import com.intellij.openapi.ui.Messages;
import com.intellij.psi.PsiElement;
import com.intellij.psi.PsiFile;
import com.intellij.psi.PsiRecursiveElementWalkingVisitor;
//import com.jetbrains.cidr.lang.psi.OCFunctionDefinition; <-- This import does not work
public class HelloAction extends AnAction {
public HelloAction() {
super("Hello");
}
@Override
public void actionPerformed(AnActionEvent anActionEvent) {
Editor editor = anActionEvent.getData(CommonDataKeys.EDITOR);
PsiFile psiFile = anActionEvent.getData(CommonDataKeys.PSI_FILE);
if (editor == null || psiFile == null) return;
int offset = editor.getCaretModel().getOffset();
final StringBuilder infoBuilder = new StringBuilder();
PsiElement element = psiFile.findElementAt(offset);
infoBuilder.append("Element at caret: ").append(element).append("\n");
Messages.showMessageDialog(anActionEvent.getProject(), infoBuilder.toString(), "PSI Info", null);
psiFile.accept(new PsiRecursiveElementWalkingVisitor(){
@Override
public void visitElement(PsiElement element) {
super.visitElement(element);
infoBuilder.append(element.getText()).append("\n");
}
});
}
@Override
public void update(AnActionEvent e) {
Editor editor = e.getData(CommonDataKeys.EDITOR);
PsiFile psiFile = e.getData(CommonDataKeys.PSI_FILE);
e.getPresentation().setEnabled(editor != null && psiFile != null);
}
}
Мой файл build.gradle
plugins {
id 'java'
id 'org.jetbrains.intellij' version '0.4.15'
}
group 'org.example'
version '1.0-SNAPSHOT'
sourceCompatibility = 1.8
repositories {
mavenCentral()
}
dependencies {
testCompile group: 'junit', name: 'junit', version: '4.12'
}
// See https://github.com/JetBrains/gradle-intellij-plugin/
intellij {
version 'LATEST-EAP-SNAPSHOT'
type 'CL'
}
patchPluginXml {
changeNotes """
Add change notes here.<br>
<em>most HTML tags may be used</em>"""
}
Мой плагин. xml
<idea-plugin>
<id>org.helloplugin</id>
<name>Hello Action Project</name>
<version>0.0.1</version>
<vendor email="dummy" url="dummy">dummy</vendor>
<depends>com.intellij.modules.lang</depends>
<depends>com.intellij.modules.cidr.lang</depends> // cannot be resolved
<extensions defaultExtensionNs="com.intellij">
</extensions>
<actions>
<group id="MyPlugin.SampleMenu" text="Greeting" description="Greeting menu">
<add-to-group group-id="MainMenu" anchor="last"/>
<action id="Myplugin.Textboxes" class="HelloAction" text="Hello" description="Says hello"/>
</group>
</actions>
</idea-plugin>