java编译器源码解析-语义分析-属性分析

二、属性分析

属性分析attribute(),核心逻辑在Attr类的attrib()方法。

com.sun.tools.javac.comp.Attr 类的代码。在这个类的头注释里,你会发现原来 ATTR 做了四件事:

Check:类型检查。

Resolve:做名称的消解,

ConstFold:常量折叠,

Infer:用于泛型中的类型参数推导。

2.1.类型检查

类型检查的方法调用链如下:


JavaCompiler.compile()
->JavaCompiler.attribute()
->Attr.attib()
->Attr.attribClass()      
->Attr.attribClassBody()
->Attr.attribStat()      
->Attr.attribTree()      
->Attr.visitVarDef()      
->Attr.attribExpr(TCTree,Env,Type)
->Attr.attribTree()      
->Attr.visitLiteral()    
->Attr.check()            
->Check.checkType()      

主要内容就是比较赋值表达式等号两边的类型是否匹配。

2.2.引用消解

就是把代码中用到了各种符号,包括类、变量和方法关联到他们的定义的过程。

com.sun.tools.javac.comp.Resolve 类的 findIdentInternal() 方法

引用消解的实现思路也很清晰。编译器在 Enter 阶段已经建立了作用域的嵌套结构。那么在这里,编译器只需要沿着这个嵌套结构逐级查找就行了.

2.3.常量折叠

2.4.泛型类型参数推导

posted @ 2022-04-15 15:12  Mars.wang  阅读(274)  评论(0编辑  收藏  举报