|  | @@ -128,10 +128,17 @@ llvm::Value* ExpressionCodegenVisitor::visit(sem::NewArrayExpression& naexpr, ll
 | 
	
		
			
				|  |  |  llvm::Value* ExpressionCodegenVisitor::visit(sem::MethodCallExpression& call, llvm::IRBuilder<>& builder)
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      using llvm::Value;
 | 
	
		
			
				|  |  | -    std::vector<Value*> arguments;
 | 
	
		
			
				|  |  |      if (call.arguments.size() != call.callee->arguments.size()) {
 | 
	
		
			
				|  |  |          throw "wrong number of arguments";
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    std::vector<Value*> arguments;
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    if (call.target != nullptr) {
 | 
	
		
			
				|  |  | +        auto* target = call.target->accept(*this, builder);
 | 
	
		
			
				|  |  | +        arguments.push_back(target);
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  |      for (size_t i = 0; i < call.arguments.size(); i++) {
 | 
	
		
			
				|  |  |          // : call.arguments) {
 | 
	
		
			
				|  |  |          auto& arg = call.arguments[i];
 | 
	
	
		
			
				|  | @@ -165,6 +172,12 @@ llvm::Value* ExpressionCodegenVisitor::visit(sem::IntConst& node, llvm::IRBuilde
 | 
	
		
			
				|  |  |  }
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +llvm::Value* ExpressionCodegenVisitor::visit(sem::ThisExpression& thisExpr, llvm::IRBuilder<>& builder)
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    return thisExpr.allocaInst;
 | 
	
		
			
				|  |  | +}
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  llvm::Value* StatementVisitor::visit(sem::DoEndBlock& assignment,
 | 
	
		
			
				|  |  |          qlow::gen::FunctionGenerator& fg)
 | 
	
		
			
				|  |  |  {
 | 
	
	
		
			
				|  | @@ -260,9 +273,13 @@ llvm::Value* StatementVisitor::visit(sem::AssignmentStatement& assignment,
 | 
	
		
			
				|  |  |          builder.CreateStore(val, targetVar->var->allocaInst);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      else if (auto* targetVar =
 | 
	
		
			
				|  |  | -        dynamic_cast<sem::MethodCallExpression*>(assignment.target.get()); targetVar) {
 | 
	
		
			
				|  |  | +        dynamic_cast<sem::FieldAccessExpression*>(assignment.target.get()); targetVar) {
 | 
	
		
			
				|  |  |          
 | 
	
		
			
				|  |  | -        logger.debug() << "assigning to MethodCallExpression" << std::endl;
 | 
	
		
			
				|  |  | +        logger.debug() << "assigning to FieldAccessExpression" << std::endl;
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +        llvm::Value* target = targetVar->target->accept(fg.expressionVisitor, builder);
 | 
	
		
			
				|  |  | +        auto elementPtr = builder.CreateGEP(target, llvm::ConstantInt::get(builder.getContext(), llvm::APInt(32, 0)));
 | 
	
		
			
				|  |  | +        builder.CreateStore(val, elementPtr);
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      else {
 | 
	
		
			
				|  |  |          
 |