IDEA插件编写五(StructureViewExtension)

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属性

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值