二、属性分析
属性分析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 阶段已经建立了作用域的嵌套结构。那么在这里,编译器只需要沿着这个嵌套结构逐级查找就行了.