summaryrefslogtreecommitdiff
path: root/src
diff options
context:
space:
mode:
Diffstat (limited to 'src')
-rw-r--r--src/ast/ast.cpp31
-rw-r--r--src/ast/ast.hpp24
-rw-r--r--src/ast/path.cpp15
-rw-r--r--src/ast/path.hpp8
-rw-r--r--src/types.hpp6
5 files changed, 82 insertions, 2 deletions
diff --git a/src/ast/ast.cpp b/src/ast/ast.cpp
index 48cbdb9d..0c33dcb9 100644
--- a/src/ast/ast.cpp
+++ b/src/ast/ast.cpp
@@ -103,7 +103,8 @@ ExternCrate ExternCrate_std()
Module& std_mod = crate.root_module();
- // TODO: Add modules
+ // === Add modules ===
+ // - option
Module option(crate.crate(), "option");
option.add_enum(true, "Option", Enum(
{
@@ -115,6 +116,29 @@ ExternCrate ExternCrate_std()
}
));
std_mod.add_submod(true, ::std::move(option));
+ // - io
+ Module io(crate.crate(), "io");
+ io.add_typealias(true, "IoResult", TypeAlias(
+ { TypeParam(false, "T") },
+ TypeRef( Path("std", {
+ PathNode("result",{}),
+ PathNode("Result", {TypeRef("T"),TypeRef(Path("std", {PathNode("io"), PathNode("IoError")}))})
+ }) )
+ ));
+ std_mod.add_submod(true, ::std::move(io));
+ // - result
+ Module result(crate.crate(), "result");
+ result.add_enum(true, "Result", Enum(
+ {
+ TypeParam(false, "R"),
+ TypeParam(false, "E"),
+ },
+ {
+ StructItem("Ok", TypeRef(TypeRef::TagArg(), "R")),
+ StructItem("Err", TypeRef(TypeRef::TagArg(), "E")),
+ }
+ ));
+ std_mod.add_submod(true, ::std::move(result));
Module prelude(crate.crate(), "prelude");
// Re-exports
@@ -151,6 +175,11 @@ void Module::iterate_functions(fcn_visitor_t *visitor, const Crate& crate)
}
}
+SERIALISE_TYPE(TypeAlias::, "AST_TypeAlias", {
+ s << m_params;
+ s << m_type;
+})
+
::Serialiser& operator<<(::Serialiser& s, Static::Class fc)
{
switch(fc)
diff --git a/src/ast/ast.hpp b/src/ast/ast.hpp
index fe07ae7d..77eb4fe3 100644
--- a/src/ast/ast.hpp
+++ b/src/ast/ast.hpp
@@ -78,6 +78,23 @@ public:
SERIALISABLE_PROTOTYPES();
};
+class TypeAlias:
+ public Serialisable
+{
+ TypeParams m_params;
+ TypeRef m_type;
+public:
+ TypeAlias(TypeParams params, TypeRef type):
+ m_params( move(params) ),
+ m_type( move(type) )
+ {}
+
+ const TypeParams& params() const { return m_params; }
+ const TypeRef& type() const { return m_type; }
+
+ SERIALISABLE_PROTOTYPES();
+};
+
class Static:
public Serialisable
{
@@ -256,8 +273,10 @@ class Module:
itemlist_fcn_t m_functions;
itemlist_mod_t m_submods;
itemlist_use_t m_imports;
+ ::std::vector<Item<TypeAlias> > m_type_aliases;
itemlist_ext_t m_extern_crates;
+
itemlist_static_t m_statics;
itemlist_enum_t m_enums;
itemlist_struct_t m_structs;
@@ -272,6 +291,9 @@ public:
void add_alias(bool is_public, Path path, ::std::string name) {
m_imports.push_back( Item<Path>( move(name), move(path), is_public) );
}
+ void add_typealias(bool is_public, ::std::string name, TypeAlias alias) {
+ m_type_aliases.push_back( Item<TypeAlias>( move(name), move(alias), is_public ) );
+ }
void add_constant(bool is_public, ::std::string name, TypeRef type, Expr val) {
m_statics.push_back( Item<Static>( move(name), Static(Static::CONST, move(type), move(val)), is_public) );
}
@@ -309,6 +331,7 @@ public:
itemlist_fcn_t& functions() { return m_functions; }
itemlist_mod_t& submods() { return m_submods; }
itemlist_use_t& imports() { return m_imports; }
+ ::std::vector<Item<TypeAlias> >& type_aliases() { return m_type_aliases; }
itemlist_ext_t& extern_crates() { return m_extern_crates; }
::std::vector<Impl>& impls() { return m_impls; }
@@ -316,6 +339,7 @@ public:
const itemlist_fcn_t& functions() const { return m_functions; }
const itemlist_mod_t& submods() const { return m_submods; }
const itemlist_use_t& imports() const { return m_imports; }
+ const ::std::vector<Item<TypeAlias> >& type_aliases() const { return m_type_aliases; }
const itemlist_ext_t& extern_crates() const { return m_extern_crates; }
const itemlist_static_t& statics() const { return m_statics; }
const itemlist_enum_t& enums () const { return m_enums; }
diff --git a/src/ast/path.cpp b/src/ast/path.cpp
index 0bce09c1..e6700696 100644
--- a/src/ast/path.cpp
+++ b/src/ast/path.cpp
@@ -92,6 +92,21 @@ void Path::resolve(const Crate& root_crate)
throw ParseError::Todo("Path::resolve() re-export");
}
}
+ // Type Aliases
+ {
+ auto& items = mod->type_aliases();
+ auto it = find_named(items, node.name());
+ if( it != items.end() )
+ {
+ DEBUG("Type alias <"<<it->data.params()<<"> " << it->data.type());
+ if( node.args().size() != it->data.params().size() )
+ throw ParseError::Generic("Param count mismatch when referencing type alias");
+ // Make a copy of the path, replace params with it, then replace *this?
+ // - Maybe leave that up to other code?
+ throw ParseError::Todo("Path::resolve() type alias");
+ }
+ }
+
// - Functions
{
auto& items = mod->functions();
diff --git a/src/ast/path.hpp b/src/ast/path.hpp
index f39e133d..c6baf607 100644
--- a/src/ast/path.hpp
+++ b/src/ast/path.hpp
@@ -29,7 +29,7 @@ class PathNode:
::std::string m_name;
::std::vector<TypeRef> m_params;
public:
- PathNode(::std::string name, ::std::vector<TypeRef> args);
+ PathNode(::std::string name, ::std::vector<TypeRef> args = {});
const ::std::string& name() const;
::std::vector<TypeRef>& args() { return m_params; }
const ::std::vector<TypeRef>& args() const;
@@ -109,6 +109,11 @@ public:
m_class(ABSOLUTE),
m_nodes(l)
{}
+ Path(::std::string crate, ::std::vector<PathNode> nodes):
+ m_crate( ::std::move(crate) ),
+ m_class(ABSOLUTE),
+ m_nodes( ::std::move(nodes) )
+ {}
void set_crate(::std::string crate) {
if( m_crate == "" ) {
@@ -119,6 +124,7 @@ public:
static Path add_tailing(const Path& a, const Path& b) {
Path ret(a);
+ ret[ret.size()-1].args() = b[0].args();
for(unsigned int i = 1; i < b.m_nodes.size(); i ++)
ret.m_nodes.push_back(b.m_nodes[i]);
return ret;
diff --git a/src/types.hpp b/src/types.hpp
index 512519f8..4ef24685 100644
--- a/src/types.hpp
+++ b/src/types.hpp
@@ -84,12 +84,18 @@ public:
m_class(GENERIC),
m_path({AST::PathNode(name, {})})
{}
+ TypeRef(::std::string name):
+ TypeRef(TagArg(), ::std::move(name))
+ {}
struct TagPath {};
TypeRef(TagPath, AST::Path path):
m_class(PATH),
m_path( ::std::move(path) )
{}
+ TypeRef(AST::Path path):
+ TypeRef(TagPath(), ::std::move(path))
+ {}
bool is_path() const { return m_class == PATH; }
AST::Path& path() { assert(is_path()); return m_path; }