about summary refs log tree commit diff
diff options
context:
space:
mode:
authorBrian Koropoff <bkoropoff@gmail.com>2014-11-01 18:49:48 -0700
committerBrian Koropoff <bkoropoff@gmail.com>2014-11-01 18:49:48 -0700
commitae929427582a83ba06a03093a76dea31b37a88b7 (patch)
treee375ba92e3033821e038b6e202e254f48869ffae
parent39f90aead4ad52de1d2c50418da4d66320233d8e (diff)
downloadrust-ae929427582a83ba06a03093a76dea31b37a88b7.tar.gz
rust-ae929427582a83ba06a03093a76dea31b37a88b7.zip
Fix def ID mapping for method defs
This prevents def IDs with the wrong crate ID from showing up
when using UFCS.  Closes #18501
-rw-r--r--src/librustc/middle/astencode.rs16
-rw-r--r--src/librustc/middle/def.rs9
2 files changed, 14 insertions, 11 deletions
diff --git a/src/librustc/middle/astencode.rs b/src/librustc/middle/astencode.rs
index 3d2bd763a14..988f7d46f5f 100644
--- a/src/librustc/middle/astencode.rs
+++ b/src/librustc/middle/astencode.rs
@@ -441,19 +441,13 @@ impl tr for def::Def {
     fn tr(&self, dcx: &DecodeContext) -> def::Def {
         match *self {
           def::DefFn(did, is_ctor) => def::DefFn(did.tr(dcx), is_ctor),
-          def::DefStaticMethod(did, wrapped_did2) => {
-            def::DefStaticMethod(did.tr(dcx),
-                                   match wrapped_did2 {
-                                    def::FromTrait(did2) => {
-                                        def::FromTrait(did2.tr(dcx))
-                                    }
-                                    def::FromImpl(did2) => {
-                                        def::FromImpl(did2.tr(dcx))
-                                    }
-                                   })
+          def::DefStaticMethod(did, p) => {
+            def::DefStaticMethod(did.tr(dcx), p.map(|did2| did2.tr(dcx)))
           }
           def::DefMethod(did0, did1, p) => {
-            def::DefMethod(did0.tr(dcx), did1.map(|did1| did1.tr(dcx)), p)
+            def::DefMethod(did0.tr(dcx),
+                           did1.map(|did1| did1.tr(dcx)),
+                           p.map(|did2| did2.tr(dcx)))
           }
           def::DefSelfTy(nid) => { def::DefSelfTy(dcx.tr_id(nid)) }
           def::DefMod(did) => { def::DefMod(did.tr(dcx)) }
diff --git a/src/librustc/middle/def.rs b/src/librustc/middle/def.rs
index a71f714a2ef..160bb2238e7 100644
--- a/src/librustc/middle/def.rs
+++ b/src/librustc/middle/def.rs
@@ -55,6 +55,15 @@ pub enum MethodProvenance {
     FromImpl(ast::DefId),
 }
 
+impl MethodProvenance {
+    pub fn map(self, f: |ast::DefId| -> ast::DefId) -> MethodProvenance {
+        match self {
+            FromTrait(did) => FromTrait(f(did)),
+            FromImpl(did) => FromImpl(f(did))
+        }
+    }
+}
+
 impl Def {
     pub fn def_id(&self) -> ast::DefId {
         match *self {