diff options
author | John Hodge <tpg@mutabah.net> | 2016-08-19 22:08:24 +0800 |
---|---|---|
committer | John Hodge <tpg@mutabah.net> | 2016-08-19 22:08:24 +0800 |
commit | c805e9e03db7e7b48f04824ccf5e625a20032af9 (patch) | |
tree | bf27192754ffa315a522391abe91378801e47ca5 /src | |
parent | 0ad915eb4919e8bdb036015f221b57c7f3de912c (diff) | |
download | mrust-c805e9e03db7e7b48f04824ccf5e625a20032af9.tar.gz |
AST - Support ! as a real type
Diffstat (limited to 'src')
-rw-r--r-- | src/ast/types.cpp | 9 | ||||
-rw-r--r-- | src/ast/types.hpp | 11 | ||||
-rw-r--r-- | src/expand/derive.cpp | 2 | ||||
-rw-r--r-- | src/expand/mod.cpp | 2 | ||||
-rw-r--r-- | src/hir/from_ast.cpp | 38 | ||||
-rw-r--r-- | src/parse/root.cpp | 8 | ||||
-rw-r--r-- | src/parse/types.cpp | 2 | ||||
-rw-r--r-- | src/resolve/absolute.cpp | 5 |
8 files changed, 50 insertions, 27 deletions
diff --git a/src/ast/types.cpp b/src/ast/types.cpp index 070f02ba..ba2c12f2 100644 --- a/src/ast/types.cpp +++ b/src/ast/types.cpp @@ -111,6 +111,7 @@ TypeRef::TypeRef(const TypeRef& other) #define _CLONE(VAR, code...) case TypeData::TAG_##VAR: { auto& old = other.m_data.as_##VAR(); m_data = TypeData::make_##VAR(code); } break; _COPY(None) _COPY(Any) + _COPY(Bang) case TypeData::TAG_Macro: assert( !"Copying an unexpanded type macro" ); _COPY(Unit) _COPY(Primitive) @@ -139,6 +140,7 @@ Ordering TypeRef::ord(const TypeRef& x) const (Macro, throw CompileError::BugCheck("TypeRef::ord - unexpanded macro");), (Any, return OrdEqual;), (Unit, return OrdEqual;), + (Bang, return OrdEqual;), (Primitive, return ::ord( (unsigned)ent.core_type, (unsigned)x_ent.core_type ); ), @@ -191,11 +193,14 @@ Ordering TypeRef::ord(const TypeRef& x) const { case TypeData::TAGDEAD: throw ""; _(None, - os << "!"; + os << "!!"; ) _(Any, os << "_"; ) + _(Bang, + os << "!"; + ) _(Macro, os << ent.inv; ) @@ -307,6 +312,7 @@ SERIALISE_TYPE(TypeRef::, "TypeRef", { s.item( ent.inv ); ) _S(Any) + _S(Bang) _S(Unit) _S(Primitive, s << coretype_name(ent.core_type); @@ -353,6 +359,7 @@ SERIALISE_TYPE(TypeRef::, "TypeRef", { _D(None) _D(Any) _D(Unit) + _D(Bang) _D(Macro, m_data = TypeData::make_Macro({}); s.item( ent.inv ); diff --git a/src/ast/types.hpp b/src/ast/types.hpp index 8fbd6c37..1710fceb 100644 --- a/src/ast/types.hpp +++ b/src/ast/types.hpp @@ -61,6 +61,7 @@ struct Type_Function: TAGGED_UNION(TypeData, None,
(None, struct { }),
(Any, struct { }),
+ (Bang, struct { }),
(Unit, struct { }),
(Macro, struct {
::AST::MacroInvocation inv;
@@ -126,9 +127,13 @@ public: return *this;
}
- TypeRef(Span sp=Span()):
+ TypeRef(Span sp = Span()):
m_span( mv$(sp) ),
- m_data(TypeData::make_Any({}))
+ m_data( TypeData::make_Any({}) )
+ {}
+ TypeRef(Span sp, TypeData data):
+ m_span( mv$(sp) ),
+ m_data( mv$(data) )
{}
struct TagInvalid {};
@@ -136,7 +141,7 @@ public: m_span(mv$(sp)),
m_data(TypeData::make_None({}))
{}
-
+
struct TagMacro {};
TypeRef(TagMacro, ::AST::MacroInvocation inv):
m_span(inv.span()),
diff --git a/src/expand/derive.cpp b/src/expand/derive.cpp index f14e7ae8..310ad104 100644 --- a/src/expand/derive.cpp +++ b/src/expand/derive.cpp @@ -129,6 +129,8 @@ struct Deriver ), (Unit, ), + (Bang, + ), (Macro, // not allowed ), diff --git a/src/expand/mod.cpp b/src/expand/mod.cpp index d4c117b1..3fb0c648 100644 --- a/src/expand/mod.cpp +++ b/src/expand/mod.cpp @@ -191,6 +191,8 @@ void Expand_Type(bool is_early, ::AST::Crate& crate, LList<const AST::Module*> m ), (Unit, ), + (Bang, + ), (Macro, auto tt = Expand_Macro(is_early, crate, modstack, mod, e.inv); TODO(e.inv.span(), "Expand macro invocation in type"); diff --git a/src/hir/from_ast.cpp b/src/hir/from_ast.cpp index 90ab5c2a..f001b081 100644 --- a/src/hir/from_ast.cpp +++ b/src/hir/from_ast.cpp @@ -577,6 +577,9 @@ const ::HIR::SimplePath path_Sized = ::HIR::SimplePath("", {"marker", "Sized"}); { TU_MATCH(::TypeData, (ty.m_data), (e), (None, + BUG(ty.span(), "TypeData::None"); + ), + (Bang, // Aka diverging return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_Diverge({}) ); ), @@ -587,7 +590,7 @@ const ::HIR::SimplePath path_Sized = ::HIR::SimplePath("", {"marker", "Sized"}); return ::HIR::TypeRef( ::HIR::TypeRef::Data::make_Tuple({}) ); ), (Macro, - BUG(ty.span(), "TypeData::None"); + BUG(ty.span(), "TypeData::Macro"); ), (Primitive, switch(e.core_type) @@ -1012,7 +1015,6 @@ void LowerHIR_Module_Impls(const ::AST::Module& ast_mod, ::HIR::Crate& hir_crat for( const auto& impl : ast_mod.impls() ) { auto params = LowerHIR_GenericParams(impl.def().params(), nullptr); - auto type = LowerHIR_Type(impl.def().type()); if( impl.def().trait().ent.is_valid() ) { @@ -1022,19 +1024,10 @@ void LowerHIR_Module_Impls(const ::AST::Module& ast_mod, ::HIR::Crate& hir_crat auto trait_name = mv$(trait_path.m_path); auto trait_args = mv$(trait_path.m_params); - if( is_marker ) - { - hir_crate.m_marker_impls.insert( ::std::make_pair( mv$(trait_name), ::HIR::MarkerImpl { - mv$(params), - mv$(trait_args), - true, - mv$(type), - - LowerHIR_SimplePath(Span(), ast_mod.path()) - } ) ); - } - else + if( !is_marker ) { + auto type = LowerHIR_Type(impl.def().type()); + ::HIR::ItemPath path(type, trait_name); DEBUG(path); @@ -1073,10 +1066,27 @@ void LowerHIR_Module_Impls(const ::AST::Module& ast_mod, ::HIR::Crate& hir_crat LowerHIR_SimplePath(Span(), ast_mod.path()) }) ); } + else if( impl.def().type().m_data.is_None() ) + { + // Ignore - These are encoded in the 'is_marker' field of the trait + } + else + { + auto type = LowerHIR_Type(impl.def().type()); + hir_crate.m_marker_impls.insert( ::std::make_pair( mv$(trait_name), ::HIR::MarkerImpl { + mv$(params), + mv$(trait_args), + true, + mv$(type), + + LowerHIR_SimplePath(Span(), ast_mod.path()) + } ) ); + } } else { // Inherent impls + auto type = LowerHIR_Type(impl.def().type()); ::HIR::ItemPath path(type); ::std::map< ::std::string, ::HIR::TypeImpl::VisImplEnt< ::HIR::Function> > methods; diff --git a/src/parse/root.cpp b/src/parse/root.cpp index c21cfba3..1ee1a13d 100644 --- a/src/parse/root.cpp +++ b/src/parse/root.cpp @@ -372,13 +372,7 @@ AST::Function Parse_FunctionDef(TokenStream& lex, ::std::string abi, AST::MetaIt if( GET_TOK(tok, lex) == TOK_THINARROW )
{
// Return type
- if( GET_TOK(tok, lex) == TOK_EXCLAM ) {
- ret_type = TypeRef(TypeRef::TagInvalid(), Span(tok.get_pos()));
- }
- else {
- PUTBACK(tok, lex);
- ret_type = Parse_Type(lex);
- }
+ ret_type = Parse_Type(lex);
}
else
{
diff --git a/src/parse/types.cpp b/src/parse/types.cpp index 34afc484..d960d1d3 100644 --- a/src/parse/types.cpp +++ b/src/parse/types.cpp @@ -40,7 +40,7 @@ TypeRef Parse_Type_Int(TokenStream& lex, bool allow_trait_list) return TypeRef(TypeRef::TagMacro(), Parse_MacroInvocation(ps, AST::MetaItems(), mv$(tok.str()), lex)); // '!' - Only ever used as part of function prototypes, but is kinda a type... not allowed here though case TOK_EXCLAM: - throw ParseError::Generic(lex, "! is not a real type"); + return TypeRef( Span(tok.get_pos()), TypeData::make_Bang({}) ); // '_' = Wildcard (type inferrence variable) case TOK_UNDERSCORE: return TypeRef(Span(tok.get_pos())); diff --git a/src/resolve/absolute.cpp b/src/resolve/absolute.cpp index 0a0cf478..89a16d47 100644 --- a/src/resolve/absolute.cpp +++ b/src/resolve/absolute.cpp @@ -878,13 +878,16 @@ void Resolve_Absolute_Type(Context& context, TypeRef& type) const auto& sp = type.span(); TU_MATCH(TypeData, (type.m_data), (e), (None, - // ! type + // invalid type ), (Any, // _ type ), (Unit, ), + (Bang, + // ! type + ), (Macro, BUG(sp, "Resolve_Absolute_Type - Encountered an unexpanded macro"); ), |