@@ -4,7 +4,7 @@ import * as vs from "vscode";
44import { DartCapabilities } from "../../shared/capabilities/dart" ;
55import { DART_DEP_FILE_NODE_CONTEXT , DART_DEP_FOLDER_NODE_CONTEXT , DART_DEP_PACKAGE_NODE_CONTEXT , DART_DEP_PROJECT_NODE_CONTEXT } from "../../shared/constants" ;
66import { DartWorkspaceContext , Logger } from "../../shared/interfaces" ;
7- import { PubDeps } from "../../shared/pub/deps" ;
7+ import { PubDeps , PubDepsPackage , ShortestPaths } from "../../shared/pub/deps" ;
88import { PackageMap } from "../../shared/pub/package_map" ;
99import { sortBy } from "../../shared/utils/array" ;
1010import { areSameFolder , fsPath } from "../../shared/utils/fs" ;
@@ -50,23 +50,35 @@ export class DartPackagesProvider implements vs.TreeDataProvider<PackageDep> {
5050 : nodes ;
5151
5252 } else if ( element instanceof PackageDepProject ) {
53- const allPackages = await this . getPackages ( element ) ;
54- if ( ! this . dartCapabilities . supportsPubDepsJson )
53+ // Try getting dependencies from `pub deps`.
54+ let packages : { [ key : string ] : PubDepsPackage } | undefined ;
55+ let shortestPaths : ShortestPaths | undefined ;
56+ if ( this . dartCapabilities . supportsPubDepsJson ) {
57+ // Fetch dependencies with "pub deps --json".
58+ const root = await this . deps . getRootDependency ( element . projectFolder ) ;
59+ packages = root ? this . deps . getPackageMap ( root ) : undefined ;
60+ shortestPaths = packages ? this . deps . computeShortestPaths ( packages ) : undefined ;
61+ }
62+
63+ // Get packages from package file.
64+ const allPackages = await this . getPackages ( element , shortestPaths ) ;
65+
66+ if ( ! packages )
5567 return allPackages ;
5668
57- // If we support "pub deps --json" split the packages into groups.
58- const packageKinds = await this . deps . getDependencyKinds ( element . projectFolder ) ;
59- const directPackages = allPackages . filter ( ( p ) => packageKinds [ p . packageName ] === "direct " ) ;
60- const devPackages = allPackages . filter ( ( p ) => packageKinds [ p . packageName ] === "dev " ) ;
61- const transitivePackages = allPackages . filter ( ( p ) => packageKinds [ p . packageName ] === "transitive" ) ;
69+ // Split the packages into groups.
70+ const directPackages = allPackages . filter ( ( p ) => packages ! [ p . packageName ] ?. kind === "direct" ) ;
71+ const devPackages = allPackages . filter ( ( p ) => packages ! [ p . packageName ] ?. kind === "dev " ) ;
72+ const transitivePackages = allPackages . filter ( ( p ) => packages ! [ p . packageName ] ?. kind === "transitive " ) ;
73+
6274
6375 const nodes : PackageDepProjectPackageGroup [ ] = [ ] ;
6476 if ( directPackages . length )
6577 nodes . push ( new PackageDepProjectPackageGroup ( "direct dependencies" , directPackages ) ) ;
6678 if ( devPackages . length )
6779 nodes . push ( new PackageDepProjectPackageGroup ( "dev dependencies" , devPackages ) ) ;
6880 if ( transitivePackages . length )
69- nodes . push ( new PackageDepProjectPackageGroup ( "transitive dependencies" , transitivePackages ) ) ;
81+ nodes . push ( new PackageDepProjectPackageGroup ( "transitive dependencies" , transitivePackages , shortestPaths ) ) ;
7082 return nodes ;
7183 } else if ( element instanceof PackageDepProjectPackageGroup ) {
7284 // For the package groups, we've already computed the children when we split
@@ -84,7 +96,7 @@ export class DartPackagesProvider implements vs.TreeDataProvider<PackageDep> {
8496 }
8597 }
8698
87- private async getPackages ( project : PackageDepProject ) : Promise < PackageDepPackage [ ] > {
99+ private async getPackages ( project : PackageDepProject , shortestPaths : ShortestPaths | undefined ) : Promise < PackageDepPackage [ ] > {
88100 const map = PackageMap . loadForProject ( this . logger , project . projectFolder ) ;
89101 const packages = map . packages ;
90102 const packageNames = sortBy ( Object . keys ( packages ) , ( s ) => s . toLowerCase ( ) ) ;
@@ -95,7 +107,8 @@ export class DartPackagesProvider implements vs.TreeDataProvider<PackageDep> {
95107 let packagePath = packages [ name ] ;
96108 if ( path . basename ( packagePath ) === "lib" )
97109 packagePath = path . normalize ( path . join ( packagePath , ".." ) ) ;
98- return new PackageDepPackage ( `${ name } ` , vs . Uri . file ( packagePath ) ) ;
110+ const shortestPath = shortestPaths ? shortestPaths [ name ] : undefined ;
111+ return new PackageDepPackage ( `${ name } ` , vs . Uri . file ( packagePath ) , shortestPath ) ;
99112 } ) ;
100113
101114 return packageDepNodes ;
@@ -186,6 +199,7 @@ export class PackageDepProjectPackageGroup extends PackageDep {
186199 constructor (
187200 label : string ,
188201 public readonly packages : PackageDepPackage [ ] ,
202+ public readonly shortestPaths ?: ShortestPaths ,
189203 ) {
190204 super ( label , undefined , vs . TreeItemCollapsibleState . Collapsed ) ;
191205 this . contextValue = DART_DEP_PACKAGE_NODE_CONTEXT ;
@@ -196,8 +210,12 @@ export class PackageDepPackage extends PackageDep {
196210 constructor (
197211 public readonly packageName : string ,
198212 resourceUri : vs . Uri ,
213+ shortestPath : string [ ] | undefined ,
199214 ) {
200215 super ( packageName , resourceUri , vs . TreeItemCollapsibleState . Collapsed ) ;
201216 this . contextValue = DART_DEP_PACKAGE_NODE_CONTEXT ;
217+
218+ if ( shortestPath )
219+ this . tooltip = shortestPath . join ( " → " ) ;
202220 }
203221}
0 commit comments