home *** CD-ROM | disk | FTP | other *** search
- package sun.tools.tree;
-
- import java.io.PrintStream;
- import java.util.Hashtable;
- import sun.tools.asm.Assembler;
- import sun.tools.java.AmbiguousField;
- import sun.tools.java.ClassDeclaration;
- import sun.tools.java.ClassDefinition;
- import sun.tools.java.ClassNotFound;
- import sun.tools.java.CompilerError;
- import sun.tools.java.Constants;
- import sun.tools.java.Environment;
- import sun.tools.java.FieldDefinition;
- import sun.tools.java.Identifier;
- import sun.tools.java.IdentifierToken;
- import sun.tools.java.Type;
-
- public class FieldExpression extends UnaryExpression {
- // $FF: renamed from: id sun.tools.java.Identifier
- Identifier field_0;
- FieldDefinition field;
- Expression implementation;
-
- public FieldExpression(int var1, Expression var2, Identifier var3) {
- super(46, var1, Type.tError, var2);
- this.field_0 = var3;
- }
-
- public FieldExpression(int var1, Expression var2, FieldDefinition var3) {
- super(46, var1, var3.getType(), var2);
- this.field_0 = var3.getName();
- this.field = var3;
- }
-
- public Expression getImplementation() {
- return (Expression)(this.implementation != null ? this.implementation : this);
- }
-
- public static Identifier toIdentifier(Expression var0) {
- StringBuffer var1;
- FieldExpression var2;
- for(var1 = new StringBuffer(); var0.op == 46; var0 = var2.right) {
- var2 = (FieldExpression)var0;
- if (var2.field_0 == Constants.idThis || var2.field_0 == Constants.idClass) {
- return null;
- }
-
- var1.insert(0, var2.field_0);
- var1.insert(0, '.');
- }
-
- if (var0.op != 60) {
- return null;
- } else {
- var1.insert(0, ((IdentifierExpression)var0).id);
- return Identifier.lookup(var1.toString());
- }
- }
-
- Type toType(Environment var1, Context var2) {
- Identifier var3 = toIdentifier(this);
- if (var3 == null) {
- var1.error(super.where, "invalid.type.expr");
- return Type.tError;
- } else {
- Type var4 = Type.tClass(var2.resolveName(var1, var3));
- return var1.resolve(super.where, var2.field.getClassDefinition(), var4) ? var4 : Type.tError;
- }
- }
-
- public Vset checkAmbigName(Environment var1, Context var2, Vset var3, Hashtable var4, UnaryExpression var5) {
- if (this.field_0 == Constants.idThis || this.field_0 == Constants.idClass) {
- var5 = null;
- }
-
- return this.checkCommon(var1, var2, var3, var4, var5);
- }
-
- public Vset checkValue(Environment var1, Context var2, Vset var3, Hashtable var4) {
- return this.checkCommon(var1, var2, var3, var4, (UnaryExpression)null);
- }
-
- static void reportFailedPackagePrefix(Environment var0, Expression var1) {
- Expression var2;
- for(var2 = var1; var2 instanceof UnaryExpression; var2 = ((UnaryExpression)var2).right) {
- }
-
- IdentifierExpression var3 = (IdentifierExpression)var2;
- if (var2 == var1) {
- var0.error(var3.where, "undef.var.or.class", var3.id);
- } else if (var0.innerClasses()) {
- var0.error(var3.where, "undef.var.class.or.package", var3.id);
- } else {
- var0.error(var3.where, "undef.var.or.package", var3.id);
- }
- }
-
- private Vset checkCommon(Environment var1, Context var2, Vset var3, Hashtable var4, UnaryExpression var5) {
- if (this.field != null) {
- return super.right == null ? var3 : super.right.checkAmbigName(var1, var2, var3, var4, this);
- } else {
- var3 = super.right.checkAmbigName(var1, var2, var3, var4, this);
- if (super.right.type == Type.tPackage) {
- if (var5 == null) {
- reportFailedPackagePrefix(var1, super.right);
- return var3;
- } else {
- Identifier var19 = toIdentifier(this);
- if (var19 != null && var1.classExists(var19)) {
- var5.right = new TypeExpression(super.where, Type.tClass(var19));
- var1.resolve(super.where, var2.field.getClassDefinition(), var5.right.type);
- return var3;
- } else {
- super.type = Type.tPackage;
- return var3;
- }
- }
- } else {
- try {
- boolean var6 = super.right instanceof TypeExpression;
- if (this.field_0 == Constants.idClass) {
- if (!var6) {
- var1.error(super.right.where, "invalid.type.expr");
- }
-
- Type var20 = super.right.type;
- if (!var20.isType(10) && !var20.isType(9)) {
- if (var20.isType(13)) {
- super.type = Type.tClassDesc;
- return var3;
- }
-
- Object var22 = null;
- String var23;
- switch (var20.getTypeCode()) {
- case 0:
- var23 = "Boolean";
- break;
- case 1:
- var23 = "Byte";
- break;
- case 2:
- var23 = "Character";
- break;
- case 3:
- var23 = "Short";
- break;
- case 4:
- var23 = "Integer";
- break;
- case 5:
- var23 = "Long";
- break;
- case 6:
- var23 = "Float";
- break;
- case 7:
- var23 = "Double";
- break;
- case 8:
- case 9:
- case 10:
- default:
- var1.error(super.right.where, "invalid.type.expr");
- return var3;
- case 11:
- var23 = "Void";
- }
-
- Identifier var26 = Identifier.lookup(Constants.idJavaLang + "." + var23);
- TypeExpression var29 = new TypeExpression(super.where, Type.tClass(var26));
- this.implementation = new FieldExpression(super.where, var29, Constants.idTYPE);
- var3 = this.implementation.checkValue(var1, var2, var3, var4);
- super.type = this.implementation.type;
- return var3;
- }
-
- FieldDefinition var21 = getClassLiteralLookup(var1, var2);
- if (var21 == null) {
- super.type = Type.tClassDesc;
- var1.error(super.where, "invalid.field.reference", this.field_0, var20);
- return var3;
- }
-
- String var25 = var20.getTypeSignature();
- String var28;
- if (var20.isType(10)) {
- var28 = var25.substring(1, var25.length() - 1).replace('/', '.');
- } else {
- var28 = var25.replace('/', '.');
- }
-
- FieldDefinition var11 = getClassLiteralCache(var1, var2, var28);
- this.implementation = this.makeClassLiteralCacheRef(var1, var2, var21, var11, var28);
- var3 = this.implementation.checkValue(var1, var2, var3, var4);
- super.type = this.implementation.type;
- return var3;
- }
-
- if (!super.right.type.isType(10)) {
- if (super.right.type.isType(9) && this.field_0.equals(Constants.idLength)) {
- super.type = Type.tInt;
- this.implementation = new LengthExpression(super.where, super.right);
- return var3;
- }
-
- if (!super.right.type.isType(13)) {
- var1.error(super.where, "invalid.field.reference", this.field_0, super.right.type);
- }
-
- return var3;
- }
-
- ClassDefinition var7 = var1.getClassDefinition(super.right.type);
- if (this.field_0 == Constants.idThis) {
- if (!var6) {
- var1.error(super.right.where, "invalid.type.expr");
- }
-
- this.implementation = var2.findOuterLink(var1, super.where, var7, (FieldDefinition)null);
- var3 = this.implementation.checkValue(var1, var2, var3, var4);
- super.type = var7.getType();
- return var3;
- }
-
- this.field = var7.getVariable(var1, this.field_0);
- if (this.field == null && var1.innerClasses() && var6 && var5 != null) {
- this.field = var7.getInnerClass(var1, this.field_0);
- if (this.field != null) {
- return this.checkInnerClass(var1, var2, var3, var4, var5);
- }
- }
-
- if (this.field == null) {
- if ((this.field = var7.findAnyMethod(var1, this.field_0)) != null) {
- var1.error(super.where, "invalid.field", this.field_0, this.field.getClassDeclaration());
- } else {
- var1.error(super.where, "no.such.field", this.field_0, var7);
- }
-
- return var3;
- }
-
- ClassDefinition var8 = var2.field.getClassDefinition();
- super.type = this.field.getType();
- if (!var8.canAccess(var1, this.field)) {
- var1.error(super.where, "no.field.access", this.field_0, var7, var2.field.getClassDeclaration());
- return var3;
- }
-
- if (var6 && !this.field.isStatic()) {
- ClassDefinition var9 = this.field.getClassDefinition();
- if (!var9.implementedBy(var1, var2.field.getClassDeclaration()) || var2.field.isStatic()) {
- var1.error(super.where, "no.static.field.access", this.field_0, var7);
- return var3;
- }
-
- ThisExpression var10 = new ThisExpression(super.right.where);
- var3 = ((Expression)var10).checkValue(var1, var2, var3, var4);
- this.implementation = new FieldExpression(super.where, var10, this.field);
- this.implementation.type = super.type;
- var6 = false;
- }
-
- if (this.field.isProtected() && !(super.right instanceof SuperExpression) && !var8.protectedAccess(var1, this.field, super.right.type)) {
- var1.error(super.where, "invalid.protected.field.use", this.field.getName(), this.field.getClassDeclaration(), super.right.type);
- return var3;
- }
-
- if (this.field.isPrivate()) {
- ClassDefinition var24 = this.field.getClassDefinition();
- if (var24 != var8) {
- FieldDefinition var27 = var24.getAccessField(var1, var2, this.field);
- if (var27 != null) {
- this.implementation = new MethodExpression(super.where, super.right, var27, new Expression[0]);
- return var3;
- }
-
- var1.error(super.where, "uplevel.private", this.field_0, var24);
- }
- }
-
- if (!this.field.isStatic() && super.right.op == 82 && !var3.testVar(var2.getThisNumber())) {
- var1.error(super.where, "access.inst.before.super", this.field_0);
- }
-
- if (this.field.reportDeprecated(var1)) {
- var1.error(super.where, "warn.field.is.deprecated", this.field_0, this.field.getClassDefinition());
- }
-
- var2.field.getClassDefinition().addDependency(this.field.getClassDeclaration());
- } catch (ClassNotFound var12) {
- var1.error(super.where, "class.not.found", var12.name, var2.field);
- } catch (AmbiguousField var13) {
- var1.error(super.where, "ambig.field", this.field_0, var13.field1.getClassDeclaration(), var13.field2.getClassDeclaration());
- }
-
- return var3;
- }
- }
- }
-
- private Vset checkInnerClass(Environment var1, Context var2, Vset var3, Hashtable var4, UnaryExpression var5) {
- ClassDefinition var6 = this.field.getInnerClass();
- super.type = var6.getType();
- if (!var6.isTopLevel()) {
- var1.error(super.where, "inner.static.ref", var6.getName());
- }
-
- TypeExpression var7 = new TypeExpression(super.where, super.type);
- ClassDefinition var8 = var2.field.getClassDefinition();
-
- try {
- if (!var8.canAccess(var1, this.field)) {
- ClassDefinition var9 = var1.getClassDefinition(super.right.type);
- var1.error(super.where, "no.type.access", this.field_0, var9, var2.field.getClassDeclaration());
- return var3;
- }
-
- if (this.field.isProtected() && !(super.right instanceof SuperExpression) && !var8.protectedAccess(var1, this.field, super.right.type)) {
- var1.error(super.where, "invalid.protected.field.use", this.field.getName(), this.field.getClassDeclaration(), super.right.type);
- return var3;
- }
-
- var6.noteUsedBy(var8, super.where, var1);
- } catch (ClassNotFound var10) {
- var1.error(super.where, "class.not.found", var10.name, var2.field);
- }
-
- var2.field.getClassDefinition().addDependency(this.field.getClassDeclaration());
- if (var5 == null) {
- return ((Expression)var7).checkValue(var1, var2, var3, var4);
- } else {
- var5.right = var7;
- return var3;
- }
- }
-
- public Vset checkLHS(Environment var1, Context var2, Vset var3, Hashtable var4) {
- boolean var5 = this.field != null;
- this.checkValue(var1, var2, var3, var4);
- if (this.implementation != null) {
- return super.checkLHS(var1, var2, var3, var4);
- } else {
- if (this.field != null && this.field.isFinal() && !var5) {
- if (super.right != null && super.right.op == 82 && !this.field.isStatic()) {
- var3 = checkFinalAssign(var1, var2, var3, super.where, this.field);
- } else {
- var1.error(super.where, "assign.to.final", this.field_0);
- }
- }
-
- return var3;
- }
- }
-
- public Vset checkAssignOp(Environment var1, Context var2, Vset var3, Hashtable var4, Expression var5) {
- this.checkValue(var1, var2, var3, var4);
- if (this.implementation != null) {
- return super.checkLHS(var1, var2, var3, var4);
- } else {
- if (this.field != null && this.field.isFinal()) {
- var1.error(super.where, "assign.to.final", this.field_0);
- }
-
- return var3;
- }
- }
-
- public static Vset checkFinalAssign(Environment var0, Context var1, Vset var2, int var3, FieldDefinition var4) {
- if (var4.isBlankFinal() && var4.getClassDefinition() == var1.field.getClassDefinition()) {
- int var7 = var1.getMemberNumber(var4);
- if (var7 >= 0 && var2.testVarUnassigned(var7)) {
- var2 = var2.addVar(var7);
- } else {
- Identifier var6 = var4.getName();
- var0.error(var3, "assign.to.blank.final", var6);
- }
- } else {
- Identifier var5 = var4.getName();
- var0.error(var3, "assign.to.final", var5);
- }
-
- return var2;
- }
-
- private static FieldDefinition getClassLiteralLookup(Environment var0, Context var1) {
- ClassDefinition var2;
- for(var2 = var1.field.getClassDefinition(); var2.isInnerClass(); var2 = var2.getOuterClass()) {
- }
-
- Identifier var3 = Identifier.lookup("class$");
- Type[] var4 = new Type[]{Type.tString};
-
- FieldDefinition var5;
- try {
- var5 = var2.matchMethod(var0, var2, var3, var4);
- } catch (ClassNotFound var22) {
- return null;
- } catch (AmbiguousField var23) {
- return null;
- }
-
- if (var5 != null) {
- return var5;
- } else {
- int var6 = var2.getWhere();
- IdentifierToken var7 = new IdentifierToken(var6, var3);
- IdentifierExpression var8 = new IdentifierExpression(var7);
- Expression[] var9 = new Expression[]{var8};
- Identifier var10 = Identifier.lookup("forName");
- MethodExpression var24 = new MethodExpression(var6, new TypeExpression(var6, Type.tClassDesc), var10, var9);
- ReturnStatement var11 = new ReturnStatement(var6, var24);
- Identifier var12 = Identifier.lookup("java.lang.ClassNotFoundException");
- Identifier var13 = Identifier.lookup("java.lang.NoClassDefFoundError");
- Type var14 = Type.tClass(var12);
- Type var15 = Type.tClass(var13);
- Identifier var16 = Identifier.lookup("getMessage");
- IdentifierExpression var25 = new IdentifierExpression(var6, var10);
- MethodExpression var26 = new MethodExpression(var6, var25, var16, new Expression[0]);
- Expression[] var17 = new Expression[]{var26};
- NewInstanceExpression var27 = new NewInstanceExpression(var6, new TypeExpression(var6, var15), var17);
- CatchStatement var18 = new CatchStatement(var6, new TypeExpression(var6, var14), new IdentifierToken(var10), new ThrowStatement(var6, var27));
- Statement[] var19 = new Statement[]{var18};
- TryStatement var28 = new TryStatement(var6, var11, var19);
- Type var20 = Type.tMethod(Type.tClassDesc, var4);
- IdentifierToken[] var21 = new IdentifierToken[]{var7};
- return var0.makeFieldDefinition(var0, var6, var2, (String)null, 524296, var20, var3, var21, (IdentifierToken[])null, var28);
- }
- }
-
- private static FieldDefinition getClassLiteralCache(Environment var0, Context var1, String var2) {
- String var3;
- if (!var2.startsWith("[")) {
- var3 = "class$" + var2.replace('.', '$');
- } else {
- var3 = "array$" + var2.substring(1);
- var3 = var3.replace('[', '$');
- if (var2.endsWith(";")) {
- var3 = var3.substring(0, var3.length() - 1);
- var3 = var3.replace('.', '$');
- }
- }
-
- Identifier var4 = Identifier.lookup(var3);
-
- ClassDefinition var5;
- for(var5 = var1.field.getClassDefinition(); var5.isInnerClass(); var5 = var5.getOuterClass()) {
- }
-
- FieldDefinition var6;
- try {
- var6 = var5.getVariable(var0, var4);
- } catch (ClassNotFound var7) {
- return null;
- } catch (AmbiguousField var8) {
- return null;
- }
-
- return var6 != null ? var6 : var0.makeFieldDefinition(var0, var5.getWhere(), var5, (String)null, 524296, Type.tClassDesc, var4, (IdentifierToken[])null, (IdentifierToken[])null, (Object)null);
- }
-
- private Expression makeClassLiteralCacheRef(Environment var1, Context var2, FieldDefinition var3, FieldDefinition var4, String var5) {
- TypeExpression var6 = new TypeExpression(super.where, var4.getClassDefinition().getType());
- FieldExpression var7 = new FieldExpression(super.where, var6, var4);
- NotEqualExpression var8 = new NotEqualExpression(super.where, ((Expression)var7).copyInline(var2), new NullExpression(super.where));
- TypeExpression var9 = new TypeExpression(super.where, var3.getClassDefinition().getType());
- StringExpression var10 = new StringExpression(super.where, var5);
- Expression[] var11 = new Expression[]{var10};
- MethodExpression var12 = new MethodExpression(super.where, var9, var3, var11);
- AssignExpression var13 = new AssignExpression(super.where, ((Expression)var7).copyInline(var2), var12);
- return new ConditionalExpression(super.where, var8, var7, var13);
- }
-
- public boolean isConstant() {
- if (this.implementation != null) {
- return this.implementation.isConstant();
- } else {
- return this.field == null || super.right != null && !(super.right instanceof TypeExpression) && (super.right.op != 82 || super.right.where != super.where) ? false : this.field.isConstant();
- }
- }
-
- public Expression inline(Environment var1, Context var2) {
- if (this.implementation != null) {
- return this.implementation.inline(var1, var2);
- } else {
- return super.right != null ? super.right.inline(var1, var2) : null;
- }
- }
-
- public Expression inlineValue(Environment var1, Context var2) {
- if (this.implementation != null) {
- return this.implementation.inlineValue(var1, var2);
- } else {
- try {
- if (this.field == null) {
- return this;
- } else {
- if (this.field.isFinal()) {
- Expression var3 = (Expression)this.field.getValue(var1);
- if (var3 != null && var3.isConstant()) {
- var3 = var3.copyInline(var2);
- var3.where = super.where;
- return (new CommaExpression(super.where, super.right, var3)).inlineValue(var1, var2);
- }
- }
-
- if (super.right != null) {
- if (this.field.isStatic()) {
- Expression var5 = super.right.inline(var1, var2);
- super.right = null;
- if (var5 != null) {
- return new CommaExpression(super.where, var5, this);
- }
- } else {
- super.right = super.right.inlineValue(var1, var2);
- }
- }
-
- return this;
- }
- } catch (ClassNotFound var4) {
- throw new CompilerError(var4);
- }
- }
- }
-
- public Expression inlineLHS(Environment var1, Context var2) {
- if (this.implementation != null) {
- return this.implementation.inlineLHS(var1, var2);
- } else {
- if (super.right != null) {
- if (this.field.isStatic()) {
- Expression var3 = super.right.inline(var1, var2);
- super.right = null;
- if (var3 != null) {
- return new CommaExpression(super.where, var3, this);
- }
- } else {
- super.right = super.right.inlineValue(var1, var2);
- }
- }
-
- return this;
- }
- }
-
- public Expression copyInline(Context var1) {
- return this.implementation != null ? this.implementation.copyInline(var1) : super.copyInline(var1);
- }
-
- public int costInline(int var1, Environment var2, Context var3) {
- if (this.implementation != null) {
- return this.implementation.costInline(var1, var2, var3);
- } else if (var3 == null) {
- return 3 + (super.right == null ? 0 : super.right.costInline(var1, var2, var3));
- } else {
- ClassDefinition var4 = var3.field.getClassDefinition();
-
- try {
- if (var4.canAccess(var2, this.field.getClassDeclaration()) && var4.canAccess(var2, this.field)) {
- if (super.right == null) {
- return 3;
- }
-
- ClassDeclaration var5 = var2.getClassDeclaration(super.right.type);
- if (var4.canAccess(var2, var5)) {
- return 3 + super.right.costInline(var1, var2, var3);
- }
- }
- } catch (ClassNotFound var6) {
- }
-
- return var1;
- }
- }
-
- int codeLValue(Environment var1, Context var2, Assembler var3) {
- if (this.implementation != null) {
- throw new CompilerError("codeLValue");
- } else if (this.field.isStatic()) {
- if (super.right != null) {
- super.right.code(var1, var2, var3);
- return 1;
- } else {
- return 0;
- }
- } else {
- super.right.codeValue(var1, var2, var3);
- return 1;
- }
- }
-
- void codeLoad(Environment var1, Context var2, Assembler var3) {
- if (this.field == null) {
- throw new CompilerError("should not be null");
- } else if (this.field.isStatic()) {
- var3.add(super.where, 178, this.field);
- } else {
- var3.add(super.where, 180, this.field);
- }
- }
-
- void codeStore(Environment var1, Context var2, Assembler var3) {
- if (this.field.isStatic()) {
- var3.add(super.where, 179, this.field);
- } else {
- var3.add(super.where, 181, this.field);
- }
- }
-
- public void codeValue(Environment var1, Context var2, Assembler var3) {
- this.codeLValue(var1, var2, var3);
- this.codeLoad(var1, var2, var3);
- }
-
- public void print(PrintStream var1) {
- var1.print("(");
- if (super.right != null) {
- super.right.print(var1);
- } else {
- var1.print("<empty>");
- }
-
- var1.print("." + this.field_0 + ")");
- if (this.implementation != null) {
- var1.print("/IMPL=");
- this.implementation.print(var1);
- }
-
- }
- }
-