فهرست منبع

Fix for safe member access operator on LHS of an assignment.

Mark Sibly 7 سال پیش
والد
کامیت
4399d4be80
3فایلهای تغییر یافته به همراه47 افزوده شده و 4 حذف شده
  1. 1 1
      src/mx2cc/mx2cc.monkey2
  2. 22 1
      src/mx2cc/stmtexpr.monkey2
  3. 24 2
      src/mx2cc/test.monkey2

+ 1 - 1
src/mx2cc/mx2cc.monkey2

@@ -34,7 +34,7 @@ Global opts_time:Bool
 
 
 Global StartDir:String
 Global StartDir:String
 
 
-Const TestArgs:="mx2cc makemods -target=ios"
+Const TestArgs:="mx2cc makemods"
 
 
 'Const TestArgs:="mx2cc makedocs mojo"
 'Const TestArgs:="mx2cc makedocs mojo"
 'Const TestArgs:="pyro-framework pyro-gui pyro-scenegraph pyro-tiled"
 'Const TestArgs:="pyro-framework pyro-gui pyro-scenegraph pyro-tiled"

+ 22 - 1
src/mx2cc/stmtexpr.monkey2

@@ -73,8 +73,29 @@ Class AssignStmtExpr Extends StmtExpr
 		Return lhs.ToString()+op+rhs.ToString()
 		Return lhs.ToString()+op+rhs.ToString()
 	End
 	End
 	
 	
-	Method OnSemant:Stmt( block:Block ) Override
+	'special case for SafeMemberExpr on lhs of assignment...
+	'
+	Method OnSemant:Stmt( smexpr:SafeMemberExpr,block:Block )
+		
+		Local value:=smexpr.expr.SemantRValue( block ).RemoveSideEffects( block )
+		
+		Local mexpr:=New MemberExpr( New ValueExpr( value,0,0 ),smexpr.ident,smexpr.srcpos,smexpr.endpos )
+		
+		Local asexpr:=New AssignStmtExpr( Self.op,mexpr,Self.rhs,srcpos,endpos )
+		
+		Local tblock:=New Block( block )
+		
+		tblock.Semant( New StmtExpr[]( asexpr ) )
+		
+		Return New IfStmt( self,value.UpCast( Type.BoolType ),tblock )
+	End
 	
 	
+	Method OnSemant:Stmt( block:Block ) Override
+		
+		Local smexpr:=Cast<SafeMemberExpr>( lhs )
+		
+		If smexpr Return OnSemant( smexpr,block )
+		
 		Local op:=Self.op
 		Local op:=Self.op
 		Local lhs:=Self.lhs.Semant( block )
 		Local lhs:=Self.lhs.Semant( block )
 		Local rhs:Value=Null
 		Local rhs:Value=Null

+ 24 - 2
src/mx2cc/test.monkey2

@@ -1,7 +1,29 @@
 
 
+Class C
+
+	Field c:C
+	Field f:Int
+	
+	Property F:Int()
+		
+		Return f
+	
+	Setter( f:Int )
+		
+		Self.f=f
+	
+	End
+End
+
 Function Main()
 Function Main()
 	
 	
-	If String<>Null Print "oops"
+	Local c:C=New C
+	
+	c.c=c
+	
+	c?.c?.f=10
+	
+	c?.c?.F=100
 	
 	
+	Print c.f
 End
 End
-