summaryrefslogtreecommitdiff
path: root/src/ast
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-10-31 10:01:41 +0800
committerJohn Hodge <tpg@mutabah.net>2016-10-31 10:01:41 +0800
commitfc7239e7271e879102272ea4d7e98f87f027ee84 (patch)
tree8134b59f26d6901b0eefc7709bb4ad40afda7f11 /src/ast
parentea043a43eeff8512396afc166ca1d0085873c57d (diff)
downloadmrust-fc7239e7271e879102272ea4d7e98f87f027ee84.tar.gz
All - Rough support for `union` (data structure present in all stages)
Diffstat (limited to 'src/ast')
-rw-r--r--src/ast/ast.cpp11
-rw-r--r--src/ast/ast.hpp17
-rw-r--r--src/ast/path.cpp14
-rw-r--r--src/ast/path.hpp12
4 files changed, 43 insertions, 11 deletions
diff --git a/src/ast/ast.cpp b/src/ast/ast.cpp
index 420ac250..6e93a0d9 100644
--- a/src/ast/ast.cpp
+++ b/src/ast/ast.cpp
@@ -191,6 +191,14 @@ Struct Struct::clone() const
throw "";
}
+Union Union::clone() const
+{
+ decltype(m_variants) new_vars;
+ for(const auto& f : m_variants)
+ new_vars.push_back( f.clone() );
+ return Union(m_params.clone(), mv$(new_vars));
+}
+
::std::ostream& operator<<(::std::ostream& os, const ImplDef& impl)
{
return os << "impl<" << impl.m_params << "> " << impl.m_trait.ent << " for " << impl.m_type << "";
@@ -343,6 +351,9 @@ Item Item::clone() const
(Enum,
return AST::Item(e.clone());
),
+ (Union,
+ return AST::Item(e.clone());
+ ),
(Trait,
return AST::Item(e.clone());
),
diff --git a/src/ast/ast.hpp b/src/ast/ast.hpp
index 63a8b751..597d9bdc 100644
--- a/src/ast/ast.hpp
+++ b/src/ast/ast.hpp
@@ -351,11 +351,23 @@ public:
const GenericParams& params() const { return m_params; }
GenericParams& params() { return m_params; }
- TypeRef get_field_type(const char *name, const ::std::vector<TypeRef>& args);
-
Struct clone() const;
};
+class Union
+{
+public:
+ GenericParams m_params;
+ ::std::vector<StructItem> m_variants;
+
+ Union( GenericParams params, ::std::vector<StructItem> fields ):
+ m_params( move(params) ),
+ m_variants( mv$(fields) )
+ {}
+
+ Union clone() const;
+};
+
class ImplDef
{
Span m_span;
@@ -572,6 +584,7 @@ TAGGED_UNION_EX(Item, (), None,
(Type, TypeAlias),
(Struct, Struct),
(Enum, Enum),
+ (Union, Union),
(Trait, Trait),
(Function, Function),
diff --git a/src/ast/path.cpp b/src/ast/path.cpp
index 7574f707..583c3396 100644
--- a/src/ast/path.cpp
+++ b/src/ast/path.cpp
@@ -20,6 +20,7 @@ namespace AST {
(Trait, os << "Trait"; ),
(Struct, os << "Struct"; ),
(Enum, os << "Enum"; ),
+ (Union, os << "Union"; ),
(Static, os << "Static"; ),
(Function, os << "Function";),
(EnumVar, os << "EnumVar(" << i.idx << ")"; ),
@@ -37,12 +38,13 @@ PathBinding PathBinding::clone() const
TU_MATCH(::AST::PathBinding, (*this), (e),
(Unbound , return PathBinding::make_Unbound({}); ),
(Module , return PathBinding::make_Module(e); ),
- (Crate , return PathBinding(e); ),
- (Trait , return PathBinding::make_Trait(e); ),
- (Struct , return PathBinding::make_Struct(e); ),
- (Enum , return PathBinding::make_Enum(e); ),
- (Static , return PathBinding::make_Static(e); ),
- (Function, return PathBinding::make_Function(e); ),
+ (Crate , return PathBinding(e); ),
+ (Trait , return PathBinding(e); ),
+ (Struct , return PathBinding(e); ),
+ (Enum , return PathBinding(e); ),
+ (Union , return PathBinding(e); ),
+ (Static , return PathBinding(e); ),
+ (Function, return PathBinding(e); ),
(TypeAlias, return PathBinding::make_TypeAlias(e); ),
(EnumVar , return PathBinding::make_EnumVar(e); ),
(StructMethod, return PathBinding::make_StructMethod(e); ),
diff --git a/src/ast/path.hpp b/src/ast/path.hpp
index 3a00cdfd..479b26b8 100644
--- a/src/ast/path.hpp
+++ b/src/ast/path.hpp
@@ -21,6 +21,7 @@ class Module;
class Trait;
class Enum;
class Struct;
+class Union;
class Static;
} // namespace HIR
@@ -32,6 +33,7 @@ class Module;
class TypeAlias;
class Enum;
class Struct;
+class Union;
class Trait;
class Static;
class Function;
@@ -47,13 +49,17 @@ TAGGED_UNION_EX(PathBinding, (), Unbound, (
const Module* module_;
const ::HIR::Module* hir = nullptr;
}),
+ (Struct, struct {
+ const Struct* struct_;
+ const ::HIR::Struct* hir = nullptr;
+ }),
(Enum, struct {
const Enum* enum_;
const ::HIR::Enum* hir = nullptr;
}),
- (Struct, struct {
- const Struct* struct_;
- const ::HIR::Struct* hir = nullptr;
+ (Union, struct {
+ const Union* union_;
+ const ::HIR::Union* hir = nullptr;
}),
(Trait, struct {
const Trait* trait_;