From 3ef5db284843be7fecb665448ee6efea87bc3395 Mon Sep 17 00:00:00 2001 From: spikeuci Date: Wed, 9 Nov 2011 02:14:53 +0000 Subject: [PATCH] Handling the case NAME DOT THIS for inner classes --- Robust/src/IR/Tree/BuildIR.java | 8 ++++---- Robust/src/IR/Tree/FieldAccessNode.java | 3 +++ Robust/src/IR/Tree/SemanticCheck.java | 24 +++++++++++++++++++++--- 3 files changed, 28 insertions(+), 7 deletions(-) diff --git a/Robust/src/IR/Tree/BuildIR.java b/Robust/src/IR/Tree/BuildIR.java index 48367754..31f062e9 100644 --- a/Robust/src/IR/Tree/BuildIR.java +++ b/Robust/src/IR/Tree/BuildIR.java @@ -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); diff --git a/Robust/src/IR/Tree/FieldAccessNode.java b/Robust/src/IR/Tree/FieldAccessNode.java index 151478cd..d7c28bda 100644 --- a/Robust/src/IR/Tree/FieldAccessNode.java +++ b/Robust/src/IR/Tree/FieldAccessNode.java @@ -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; } diff --git a/Robust/src/IR/Tree/SemanticCheck.java b/Robust/src/IR/Tree/SemanticCheck.java index 7b505875..5d96ada5 100644 --- a/Robust/src/IR/Tree/SemanticCheck.java +++ b/Robust/src/IR/Tree/SemanticCheck.java @@ -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); -- 2.34.1