Skip to content

Commit 5589c91

Browse files
committed
docs: add for intellij multiple plugin
1 parent 7071c02 commit 5589c91

File tree

1 file changed

+60
-5
lines changed

1 file changed

+60
-5
lines changed

README.md

Lines changed: 60 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -211,7 +211,7 @@ GitHub Copilot 采用了相似上下文的架构模式,其精略的架构分
211211
- 服务端(Server)。处理 prompt 请求,并交给 LLM 服务端处理。
212212
213213
在 “公开” 的 [Copilot-Explorer](https://github.com/thakkarparth007/copilot-explorer) 项目的研究资料里,可以看到 Prompt
214-
是如何构建出来的。如下是发送到的 prompt 请求:
214+
是如何构建出来的。如下是发送到的 prompt 请求:
215215
216216
```json
217217
{
@@ -323,7 +323,7 @@ BlogService 类信息,作为上下文(在注释中提供)提供给模型
323323
IDE、编辑器作为开发者的主要工具,其设计和学习成本也相对比较高。首先,我们可以用官方提供的模板生成:
324324
325325
- [IDEA 插件模板](https://github.com/JetBrains/intellij-platform-plugin-template)
326-
- [VSCode 插件模板](https://code.visualstudio.com/api/get-started/your-first-extension)
326+
- [VSCode 插件生成](https://code.visualstudio.com/api/get-started/your-first-extension)
327327
328328
然后,再往上添加功能(是不是很简单),当然不是。以下是一些可以参考的 IDEA 插件资源:
329329
@@ -419,6 +419,61 @@ class AutoDevEditorListener : EditorFactoryListener {
419419
</group>
420420
```
421421
422+
#### 多语言上下文架构
423+
424+
由于 Intellij 的平台策略,使得运行于 Java IDE(Intellij IDEA)与在其它 IDE 如 Python
425+
IDE(Pycharm)之间的差异性变得更大。我们需要提供基于多平台产品的兼容性,详细介绍可以参考:[Plugin Compatibility with IntelliJ Platform Products](https://plugins.jetbrains.com/docs/intellij/plugin-compatibility.html)
426+
427+
首先,将插件的架构进一步模块化,即针对于不同的语言,提供不同的模块。如下是 AutoDev 的模块化架构:
428+
429+
```bash
430+
java/ # Java 语言插件
431+
src/main/java/cc/unitmesh/autodev/ # Java 语言入口
432+
src/main/resources/META-INF/plugin.xml
433+
plugin/ # 多平台入口
434+
src/main/resources/META-INF/plugin.xml
435+
src/ # 即核心模块
436+
main/resource/META-INF/core.plugin.xml
437+
```
438+
439+
在 `plugin/plugin.xml` 中,我们需要添加对应的 `depends`,以及 `extensions`,如下是一个示例:
440+
441+
```xml
442+
<idea-plugin package="cc.unitmesh" xmlns:xi="http://www.w3.org/2001/XInclude" allow-bundled-update="true">
443+
<xi:include href="/META-INF/core.xml" xpointer="xpointer(/idea-plugin/*)"/>
444+
<content>
445+
<module name="cc.unitmesh.java"/>
446+
<!-- 其它模块 -->
447+
</content>
448+
</idea-plugin>
449+
```
450+
451+
而在 `java/plugin.xml` 中,我们需要添加对应的 `depends`,以及 `extensions`,如下是一个示例:
452+
453+
```xml
454+
<idea-plugin package="cc.unitmesh.java">
455+
<!--suppress PluginXmlValidity -->
456+
<dependencies>
457+
<plugin id="com.intellij.modules.java"/>
458+
<plugin id="org.jetbrains.plugins.gradle"/>
459+
</dependencies>
460+
</idea-plugin>
461+
```
462+
463+
随后,Intellij 会自动加载对应的模块,以实现多语言的支持。根据我们预期支持的不同语言,便需要对应的 `plugin.xml`,诸如于:
464+
465+
```bash
466+
cc.unitmesh.javascript.xml
467+
cc.unitmesh.rust.xml
468+
cc.unitmesh.python.xml
469+
cc.unitmesh.kotlin.xml
470+
cc.unitmesh.java.xml
471+
cc.unitmesh.go.xml
472+
cc.unitmesh.cpp.xml
473+
```
474+
475+
最后,在不同的语言模块里,实现对应的功能即可。
476+
422477
### 上下文构建
423478
424479
为了简化这个过程,我们使用 Unit Eval 来展示如何构建两种类似的上下文。
@@ -742,7 +797,7 @@ fun filterByThreshold(job: InstructionFileJob) {
742797
return
743798
}
744799
745-
// like js minified file
800+
// like js minified file
746801
if (summary.binary || summary.generated || summary.minified) {
747802
return
748803
}
@@ -768,7 +823,7 @@ fun filterByThreshold(job: InstructionFileJob) {
768823
}
769824
```
770825
771-
在过虑之后,我们就可以由不同语言的 Worker 来进行处理,诸如 JavaWorker、PythonWorker 等。
826+
在过虑之后,我们就可以由不同语言的 Worker 来进行处理,诸如 JavaWorker、PythonWorker 等。
772827
773828
```kotlin
774829
val lists = jobs.map { job ->
@@ -801,7 +856,7 @@ SimilarChunksStrategyBuilder 主要逻辑如下
801856
1. 使用配置中指定的规则检查以识别存在问题的数据结构。
802857
2. 收集所有具有相似数据结构的数据结构。
803858
3. 为每个被识别的数据结构中的函数构建完成生成器。
804-
4. 过滤掉具有空的前置和后置光标的完成生成器。
859+
4. 过滤掉具有空的前置和后置光标的完成生成器。
805860
5. 使用JavaSimilarChunker计算块补全的相似块。
806861
6. 为每个完成生成器创建SimilarChunkIns对象,包括语言、前置光标、相似块、后置光标、输出和类型的相关信息。
807862
7. 返回生成的SimilarChunkIns对象的列表。

0 commit comments

Comments
 (0)