結繩プラグイン開発
「結繩 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-SDL3 | GCC ツールチェーン + 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.6 | 1 | 4.6 プラグインは "minSupport": 1 と記述 |
| 結繩 4.7 | 2 | 4.7 プラグインは "minSupport": 2 と記述 |
つまり:4.6 向けにプラグインを開発する場合は
minSupportに1を設定し、4.7 にアップグレードする(または 4.7 向けのプラグイン)場合は2を設定します。 値とホストバージョン番号の具体的な紐付けルールは公式に従い、開発時はターゲットとするホストバージョンに合わせて記述してください。
確認済みの拡張ポイント一覧(point フィールド):
| 拡張ポイント | クラスが実装/継承するもの | 役割 | 出典プラグイン |
|---|---|---|---|
application | AndroidPlugin | プラグインエントリポイント、onInit/activate/onUninstall | go/scala/aar/インストール不要 |
project.manager | ProjectManager(通常は CodeProjectManager) | プロジェクトタイプを登録 | go/scala/linux |
project.language | LanguageFactory | 言語を登録(ハイライト + 関連ファイル拡張子)。scope を指定可能 | go/scala |
project.language.engine | LanguageEngine | 言語エンジンを登録(補完/診断などの provider のコンテナ) | 結繩コンソールプラグイン |
project.toolchain | Tool のサブクラス(例:SunJdk8Compiler) | コンパイルツールチェーンを登録 | JavaCompiler8 |
project.component | ComponentIntegrator/ComponentFactory | プロジェクトを開く際にコンポーネントをアタッチ(実行構成/初回ポップアップ/hook) | linux/kotlin/aar/インストール不要 |
project.file.creationOption | PSObjectCreationOption | ファイルツリーの「新規ファイル」メニュー項目 | kotlin/libgdx |
project.file.openWithEditor | PSObjectOpeningOption | ファイルの「開き方」 | kotlin |
project.event.fileUi | ProjectFileUiEvent | ファイルツリー UI イベント(アイコン紐付けなど) | kotlin |
domain.menu | BaseDomainMenuAction/メニュー action | トップレベルメニュー項目 | go |
domain.menu.editor.code | エディタコード領域メニュー | libgdx | |
platform.settingsBuilder | SettingsBuilder | 設定ページにサブページを追加 | 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:一般的なエラーとデバッグ
- タスク内 NPE:
BaseTask.prepare()でthis.logger = loggerを忘れた場合、execute()はすぐに失敗します。 - 拡張ポイント未登録:
program.jsonのextension配列で宣言されていない場合、クラスは読み込まれません。 - ホストバージョンの不一致:
minSupportフィールドが低すぎるか高すぎると、プラグインが読み込まれないか、API が欠落します。 - リソースが見つからない:
AssetUtils.readAssetはapp/src/main/assets/から読み取ります。パスが正しく、リソースがビルド APK に含まれていることを確認してください。
付録 B:com.rapid.api.* の逆コンパイル概要
(このスキルの全内容は、実際のプラグインの逆コンパイルとリポジトリコードに基づいてまとめられています。完全な API リファレンスについては、公式の qistudio-api-<バージョン>.jar を参照してください。)
キーパッケージ:
| パッケージ | クラス例 |
|---|---|
com.rapid.api | Platform, PlatformKeys |
com.rapid.api.framework.project | Project, CodeProject, ProjectManager, CodeProjectManager, ProjectVariant |
com.rapid.api.framework.project.task | Task, BaseTask, TaskContainer, TaskExecutor, TaskRunConfiguration |
com.rapid.api.framework.project.lang | LanguageFactory, LanguageEngine, Language |
com.rapid.api.framework.project.toolchain | Tool, Installable, ToolchainService |
com.rapid.api.framework.project.file | ProjectFileManager, PSObject, PSObjectExpansionCase, PSObjectCreationOption, PSObjectOpeningOption |
com.rapid.api.framework.project.ui | BaseDomainMenuAction, ComponentIntegrator, ProjectFileUiEvent |