diff --git a/include/serene/exprs/def.h b/include/serene/exprs/def.h index b270b25..7dafd7d 100644 --- a/include/serene/exprs/def.h +++ b/include/serene/exprs/def.h @@ -44,7 +44,7 @@ public: node value; Def(reader::LocationRange &loc, llvm::StringRef binding, node &v) - : Expression(loc), binding(binding), value(std::move(v)){}; + : Expression(loc), binding(binding), value(v){}; ExprType getType() const; std::string toString() const; diff --git a/include/serene/exprs/list.h b/include/serene/exprs/list.h index 11f7423..e924d39 100644 --- a/include/serene/exprs/list.h +++ b/include/serene/exprs/list.h @@ -46,7 +46,6 @@ public: List(const reader::LocationRange &loc) : Expression(loc){}; List(const reader::LocationRange &loc, node &e); - // List(const reader::LocationRange &loc, llvm::MutableArrayRef elems); List(const reader::LocationRange &loc, ast elems); ExprType getType() const; diff --git a/src/serene/exprs/list.cpp b/src/serene/exprs/list.cpp index 5e48dbd..11248eb 100644 --- a/src/serene/exprs/list.cpp +++ b/src/serene/exprs/list.cpp @@ -26,6 +26,7 @@ #include "serene/exprs/def.h" #include "serene/exprs/symbol.h" #include "llvm/Support/Casting.h" +#include "llvm/Support/ErrorHandling.h" #include "llvm/Support/FormatVariadic.h" #include @@ -37,10 +38,6 @@ List::List(const reader::LocationRange &loc, node &e) : Expression(loc) { elements.push_back(e); }; -// List::List(const reader::LocationRange &loc, llvm::MutableArrayRef -// elems) -// : Expression(loc), elements(elems.begin(), elems.end()) {}; - List::List(const reader::LocationRange &loc, ast elems) : Expression(loc), elements(elems){}; @@ -58,24 +55,34 @@ std::string List::toString() const { }; maybe_node List::analyze(reader::SemanticContext &ctx) { - // if (!elements.empty()) { - // auto *first = elements[0].get(); + if (!elements.empty()) { + auto *first = elements[0].get(); - // if (first->getType() == ExprType::Symbol) { - // auto *sym = llvm::dyn_cast(first); + if (first->getType() == ExprType::Symbol) { + auto *sym = llvm::dyn_cast(first); - // if (sym->name == "def") { - // if (auto err = Def::isValid(this)) { - // // Not a valid `def` form - // return Result::Error(std::move(err)); - // } + if (sym) { + if (sym->name == "def") { + if (auto err = Def::isValid(this)) { + // Not a valid `def` form + return Result::Error(std::move(err)); + } - // auto *binding = llvm::dyn_cast(elements[1].get()); - // auto def = make(binding->name, std::move(elements[2])); - // return Result::Success(std::move(def)); - // } - // } - // } + Symbol *binding = llvm::dyn_cast(elements[1].get()); + + if (!binding) { + llvm_unreachable("Def::isValid should of catch this."); + } + + node def = make(location, binding->name, elements[2]); + return Result::Success(def); + } + } + + // TODO: Return an error saying the binding has to be + // a symbol + } + } return Result::Success(nullptr); }; diff --git a/src/serene/reader/semantics.cpp b/src/serene/reader/semantics.cpp index b818ede..0718325 100644 --- a/src/serene/reader/semantics.cpp +++ b/src/serene/reader/semantics.cpp @@ -39,10 +39,9 @@ exprs::maybe_ast Semantics::analyze(exprs::ast &inputAst) { auto &node = maybeNode.getValue(); if (node) { - llvm::outs() << "HERE\n" << node->toString() << " n\n"; - ast.push_back(std::move(node)); + ast.push_back(node); } else { - ast.push_back(std::move(element)); + ast.push_back(element); } } else { Result::Error(std::move(maybeNode.getError()));