1.什么是StructureViewExtension
StructureViewExtension是IDEA编辑器中的类结构展现的窗口,可以通过StructureViewExtension控制要展现的字段或者方法
2.创建StructureViewExtension项目
2.1POM文件
<idea-plugin>
<id>com.wangxb.plugin.MyPlugin</id>
<name>我的插件</name>
<version>1.0</version>
<vendor email="wang5525369@sina.com" url="http://www.wangxb.com">wangxb</vendor>
<description>我的插件我的插件我的插件我的插件我的插件我的插件我的插件说明主要是增加属性的说明</description>
<change-notes>我的插件我的插件我的插件我的插件我的插件我的插件我的插件说明主要是增加属性的说明</change-notes>
<!-- please see https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/build_number_ranges.html for description -->
<idea-version since-build="193.0"/>
<!-- please see https://www.jetbrains.org/intellij/sdk/docs/basics/getting_started/plugin_compatibility.html
on how to target different products -->
<depends>com.intellij.modules.java</depends>
<extensions defaultExtensionNs="com.intellij">
<lang.structureViewExtension implementation="com.wangxb.plugin.MyStructureViewExtension"/>
</extensions>
<actions>
</actions>
</idea-plugin>
2.2 代码文件
package com.wangxb.plugin;
import com.intellij.ide.structureView.StructureViewExtension;
import com.intellij.ide.structureView.StructureViewTreeElement;
import com.intellij.ide.structureView.impl.java.JavaClassTreeElement;
import com.intellij.ide.structureView.impl.java.PsiFieldTreeElement;
import com.intellij.ide.structureView.impl.java.PsiMethodTreeElement;
import com.intellij.openapi.editor.Editor;
import com.intellij.psi.*;
import com.intellij.psi.impl.light.LightFieldBuilder;
import com.intellij.psi.impl.light.LightMethodBuilder;
import com.wangxb.plugin.utils.MyFieldUtils;
import org.jetbrains.annotations.Nullable;
import java.util.ArrayList;
import java.util.Arrays;
import java.util.Collection;
import java.util.List;
import java.util.stream.Stream;
public class MyStructureViewExtension implements StructureViewExtension {
String annotaionName = "com.wangxb.annotation.AddField";
@Override
public Class<? extends PsiElement> getType() {
return PsiClass.class;
}
@Override
public StructureViewTreeElement[] getChildren(PsiElement psiElement) {
if ((psiElement instanceof PsiClass) == false){
return StructureViewTreeElement.EMPTY_ARRAY;
}
PsiClass psiClass = (PsiClass) psiElement;
PsiAnnotation psiAnnotation = MyFieldUtils.getAnnotation(psiClass,annotaionName);
if (psiAnnotation == null) {
return StructureViewTreeElement.EMPTY_ARRAY;
}
List<StructureViewTreeElement> structureViewTreeElementList = new ArrayList<>();
PsiField [] psiFieldList = psiClass.getAllFields();
for(PsiField psiField : psiFieldList){
if (psiField instanceof LightFieldBuilder){
PsiFieldTreeElement psiFieldTreeElement = new PsiFieldTreeElement(psiField, false);
structureViewTreeElementList.add(psiFieldTreeElement);
}
}
PsiMethod[] psiMethodList = psiClass.getAllMethods();
for(PsiMethod psiMethod : psiMethodList){
if (psiMethod instanceof LightMethodBuilder){
PsiMethodTreeElement psiMethodTreeElement = new PsiMethodTreeElement(psiMethod, false);
structureViewTreeElementList.add(psiMethodTreeElement);
}
}
if (structureViewTreeElementList.isEmpty()){
return StructureViewTreeElement.EMPTY_ARRAY;
}else{
return structureViewTreeElementList.toArray(new StructureViewTreeElement[structureViewTreeElementList.size()]);
}
}
@Nullable
@Override
public Object getCurrentEditorElement(Editor editor, PsiElement psiElement) {
return null;
}
}
2.3 代码效果
代码文件中没有abc属性,但代码结构中展现abc属性