summaryrefslogtreecommitdiff
path: root/src/resolve/absolute.cpp
diff options
context:
space:
mode:
authorJohn Hodge <tpg@mutabah.net>2016-10-24 08:39:49 +0800
committerJohn Hodge <tpg@mutabah.net>2016-10-24 08:39:49 +0800
commit4d6039f0755b88c135492d80e18ab640d402de88 (patch)
tree3382668660eb4061544ae6861e304fed02113e05 /src/resolve/absolute.cpp
parent9aa1f89f273b6acdd171543498bec661a04118fa (diff)
downloadmrust-4d6039f0755b88c135492d80e18ab640d402de88.tar.gz
AST - Remove separate impls list (now in item list)
Diffstat (limited to 'src/resolve/absolute.cpp')
-rw-r--r--src/resolve/absolute.cpp105
1 files changed, 48 insertions, 57 deletions
diff --git a/src/resolve/absolute.cpp b/src/resolve/absolute.cpp
index ca79094e..646e4aaf 100644
--- a/src/resolve/absolute.cpp
+++ b/src/resolve/absolute.cpp
@@ -2023,10 +2023,56 @@ void Resolve_Absolute_Mod( Context item_context, ::AST::Module& mod )
}
),
(Impl,
- TODO(i.data.span, "Impl");
+ auto& def = e.def();
+ DEBUG("impl " << def.trait().ent << " for " << def.type());
+ if( !def.type().is_valid() )
+ {
+ DEBUG("---- MARKER IMPL for " << def.trait().ent);
+ item_context.push(def.params(), GenericSlot::Level::Top);
+ Resolve_Absolute_Generic(item_context, def.params());
+ assert( def.trait().ent.is_valid() );
+ Resolve_Absolute_Path(item_context, def.trait().sp, Context::LookupMode::Type, def.trait().ent);
+
+ if( e.items().size() != 0 ) {
+ ERROR(def.span(), E0000, "impl Trait for .. with methods");
+ }
+
+ item_context.pop(def.params());
+
+ const_cast< ::AST::Trait*>(def.trait().ent.binding().as_Trait().trait_)->set_is_marker();
+ }
+ else
+ {
+ item_context.push_self( def.type() );
+ item_context.push(def.params(), GenericSlot::Level::Top);
+ Resolve_Absolute_Generic(item_context, def.params());
+
+ Resolve_Absolute_Type(item_context, def.type());
+ if( def.trait().ent.is_valid() ) {
+ Resolve_Absolute_Path(item_context, def.trait().sp, Context::LookupMode::Type, def.trait().ent);
+ }
+
+ Resolve_Absolute_ImplItems(item_context, e.items());
+
+ item_context.pop(def.params());
+ item_context.pop_self( def.type() );
+ }
),
(NegImpl,
- TODO(i.data.span, "NegImpl");
+ auto& impl_def = e;
+ item_context.push_self( impl_def.type() );
+ item_context.push(impl_def.params(), GenericSlot::Level::Top);
+ Resolve_Absolute_Generic(item_context, impl_def.params());
+
+ Resolve_Absolute_Type(item_context, impl_def.type());
+ if( !impl_def.trait().ent.is_valid() )
+ BUG(impl_def.span(), "Encountered negative impl with no trait");
+ Resolve_Absolute_Path(item_context, impl_def.trait().sp, Context::LookupMode::Type, impl_def.trait().ent);
+
+ // No items
+
+ item_context.pop(impl_def.params());
+ item_context.pop_self( impl_def.type() );
),
(Module,
DEBUG("Module - " << i.name);
@@ -2067,61 +2113,6 @@ void Resolve_Absolute_Mod( Context item_context, ::AST::Module& mod )
)
}
- for(auto& impl : mod.impls())
- {
- auto& def = impl.def();
- DEBUG("impl " << def.trait().ent << " for " << def.type());
- if( !def.type().is_valid() )
- {
- DEBUG("---- MARKER IMPL for " << def.trait().ent);
- item_context.push(def.params(), GenericSlot::Level::Top);
- Resolve_Absolute_Generic(item_context, def.params());
- assert( def.trait().ent.is_valid() );
- Resolve_Absolute_Path(item_context, def.trait().sp, Context::LookupMode::Type, def.trait().ent);
-
- if( impl.items().size() != 0 ) {
- ERROR(def.span(), E0000, "impl Trait for .. with methods");
- }
-
- item_context.pop(def.params());
-
- const_cast< ::AST::Trait*>(def.trait().ent.binding().as_Trait().trait_)->set_is_marker();
- }
- else
- {
- item_context.push_self( impl.def().type() );
- item_context.push(impl.def().params(), GenericSlot::Level::Top);
- Resolve_Absolute_Generic(item_context, impl.def().params());
-
- Resolve_Absolute_Type(item_context, impl.def().type());
- if( def.trait().ent.is_valid() ) {
- Resolve_Absolute_Path(item_context, def.trait().sp, Context::LookupMode::Type, def.trait().ent);
- }
-
- Resolve_Absolute_ImplItems(item_context, impl.items());
-
- item_context.pop(def.params());
- item_context.pop_self( def.type() );
- }
- }
-
- for(auto& impl_def : mod.neg_impls())
- {
- item_context.push_self( impl_def.type() );
- item_context.push(impl_def.params(), GenericSlot::Level::Top);
- Resolve_Absolute_Generic(item_context, impl_def.params());
-
- Resolve_Absolute_Type(item_context, impl_def.type());
- if( !impl_def.trait().ent.is_valid() )
- BUG(impl_def.span(), "Encountered negative impl with no trait");
- Resolve_Absolute_Path(item_context, impl_def.trait().sp, Context::LookupMode::Type, impl_def.trait().ent);
-
- // No items
-
- item_context.pop(impl_def.params());
- item_context.pop_self( impl_def.type() );
- }
-
// - Run through the indexed items and fix up those paths
static Span sp;
DEBUG("mod = " << mod.path());