|  | @@ -8,6 +8,8 @@
 | 
											
												
													
														|  |  #include "Visitor.h"
 |  |  #include "Visitor.h"
 | 
											
												
													
														|  |  #include "Scope.h"
 |  |  #include "Scope.h"
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | 
 |  | +#include "Type.h"
 | 
											
												
													
														|  | 
 |  | +
 | 
											
												
													
														|  |  #include <llvm/IR/Value.h>
 |  |  #include <llvm/IR/Value.h>
 | 
											
												
													
														|  |  #include <llvm/IR/IRBuilder.h>
 |  |  #include <llvm/IR/IRBuilder.h>
 | 
											
												
													
														|  |  #include <llvm/IR/BasicBlock.h>
 |  |  #include <llvm/IR/BasicBlock.h>
 | 
											
										
											
												
													
														|  | @@ -19,7 +21,6 @@ namespace qlow
 | 
											
												
													
														|  |          std::unique_ptr<GlobalScope>
 |  |          std::unique_ptr<GlobalScope>
 | 
											
												
													
														|  |              createFromAst(const std::vector<std::unique_ptr<qlow::ast::AstObject>>& objects);
 |  |              createFromAst(const std::vector<std::unique_ptr<qlow::ast::AstObject>>& objects);
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -        struct SemanticObject;
 |  | 
 | 
											
												
													
														|  |          struct Class;
 |  |          struct Class;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |          struct Variable;
 |  |          struct Variable;
 | 
											
										
											
												
													
														|  | @@ -52,7 +53,7 @@ namespace qlow
 | 
											
												
													
														|  |          class SemanticException;
 |  |          class SemanticException;
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    class ExpressionVisitor;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    class ExpressionCodegenVisitor;
 | 
											
												
													
														|  |      class StatementVisitor;
 |  |      class StatementVisitor;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      namespace gen
 |  |      namespace gen
 | 
											
										
											
												
													
														|  | @@ -62,17 +63,6 @@ namespace qlow
 | 
											
												
													
														|  |  }
 |  |  }
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -struct qlow::sem::SemanticObject
 |  | 
 | 
											
												
													
														|  | -{
 |  | 
 | 
											
												
													
														|  | -    virtual ~SemanticObject(void);
 |  | 
 | 
											
												
													
														|  | -    
 |  | 
 | 
											
												
													
														|  | -    /**
 |  | 
 | 
											
												
													
														|  | -     * \brief converts the object to a readable string for debugging purposes. 
 |  | 
 | 
											
												
													
														|  | -     */
 |  | 
 | 
											
												
													
														|  | -    virtual std::string toString(void) const;
 |  | 
 | 
											
												
													
														|  | -};
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  | -
 |  | 
 | 
											
												
													
														|  |  struct qlow::sem::Class : public SemanticObject
 |  |  struct qlow::sem::Class : public SemanticObject
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  |      qlow::ast::Class* astNode;
 |  |      qlow::ast::Class* astNode;
 | 
											
										
											
												
													
														|  | @@ -233,8 +223,14 @@ struct qlow::sem::Expression :
 | 
											
												
													
														|  |      public SemanticObject,
 |  |      public SemanticObject,
 | 
											
												
													
														|  |      public Visitable<std::pair<llvm::Value*, sem::Type*>,
 |  |      public Visitable<std::pair<llvm::Value*, sem::Type*>,
 | 
											
												
													
														|  |                       llvm::IRBuilder<>,
 |  |                       llvm::IRBuilder<>,
 | 
											
												
													
														|  | -                     qlow::ExpressionVisitor>
 |  | 
 | 
											
												
													
														|  | 
 |  | +                     qlow::ExpressionCodegenVisitor>
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  | 
 |  | +    std::unique_ptr<sem::Type> type;
 | 
											
												
													
														|  | 
 |  | +    
 | 
											
												
													
														|  | 
 |  | +    inline Expression(std::unique_ptr<Type> type) :
 | 
											
												
													
														|  | 
 |  | +        type{ std::move(type) }
 | 
											
												
													
														|  | 
 |  | +    {
 | 
											
												
													
														|  | 
 |  | +    }
 | 
											
												
													
														|  |  };
 |  |  };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -248,7 +244,7 @@ struct qlow::sem::LocalVariableExpression : public Expression
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  |      Variable* var;
 |  |      Variable* var;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  | -    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionVisitor& visitor, llvm::IRBuilder<>& arg2) override;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionCodegenVisitor& visitor, llvm::IRBuilder<>& arg2) override;
 | 
											
												
													
														|  |      virtual std::string toString(void) const override;
 |  |      virtual std::string toString(void) const override;
 | 
											
												
													
														|  |  };
 |  |  };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -258,7 +254,7 @@ struct qlow::sem::BinaryOperation : public Operation
 | 
											
												
													
														|  |      std::unique_ptr<Expression> left;
 |  |      std::unique_ptr<Expression> left;
 | 
											
												
													
														|  |      std::unique_ptr<Expression> right;
 |  |      std::unique_ptr<Expression> right;
 | 
											
												
													
														|  |      
 |  |      
 | 
											
												
													
														|  | -    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionVisitor& visitor, llvm::IRBuilder<>& arg2) override;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionCodegenVisitor& visitor, llvm::IRBuilder<>& arg2) override;
 | 
											
												
													
														|  |      
 |  |      
 | 
											
												
													
														|  |      virtual std::string toString(void) const override;
 |  |      virtual std::string toString(void) const override;
 | 
											
												
													
														|  |  };
 |  |  };
 | 
											
										
											
												
													
														|  | @@ -269,7 +265,7 @@ struct qlow::sem::NewArrayExpression : public Expression
 | 
											
												
													
														|  |      std::unique_ptr<Type> arrayType;
 |  |      std::unique_ptr<Type> arrayType;
 | 
											
												
													
														|  |      std::unique_ptr<Expression> length;
 |  |      std::unique_ptr<Expression> length;
 | 
											
												
													
														|  |      
 |  |      
 | 
											
												
													
														|  | -    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionVisitor& visitor, llvm::IRBuilder<>& arg2) override;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionCodegenVisitor& visitor, llvm::IRBuilder<>& arg2) override;
 | 
											
												
													
														|  |      virtual std::string toString(void) const override;
 |  |      virtual std::string toString(void) const override;
 | 
											
												
													
														|  |  };
 |  |  };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -278,7 +274,7 @@ struct qlow::sem::UnaryOperation : public Operation
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  |      qlow::ast::UnaryOperation::Side side;
 |  |      qlow::ast::UnaryOperation::Side side;
 | 
											
												
													
														|  |      std::unique_ptr<Expression> arg;
 |  |      std::unique_ptr<Expression> arg;
 | 
											
												
													
														|  | -    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionVisitor& visitor, llvm::IRBuilder<>& arg2) override;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionCodegenVisitor& visitor, llvm::IRBuilder<>& arg2) override;
 | 
											
												
													
														|  |      virtual std::string toString(void) const override;
 |  |      virtual std::string toString(void) const override;
 | 
											
												
													
														|  |  };
 |  |  };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
										
											
												
													
														|  | @@ -287,7 +283,7 @@ struct qlow::sem::FeatureCallExpression : public Expression
 | 
											
												
													
														|  |  {
 |  |  {
 | 
											
												
													
														|  |      Method* callee;
 |  |      Method* callee;
 | 
											
												
													
														|  |      OwningList<Expression> arguments;
 |  |      OwningList<Expression> arguments;
 | 
											
												
													
														|  | -    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionVisitor& visitor, llvm::IRBuilder<>& arg2) override;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionCodegenVisitor& visitor, llvm::IRBuilder<>& arg2) override;
 | 
											
												
													
														|  |      
 |  |      
 | 
											
												
													
														|  |      virtual std::string toString(void) const override;
 |  |      virtual std::string toString(void) const override;
 | 
											
												
													
														|  |  };
 |  |  };
 | 
											
										
											
												
													
														|  | @@ -298,11 +294,12 @@ struct qlow::sem::IntConst : public Expression
 | 
											
												
													
														|  |      unsigned long long value;
 |  |      unsigned long long value;
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |      inline IntConst(unsigned long long value) :
 |  |      inline IntConst(unsigned long long value) :
 | 
											
												
													
														|  | 
 |  | +        Expression{ std::make_unique<NativeType>(NativeType::INTEGER) },
 | 
											
												
													
														|  |          value{ value }
 |  |          value{ value }
 | 
											
												
													
														|  |      {
 |  |      {
 | 
											
												
													
														|  |      }
 |  |      }
 | 
											
												
													
														|  |      
 |  |      
 | 
											
												
													
														|  | -    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionVisitor& visitor, llvm::IRBuilder<>& arg2) override;
 |  | 
 | 
											
												
													
														|  | 
 |  | +    virtual std::pair<llvm::Value*, sem::Type*> accept(ExpressionCodegenVisitor& visitor, llvm::IRBuilder<>& arg2) override;
 | 
											
												
													
														|  |  };
 |  |  };
 | 
											
												
													
														|  |  
 |  |  
 | 
											
												
													
														|  |  
 |  |  
 |