diff options
Diffstat (limited to 'src/ast/provided_module.cpp')
-rw-r--r-- | src/ast/provided_module.cpp | 49 |
1 files changed, 33 insertions, 16 deletions
diff --git a/src/ast/provided_module.cpp b/src/ast/provided_module.cpp index f8e53bdf..460b7494 100644 --- a/src/ast/provided_module.cpp +++ b/src/ast/provided_module.cpp @@ -2,7 +2,11 @@ */ #include "ast.hpp" +void AST_InitProvidedModule_Impls(); + AST::Module g_compiler_module; +AST::Path g_copy_marker_path; +AST::Path g_sized_marker_path; void AST_InitProvidedModule() { @@ -12,31 +16,44 @@ void AST_InitProvidedModule() AST::StructItem("", TypeRef(TypeRef::TagUnsizedArray(), TypeRef(CORETYPE_U8)), false), })); - AST::Path copy_marker_path({AST::PathNode("marker"),AST::PathNode("Copy")}); + // TODO: Defer this until AFTER + AST_InitProvidedModule_Impls(); +} + +void AST_InitProvidedModule_Impls() +{ + if( !g_copy_marker_path.is_valid() ) { + g_copy_marker_path = AST::Path( {AST::PathNode("marker"),AST::PathNode("Copy")} ); + } + + if( !g_sized_marker_path.is_valid() ) { + g_sized_marker_path = AST::Path( {AST::PathNode("marker"),AST::PathNode("Sized")} ); + } + #define impl(trait, type) \ g_compiler_module.add_impl(AST::Impl(AST::MetaItems(), AST::TypeParams(), type, trait)) - impl(copy_marker_path, TypeRef(CORETYPE_U8)); - impl(copy_marker_path, TypeRef(CORETYPE_U16)); - impl(copy_marker_path, TypeRef(CORETYPE_U32)); - impl(copy_marker_path, TypeRef(CORETYPE_U64)); - impl(copy_marker_path, TypeRef(CORETYPE_UINT)); - impl(copy_marker_path, TypeRef(CORETYPE_I8)); - impl(copy_marker_path, TypeRef(CORETYPE_I16)); - impl(copy_marker_path, TypeRef(CORETYPE_I32)); - impl(copy_marker_path, TypeRef(CORETYPE_I64)); - impl(copy_marker_path, TypeRef(CORETYPE_INT)); - impl(copy_marker_path, TypeRef(CORETYPE_F32)); - impl(copy_marker_path, TypeRef(CORETYPE_F64)); + impl(g_copy_marker_path, TypeRef(CORETYPE_U8)); + impl(g_copy_marker_path, TypeRef(CORETYPE_U16)); + impl(g_copy_marker_path, TypeRef(CORETYPE_U32)); + impl(g_copy_marker_path, TypeRef(CORETYPE_U64)); + impl(g_copy_marker_path, TypeRef(CORETYPE_UINT)); + impl(g_copy_marker_path, TypeRef(CORETYPE_I8)); + impl(g_copy_marker_path, TypeRef(CORETYPE_I16)); + impl(g_copy_marker_path, TypeRef(CORETYPE_I32)); + impl(g_copy_marker_path, TypeRef(CORETYPE_I64)); + impl(g_copy_marker_path, TypeRef(CORETYPE_INT)); + impl(g_copy_marker_path, TypeRef(CORETYPE_F32)); + impl(g_copy_marker_path, TypeRef(CORETYPE_F64)); // A hacky default impl of 'Sized', with a negative impl on [T] - AST::Path sized_marker_path({AST::PathNode("marker"),AST::PathNode("Sized")}); - impl(sized_marker_path, TypeRef()); + impl(g_sized_marker_path, TypeRef()); + { AST::TypeParams tps; tps.add_ty_param( AST::TypeParam("T") ); g_compiler_module.add_neg_impl(AST::ImplDef( AST::MetaItems(), ::std::move(tps), - sized_marker_path, + g_sized_marker_path, TypeRef(TypeRef::TagUnsizedArray(), TypeRef(TypeRef::TagArg(), "T")) )); } |