参考博文:
(1)Check类之duplicate declaration checking/Class name generation/Type Checking
(2)
静态检查是指在编译过程中完成各种一致性检查。由于Java是静态类型的语言,所以在编译阶段,可以对各种表达式进行类型检查,以保证类型符合其上下文对它的期望。
静态检查主要包含了类型检查及语法检查。由于Java是面向对象的语言,所以程序源代码中会频繁对类型进行定义、声明及校验。而语法检查是由JLS规范中定义的,针对某个类型、某种结构都有不同的语法规范要遵循。例如,break语句只能存在于一个循环或者switch语句中,局部变量在使用时必须明确初始化等。
Java是单继承的,也就是说Java只能继承一个实现类。但是在继承过程中可能会形成循环,接口也是。
1 Java类及接口定义的检查
Java在定义时会着重检查方法继承、接口实现与类型变量声明。
Type supertype;
if(tree.extending!=null){
supertype = attr.attribBase(tree.extending, baseEnv, true, false, true);
}else{
if((tree.mods.flags & Flags.ENUM) != 0){
JCExpression jce = enumBase(tree.pos, classSymbol);
supertype = attr.attribBase(jce, baseEnv,true, false, false);
}else if(classSymbol.fullname == names.java_lang_Object){
supertype = Type.noType;
}else{
supertype = syms.objectType;
}
}
如果类定义用extends明确指明了继承的父类,那么就调用Attr.attribBase()方法对父类节点进行标记。否则看这个类是否为枚举类,值得一提的是,Java中将枚举类看为类,将注解定义类看作接口来对待。对于枚举类来说,不能在定义时指明父类,而是通过编译器来自动添加父节点的,调用enumBase()代码如下:
private JCExpression enumBase(int pos, ClassSymbol c) {
JCExpression jce = make.QualIdent(syms.enumSym); // java.lang.Enum
JCExpression arg = make.Type(c.type);
JCExpression result = make.at(pos).TypeApply(jce,List.<JCExpression>of(arg));
retur