Make expressions return type on typecheck
This commit is contained in:
parent
902610aaea
commit
d11da4d1e6
12
src/ast.h
12
src/ast.h
@ -24,7 +24,7 @@ namespace AST {
|
||||
public:
|
||||
Expression(token::Metadata meta) : Node{ meta } {}
|
||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) = 0;
|
||||
virtual typecheck::TypecheckResult typecheck(
|
||||
virtual std::shared_ptr<types::Type> typecheck(
|
||||
typecheck::State& state,
|
||||
typecheck::Scope& scope,
|
||||
std::optional<std::shared_ptr<types::Type>> expected_ty
|
||||
@ -46,7 +46,7 @@ namespace AST {
|
||||
virtual ~IntLiteralExpression() override = default;
|
||||
virtual std::string formatted() override;
|
||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
||||
virtual typecheck::TypecheckResult typecheck(
|
||||
virtual std::shared_ptr<types::Type> typecheck(
|
||||
typecheck::State& state,
|
||||
typecheck::Scope& scope,
|
||||
std::optional<std::shared_ptr<types::Type>> expected_ty
|
||||
@ -61,7 +61,7 @@ namespace AST {
|
||||
virtual ~StringLiteralExpression() override = default;
|
||||
virtual std::string formatted() override;
|
||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
||||
virtual typecheck::TypecheckResult typecheck(
|
||||
virtual std::shared_ptr<types::Type> typecheck(
|
||||
typecheck::State& state,
|
||||
typecheck::Scope& scope,
|
||||
std::optional<std::shared_ptr<types::Type>> expected_ty
|
||||
@ -76,7 +76,7 @@ namespace AST {
|
||||
virtual ~ValueReferenceExpression() override = default;
|
||||
virtual std::string formatted() override;
|
||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
||||
virtual typecheck::TypecheckResult typecheck(
|
||||
virtual std::shared_ptr<types::Type> typecheck(
|
||||
typecheck::State& state,
|
||||
typecheck::Scope& scope,
|
||||
std::optional<std::shared_ptr<types::Type>> expected_ty
|
||||
@ -102,7 +102,7 @@ namespace AST {
|
||||
virtual ~BinaryOperationExpression() override = default;
|
||||
virtual std::string formatted() override;
|
||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
||||
virtual typecheck::TypecheckResult typecheck(
|
||||
virtual std::shared_ptr<types::Type> typecheck(
|
||||
typecheck::State& state,
|
||||
typecheck::Scope& scope,
|
||||
std::optional<std::shared_ptr<types::Type>> expected_ty
|
||||
@ -125,7 +125,7 @@ namespace AST {
|
||||
virtual ~FunctionCallExpression() override = default;
|
||||
virtual std::string formatted() override;
|
||||
virtual codegen::StackValue codegen(codegen::Builder& builder, codegen::Scope& scope) override;
|
||||
virtual typecheck::TypecheckResult typecheck(
|
||||
virtual std::shared_ptr<types::Type> typecheck(
|
||||
typecheck::State& state,
|
||||
typecheck::Scope& scope,
|
||||
std::optional<std::shared_ptr<types::Type>> expected_ty
|
||||
|
||||
@ -4,7 +4,7 @@
|
||||
#include "errors.h"
|
||||
|
||||
namespace AST {
|
||||
typecheck::TypecheckResult IntLiteralExpression::typecheck(
|
||||
std::shared_ptr<types::Type> IntLiteralExpression::typecheck(
|
||||
typecheck::State& state,
|
||||
typecheck::Scope& scope,
|
||||
std::optional<std::shared_ptr<types::Type>> expected_ty
|
||||
@ -12,7 +12,7 @@ namespace AST {
|
||||
throw CompileError("TODO", {});
|
||||
}
|
||||
|
||||
typecheck::TypecheckResult StringLiteralExpression::typecheck(
|
||||
std::shared_ptr<types::Type> StringLiteralExpression::typecheck(
|
||||
typecheck::State& state,
|
||||
typecheck::Scope& scope,
|
||||
std::optional<std::shared_ptr<types::Type>> expected_ty
|
||||
@ -20,7 +20,7 @@ namespace AST {
|
||||
throw CompileError("TODO", {});
|
||||
}
|
||||
|
||||
typecheck::TypecheckResult ValueReferenceExpression::typecheck(
|
||||
std::shared_ptr<types::Type> ValueReferenceExpression::typecheck(
|
||||
typecheck::State& state,
|
||||
typecheck::Scope& scope,
|
||||
std::optional<std::shared_ptr<types::Type>> expected_ty
|
||||
@ -28,7 +28,7 @@ namespace AST {
|
||||
throw CompileError("TODO", {});
|
||||
}
|
||||
|
||||
typecheck::TypecheckResult BinaryOperationExpression::typecheck(
|
||||
std::shared_ptr<types::Type> BinaryOperationExpression::typecheck(
|
||||
typecheck::State& state,
|
||||
typecheck::Scope& scope,
|
||||
std::optional<std::shared_ptr<types::Type>> expected_ty
|
||||
@ -36,7 +36,7 @@ namespace AST {
|
||||
throw CompileError("TODO", {});
|
||||
}
|
||||
|
||||
typecheck::TypecheckResult FunctionCallExpression::typecheck(
|
||||
std::shared_ptr<types::Type> FunctionCallExpression::typecheck(
|
||||
typecheck::State& state,
|
||||
typecheck::Scope& scope,
|
||||
std::optional<std::shared_ptr<types::Type>> expected_ty
|
||||
|
||||
@ -7,15 +7,6 @@
|
||||
#include "errors.h"
|
||||
|
||||
namespace typecheck {
|
||||
enum class TypecheckResult {
|
||||
/// @brief The types match perfectly (enough)
|
||||
Ok,
|
||||
/// @brief The original type can be implicitly cast into the given type
|
||||
Castable,
|
||||
/// @brief The types are totally incompatible
|
||||
Error,
|
||||
};
|
||||
|
||||
struct Scope {
|
||||
std::map<std::string, std::shared_ptr<types::Type>> symbols;
|
||||
std::optional<std::shared_ptr<types::Type>> return_ty;
|
||||
|
||||
Loading…
Reference in New Issue
Block a user