Skip to content

Commit

Permalink
feat: use namespace <name>; over #pragma namespace <name>
Browse files Browse the repository at this point in the history
  • Loading branch information
jumanji144 committed Feb 4, 2024
1 parent 188a808 commit 6dae1bc
Show file tree
Hide file tree
Showing 4 changed files with 24 additions and 12 deletions.
8 changes: 7 additions & 1 deletion lib/include/pl/core/parser.hpp
Original file line number Diff line number Diff line change
Expand Up @@ -36,7 +36,7 @@ namespace pl::core {
explicit Parser() = default;
~Parser() override = default;

hlp::CompileResult<std::vector<std::shared_ptr<ast::ASTNode>>> parse(const std::vector<Token> &tokens, const std::vector<std::string>& prefixNamespace = {});
hlp::CompileResult<std::vector<std::shared_ptr<ast::ASTNode>>> parse(const std::vector<Token> &tokens);

const auto &getTypes() { return this->m_types; }

Expand All @@ -48,6 +48,10 @@ namespace pl::core {
this->m_parserManager = parserManager;
}

void setDefaultNamespace(const std::vector<std::string> &defaultNamespace) {
this->m_defaultNamespace = defaultNamespace;
}

private:
TokenIter m_curr;
TokenIter m_startToken, m_originalPosition, m_partOriginalPosition;
Expand All @@ -64,6 +68,8 @@ namespace pl::core {

ParserManager* m_parserManager = nullptr;

std::vector<std::string> m_defaultNamespace;

Location location() override;
// error helpers
void errorHere(const std::string &message);
Expand Down
17 changes: 14 additions & 3 deletions lib/source/pl/core/parser.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -2083,6 +2083,17 @@ namespace pl::core {
break;
}

if (sequence(tkn::Separator::Semicolon)) {
// default namespace declaration
if (!m_defaultNamespace.empty()) {
return { };
}

this->m_defaultNamespace = this->m_currNamespace.back();

return { };
}

if (!sequence(tkn::Separator::LeftBrace)) {
error("Expected '{{' at beginning of namespace, got {}.", getFormattedToken(0));
return { };
Expand Down Expand Up @@ -2282,7 +2293,7 @@ namespace pl::core {
}

// <(parseNamespace)...> EndOfProgram
hlp::CompileResult<std::vector<std::shared_ptr<ast::ASTNode>>> Parser::parse(const std::vector<Token> &tokens, const std::vector<std::string>& prefixNamespace) {
hlp::CompileResult<std::vector<std::shared_ptr<ast::ASTNode>>> Parser::parse(const std::vector<Token> &tokens) {

this->m_curr = this->m_startToken = this->m_originalPosition = this->m_partOriginalPosition
= TokenIter(tokens.begin(), tokens.end());
Expand All @@ -2294,8 +2305,8 @@ namespace pl::core {

this->m_currNamespace.clear();
this->m_currNamespace.emplace_back();
if(!prefixNamespace.empty())
this->m_currNamespace.push_back(prefixNamespace);
if (!this->m_defaultNamespace.empty())
this->m_currNamespace.back() = this->m_defaultNamespace;

try {
auto program = parseTillToken(tkn::Separator::EndOfProgram);
Expand Down
9 changes: 2 additions & 7 deletions lib/source/pl/core/parser_manager.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -27,12 +27,6 @@ ParserManager::parse(api::Source *source, const std::string &namespacePrefix) {

const auto& preprocessor = internals.preprocessor;

preprocessor->addPragmaHandler("namespace", [&](auto&, const std::string& value) {
if(namespacePrefix.empty())
namespaces = wolv::util::splitString(value, "::");
return true;
});

const auto& lexer = internals.lexer;
const auto& validator = internals.validator;

Expand All @@ -53,8 +47,9 @@ ParserManager::parse(api::Source *source, const std::string &namespacePrefix) {
}

parser.setParserManager(this);
parser.setDefaultNamespace(namespaces);

auto result = parser.parse(tokens.value(), namespaces);
auto result = parser.parse(tokens.value());
if (result.hasErrs())
return result;

Expand Down
2 changes: 1 addition & 1 deletion tests/source/main.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -88,7 +88,7 @@ int runTests(int argc, char **argv) {
)", "IA");

(void)runtime.addVirtualSource(R"(
#pragma namespace B
namespace B;
import IC as C;
Expand Down

0 comments on commit 6dae1bc

Please sign in to comment.