boboyr/TiecodePluginSkills

结绳(Tiecode/结绳 IDE)插件开发的完整指南。涵盖插件 API(com.rapid.api.* / studio-api.jar)、program.json 扩展点、.rmx 打包以及各种功能的实现方式。当用户要开发、修改、学习或排查结绳插件、结绳IDE插件、.rmx 插件、Tiecode 插件、go/scala/kotlin/linux/aar 等语言工程插件时使用。

TiecodePluginSkills とは?

このスキルは、結繩(Tiecode / 結繩 IDE)向けのプラグイン開発に関する包括的なガイドを提供します。対象者は、QiStudio(旧称 結繩 Studio)のプラグインシステムを理解し、.rmx 形式のプラグインを開発・改修・学習・デバッグしたい開発者です。このスキルは、com.rapid.api.* パッケージを中心としたプラグイン SDK の使い方、META-INF/program.json における拡張ポイント(extension point)の宣言方法、そしてコード補完(TextMate + LanguageEngine + LSP)、ファイルツリー(PSObject/ExpansionCase/CreationOption/OpeningOption)、実行構成(RunConfiguration/TaskRunConfiguration)、新規ファイル作成オプション、プロジェクトテンプレート(BaseTemplate)、コンパイルタスク(BaseTask/ToolchainService)、ツールチェーン、言語ハイライト、メニュー、設定ページなどの機能実装方法を網羅的にカバーしています。また、公式の Gitee リポジトリ(MobileIPE-Plugin-DevManual、TiecodeCompiler-Public、QiStudio-PluginSamples)へのリンクや、実際のプラグインソースコードのコレクション(GitHub: boboyr/tiecode-plugin)への参照も含まれており、理論と実践の両面から学習できます。さらに、各拡張ポイントの具体的な実装例(Java コード)や、task 内の logger 初期化漏れによる NPE などの落とし穴についても言及しており、実用的な知識が得られます。

対応~Claude Code~Codex CLI✓Cursor
npx skills add boboyr/TiecodePluginSkills

Installed? Explore more 生産性&コラボレーション skills: steipete/gemini, steipete/gh-issues, steipete/skill-creator · View all 6 →

お気に入りのAIに質問する

このエージェントスキルを事前に読み込んだ状態で新しいチャットを開きます。

ドキュメント

結繩プラグイン開発

「結繩 IDE / QiStudio」(ホストパッケージ名 com.tiecode.develop)向けのプラグイン開発ドキュメント。 「結繩 Studio」の正式名称は QiStudio(次世代オープンエンジニアリングプラットフォーム。モバイル初の OSGi 標準対応アプリで、 「マイクロコンポーネント / プラグイン」形式でエンジニアリング開発環境を拡張します)。 内容の出典:studio-api-1.0-preview5.jar(com.rapid.api.*)の逆コンパイル + go / scala / kotlin / linux / aar / libgdx / インストール不要実行 など、十数個の実プラグインのソースコード復元。


公式資料とリポジトリ(重要)

公式 Gitee リポジトリ

リポジトリ説明
MobileIPE-Plugin-DevManual公式プラグイン開発チュートリアル(QiStudio マイクロコンポーネント)。QiStudio核心体系介绍.md、Rapid框架介绍.md、plugin/扩展点介绍.md、plugin/插件清单配置.md、plugin/注册你的微组件——插件.md を含む
TiecodeCompiler-Public結繩コンパイラ(クロスプラットフォーム版)成果物公開リポジトリ。docs/(コンパイラの使用法/文法/カプセル化/プラットフォーム統合ドキュメント)、headers/tiec/(C API + C++ カプセル化ヘッダーファイル)、prebuilt/(cli + android/windows/linux/ohos/wasm 動的ライブラリ)、stdlibs/(Android/CXX/Web 基本ライブラリ)を含む
QiStudio-PluginSamples公式プラグインサンプルプロジェクト集(19以上のサンプル:依存性注入、エディタエフェクト/レインボー括弧、フローティングログ、Html プロジェクトマネージャー、ネットワークリクエスト、アイコン拡張、Javac9 ツールチェーン、言語ハイライト、カスタムテーマ、Application ライフサイクル、プロジェクトコンポーネント、各種メニュー、ツールページ、設定ページなど)

公式 API jar 名は qistudio-api-<バージョン>.jar(このスキルで逆コンパイルした studio-api-1.0-preview5.jar はそのホスト側 SDK です)。 QQ コミュニティ:1016399857。

コミュニティ実装例(GitHub)

本スキルに付随する実プラグインソースコード集(単一リポジトリ複数ディレクトリ、8 個の完全コンパイル可能プラグインを含む):

https://github.com/boboyr/tiecode-plugin

ディレクトリプラグインデモ機能
go语言工程插件/go 言語プロジェクト(コンソール+SDL3)デュアルテンプレート + LSP(gopls)補完 + TextMate ハイライト + ツールチェーン + 実行構成 + ファイルツリー仮想ノード
结绳安卓工程aar构建插件/aar/jar ビルドホストコンパイルチェーン再利用 + NameGenerator 中国語出力
结绳免安装运行插件/インストール不要ランチャーホストタスク再利用 + 未インストール APK のプラグイン読み込み
libgdx游戏编辑器插件/libgdx ビジュアルエディタデザイナー + エディタコード領域メニュー + 新規シーンクラス
scala安卓工程插件/Scala Android プロジェクト完全な sbt ビルドチェーン + 「結繩プラグインプロジェクト」テンプレート + ビルド/デバッグプラグイン
结绳Linux工程插件/結繩 Linux-SDL3GCC ツールチェーン + SDL3 + タスクチェーン
外部kotlin文件注解插件/外部 Kotlin ファイルアノテーション結繩コンパイラ API:CompilerPlugin + AnnotationProcessor + Kotlin 補完
BasicLanguages-lang参考/公式基本言語csml/json/markdown/xml/properties 言語ハイライトリファレンス

0. コアコンセプトと全体アーキテクチャ

結繩はモジュール化された IDE ホストであり、プラグインは .rmx ファイルとして配布されます。.rmx は本質的に APK です:AndroidManifest.xml + classes.dex + META-INF/program.json。 ホストは program.json の**拡張ポイント(extension point)**宣言によってプラグインの機能を発見し、 manifest の <application> や四大コンポーネントには依存しません。

0.1 三つの主要パッケージ

パッケージ役割
com.rapid.api.*プラグイン SDK(このドキュメントの主対象)。プロジェクト、言語、タスク、構造、ページ、UI、ネットワークなど
com.rapid.framework.*フレームワーク層:VFS(仮想ファイルシステム)、Service/Data/Event Keys、program/plugin コンテナ
com.tiecode.compiler.*結繩コンパイラ(構文木 / シンボルテーブル / ツールチェーン completer/processor)——ホスト側。プラグインは通常、その toolchain サブパッケージのみを使用

0.2 拡張ポイント(program.json の extension 配列)

META-INF/program.json の完全な構造:

{
  "id": "com.goproject.plugin",
  "name": "go语言工程插件",
  "engine": "plugin",
  "description": "...",
  "versionCode": 4,
  "versionName": "1.3",
  "minSupport": 1,
  "vendor": { "name": "boboyr", "email": "", "url": "#" },
  "extension": [
    { "point": "application", "class": "com.goproject.plugin.MyApplication" },
    { "point": "project.manager", "class": "com.goproject.plugin.project.GoProjectManager" },
    { "point": "project.language", "class": "com.goproject.plugin.lang.GoLanguageFactory",
      "scope": { "unit": "project", "identifiers": "sample.go" } },
    { "point": "domain.menu", "class": "com.goproject.plugin.Gomodmenu" }
  ]
}

minSupport フィールドの説明(ホスト最小サポートバージョン)

minSupport は整数で、プラグインがホストに要求する結繩の最小バージョンを示します。バージョンごとに値が異なります:

結繩バージョンminSupport説明
結繩 4.614.6 プラグインは "minSupport": 1 と記述
結繩 4.724.7 プラグインは "minSupport": 2 と記述

つまり:4.6 向けにプラグインを開発する場合は minSupport に 1 を設定し、4.7 にアップグレードする(または 4.7 向けのプラグイン)場合は 2 を設定します。 値とホストバージョン番号の具体的な紐付けルールは公式に従い、開発時はターゲットとするホストバージョンに合わせて記述してください。

確認済みの拡張ポイント一覧(point フィールド):

拡張ポイントクラスが実装/継承するもの役割出典プラグイン
applicationAndroidPluginプラグインエントリポイント、onInit/activate/onUninstallgo/scala/aar/インストール不要
project.managerProjectManager(通常は CodeProjectManager)プロジェクトタイプを登録go/scala/linux
project.languageLanguageFactory言語を登録(ハイライト + 関連ファイル拡張子)。scope を指定可能go/scala
project.language.engineLanguageEngine言語エンジンを登録(補完/診断などの provider のコンテナ)結繩コンソールプラグイン
project.toolchainTool のサブクラス(例:SunJdk8Compiler)コンパイルツールチェーンを登録JavaCompiler8
project.componentComponentIntegrator/ComponentFactoryプロジェクトを開く際にコンポーネントをアタッチ(実行構成/初回ポップアップ/hook)linux/kotlin/aar/インストール不要
project.file.creationOptionPSObjectCreationOptionファイルツリーの「新規ファイル」メニュー項目kotlin/libgdx
project.file.openWithEditorPSObjectOpeningOptionファイルの「開き方」kotlin
project.event.fileUiProjectFileUiEventファイルツリー UI イベント(アイコン紐付けなど)kotlin
domain.menuBaseDomainMenuAction/メニュー actionトップレベルメニュー項目go
domain.menu.editor.codeエディタコード領域メニューlibgdx
platform.settingsBuilderSettingsBuilder設定ページにサブページを追加scala android
project.file.creationOption———

注意:scope.identifiers は言語/コンポーネントを特定のプロジェクト typeId(例:sample.go)に限定するために使用します。 一部の拡張ポイントの class は None(プレースホルダー)にできます。


1. プラグインエントリポイント:application 拡張ポイント

import com.rapid.framework.program.android.app.AndroidPlugin;
import com.rapid.framework.program.android.DvmPluginDescriptor;
import com.rapid.api.Platform;
import com.rapid.api.framework.project.toolchain.ToolchainService;
import com.rapid.api.framework.project.ProjectServiceKeys;

public class MyApplication extends AndroidPlugin {
    @Override
    public void onInit(DvmPluginDescriptor descriptor) {
        // カスタムコンパイルツールチェーンを登録(例:go コンパイラ)
        ToolchainService service = Platform.getService(ProjectServiceKeys.TOOLCHAIN);
        service.setTool(GoCompileApiKeys.Gocompile, new BaseGoCompiler());
    }
    @Override
    public void activate() {
        // プラグインがアクティブになったときに一度実行(通常は hook、リスナー、コンパイルプラグインのアセンブルを配置)
    }
    @Override
    public void onUninstall() {
        // アンインストールクリーンアップ:自分で起動した子プロセス(gopls など)を終了、LSP を切断
    }
}

主要 API(com.rapid.api.Platform):

  • Platform.getService(Key<T>) —— ホストサービスを取得(例:ProjectServiceKeys.TOOLCHAIN)
  • Platform.getProject() —— 現在開いているプロジェクトオブジェクト
  • Platform.getApplicationContext() —— ホスト Context

2. プロジェクトタイプ:project.manager 拡張ポイント

プラグインは ProjectManager を使用して「プロジェクトタイプ」(例:go语言工程、结绳安卓工程)を登録します。

2.1 マネージャーのスケルトン

public class GoProjectManager extends CodeProjectManager<GoProject> {
    public final static String TYPE = "go语言工程";       // 表示名
    public final static String IDENTIFIER = "sample.go"; // typeId、project.json に保存される

    public GoProjectManager() {
        super();
        this.fileManager = new GoFileManager();   // オプション:カスタムファイルマネージャー(アイコン紐付けなど)

        // ① ファイルの開き方(拡張子別)
        fileManager.addPSObjectOpeningOption(DefaultOpeningOption.INSTANCE, ".go", ".mod");
        // ② ファイルツリーノードの展開方法(仮想「外部ライブラリ」ノード)
        fileManager.addPSObjectExpansionCase(new ExternalLibrariesExpansionCase(), MARKER);
        // ③ 新規ファイルメニュー項目
        fileManager.addPSObjectCreationOption(new GoFileCreationOption());
        // ④ 言語エンジンと言語ファクトリ
        languageManager.registerEngine("go", GoLanguageEngine.getInstance());
        languageManager.registerLanguageFactory(new GoLanguageFactory());
        languageManager.registerOperatorProvider(GoLanguage.ID, new GoOperatorProvider());
        // ⑤ プロジェクト作成テンプレート
        addTemplate(new GoConsoleTemplate());
        addTemplate(new GoSdl3Template());
    }

    @Override public String getIdentifier() { return IDENTIFIER; }

    @Override public TypeDescription getTypeDescription() {
        Drawable d = ContextUtils.getDrawable(AndroidPlugins.getContext(this), R.drawable.golang);
        return new TypeDescription(TYPE, TypeDescription.APPLICATION, d);
    }

    @Override public GoProject newProject() { return new GoProject(); }

    @Override public boolean isProjectDir(File file) { return false; }
}

ProjectManager インターフェースのメソッド(javap から):

String getIdentifier();
TypeDescription getTypeDescription();      // 名前 + タイプ + アイコン
List<Template<T>> getTemplates();
void addTemplate(Template<T>);
ProjectFileManager<T> getFileManager();
T newProject();
void load(T, LoadingPresentation);
boolean isProjectDir(File);                // 指定されたディレクトリがそのタイプのプロジェクトかどうかを判定
String backup(T); void delete(T);

TypeDescription のタイプ定数:APPLICATION / CONSOLE / LIBRARY。


3. プロジェクトオブジェクトとパイプラインアセンブル:CodeProject.prepare()

プロジェクトタイプは Project サブクラスに対応します。prepare() はプロジェクトを開くときにホストから呼び出され、この時点でテンプレートファイルは書き出されているため、ディレクトリ内容に基づいてタスクチェーン、実行構成、コンポーネントをアセンブルできます。

public class GoProject extends CodeProject {
    @Override
    public void prepare() {
        if (GoProjectKind.isSdl3(getProjectDir())) {
            Task buildLibmain = new BuildLibmainTask();
            Task publishLib = new PublishLibTask();
            addTask(buildLibmain);
            addTask(publishLib);
            publishLib.dependsOn(buildLibmain);      // タスク依存関係
            addRunConfiguration(new GoSdl3RunConfiguration());
        } else {
            addTask(new CompilerGoTask());
            addTask(new RunGoTask());
            addRunConfiguration(new GoStartRunConfig());
            addRunConfiguration(new ElfRunConfig());
        }
    }
    @Override public ProjectVariant getVariant() { return ProjectVariant.DEBUG; }
}

CodeProject(BaseProject を継承)の主要メソッド:

void prepare();
TaskContainer getTasks();  TaskExecutor getTaskExecutor();
void addTask(Task);  void setTasks(Iterable<Task>);
void addRunConfiguration(RunConfiguration);   // CodeProject 独自
ProjectVariant getVariant();  void setVariant(ProjectVariant);
Logger getLogger();  void setLogger(Logger);
String getName();
File getProjectDir();  File getChildFile(String);   // プロジェクト相対パスを File に解決
void recycle();

ProjectVariant の値:DEBUG / RELEASE / UNDEFINED。

テクニック(go プラグインより):prepare() 内でプロジェクトにマーカーファイル(例:External Libraries)を書き込むことで、 既存の古いプロジェクトに一度で機能を追加でき、プロジェクトを再作成する必要がありません。


4. プロジェクトテンプレート:BaseTemplate

テンプレートは、「新規プロジェクト」ダイアログでどのようなオプションが利用可能か、作成時にどのファイルを書き出すかを決定します。

public class GoConsoleTemplate extends BaseTemplate<GoProject> {
    @Override public String getName() { return "控制台工程"; }
    @Override public Drawable getPicture() { return null; }        // テンプレートプレビュー画像、null 可
    @Override public String getDefaultProjectName() { return "我的go控制台工程"; }
    @Override public Form getForm() { return new Form(); }         // 入力項目を追加可能

    @Override public void create(GoProject project, Form form,
                                 Project.OnProjectCreateListener listener) {
        try {
            File file = project.getChildFile("src/main.go");
            String html = AssetUtils.readAsset(AndroidPlugins.getContext(this), "sample/main.go");
            html = html.replace("${project_name}", project.getName());
            FileUtils.writeFile(html, file);                        // プロジェクトディレクトリに書き込み
            FileUtils.writeFile("module main\ngo 1.26.0", project.getChildFile("src/go.mod"));
            listener.onSuccess();                                    // 成功コールバック
        } catch (IOException e) {
            listener.onFail("書き出しに失敗しました");                      // 失敗コールバック
        }
    }
}

Template<T> インターフェースのメソッド:

String getName();
Drawable getPicture();
String getDefaultProjectName();
Form getForm();          // com.rapid.framework.data.form.Form。addInput(new FormInput(...)) が可能
void create(T, Form, OnProjectCreateListener);   // OnProjectCreateListener.onSuccess()/onFail(msg)

テンプレートにリソースを同梱する:テンプレートファイルを app/src/main/assets/<name> に配置し、 AssetUtils.readAsset / AssetUtils.unZipAssetsFolder(context, zipName, destDir) を使用して読み取りおよび解凍します。 (SDL3 プロジェクトテンプレートは、asset 内の gosdl3_template.zip 全体をプロジェクトディレクトリに解凍します。)


5. コンパイルタスクとツールチェーン:BaseTask + ToolchainService

5.1 タスク BaseTask

public class CompilerGoTask extends BaseTask {
    @Override public void execute() throws TaskInterruptError {
        File output = new File(Platform.getProject().getProjectDir() + "/output");
        if (!output.exists()) output.mkdirs();
        GoCompile a = Platform.getService(ProjectServiceKeys.TOOLCHAIN)
                             .getTool(GoCompileApiKeys.Gocompile);
        if (!a.isInstalled(ctx)) { logger.info("安装工具链..."); a.install(ctx); }
        GoCompileParams p = new GoCompileParams();
        p.inputFiles = FileUtils.getGofile(srcDir);
        p.outputPath = output.getPath();
        p.options = new String[]{"build", "-o"};
        a.compile(p, new CompileOnExecutionCallback());
    }

    // 必須オーバーライド:デフォルトの BaseTask.prepare は UnsupportedOperationException をスローします。
    // また、logger/variant フィールドはここで代入しないと、execute() 内の logger.info で NPE が発生します。
    @Override public void prepare(Project project, ProjectVariant variant, Logger logger) {
        this.logger = logger;
        this.variant = variant;
        Os.setenv("GOROOT", goRoot, false);   // 環境変数を設定(android.system.Os)
    }

    @Override public String getId() { return "compileWithGo"; }   // 実行構成の getTaskId() から参照される
    @Override public String getName() { return "编译到目标平台"; }
}

Task インターフェース(javap から):

String getId();  String getName();
void prepare(Project, ProjectVariant, Logger);      // デフォルトは例外をスローするため、必ずオーバーライドすること
void execute() throws TaskInterruptError;
TaskState getState();
void interrupt();
void dependsOn(Task...);  void dependsOn(List<Task>);
Task getDependencyTask(String);  Task getDependencyTaskByName(String);
String getIntermediatePath();  String getIntermediatePath(String);
String getOutputPath();  String getOutputPath(String);
File getGeneratedDir();

注意点(go プラグインのコメントより):タスク内で logger を代入しないと、execute() で logger.info を使用したときに NPE が発生して即座に失敗し、ツールチェーンのインストールが実行されません。

5.2 ツールチェーン Tool + Installable

public interface Tool { /* 組み込み:ANDROID_SDK/AAPT/AAPT2/D8/R8/DX/PROGUARD/
                         MANIFEST_MERGER/APK_SIGNER/JAVA_SDK/JAVA_COMPILER などの Key */ }
public interface Installable {
    boolean isInstalled(Context);
    void install(Context) throws IOException;
}
  • カスタムツールチェーンは application.onInit() 内で ToolchainService.setTool(customKey, impl) を使用して登録します。
  • 組み込み Android ツールチェーンの Key はすべて Tool インターフェース内にあります(直接 Platform.getService(TOOLCHAIN).getTool(Tool.AAPT2) のように使用できます)。
  • ホストのコンパイルチェーンを再利用する(aar プラグイン / インストール不要プラグインの方法):自分でコンパイラをバンドルせずに、 getDependencyTaskByName("compileWithTiecodec") のようにしてホストタスクを取得し依存関係を設定するか、getTaskId() を直接再利用します。

6. 実行構成:RunConfiguration / TaskRunConfiguration

プロジェクトの「実行」メニューに実行可能項目を追加します。最も一般的なのは TaskRunConfiguration で、タスク ID を指定し、 タスク実行成功後に onResult コールバックを呼び出します。

public class GoStartRunConfig extends TaskRunConfiguration {
    public Project getProject() { return Platform.getProject(); }
    public String getTaskId() { return "RunWithGo"; }          // 関連付けるタスク ID
    public ProjectVariant getVariant() { return ProjectVariant.RELEASE; }
    @Override public void onResult(TaskResult result) {
        if (result.isSuccessful()) {
            // 実行成功:ログ表示、UI 更新など
        }
    }
    @Override public String getName() { return "Go 程序启动"; }
}

RunConfiguration インターフェースの主要メソッド:

String getName();
Project getProject(); ProjectVariant getVariant();
void onResult(TaskResult);

TaskRunConfiguration は RunConfiguration を実装し、getTaskId() のみの指定を必要とする便利なクラスです。


7. ファイルツリーと PSObject

ファイルツリーは PSObject(プロジェクト構造オブジェクト)で構成されます。

7.1 PSObjectExpansionCase で仮想ノードを追加

仮想フォルダ(External Libraries など)を追加して、実際のディレクトリ構造を拡張します。

public class ExternalLibrariesExpansionCase extends PSObjectExpansionCase {
    final static String MARKER = "external_libraries";
    @Override public PSObjectResult getChildren(PSObject parent, File parentFile) {
        if (!"sample.go".equals(ProjectFileManager.getType(parent))) return null;
        // 既にマーカーファイルがある場合は追加しない
        if (hasMarker(parentFile)) return null;
        // 仮想ノードを作成
        PSObject virtual = new PSObject("外部库", parent, MARKER);
        return new PSObjectResult(Collections.singletonList(virtual));
    }
    @Override public boolean canAddToNode(PSObject node) {
        return MARKER.equals(node.getTag());
    }
}

7.2 PSObjectCreationOption で新規ファイルメニューを追加

public class GoFileCreationOption implements PSObjectCreationOption {
    @Override public String getName() { return "Go 源文件"; }
    @Override public Drawable getIcon() { return null; }
    @Override public void onCreate(PSObject parent, File parentFile, 
                                    OnProjectFileCreated callback) {
        String template = "package main\n\nfunc main() {\n\tprintln(\"Hello\")\n}\n";
        File newFile = new File(parentFile, "new_file.go");
        try {
            FileUtils.writeFile(template, newFile);
            callback.onCreated(newFile);
        } catch (IOException e) {
            callback.onFailed("ファイル作成エラー");
        }
    }
}

7.3 PSObjectOpeningOption でカスタムの「開き方」を追加

特定のファイルをエディタではなく別の方法で開きます(例:画像ビューア、プロパティエディタ)。

public class ImageViewerOpeningOption implements PSObjectOpeningOption {
    @Override public String getMenuName() { return "图像查看器打开"; }
    @Override public boolean isAvailable(PSObject obj, File file) {
        return file.getName().endsWith(".png") || file.getName().endsWith(".jpg");
    }
    @Override public void open(PSObject obj, File file) {
        // カスタム画像ビューアを起動
    }
}

8. 言語:LanguageFactory + LanguageEngine

8.1 言語ファクトリ LanguageFactory

public class GoLanguageFactory extends LanguageFactory<GoLanguage> {
    @Override public void init() {
        // TextMate スコープに基づくハイライト設定を登録
        addHighlightSetting("go", GoTextmateConfig.create());
        // オペレータプロバイダーを設定(コード補完と解析に重要)
        setOperatorProvider(new GoOperatorProvider());
    }
    @Override public GoLanguage create() { return new GoLanguage(); }
    @Override public String[] getSupportedExtensions() { return new String[]{".go", ".mod"}; }
}

8.2 言語エンジン LanguageEngine

検証、コード補完、ナビゲーション(定義へ移動)、シグネチャヒントを提供します:

public class GoLanguageEngine extends LanguageEngine {
    public static final GoLanguageEngine INSTANCE = new GoLanguageEngine();
    // ロジックはエンジン外部で管理される LSP に委譲(別プロセスでの gopls の維持など)
    @Override public List<CompletionProposal> getCompletions(Document doc, int offset) {
        // LSP サーバーに問い合わせ
        return completions;
    }
    @Override public List<Diagnostic> getDiagnostics(Document doc) {
        // LSP 診断をクエリ
    }
}

9. 高度な使用法

9.1 LSP との統合(go プラグイン例)

GoLanguageEngine 自体は同期プロキシとして機能し、実際の解析は別プロセスで実行される gopls に委譲されます。プラグインは gopls プロセスのライフサイクルを管理し、LSP プロトコルを介して通信します。

9.2 ホストコンパイラの再利用(aar プラグイン)

Tool.AAPT2 や Tool.D8 などの組み込みツールを直接取得して再利用します。

Tool tool = Platform.getService(ProjectServiceKeys.TOOLCHAIN).getTool(Tool.AAPT2);

9.3 プロジェクトテンプレートと組み合わせた新しいテクノロジー(libgdx プラグイン)

libgdx エディタは、内部に組み込まれた .rmx として配布される完全なアプリケーションであり、ファイルツリーとエディタ領域をカスタマイズするための新しいファイル作成オプションとエディタコード領域メニューを提供します。


付録 A:一般的なエラーとデバッグ

  1. タスク内 NPE:BaseTask.prepare() で this.logger = logger を忘れた場合、execute() はすぐに失敗します。
  2. 拡張ポイント未登録:program.json の extension 配列で宣言されていない場合、クラスは読み込まれません。
  3. ホストバージョンの不一致:minSupport フィールドが低すぎるか高すぎると、プラグインが読み込まれないか、API が欠落します。
  4. リソースが見つからない:AssetUtils.readAsset は app/src/main/assets/ から読み取ります。パスが正しく、リソースがビルド APK に含まれていることを確認してください。

付録 B:com.rapid.api.* の逆コンパイル概要

(このスキルの全内容は、実際のプラグインの逆コンパイルとリポジトリコードに基づいてまとめられています。完全な API リファレンスについては、公式の qistudio-api-<バージョン>.jar を参照してください。)

キーパッケージ:

パッケージクラス例
com.rapid.apiPlatform, PlatformKeys
com.rapid.api.framework.projectProject, CodeProject, ProjectManager, CodeProjectManager, ProjectVariant
com.rapid.api.framework.project.taskTask, BaseTask, TaskContainer, TaskExecutor, TaskRunConfiguration
com.rapid.api.framework.project.langLanguageFactory, LanguageEngine, Language
com.rapid.api.framework.project.toolchainTool, Installable, ToolchainService
com.rapid.api.framework.project.fileProjectFileManager, PSObject, PSObjectExpansionCase, PSObjectCreationOption, PSObjectOpeningOption
com.rapid.api.framework.project.uiBaseDomainMenuAction, ComponentIntegrator, ProjectFileUiEvent

関連スキル