史上最全idea插件开发入门实战(傻瓜式教程) |
您所在的位置:网站首页 › idea代码风格模板 › 史上最全idea插件开发入门实战(傻瓜式教程) |
idea插件开发入门实战
文章目录
idea插件开发入门实战前言一、书写第一个Hello World二、IDEA插件开发进阶1.基于java文件的规则校验2.基于XML文件规则的校验3.基于java文件的代码自动生成方法4.基于XML文件的读写方法5.XML跳转Java文件
前言
建议先看一遍官方文档再开始 IDEA插件开发官方文档 一、书写第一个Hello World新建项目
再新建第一个action
点击运行 IDEA默认有对于JAVA的一些校验规则,如果我们想自己定义一些规则,如命名方式什么的,让不符合规则的内容爆红线,应该怎么做呢? 方法如下。 XML需要新增配置 language 这里表示作用于JAVA文件 此时我们重新运行,新建查看效果。
和Java类似,这里我示范一个对于标签属性的校验。 直接贴代码和配置: import com.intellij.codeInspection.AbstractBaseJavaLocalInspectionTool; import com.intellij.codeInspection.ProblemsHolder; import com.intellij.psi.PsiElementVisitor; import com.intellij.psi.XmlElementVisitor; import com.intellij.psi.xml.XmlAttribute; import org.jetbrains.annotations.NotNull; public class XMLInspection extends AbstractBaseJavaLocalInspectionTool { @Override public PsiElementVisitor buildVisitor(@NotNull final ProblemsHolder holder, final boolean isOnTheFly){ XmlElementVisitor xml = new XmlElementVisitor(){ @Override public void visitXmlAttribute(XmlAttribute attribute) { super.visitXmlAttribute(attribute); if (attribute.getName().equals("name") && attribute.getValue().equals("亦疏")){ holder.registerProblem(attribute,"描述哔巴拉巴拉"); } } }; return xml; } }配置: 效果 代码: import com.intellij.openapi.actionSystem.AnAction; import com.intellij.openapi.actionSystem.AnActionEvent; import com.intellij.openapi.actionSystem.CommonDataKeys; import com.intellij.openapi.command.WriteCommandAction; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; public class GeneratedJavaCode extends AnAction { @Override public void actionPerformed(@NotNull AnActionEvent event) { WriteCommandAction.runWriteCommandAction(event.getProject(), () -> { PsiJavaFile file = (PsiJavaFile)event.getData(CommonDataKeys.PSI_FILE); PsiElementFactory factory = PsiElementFactory.SERVICE.getInstance(event.getProject()); file.add(factory.createField("age",PsiType.INT)); }); } }配置: 效果 XML文件比较独特,这里展开讲讲。 建议先看官网介绍 https://plugins.jetbrains.com/docs/intellij/xml-dom-api.html#abstract
定义interface Root import com.intellij.util.xml.DomElement; import com.intellij.util.xml.SubTag; public interface Root extends DomElement { @SubTag("foo") Foo getFoo(); }Foo public interface Foo extends DomElement { @Attribute("name") GenericAttributeValue getName(); @SubTagList("bar") List getBars(); Bar addBar(); }Bar public interface Bar extends DomElement { String getValue(); void setValue(String s); @Attribute("name") GenericAttributeValue getName(); }注解记得加上,因为子标签不是唯一的时候,不加注解会获取不到 注册DomFileDescription: public class XmlDescription extends DomFileDescription { public XmlDescription() { super(Root.class, "root", ""); } }XML配置 按alt+insert 代码 public class XMLToJavaProvider extends RelatedItemLineMarkerProvider { @Override protected void collectNavigationMarkers(@NotNull PsiElement element, @NotNull Collection result){ //获取当前文件 Project project = element.getProject(); PsiFile containingFile = element.getContainingFile(); DomManager domManager = DomManager.getDomManager(project); XmlFile xmlFile = (XmlFile) containingFile; Root root = domManager.getFileElement(xmlFile, Root.class).getRootElement(); if (element instanceof XmlTag){ XmlTag tag = (XmlTag)element; System.out.println(tag.getName()); switch (tag.getName()){ case "foo": String className = root.getFoo().getName().getStringValue(); createMark(className,element,result); break; default: break; } } } private void createMark(String className,PsiElement element,Collection result){ Project project = element.getProject(); Optional.ofNullable(className).ifPresent(c->{ PsiShortNamesCache shortNamesCache = PsiShortNamesCache.getInstance(project); PsiClass psiClass = shortNamesCache.getClassesByName(className, GlobalSearchScope.projectScope(project))[0]; Optional.ofNullable(psiClass).ifPresent(p->{ NavigationGutterIconBuilder builder = NavigationGutterIconBuilder .create(AllIcons.Actions.Back) .setTarget(psiClass) .setTooltipTitle("跳转java文件"); result.add(builder.createLineMarkerInfo(element)); }); }); } }配置:放在extensions标签下 启动看看效果: |
今日新闻 |
推荐新闻 |
CopyRight 2018-2019 办公设备维修网 版权所有 豫ICP备15022753号-3 |