diff options
author | John Hodge <tpg@mutabah.net> | 2016-10-31 10:01:41 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-10-31 10:01:41 +0800 |
commit | fc7239e7271e879102272ea4d7e98f87f027ee84 (patch) | |
tree | 8134b59f26d6901b0eefc7709bb4ad40afda7f11 /src/ast | |
parent | ea043a43eeff8512396afc166ca1d0085873c57d (diff) | |
download | mrust-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.cpp | 11 | ||||
-rw-r--r-- | src/ast/ast.hpp | 17 | ||||
-rw-r--r-- | src/ast/path.cpp | 14 | ||||
-rw-r--r-- | src/ast/path.hpp | 12 |
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_; |