Intellij IDEA插件开发(五)自定义语言支持

这一个系列的前面四篇文章对IntelliJ IDEA插件开发的一些基础和通用的方法做了介绍,本篇将会深入一步,从语言结构化支持的角度探究插件开发的相关技巧。 依据Wiki的介绍,编程语言是用来定义计算机程序的形式语言。它是一种被标准化的交流技巧,用来向计算机发出指令。编程语言的描述一般可以分为语法及语义。语法是说明编程语言中,哪些符号或文字的组合方式是正确的,语义则是对于编程的解释。 对语言中语法和语义的分析,就是编译原理里词法分析和语法分析的概念。本篇文章仅会简略介绍针对于完全未知的语言类型的支持,而将更多的重点放在对已有语言类型的继承和扩展支持上。 针对于插件开发者,推荐一个十分有用的插件…

阅读全文 »

Java注解处理器从入门到出门

简介 Java注解又称Java标注,是Java语言5.0版本开始支持加入源代码的特殊语法元数据。 Java语言中的类、方法、变量、参数和包等都可以被标注。Java标注和Javadoc不同,标注有自反性。在编译器生成类文件时,标注可以被嵌入到字节码中,由Java虚拟机执行时获取到标注。 根据元注解@Retention指定值的不同,注解可分为SOURCE、CLASS和RUNTIME三种类型。当被声明为SOURCE时,注解仅仅在源码级别被保留,编译时被丢弃;声明为CLASS时,注解会由编译器记录在class文件内,但在运行时会被忽略,默认的Retention级别即为CLASS;声明为RUNTIME时…

阅读全文 »

ViewOverlay与ViewGroupOverlay简介

What’s Overlay ViewOverlay是存在于API 18+(Android 4.3)内的类,它是位于View视图层顶部的一个附加层,在View所有内容绘制完成后被绘制。ViewGroupOverlay是ViewOverlay的子类,对应于ViewGroup,同样地,这个层在ViewGroup中所有内容(包括childView)绘制完毕后才会被绘制。这个层和我们的View拥有同样的尺寸,可看做浮在View上方的一个二维空间。 Overlay对象可通过View.getOverlay()或ViewGroup.getOverlay()方法获得,获得Overlay对象后,就可…

阅读全文 »

Photoshop投屏到Android APP方案解析

Adobe为设计界提供了一大堆强有力的生产力工具,无比贴心,但对于开发者却不是那么友好,没有一份有条理的开发者文档和示例,就像一个穿着裤衩播新闻的主持人。话虽如此,Photoshop还是有一份相当简陋的SDK和文档在这里。 PS Play是腾讯ISUX发布的一款Photoshop协作工具,支持在移动设备上对Photoshop内的文稿进行预览,今天我们将尝试剖析它的实现原理。 设备发现 如前面文章所述,PS Play一定也是用了mDNS这种成本很小的方案来进行设备发现,但这里的问题是我们并没有在文档的任何地方发现mDNS协议所依赖的服务类型字段。既然文档里找不到,那么当然要请出二营长的意大利炮W…

阅读全文 »

Intellij IDEA插件开发(四)PSI进阶

本文是Intellij IDEA插件开发系列的最后一篇文章,将介绍PSI对象操作的进阶用法 使用模板 模板可以大大节省我们编写代码的工作量,在IDEA中,可以通过Preferences -> Editor -> File and Code Templates来查看和编辑已有的模板,或是添加新的模板。在模板中可以使用IDE提供的一些宏变量,常用的有NAME、PACKAGE_NAME、USER、DATE等,在新建模板时也可以使用自定义宏变量,自定义的宏变量将在创建文件时弹出一个输入框让用户对其赋值。 同样的,在插件开发中也可以使用文件模板,将公共部分代码进行抽离,减少创建PSI对象的复…

阅读全文 »

Intellij IDEA插件开发(三)操作PSI对象

PSI简介 PSI(Program Structure Interface)是Intellij Platform中一个非常重要的概念,在IDE所管理的Project中,每个目录,Package,源代码和资源文件都会被抽象成相应的PSI对象。本文将以PsiDirectory、PsiJavaFile和XmlFile为例介绍插件对文件目录、Java类和DOM对象的操作。 一些有用的方法 通用方法 FilenameIndex.getFilesByName()通过给定名称(不包含具体路径)搜索对应文件 ReferencesSearch.search()类似于IDE中的Find Usages操作 Refa…

阅读全文 »

Intellij IDEA插件开发(二)虚拟文件系统

VFS简介 虚拟文件系统(VFS)是一个Intellij Platform组件,它封装了大部分对活动文件的处理操作,为了达成以下目的: – 提供一个处理文件的通用API,而不关心文件的具体位置(无论文件位于磁盘上、归档文件中还是HTTP服务器上) – 追踪文件变化,并且在检测到文件内容发生更改时能提供新旧两个版本的文件 – 建立文件在VFS和持久化存储之间的关联 为了达到后两个目的,VFS为用户磁盘上的内容管理了一个持久化的快照,快照只存储那些通过VFS API访问过的和被异步更新后发生变化了的文件。快照是应用程序级别而不是工程级别的,也就是说,如果一个文件…

阅读全文 »

Intellij IDEA插件开发(一)快速入门

概述 作为开发者,一定听说过JetBrains的大名,此公司简直堪称IDE界的Adobe,针对不同编程语言有一系列不同的IDE产品,如葫芦兄弟般神通广大。 JetBrains的当家花旦当属Intellij IDEA,它的旗舰版本支持你会写的不会写的N多种语言,更重要的是它自身就是一个SDK,提供了众多插件接口供开发者使用,通过插件,让以面向对象方式操纵代码变为可能。下面分享一些在JetBrains系列IDE上编写插件的方法。 IDE的插件化支持 一件喜闻乐见的事情是JetBrains出产的IDE都使用Java编写,写过Swing程序的同学可能对那个丑陋不堪的GUI久久不能忘怀,再看看IDEA,…

阅读全文 »

Android局域网通信机制初探

简介 在网络上,两台主机要进行通信,就必须互相知晓对方的IP地址,在Internet上,一台主机的IP地址可能是经常发生变化的,并且IP地址非常难以记忆,因此产生了将主机名(域名)解析为IP地址的DNS服务。在局域网内,往往不存在DNS服务器,而在使用了DHCP的局域网内,各主机的IP往往也是不固定的,因此在主机之间进行IP解析是有一定困难的,为解决这个问题,mDNS应运而生。 在计算机网络中,多播域名系统(multicast Domain Name System, mDNS)被用于在一个不包含DNS服务器的局域网络中做域名解析服务。 RFC 6762定义了mDNS的规范,它使用UDP协议承载…

阅读全文 »

FlowLayout:Android自定义ViewGroup实现

需求 我们需要实现一个自定义的Layout,该Layout可以容纳若干个宽高不等的子元素,元素按照从左到右的顺序排列,当元素超出屏幕显示范围时,换一行继续显示,like this View和ViewGroup Android的界面都是由View、ViewGroup及其派生类组合而成,其中,View是ViewGroup及其他UI组件的基类。ViewGroup是放置View的容器,在编写xml布局文件的时候,View所有以layout开头的属性都是提供给ViewGroup的,ViewGroup根据这些属性来给childView计算出测量模式和建议的宽高,并将childView绘制在屏幕上的适当位置…

阅读全文 »