Goland插件开发之使用Psi

前言

在工作中希望能够获取Model层中PO(Persistent Object)的一些信息,进而进行一些导出之类的操作。之前考虑过通过启动项目对struct进行加载,但是这种方式不够灵活每次启动编译有点慢,于是就转向了Goland插件的形式。

依赖引入

需要在plugin.xml中加入如下依赖:

1
2
3
4
<depends>com.intellij.modules.go</depends>
<depends>com.intellij.modules.platform</depends>
<depends>com.intellij.modules.lang</depends>
<depends>org.jetbrains.plugins.go</depends>

获取PsiFile

由于功能是集成在菜单中,可以通过AnActionEvent获取到Psi信息

1
event.getData(CommonDataKeys.PSI_FILE);

通过PsiFile获取文件中定义的结构体GoStructType

psiFile中的accept方法可以对文件的结构进行遍历,通过重写visitStructType方法即可遍历文件中所有的结构体

1
2
3
4
5
6
7
psiFile.accept(new GoRecursiveVisitor() {
    @Override
    public void visitStructType(@NotNull GoStructType o) {
        super.visitStructType(o);
       // 这里可以将GoStructType o添加到list等遍历完再进行处理,或者在这编写逻辑
    }
});

获取Field信息

获取GoFieldDeclaration

对上面获取到的GoStructuralType调用getFieldDeclarationList()方法即可获取GoFieldDeclaration对象

1
goStructType.getFieldDeclarationList();

获取Field类型

1
2
declaration.getType().getText();

通过GoFieldDeclaration获取Identifier对象

对获取到的GoFieldDeclaration进行如下操作即可获取对应的Identifier

1
Indentifier identifier = declaration.getFieldDefinitionList().get(0).getIdentifier();

获取Field name

1
2
identifier.getText();

获取Tag信息

获取到Tag的文本,通过正则表达式提取信息就很方便了

1
identifier.getTagText();

获取Field注释

目前没有找到优雅的获取Field注释的方式,下面提供一个小demo。即获取struct定义的文本,通过按行切分文本内容,然后正则提取。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
String structText = goStructType.getText();
String[] structTextLines = structText.split("\n");
List<String> commentList = new ArrayList<>();
// 正则匹配以双斜杠开头的内容,即注释
String commentPattern = "//.+";
Pattern commentRegex = Pattern.compile(commentPattern);
for (String structTextLine : structTextLines) {
    // 如果这一行有双斜杠
    if (structTextLine.contains("//")) {
        if (commentRegex.matcher(structTextLine).find()) {
            commentList.add(matcher.group().replace("//", "").trim());
        }
    }
}
作者

ZhongHuihong

发布于

2021-08-15

更新于

2021-10-02

许可协议