|  | @@ -30,6 +30,8 @@ namespace qlow
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          struct Statement;
 | 
	
		
			
				|  |  |          struct Expression;
 | 
	
		
			
				|  |  | +        
 | 
	
		
			
				|  |  | +        struct ThisExpression;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |          struct DoEndBlock;
 | 
	
		
			
				|  |  |          struct IfElseBlock;
 | 
	
	
		
			
				|  | @@ -48,7 +50,8 @@ namespace qlow
 | 
	
		
			
				|  |  |          
 | 
	
		
			
				|  |  |          struct NewArrayExpression;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -        struct FeatureCallExpression;
 | 
	
		
			
				|  |  | +        struct MethodCallExpression;
 | 
	
		
			
				|  |  | +        struct FieldAccessExpression;
 | 
	
		
			
				|  |  |          
 | 
	
		
			
				|  |  |          struct IntConst;
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -124,6 +127,7 @@ struct qlow::sem::Method : public SemanticObject
 | 
	
		
			
				|  |  |      std::vector<Variable*> arguments;
 | 
	
		
			
				|  |  |      std::string name;
 | 
	
		
			
				|  |  |      ast::MethodDefinition* astNode;
 | 
	
		
			
				|  |  | +    std::unique_ptr<ThisExpression> thisExpression;
 | 
	
		
			
				|  |  |      std::unique_ptr<DoEndBlock> body;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      LocalScope scope;
 | 
	
	
		
			
				|  | @@ -132,7 +136,8 @@ struct qlow::sem::Method : public SemanticObject
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      inline Method(Scope& parentScope, std::shared_ptr<Type> returnType) :
 | 
	
		
			
				|  |  |          returnType{ std::move(returnType) },
 | 
	
		
			
				|  |  | -        scope{ parentScope },
 | 
	
		
			
				|  |  | +        scope{ parentScope, this },
 | 
	
		
			
				|  |  | +        thisExpression{ std::make_unique<ThisExpression>(this) },
 | 
	
		
			
				|  |  |          body{ nullptr }
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -140,7 +145,8 @@ struct qlow::sem::Method : public SemanticObject
 | 
	
		
			
				|  |  |      inline Method(ast::MethodDefinition* astNode, Scope& parentScope) :
 | 
	
		
			
				|  |  |          astNode{ astNode },
 | 
	
		
			
				|  |  |          name{ astNode->name },
 | 
	
		
			
				|  |  | -        scope{ parentScope },
 | 
	
		
			
				|  |  | +        scope{ parentScope, this },
 | 
	
		
			
				|  |  | +        thisExpression{ std::make_unique<ThisExpression>(this) },
 | 
	
		
			
				|  |  |          body{ nullptr }
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |      }
 | 
	
	
		
			
				|  | @@ -149,6 +155,17 @@ struct qlow::sem::Method : public SemanticObject
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | +struct qlow::sem::ThisExpression : public Variable
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    Method* method;
 | 
	
		
			
				|  |  | +    inline ThisExpression(Method* method) :
 | 
	
		
			
				|  |  | +        Variable{ method->returnType, "this" },
 | 
	
		
			
				|  |  | +        method{ method}
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  |  struct qlow::sem::Statement : public SemanticObject, public Visitable<llvm::Value*, gen::FunctionGenerator, qlow::StatementVisitor>
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      virtual llvm::Value* accept(qlow::StatementVisitor&, gen::FunctionGenerator&) = 0;
 | 
	
	
		
			
				|  | @@ -160,7 +177,7 @@ struct qlow::sem::DoEndBlock : public Statement
 | 
	
		
			
				|  |  |      LocalScope scope;
 | 
	
		
			
				|  |  |      OwningList<Statement> statements;
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -    inline DoEndBlock(Scope& parentScope) :
 | 
	
		
			
				|  |  | +    inline DoEndBlock(LocalScope& parentScope) :
 | 
	
		
			
				|  |  |          scope{ parentScope } {}
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  |      virtual llvm::Value* accept(qlow::StatementVisitor&, gen::FunctionGenerator&) override;
 | 
	
	
		
			
				|  | @@ -335,15 +352,35 @@ struct qlow::sem::UnaryOperation : public Operation
 | 
	
		
			
				|  |  |  };
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  | -struct qlow::sem::FeatureCallExpression : public Expression
 | 
	
		
			
				|  |  | +struct qlow::sem::MethodCallExpression : public Expression
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  |      Method* callee;
 | 
	
		
			
				|  |  |      std::unique_ptr<Expression> target;
 | 
	
		
			
				|  |  |      OwningList<Expression> arguments;
 | 
	
		
			
				|  |  |      
 | 
	
		
			
				|  |  | -    inline FeatureCallExpression(std::unique_ptr<Expression> target,
 | 
	
		
			
				|  |  | +    inline MethodCallExpression(std::unique_ptr<Expression> target,
 | 
	
		
			
				|  |  |                                   Method* callee) :
 | 
	
		
			
				|  |  | -        Expression{ callee->returnType }
 | 
	
		
			
				|  |  | +        Expression{ callee->returnType },
 | 
	
		
			
				|  |  | +        callee{ callee }
 | 
	
		
			
				|  |  | +    {
 | 
	
		
			
				|  |  | +    }
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    virtual llvm::Value* accept(ExpressionCodegenVisitor& visitor, llvm::IRBuilder<>& arg2) override;
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    virtual std::string toString(void) const override;
 | 
	
		
			
				|  |  | +};
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +
 | 
	
		
			
				|  |  | +struct qlow::sem::FieldAccessExpression : public Expression
 | 
	
		
			
				|  |  | +{
 | 
	
		
			
				|  |  | +    sem::Field* accessed;
 | 
	
		
			
				|  |  | +    std::unique_ptr<Expression> target;
 | 
	
		
			
				|  |  | +    OwningList<Expression> arguments;
 | 
	
		
			
				|  |  | +    
 | 
	
		
			
				|  |  | +    inline FieldAccessExpression(std::unique_ptr<Expression> target,
 | 
	
		
			
				|  |  | +                                 Field* accessed ) :
 | 
	
		
			
				|  |  | +        Expression{ accessed->type },
 | 
	
		
			
				|  |  | +        accessed{ accessed }
 | 
	
		
			
				|  |  |      {
 | 
	
		
			
				|  |  |      }
 | 
	
		
			
				|  |  |      
 | 
	
	
		
			
				|  | @@ -369,8 +406,8 @@ struct qlow::sem::IntConst : public Expression
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |  struct qlow::sem::FeatureCallStatement : public Statement 
 | 
	
		
			
				|  |  |  {
 | 
	
		
			
				|  |  | -    std::unique_ptr<FeatureCallExpression> expr;
 | 
	
		
			
				|  |  | -    inline FeatureCallStatement(std::unique_ptr<FeatureCallExpression> expr) :
 | 
	
		
			
				|  |  | +    std::unique_ptr<MethodCallExpression> expr;
 | 
	
		
			
				|  |  | +    inline FeatureCallStatement(std::unique_ptr<MethodCallExpression> expr) :
 | 
	
		
			
				|  |  |          expr{ std::move(expr) } {}
 | 
	
		
			
				|  |  |  
 | 
	
		
			
				|  |  |      virtual std::string toString(void) const override;
 |