Использование IntelliJ 2019.3.1 для разработки плагинов для Clion. Как добавить поддержку языка c ++ для моего проекта плагина? - PullRequest
2 голосов
/ 11 января 2020

В настоящее время я изучаю написание плагинов для 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>

1 Ответ

0 голосов
/ 12 января 2020

Я нашел ответ в документации. Мне просто пришлось заново импортировать проект.

Изучение API модулей и плагинов

После объявления зависимости от модуля или плагина в плагине. xml, полезно изучить пакеты и классы доступны в этой зависимости. В следующем разделе приведены некоторые рекомендуемые процедуры для обнаружения того, что доступно в модуле или плагине, от которого зависит проект. В этих процедурах предполагается, что в проекте правильно настроены зависимости build.gradle и plugin. xml. Исследование API как потребителя

Для изучения доступных пакетов и классов в плагине или модуле используются функции в IDE IntelliJ.

Если проект не обновлен, повторно импортируйте проект Gradle как первый шаг. Повторное импортирование проекта автоматически обновит зависимости.

Поэтому для поддержки языка c ++ нет необходимости добавлять что-либо в build.gradle

Мой плагин. 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.platform</depends>
    <depends>com.intellij.modules.lang</depends>
    <depends>com.intellij.modules.cidr.lang</depends>


    <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>
...