home *** CD-ROM | disk | FTP | other *** search
/ Symantec Visual Cafe for Java 2.5 / symantec-visual-cafe-2.5-database-dev-edition.iso / VPage / Java.bin / CLASSES.ZIP / sun / tools / tree / IdentifierExpression.class (.txt) < prev    next >
Encoding:
Java Class File  |  1997-07-08  |  10.0 KB  |  357 lines

  1. package sun.tools.tree;
  2.  
  3. import java.io.PrintStream;
  4. import java.util.Hashtable;
  5. import sun.tools.asm.Assembler;
  6. import sun.tools.asm.LocalVariable;
  7. import sun.tools.java.AmbiguousField;
  8. import sun.tools.java.ClassDefinition;
  9. import sun.tools.java.ClassNotFound;
  10. import sun.tools.java.CompilerError;
  11. import sun.tools.java.Constants;
  12. import sun.tools.java.Environment;
  13. import sun.tools.java.FieldDefinition;
  14. import sun.tools.java.Identifier;
  15. import sun.tools.java.IdentifierToken;
  16. import sun.tools.java.Type;
  17.  
  18. public class IdentifierExpression extends Expression {
  19.    // $FF: renamed from: id sun.tools.java.Identifier
  20.    Identifier field_0;
  21.    FieldDefinition field;
  22.    Expression implementation;
  23.  
  24.    public IdentifierExpression(int var1, Identifier var2) {
  25.       super(60, var1, Type.tError);
  26.       this.field_0 = var2;
  27.    }
  28.  
  29.    public IdentifierExpression(IdentifierToken var1) {
  30.       this(var1.getWhere(), var1.getName());
  31.    }
  32.  
  33.    public IdentifierExpression(int var1, FieldDefinition var2) {
  34.       super(60, var1, var2.getType());
  35.       this.field_0 = var2.getName();
  36.       this.field = var2;
  37.    }
  38.  
  39.    public Expression getImplementation() {
  40.       return (Expression)(this.implementation != null ? this.implementation : this);
  41.    }
  42.  
  43.    public boolean equals(Identifier var1) {
  44.       return this.field_0.equals(var1);
  45.    }
  46.  
  47.    private Vset assign(Environment var1, Context var2, Vset var3) {
  48.       if (this.field.isLocal()) {
  49.          LocalField var4 = (LocalField)this.field;
  50.          if (var4.scopeNumber < var2.frameNumber) {
  51.             var1.error(super.where, "assign.to.uplevel", this.field_0);
  52.          }
  53.  
  54.          if (((FieldDefinition)var4).isFinal()) {
  55.             if (!((FieldDefinition)var4).isBlankFinal()) {
  56.                var1.error(super.where, "assign.to.final", this.field_0);
  57.             } else if (!var3.testVarUnassigned(var4.number)) {
  58.                var1.error(super.where, "assign.to.blank.final", this.field_0);
  59.             }
  60.          }
  61.  
  62.          var3.addVar(var4.number);
  63.          ++var4.writecount;
  64.       } else if (this.field.isFinal()) {
  65.          var3 = FieldExpression.checkFinalAssign(var1, var2, var3, super.where, this.field);
  66.       }
  67.  
  68.       return var3;
  69.    }
  70.  
  71.    private Vset get(Environment var1, Context var2, Vset var3) {
  72.       if (this.field.isLocal()) {
  73.          LocalField var4 = (LocalField)this.field;
  74.          if (var4.scopeNumber < var2.frameNumber && !((FieldDefinition)var4).isFinal()) {
  75.             var1.error(super.where, "invalid.uplevel", this.field_0);
  76.          }
  77.  
  78.          if (!var3.testVar(var4.number)) {
  79.             var1.error(super.where, "var.not.initialized", this.field_0);
  80.             var3.addVar(var4.number);
  81.          }
  82.  
  83.          ++var4.readcount;
  84.       } else {
  85.          if (!this.field.isStatic() && !var3.testVar(var2.getThisNumber())) {
  86.             var1.error(super.where, "access.inst.before.super", this.field_0);
  87.             this.implementation = null;
  88.          }
  89.  
  90.          if (this.field.isBlankFinal()) {
  91.             int var5 = var2.getMemberNumber(this.field);
  92.             if (var5 >= 0 && !var3.testVar(var5)) {
  93.                var1.error(super.where, "var.not.initialized", this.field_0);
  94.             }
  95.          }
  96.       }
  97.  
  98.       return var3;
  99.    }
  100.  
  101.    boolean bind(Environment var1, Context var2) {
  102.       try {
  103.          this.field = var2.getField(var1, this.field_0);
  104.          if (this.field != null) {
  105.             super.type = this.field.getType();
  106.             if (!var2.field.getClassDefinition().canAccess(var1, this.field)) {
  107.                var1.error(super.where, "no.field.access", this.field_0, this.field.getClassDeclaration(), var2.field.getClassDeclaration());
  108.                return false;
  109.             }
  110.  
  111.             if (this.field.isLocal()) {
  112.                LocalField var9 = (LocalField)this.field;
  113.                if (var9.scopeNumber < var2.frameNumber) {
  114.                   this.implementation = var2.makeReference(var1, var9);
  115.                }
  116.             } else {
  117.                FieldDefinition var10 = this.field;
  118.                if (var10.reportDeprecated(var1)) {
  119.                   var1.error(super.where, "warn.field.is.deprecated", this.field_0, var10.getClassDefinition());
  120.                }
  121.  
  122.                ClassDefinition var4 = var10.getClassDefinition();
  123.                if (var4 != var2.field.getClassDefinition()) {
  124.                   FieldDefinition var5 = var2.getApparentField(var1, this.field_0);
  125.                   if (var5 != null && var5 != var10) {
  126.                      ClassDefinition var6 = var2.findScope(var1, var4);
  127.                      if (var6 == null) {
  128.                         var6 = var10.getClassDefinition();
  129.                      }
  130.  
  131.                      if (var5.isLocal()) {
  132.                         var1.error(super.where, "inherited.hides.local", this.field_0, var6.getClassDeclaration());
  133.                      } else {
  134.                         var1.error(super.where, "inherited.hides.field", this.field_0, var6.getClassDeclaration(), var5.getClassDeclaration());
  135.                      }
  136.                   }
  137.                }
  138.  
  139.                if (var10.isStatic()) {
  140.                   new TypeExpression(super.where, var10.getClassDeclaration().getType());
  141.                   this.implementation = new FieldExpression(super.where, (Expression)null, var10);
  142.                } else {
  143.                   Expression var11 = var2.findOuterLink(var1, super.where, var10);
  144.                   if (var11 != null) {
  145.                      this.implementation = new FieldExpression(super.where, var11, var10);
  146.                   }
  147.                }
  148.             }
  149.  
  150.             if (!var2.canReach(var1, this.field)) {
  151.                var1.error(super.where, "forward.ref", this.field_0, this.field.getClassDeclaration());
  152.                return false;
  153.             }
  154.  
  155.             return true;
  156.          }
  157.  
  158.          for(ClassDefinition var3 = var2.field.getClassDefinition(); var3 != null; var3 = var3.getOuterClass()) {
  159.             if (var3.findAnyMethod(var1, this.field_0) != null) {
  160.                var1.error(super.where, "invalid.var", this.field_0, var2.field.getClassDeclaration());
  161.                return false;
  162.             }
  163.          }
  164.  
  165.          var1.error(super.where, "undef.var", this.field_0);
  166.          return false;
  167.       } catch (ClassNotFound var7) {
  168.          var1.error(super.where, "class.not.found", var7.name, var2.field);
  169.       } catch (AmbiguousField var8) {
  170.          var1.error(super.where, "ambig.field", this.field_0, var8.field1.getClassDeclaration(), var8.field2.getClassDeclaration());
  171.       }
  172.  
  173.       return false;
  174.    }
  175.  
  176.    public Vset checkValue(Environment var1, Context var2, Vset var3, Hashtable var4) {
  177.       if (this.field != null) {
  178.          return var3;
  179.       } else {
  180.          if (this.bind(var1, var2)) {
  181.             var3 = this.get(var1, var2, var3);
  182.             var2.field.getClassDefinition().addDependency(this.field.getClassDeclaration());
  183.             if (this.implementation != null) {
  184.                var3 = this.implementation.checkValue(var1, var2, var3, var4);
  185.             }
  186.          }
  187.  
  188.          return var3;
  189.       }
  190.    }
  191.  
  192.    public Vset checkLHS(Environment var1, Context var2, Vset var3, Hashtable var4) {
  193.       if (!this.bind(var1, var2)) {
  194.          return var3;
  195.       } else {
  196.          var3 = this.assign(var1, var2, var3);
  197.          if (this.implementation != null) {
  198.             var3 = this.implementation.checkValue(var1, var2, var3, var4);
  199.          }
  200.  
  201.          return var3;
  202.       }
  203.    }
  204.  
  205.    public Vset checkAssignOp(Environment var1, Context var2, Vset var3, Hashtable var4, Expression var5) {
  206.       if (!this.bind(var1, var2)) {
  207.          return var3;
  208.       } else {
  209.          var3 = this.assign(var1, var2, this.get(var1, var2, var3));
  210.          if (this.implementation != null) {
  211.             var3 = this.implementation.checkValue(var1, var2, var3, var4);
  212.          }
  213.  
  214.          return var3;
  215.       }
  216.    }
  217.  
  218.    public Vset checkAmbigName(Environment var1, Context var2, Vset var3, Hashtable var4, UnaryExpression var5) {
  219.       try {
  220.          if (var2.getField(var1, this.field_0) != null) {
  221.             return this.checkValue(var1, var2, var3, var4);
  222.          }
  223.       } catch (ClassNotFound var7) {
  224.       } catch (AmbiguousField var8) {
  225.       }
  226.  
  227.       ClassDefinition var6 = this.toResolvedType(var1, var2, true);
  228.       if (var6 != null) {
  229.          var5.right = new TypeExpression(super.where, var6.getType());
  230.          return var3;
  231.       } else {
  232.          super.type = Type.tPackage;
  233.          return var3;
  234.       }
  235.    }
  236.  
  237.    private ClassDefinition toResolvedType(Environment var1, Context var2, boolean var3) {
  238.       Identifier var4 = var2.resolveName(var1, this.field_0);
  239.       Type var5 = Type.tClass(var4);
  240.       if (var3 && !var1.classExists(var5)) {
  241.          return null;
  242.       } else {
  243.          if (var1.resolve(super.where, var2.field.getClassDefinition(), var5)) {
  244.             try {
  245.                ClassDefinition var6 = var1.getClassDefinition(var5);
  246.                if (var6.isMember()) {
  247.                   ClassDefinition var7 = var2.findScope(var1, var6.getOuterClass());
  248.                   if (var7 != var6.getOuterClass()) {
  249.                      Identifier var8 = var2.getApparentClassName(var1, this.field_0);
  250.                      if (!var8.equals(Constants.idNull) && !var8.equals(var4)) {
  251.                         var1.error(super.where, "inherited.hides.type", this.field_0, var7.getClassDeclaration());
  252.                      }
  253.                   }
  254.                }
  255.  
  256.                if (!var6.getLocalName().equals(this.field_0.getFlatName().getName())) {
  257.                   var1.error(super.where, "illegal.mangled.name", this.field_0, var6);
  258.                }
  259.  
  260.                return var6;
  261.             } catch (ClassNotFound var9) {
  262.             }
  263.          }
  264.  
  265.          return null;
  266.       }
  267.    }
  268.  
  269.    Type toType(Environment var1, Context var2) {
  270.       ClassDefinition var3 = this.toResolvedType(var1, var2, false);
  271.       return var3 != null ? var3.getType() : Type.tError;
  272.    }
  273.  
  274.    public boolean isConstant() {
  275.       if (this.implementation != null) {
  276.          return this.implementation.isConstant();
  277.       } else {
  278.          return this.field != null ? this.field.isConstant() : false;
  279.       }
  280.    }
  281.  
  282.    public Expression inline(Environment var1, Context var2) {
  283.       return null;
  284.    }
  285.  
  286.    public Expression inlineValue(Environment var1, Context var2) {
  287.       if (this.implementation != null) {
  288.          return this.implementation.inlineValue(var1, var2);
  289.       } else if (this.field == null) {
  290.          return this;
  291.       } else {
  292.          try {
  293.             if (this.field.isLocal()) {
  294.                if (this.field.isInlineable(var1, false)) {
  295.                   Expression var3 = (Expression)this.field.getValue(var1);
  296.                   return (Expression)(var3 == null ? this : var3.inlineValue(var1, var2));
  297.                } else {
  298.                   return this;
  299.                }
  300.             } else {
  301.                return this;
  302.             }
  303.          } catch (ClassNotFound var4) {
  304.             throw new CompilerError(var4);
  305.          }
  306.       }
  307.    }
  308.  
  309.    public Expression inlineLHS(Environment var1, Context var2) {
  310.       return (Expression)(this.implementation != null ? this.implementation.inlineLHS(var1, var2) : this);
  311.    }
  312.  
  313.    public Expression copyInline(Context var1) {
  314.       if (this.implementation != null) {
  315.          return this.implementation.copyInline(var1);
  316.       } else {
  317.          IdentifierExpression var2 = (IdentifierExpression)super.copyInline(var1);
  318.          if (this.field != null && this.field.isLocal()) {
  319.             var2.field = ((LocalField)this.field).getCurrentInlineCopy(var1);
  320.          }
  321.  
  322.          return var2;
  323.       }
  324.    }
  325.  
  326.    public int costInline(int var1, Environment var2, Context var3) {
  327.       return this.implementation != null ? this.implementation.costInline(var1, var2, var3) : super.costInline(var1, var2, var3);
  328.    }
  329.  
  330.    int codeLValue(Environment var1, Context var2, Assembler var3) {
  331.       return 0;
  332.    }
  333.  
  334.    void codeLoad(Environment var1, Context var2, Assembler var3) {
  335.       var3.add(super.where, 21 + super.type.getTypeCodeOffset(), new Integer(((LocalField)this.field).number));
  336.    }
  337.  
  338.    void codeStore(Environment var1, Context var2, Assembler var3) {
  339.       LocalField var4 = (LocalField)this.field;
  340.       var3.add(super.where, 54 + super.type.getTypeCodeOffset(), new LocalVariable(var4, var4.number));
  341.    }
  342.  
  343.    public void codeValue(Environment var1, Context var2, Assembler var3) {
  344.       this.codeLValue(var1, var2, var3);
  345.       this.codeLoad(var1, var2, var3);
  346.    }
  347.  
  348.    public void print(PrintStream var1) {
  349.       var1.print(this.field_0 + "#" + (this.field != null ? this.field.hashCode() : 0));
  350.       if (this.implementation != null) {
  351.          var1.print("/IMPL=");
  352.          this.implementation.print(var1);
  353.       }
  354.  
  355.    }
  356. }
  357.