]> git.lizzy.rs Git - rust.git/commit
Re-work loading crates with nicer errors
authorAlex Crichton <alex@alexcrichton.com>
Mon, 10 Feb 2014 20:50:53 +0000 (12:50 -0800)
committerAlex Crichton <alex@alexcrichton.com>
Fri, 21 Feb 2014 01:48:32 +0000 (17:48 -0800)
commitafa5f574ff30714b578ded14de2dfdf7ca1a0f39
tree74a900396cc3b3773e47b5b4f1e3b9578be0f5fa
parent6532d2fa0d173e4f815ac2144ff9860f5343cd7d
Re-work loading crates with nicer errors

This commit rewrites crate loading internally in attempt to look at less
metadata and provide nicer errors. The loading is now split up into a few
stages:

1. Collect a mapping of (hash => ~[Path]) for a set of candidate libraries for a
   given search. The hash is the hash in the filename and the Path is the
   location of the library in question. All candidates are filtered based on
   their prefix/suffix (dylib/rlib appropriate) and then the hash/version are
   split up and are compared (if necessary).

   This means that if you're looking for an exact hash of library you don't have
   to open up the metadata of all libraries named the same, but also in your
   path.

2. Once this mapping is constructed, each (hash, ~[Path]) pair is filtered down
   to just a Path. This is necessary because the same rlib could show up twice
   in the path in multiple locations. Right now the filenames are based on just
   the crate id, so this could be indicative of multiple version of a crate
   during one crate_id lifetime in the path. If multiple duplicate crates are
   found, an error is generated.

3. Now that we have a mapping of (hash => Path), we error on multiple versions
   saying that multiple versions were found. Only if there's one (hash => Path)
   pair do we actually return that Path and its metadata.

With this restructuring, it restructures code so errors which were assertions
previously are now first-class errors. Additionally, this should read much less
metadata with lots of crates of the same name or same version in a path.

Closes #11908
src/librustc/metadata/loader.rs
src/test/auxiliary/issue-11908-1.rs [new file with mode: 0644]
src/test/auxiliary/issue-11908-2.rs [new file with mode: 0644]
src/test/compile-fail/issue-11908-1.rs [new file with mode: 0644]
src/test/compile-fail/issue-11908-2.rs [new file with mode: 0644]