概述
JS编辑器的调研
aptana是一个很不错的基于eclipse开发的一个可以解析多种语言的IDE工具aptana官网。它包含了多种语言的编辑器,是一个很不错的编辑器工具,而且重要的是它的源码是完全公开的:aptana-studio3。以下是本人在做插件开发中使用的关于JS编辑器的一些调研成果,基本上详细到每一个类。因为是按照语法高亮、文本解析、辅助提示、错误警告这几个部分来进行说明。
此调研内容仅为个人学习记录,可能会有些许瑕疵,希望能者指点。
一、调研js语法高亮
1、JS的匹配token,用到了DFA算法,此算法旨在搭建语法树进行快速索引;
2、在打开编辑器时,会生成一个JSPartitioningFlexScanner;接着会去SimpleDocumentProvider类调用 connect方法,将分区和文档连接在一起;
3、接着去JSPartitioningFlexScanner类中调用nextToken方法的yylex方法进行文本的读取;
4、在yylex方法中,会进行DFA算法的计算过滤,然后得到每一个token在树中的信息,然后通过switch进行匹配,匹配时会直接利用计算出的信息new对应计算出的token;
5、将拿到的token进行判断,首先是JSSourcePartitionScannerJFlex类中mapToken方法判断分类,判断是否符合某一类(因为一类对应一个分区);
6、如果都不属于,则返回null,接着继续拿下一个token;
7、当所有的token都读取完之后,connect方法也就走完了;
8、接下就是去SimpleSourceViewerConfiguration类中调用getPresentationReconciler方法,进行文本的渲染,即语法高亮;
9、接着去CommonSourceViewerConfiguration类的getContentAssistant方法,对js的辅助提示进行初始化;
10、接着先去JSFlexScanner类的yylex方法中再一次做token的DFA计算,然后去JSCodeScanner类的maptoken方法中对每一个token进行对应匹配;
11、接下来就去创建editor了,然后就完了;
二、调研JS文本解析
1、当打开js编辑器时,会对其文本进行解析,首先会去入口GraalJSParser类的parse方法,调用parseModule方法(此方法默认为ES6的严格模式);
2、接着会去Parser类的module方法中调用moduleBody方法,并且接下来将分为三种类型去解析文本,分别是importDeclaration、exportDeclaration、statement(普通语法)、EOF等;此方法为文本解析默认入口。
3、根据上边不同类型,进去后会调用各种语法解析;(解析规则是根据JS的语法树,即知道每一个nexttoken应该是啥,eg:let后边必定是一个变量名,等等规则)
三、JS辅助提示流程
1、在按下“alt+/”后,会首先到CompletionProposalPopup类的showProposals方法,取走内部的run方法;
2、在run方法的内部有一个computeProposals方法,是用来计算该出现所有辅助提示,是一个ICompletionProposal[]数组;
3、然后经过一系列的调用后,会走到ContentAssistant类的computeCompletionProposals方法,进而调用getProcessor方法;
4、然后getProcessor方法中去获取辅助提示助理器,如果可以获取到,则会进入computeCompletionProposals方法,来获取改提示的数组;如果获取不到,直接返回result的结果为null,就是用户看到的“No proposals”;
5、不为空时,进入CommonContentAssistProcessor类的computeCompletionProposals方法;此方法主要功能是收集所有需要显示的提示词或句;
6、除了系统自带的读文件获取的提示以外,就是doComputeCompletionProposals方法的自定义提示;
7、接下来就会进入到JSContentAssistProcessor类的doComputeCompletionProposals方法,这是js相关的others提示;
8、此方法会根据不同的LocationType来收集不同的辅助提示;
四、JS编辑器错误警告
关于错误警告都是根据解析报错来的,所以基本上每一次解析后面都有,而且异常基本也都是自己定义的,结果也是自己处理的。此处没有深入调研过,只作简单说明。
错误有这么几种类型:JSErrorType
五、调研源码中的DFA算法
DFA算法是解析文本和语法高亮的时候用到的一种计算token的算法,此处只写源码中使用DFA的流程,并不详细介绍。
1、因为解析使用的是UTF-8的字符,所以需要一张65535个单元的表用来把一个字符映射到字符类,ZZ_CMAP_PACKED
2、此时就需要一张DFA的状态表;ZZ_TRANS_PACKED_0------------需要通过计算偏移量将原本4553的状态码计算生成14755的DFA状态码;
3、接着需要把字符类的状态转换为上述状态转换表中的行索引;ZZ_ROWMAP_PACKED_0---------------通过计算将转换表中的644个状态码转换成321个行索引状态码;
4、初始化一个DFA的属性状态表;ZZ_ATTRIBUTE_PACKED_0------------------通过偏移量计算将166个DFA属性状态码计算成321个状态码;
5、DFA词法分析时的词法状态数组;ZZ_LEXSTATE
6、最后一步将DFA状态转换为正则,进行switch匹配;ZZ_ACTION_PACKED_0
说明:以上内容只是针对aptana-studio3中的js编辑器的部分调研,所以一些类都是源码中的;此调研均为调用流程,不是个中代码书写的原因,所以只是用来记录指导新手调研。有瑕疵望指出,谢谢您有耐心看完!
最后
以上就是从容雪糕为你收集整理的插件开发:关于aptana编辑器中JS编辑器的调研的全部内容,希望文章能够帮你解决插件开发:关于aptana编辑器中JS编辑器的调研所遇到的程序开发问题。
如果觉得靠谱客网站的内容还不错,欢迎将靠谱客网站推荐给程序员好友。
发表评论 取消回复