summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--src/ast/ast.hpp3
-rw-r--r--src/ast/path.cpp25
-rw-r--r--src/ast/path.hpp9
-rw-r--r--src/convert/resolve.cpp38
4 files changed, 56 insertions, 19 deletions
diff --git a/src/ast/ast.hpp b/src/ast/ast.hpp
index 3ec689f8..e7a0ba2d 100644
--- a/src/ast/ast.hpp
+++ b/src/ast/ast.hpp
@@ -270,7 +270,8 @@ public:
const itemlist_mod_t& submods() const { return m_submods; }
const itemlist_use_t& imports() const { return m_imports; }
const itemlist_ext_t& extern_crates() const { return m_extern_crates; }
- const itemlist_enum_t& enums() const { return m_enums; }
+ const itemlist_static_t& statics() const { return m_statics; }
+ const itemlist_enum_t& enums () const { return m_enums; }
const itemlist_struct_t& structs() const { return m_structs; }
SERIALISABLE_PROTOTYPES();
diff --git a/src/ast/path.cpp b/src/ast/path.cpp
index 354da4da..a868be5d 100644
--- a/src/ast/path.cpp
+++ b/src/ast/path.cpp
@@ -142,11 +142,28 @@ void Path::resolve(const Crate& root_crate)
return ;
}
else {
- throw ParseError::Generic("Import of enum, too many extra nodes");
+ throw ParseError::Generic("Binding path to enum, too many extra nodes");
}
}
}
// - Constants / statics
+ {
+ auto& items = mod->statics();
+ auto it = find_named(items, node.name());
+ if( it != items.end() )
+ {
+ DEBUG("Found static/const");
+ if( is_last ) {
+ if( node.args().size() )
+ throw ParseError::Generic("Unexpected generic params on static/const");
+ bind_static(it->data);
+ return ;
+ }
+ else {
+ throw ParseError::Generic("Binding path to static, trailing nodes");
+ }
+ }
+ }
throw ParseError::Generic("Unable to find component '" + node.name() + "'");
}
@@ -198,6 +215,12 @@ void Path::bind_struct(const Struct& ent, const ::std::vector<TypeRef>& args)
{
throw ParseError::Todo("Path::resolve() bind to struct type");
}
+void Path::bind_static(const Static& ent)
+{
+ m_binding_type = STATIC;
+ m_binding.static_ = &ent;
+}
+
Path& Path::operator+=(const Path& other)
{
diff --git a/src/ast/path.hpp b/src/ast/path.hpp
index 17325d10..f39e133d 100644
--- a/src/ast/path.hpp
+++ b/src/ast/path.hpp
@@ -19,6 +19,7 @@ class Crate;
class Module;
class Enum;
class Struct;
+class Static;
class Function;
@@ -56,6 +57,10 @@ public:
MODULE,
ENUM,
ENUM_VAR,
+ STRUCT,
+ STRUCT_METHOD,
+ FUNCTION,
+ STATIC,
};
private:
enum Class {
@@ -78,6 +83,9 @@ private:
union {
const Module* module_;
const Enum* enum_;
+ const Struct* struct_;
+ const Static* static_;
+ const Function* func_;
struct {
const Enum* enum_;
unsigned int idx;
@@ -157,6 +165,7 @@ private:
void bind_enum(const Enum& ent, const ::std::vector<TypeRef>& args);
void bind_enum_var(const Enum& ent, const ::std::string& name, const ::std::vector<TypeRef>& args);
void bind_struct(const Struct& ent, const ::std::vector<TypeRef>& args);
+ void bind_static(const Static& ent);
};
} // namespace AST
diff --git a/src/convert/resolve.cpp b/src/convert/resolve.cpp
index ee906150..53a1edaf 100644
--- a/src/convert/resolve.cpp
+++ b/src/convert/resolve.cpp
@@ -18,7 +18,7 @@ class CPathResolver
// TODO: Maintain a stack of variable scopes
public:
- CPathResolver(const AST::Crate& crate, const AST::Module& mod);
+ CPathResolver(const AST::Crate& crate, const AST::Module& mod, AST::Path module_path);
enum ResolvePathMode {
MODE_EXPR, // Variables allowed
@@ -85,9 +85,10 @@ public:
}
};
-CPathResolver::CPathResolver(const AST::Crate& crate, const AST::Module& mod):
+CPathResolver::CPathResolver(const AST::Crate& crate, const AST::Module& mod, AST::Path module_path):
m_crate(crate),
- m_module(mod)
+ m_module(mod),
+ m_module_path( ::std::move(module_path) )
{
}
@@ -159,6 +160,14 @@ void CPathResolver::resolve_path(AST::Path& path, ResolvePathMode mode) const
return ;
}
}
+ for( const auto& item : m_module.statics() )
+ {
+ if( item.name == path[0].name() ) {
+ path = m_module_path + path;
+ path.resolve( m_crate );
+ return ;
+ }
+ }
for( const auto& import : m_module.imports() )
{
const ::std::string& bind_name = import.name;
@@ -244,28 +253,22 @@ void CPathResolver::handle_pattern(AST::Pattern& pat)
void CPathResolver::handle_function(AST::Function& fcn)
{
CResolvePaths_NodeVisitor node_visitor(*this);
-
- for( auto& arg : fcn.args() )
- m_locals.push_back(arg.first);
-
- fcn.code().visit_nodes( node_visitor );
+ DEBUG("Return type");
resolve_type(fcn.rettype());
-
+ DEBUG("Args");
for( auto& arg : fcn.args() )
resolve_type(arg.second);
-
+
+ DEBUG("Code");
+ for( auto& arg : fcn.args() )
+ m_locals.push_back(arg.first);
+ fcn.code().visit_nodes( node_visitor );
pop_scope();
if( m_locals.size() != 0 )
throw ParseError::BugCheck("m_locals.size() != 0");
}
-void ResolvePaths_HandleFunction(const AST::Crate& crate, const AST::Module& mod, AST::Function& fcn)
-{
- CPathResolver pr(crate, mod);
- pr.handle_function(fcn);
-}
-
void ResolvePaths_HandleModule_Use(const AST::Crate& crate, const AST::Path& modpath, AST::Module& mod)
{
DEBUG("modpath = " << modpath);
@@ -340,7 +343,8 @@ void ResolvePaths_HandleModule(const AST::Crate& crate, const AST::Path& modpath
{
for( auto& fcn : mod.functions() )
{
- ResolvePaths_HandleFunction(crate, mod, fcn.data);
+ CPathResolver pr(crate, mod, modpath);
+ pr.handle_function(fcn.data);
}
for( auto& submod : mod.submods() )