@@ -9,6 +9,7 @@ use crate::{
99use anyhow:: Context ;
1010use id_arena:: { Arena , Id } ;
1111use indexmap:: { IndexMap , IndexSet } ;
12+ use semver:: Version ;
1213use serde:: { Serialize , Serializer } ;
1314use std:: {
1415 collections:: { hash_map, HashMap } ,
@@ -594,7 +595,7 @@ pub trait PackageResolver {
594595 /// Resolves a package name to the package bytes.
595596 ///
596597 /// Returns `Ok(None)` if the package could not be found.
597- fn resolve ( & self , name : & str ) -> anyhow:: Result < Option < Vec < u8 > > > ;
598+ fn resolve ( & self , name : & str , version : Option < & Version > ) -> anyhow:: Result < Option < Vec < u8 > > > ;
598599}
599600
600601/// Used to resolve packages from the file system.
@@ -620,7 +621,7 @@ impl Default for FileSystemPackageResolver {
620621}
621622
622623impl PackageResolver for FileSystemPackageResolver {
623- fn resolve ( & self , name : & str ) -> anyhow:: Result < Option < Vec < u8 > > > {
624+ fn resolve ( & self , name : & str , _version : Option < & Version > ) -> anyhow:: Result < Option < Vec < u8 > > > {
624625 let path = if let Some ( path) = self . overrides . get ( name) {
625626 if !path. exists ( ) {
626627 anyhow:: bail!(
@@ -840,6 +841,8 @@ impl fmt::Display for FuncKind {
840841pub struct ResolvedDocument {
841842 /// The name of the package being resolved.
842843 pub package : String ,
844+ /// The version of the package being resolved.
845+ pub version : Option < Version > ,
843846 /// The definitions in the resolution.
844847 pub definitions : Definitions ,
845848 /// The items in the resolution.
@@ -860,7 +863,6 @@ impl ResolvedDocument {
860863 /// Creates a new resolved document from the given document.
861864 pub fn new < ' a > (
862865 document : & ' a ast:: Document < ' a > ,
863- package : impl Into < String > ,
864866 resolver : Option < Box < dyn PackageResolver > > ,
865867 ) -> ResolutionResult < ' a , Self > {
866868 let mut scopes = Arena :: new ( ) ;
@@ -870,7 +872,8 @@ impl ResolvedDocument {
870872 } ) ;
871873
872874 let mut resolution = ResolvedDocument {
873- package : package. into ( ) ,
875+ package : document. package . name . to_owned ( ) ,
876+ version : document. package . version . clone ( ) ,
874877 definitions : Default :: default ( ) ,
875878 items : Default :: default ( ) ,
876879 imports : Default :: default ( ) ,
@@ -2069,6 +2072,7 @@ impl ResolvedDocument {
20692072 & mut self ,
20702073 state : & ' b mut ResolutionState < ' a > ,
20712074 name : & ' a str ,
2075+ version : Option < & Version > ,
20722076 span : Span < ' a > ,
20732077 ) -> ResolutionResult < ' a , & ' b Package > {
20742078 match state. packages . entry ( name. to_owned ( ) ) {
@@ -2078,7 +2082,7 @@ impl ResolvedDocument {
20782082 match state
20792083 . resolver
20802084 . as_deref ( )
2081- . and_then ( |r| r. resolve ( name) . transpose ( ) )
2085+ . and_then ( |r| r. resolve ( name, version ) . transpose ( ) )
20822086 . transpose ( )
20832087 . map_err ( |e| Error :: PackageResolutionFailure {
20842088 name,
@@ -2110,7 +2114,12 @@ impl ResolvedDocument {
21102114 return self . resolve_local_export ( state, path) ;
21112115 }
21122116
2113- let pkg = self . resolve_package ( state, path. name , path. package_name_span ( ) ) ?;
2117+ let pkg = self . resolve_package (
2118+ state,
2119+ path. name ,
2120+ path. version . as_ref ( ) ,
2121+ path. package_name_span ( ) ,
2122+ ) ?;
21142123
21152124 let mut current = 0 ;
21162125 let mut parent_ty = None ;
@@ -2257,7 +2266,12 @@ impl ResolvedDocument {
22572266 state : & mut ResolutionState < ' a > ,
22582267 expr : & ' a ast:: NewExpr < ' a > ,
22592268 ) -> ResolutionResult < ' a , ItemId > {
2260- let pkg = self . resolve_package ( state, expr. package . name , expr. package . span ) ?;
2269+ let pkg = self . resolve_package (
2270+ state,
2271+ expr. package . name ,
2272+ expr. package . version . as_ref ( ) ,
2273+ expr. package . span ,
2274+ ) ?;
22612275 let ty = pkg. ty ;
22622276 let require_all = !expr. ellipsis ;
22632277
0 commit comments