From bce1b1c79cb61a28fd8b66cbf2b4197705da672e Mon Sep 17 00:00:00 2001 From: Deukhoofd Date: Sat, 9 Jan 2021 15:33:34 +0100 Subject: [PATCH] Simple binding for virtprops. --- src/Binder/Binder.cpp | 23 +++++++++++++++++++++++ src/Parser/Statements/ParsedStatement.hpp | 12 ++++++------ 2 files changed, 29 insertions(+), 6 deletions(-) diff --git a/src/Binder/Binder.cpp b/src/Binder/Binder.cpp index 342cd39..5426471 100644 --- a/src/Binder/Binder.cpp +++ b/src/Binder/Binder.cpp @@ -209,6 +209,29 @@ namespace MalachScript::Binder { break; } + case ParsedStatementKind::VirtProp: { + const auto* var = static_cast(statement); + const auto& typeStatement = var->GetReturnType(); + // FIXME: Resolve namespace of scoped identifier + auto type = ResolveType(ns, typeStatement->GetScopedIdentifier().GetIdentifier()); + if (!type.has_value()) { + log(DiagnosticLevel::Error, DiagnosticType::UnknownType, typeStatement->GetSpan(), + {typeStatement->GetScopedIdentifier().GetIdentifier().GetStdString()}); + type = UnknownType; + } + if (activeType.has_value()) { + if (var->GetGetStatement() == nullptr && var->GetSetStatement() == nullptr) { + // FIXME: we're just adding properties as a field now, this is wrong. + activeType.value()->AddField(var->GetIdentifier(), + new BoundVariable(type.value(), var->GetAccess())); + } else { + // TODO: non-auto property. + } + } else { + throw std::logic_error("TODO: Property outside of class should log an error"); + } + break; + } default: break; } } diff --git a/src/Parser/Statements/ParsedStatement.hpp b/src/Parser/Statements/ParsedStatement.hpp index e899df1..a98c04a 100644 --- a/src/Parser/Statements/ParsedStatement.hpp +++ b/src/Parser/Statements/ParsedStatement.hpp @@ -209,17 +209,17 @@ namespace MalachScript::Parser { class ParsedVirtPropStatement : public ParsedStatementImpl { public: - ParsedVirtPropStatement(const ScriptTextSpan& span, AccessModifier access, const ParsedStatement* returnType, - bool isReturnTypeRef, Identifier identifier, bool hasGet, bool getConst, - FuncAttr getAttr, const ParsedStatement* getStatement, bool hasSet, bool setConst, - FuncAttr setAttr, const ParsedStatement* setStatement) + ParsedVirtPropStatement(const ScriptTextSpan& span, AccessModifier access, + const ParsedTypeStatement* returnType, bool isReturnTypeRef, Identifier identifier, + bool hasGet, bool getConst, FuncAttr getAttr, const ParsedStatement* getStatement, + bool hasSet, bool setConst, FuncAttr setAttr, const ParsedStatement* setStatement) : ParsedStatementImpl(span), _access(access), _returnType(returnType), _isReturnTypeRef(isReturnTypeRef), _identifier(identifier), _hasGet(hasGet), _getConst(getConst), _getAttr(getAttr), _getStatement(getStatement), _hasSet(hasSet), _setConst(setConst), _setAttr(setAttr), _setStatement(setStatement) {} [[nodiscard]] inline AccessModifier GetAccess() const noexcept { return _access; } - [[nodiscard]] inline const std::unique_ptr& GetReturnType() const noexcept { + [[nodiscard]] inline const std::unique_ptr& GetReturnType() const noexcept { return _returnType; } [[nodiscard]] inline bool IsReturnTypeRef() const noexcept { return _isReturnTypeRef; } @@ -241,7 +241,7 @@ namespace MalachScript::Parser { private: AccessModifier _access; - std::unique_ptr _returnType; + std::unique_ptr _returnType; bool _isReturnTypeRef; Identifier _identifier;