Handling the case NAME DOT THIS for inner classes
authorspikeuci <spikeuci>
Wed, 9 Nov 2011 02:14:53 +0000 (02:14 +0000)
committerspikeuci <spikeuci>
Wed, 9 Nov 2011 02:14:53 +0000 (02:14 +0000)
Robust/src/IR/Tree/BuildIR.java
Robust/src/IR/Tree/FieldAccessNode.java
Robust/src/IR/Tree/SemanticCheck.java

index 483677543811773d7785d06dd0389408d0a798f0..31f062e946508cdb8e74421ca04c33575773add8 100644 (file)
@@ -1205,10 +1205,10 @@ private void addOuterClassReferences( ClassDescriptor cn, int depth )
       NameDescriptor nd=new NameDescriptor("this");
       NameNode nn=new NameNode(nd);
       nn.setNumLine(pn.getLine());
-
-      FieldAccessNode fan=new FieldAccessNode(nn,"this$parent");
-      fan.setNumLine(pn.getLine());
-      return fan;
+       //because inner classes pass right thru......
+    /*  FieldAccessNode fan=new FieldAccessNode(nn,"this$0");
+      fan.setNumLine(pn.getLine());*/
+      return nn;
     } else if (isNode(pn,"isavailable")) {
       NameDescriptor nd=new NameDescriptor(pn.getTerminal());
       NameNode nn=new NameNode(nd);
index 151478cdafaf0ef658cdb2b997845f7ecfbc0ba0..d7c28bda45b2a223b7201929e859b65cd6cf3b43 100644 (file)
@@ -28,6 +28,9 @@ public class FieldAccessNode extends ExpressionNode {
     return left;
   }
 
+  public void setExpression( ExpressionNode en ) {
+       left = en;  
+  }
   public String printNode(int indent) {
     return left.printNode(indent)+"."+fieldname;
   }
index 7b505875eb17e54436a13776623f5af554ae0ad4..5d96ada540fe3cd60cbef22df604c129548bfc5a 100644 (file)
@@ -652,6 +652,7 @@ public class SemanticCheck {
     throw new Error("Cast will always fail\n"+cn.printNode(0));
   }
 
+  //FieldDescriptor checkFieldAccessNodeForParentNode( Descriptor md, SymbolTable na )
   void checkFieldAccessNode(Descriptor md, SymbolTable nametable, FieldAccessNode fan, TypeDescriptor td) {
     ExpressionNode left=fan.getExpression();
     checkExpressionNode(md,nametable,left,null);
@@ -702,6 +703,22 @@ public class SemanticCheck {
       }
     }
 
+    if (fd==null){
+       if((md instanceof MethodDescriptor) && false == ((MethodDescriptor)md).isStaticBlock()) {
+               ClassDescriptor cd = ((MethodDescriptor)md).getClassDesc();
+               FieldAccessNode theFieldNode =  fieldAccessExpression( cd, fieldname, fan.getNumLine() );
+               if( null != theFieldNode ) {
+                       //fan = theFieldNode;
+                       checkFieldAccessNode( md, nametable, theFieldNode, td );
+                       fan.setField( theFieldNode.getField() );
+                       fan.setExpression( theFieldNode.getExpression() );
+                       //TypeDescriptor td1 = fan.getType();
+                       //td1.toString();
+                       return;         
+               }       
+               }
+       throw new Error("Unknown field "+fieldname + " in "+fan.printNode(0)+" in "+md);
+      }
     if (fd==null) {
       ClassDescriptor surroundingCls=ltd.getClassDesc().getSurroundingDesc();
       int numencloses=1;
@@ -727,6 +744,7 @@ public class SemanticCheck {
        throw new Error("Unknown field "+fieldname + " in "+fan.printNode(0)+" in "+md);
     }
 
+
     if (fd.getType().iswrapper()) {
       FieldAccessNode fan2=new FieldAccessNode(left, fieldname);
       fan2.setNumLine(left.getNumLine());
@@ -823,7 +841,7 @@ public class SemanticCheck {
        return recurseSurroundingClasses( surroundingDesc, varname );
   }
 
-  FieldAccessNode fieldAccessExpression( ClassDescriptor icd, String varname, NameNode nn ) {
+  FieldAccessNode fieldAccessExpression( ClassDescriptor icd, String varname, int linenum ) {
        FieldDescriptor fd = recurseSurroundingClasses( icd, varname );
        if( null == fd )
                return null;
@@ -847,7 +865,7 @@ public class SemanticCheck {
        NameDescriptor idDesc = new NameDescriptor( runningDesc, varname );
        
        
-       FieldAccessNode theFieldNode = ( FieldAccessNode )translateNameDescriptorintoExpression( idDesc, nn.getNumLine() );
+       FieldAccessNode theFieldNode = ( FieldAccessNode )translateNameDescriptorintoExpression( idDesc, linenum );
        return theFieldNode;
   }
 
@@ -872,7 +890,7 @@ public class SemanticCheck {
        //check the inner class case first.
        if((md instanceof MethodDescriptor) && false == ((MethodDescriptor)md).isStaticBlock()) {
                cd = ((MethodDescriptor)md).getClassDesc();
-               FieldAccessNode theFieldNode =  fieldAccessExpression( cd, varname, nn );
+               FieldAccessNode theFieldNode =  fieldAccessExpression( cd, varname, nn.getNumLine() );
                if( null != theFieldNode ) {
                        nn.setExpression(( ExpressionNode )theFieldNode);
                        checkExpressionNode(md,nametable,( ExpressionNode )theFieldNode,td);