/* Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠMIT Ġlicense Ġthat Ġcan Ġbe Ċ Ġ* Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . rust . lang . core . crate . impl Ċ Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . diagnostic . logger Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . Simple Modification Tracker Ċ import Ġcom . intellij . openapi . vfs . Virtual File Ċ import Ġcom . intellij . openapi . vfs . Virtual FileManager Ċ import Ġcom . intellij . openapi . vfs . Virtual File With Id Ċ import Ġcom . intellij . psi . util . Cached Value Provider Ċ import Ġcom . intellij . util . containers . add If NotNull Ċ import Ġg nu . tro ve . T Int Object HashMap Ċ import Ġorg . rust . cargo . project . model . Cargo Project Ċ import Ġorg . rust . cargo . project . model . Cargo Projects Service . Cargo Projects Listener Ċ import Ġorg . rust . cargo . project . model . Cargo Projects Service . Companion . C ARG O _ PROJECT S _ TOPIC Ċ import Ġorg . rust . cargo . project . model . cargo Projects Ċ import Ġorg . rust . cargo . project . workspace . Cargo Workspace Ċ import Ġorg . rust . cargo . project . workspace . Feature State Ċ import Ġorg . rust . cargo . project . workspace . Package Origin Ċ import Ġorg . rust . lang . core . crate . C rate Ċ import Ġorg . rust . lang . core . crate . C rate Graph Service Ċ import Ġorg . rust . lang . core . crate . C rate Persistent Id Ċ import Ġorg . rust . openapi ext . Cached Value Delegate Ċ import Ġorg . rust . openapi ext . check Read Access Allowed Ċ import Ġorg . rust . openapi ext . is UnitTest Mode Ċ import Ġorg . rust . st dex t . apply With S ymlink Ċ import Ġorg . rust . st dex t . enum Set Of Ċ import Ġorg . rust . st dex t . exhaustive Ċ import Ġjava . nio . file . Path Ċ Ċ class ĠC rate Graph ServiceImpl ( val Ġproject : ĠProject ) Ġ: ĠC rate Graph Service Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġcargo Projects Mod Tracker Ġ= ĠSimple Modification Tracker () ĊĊĠĠĠ Ġinit Ġ{ ĊĠĠĠĠĠĠĠ Ġproject . message Bus . connect (). subscribe ( C ARG O _ PROJECT S _ TOPIC , ĠC argo Projects Listener Ġ{ Ġ_, Ġ_ Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcargo Projects Mod Tracker . inc Modification Count () ĊĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġcrate Graph : ĠC rate Graph Ġby ĠCached Value Delegate Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= Ġbuild C rate Graph ( project . cargo Projects . all Projects ) ĊĠĠĠĠĠĠĠ ĠCached Value Provider . Result ( result , Ġcargo Projects Mod Tracker , ĠVirtual FileManager . V FS _ STRUCTURE _ MO DIF ICATION S ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġtop Sorted Cr ates : ĠList < C rate > ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Read Access Allowed () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcrate Graph . top Sorted Cr ates ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind C rate ById ( id : ĠC rate Persistent Id ): ĠC rate ? Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Read Access Allowed () ĊĠĠĠĠĠĠĠ Ġreturn Ġcrate Graph . id To C rate . get ( id ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġfind C rate By Root Mod ( root Mod File : ĠVirtual File ): ĠC rate ? Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck Read Access Allowed () ĊĠĠĠĠĠĠĠ Ġreturn Ġroot Mod File . apply With S ymlink Ġ{ Ġif Ġ( it Ġis ĠVirtual File With Id ) Ġfind C rate ById ( it . id ) Ġelse Ġnull Ġ} ĊĠĠĠ Ġ} Ċ Ċ } Ċ Ċ private Ġdata Ġclass ĠC rate Graph ( ĊĠĠĠ Ġval Ġtop Sorted Cr ates : ĠList < C rate >, ĊĠĠĠ Ġval Ġid To C rate : ĠT Int Object HashMap < C rate > Ċ ) Ċ Ċ private Ġval ĠLOG : ĠLogger Ġ= Ġlogger < C rate Graph ServiceImpl >() Ċ Ċ private Ġfun Ġbuild C rate Graph ( cargo Projects : ĠCollection < Cargo Project >): ĠC rate Graph Ġ{ ĊĠĠĠ Ġval Ġbuilder Ġ= ĠC rate Graph Builder () ĊĠĠĠ Ġfor Ġ( cargo Project Ġin Ġcargo Projects ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġworkspace Ġ= Ġcargo Project . workspace Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠ Ġfor Ġ( pkg Ġin Ġworkspace . packages ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuilder . lower Package ( Project Package ( cargo Project , Ġpkg )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠC yc lic Graph Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġshould Ġnot Ġoccur , Ġbut Ġif Ġit Ġis , Ġlet 's Ġjust Ġlog Ġthe Ġexception Ġinstead Ġof Ġbreaking Ġeverything ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLOG . error ( e ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġbuilder . build () Ċ } Ċ Ċ private Ġclass ĠC rate Graph Builder Ġ{ ĊĠĠĠ Ġprivate Ġval Ġstates Ġ= Ġhash Map Of < Path , ĠNode State >() ĊĠĠĠ Ġprivate Ġval Ġtop Sorted Cr ates Ġ= Ġmutable ListOf < Cargo Based C rate >() ĊĊĠĠĠ Ġprivate Ġval Ġcr ates ToLower Later Ġ= Ġmutable ListOf < Non Library Cr ates >() ĊĠĠĠ Ġprivate Ġval Ġcr ates To Replace Target Later Ġ= Ġmutable ListOf < Replace Project And Target >() ĊĊĠĠĠ Ġfun Ġlower Package ( pkg : ĠProject Package ): ĠC argo Based C rate ? Ġ{ ĊĠĠĠĠĠĠĠ Ġwhen Ġ( val Ġstate Ġ= Ġstates [ pkg . root Directory ]) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠNode State . Done Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlib C rate Ġ= Ġstate . lib C rate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( state . pkgs . add ( pkg . pkg )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠD uplicated Ġpackage Ġfound . ĠThis Ġcan Ġoccur Ġif Ġa Ġpackage Ġis Ġused Ġin Ġmultiple ĠC argo Projects . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMer ging Ġthem Ġinto Ġa Ġsingle Ġcrate ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lib C rate Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlib C rate . features Ġ= Ġmerge Features ( pkg . pkg . feature State , Ġlib C rate . features ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠP refer Ġworkspace Ġtarget ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pkg . pkg . origin Ġ== ĠPackage Origin . WORK SPACE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcr ates To Replace Target Later Ġ+= ĠReplace Project And Target ( state , Ġpkg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIt 's Ġpossible Ġthat Ġthere Ġare Ġtwo Ġpackages , Ġbut Ġonly Ġone Ġof Ġthem Ġhas Ġa Ġvalid Ġproc Ġmacro Ġartifact ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pkg . pkg . proc Macro Artifact Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstate . lib C rate ?. let Ġ{ Ġit . proc Macro Artifact Ġ= Ġpkg . pkg . proc Macro Artifact Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlib C rate ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠNode State . Processing Ġ-> Ġthrow ĠC yc lic Graph Exception ( pkg . pkg . name ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġstates [ pkg . root Directory ] Ġ= ĠNode State . Processing ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġ( build Deps , Ġnormal And Non Cyc lic Dev Deps , Ġcy clic Dev Dependencies ) Ġ= Ġlower Package Dependencies ( pkg ) ĊĊĠĠĠĠĠĠĠ Ġval Ġcustom Build C rate Ġ= Ġpkg . pkg . custom Build Target ?. let Ġ{ Ġtarget Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC argo Based C rate ( pkg . project , Ġtarget , Ġbuild Deps , Ġbuild Deps . flatten Top Sorted Deps ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġtop Sorted Cr ates . add If NotNull ( custom Build C rate ) ĊĊĠĠĠĠĠĠĠ Ġval Ġflat Normal And Non Cyc lic Dev Deps Ġ= Ġnormal And Non Cyc lic Dev Deps . flatten Top Sorted Deps () ĊĠĠĠĠĠĠĠ Ġval Ġlib C rate Ġ= Ġpkg . pkg . lib Target ?. let Ġ{ Ġlib Target Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ ĠC argo Based C rate ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpkg . project , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlib Target , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormal And Non Cyc lic Dev Deps , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflat Normal And Non Cyc lic Dev Deps , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpkg . pkg . proc Macro Artifact ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠnewState Ġ= ĠNode State . Done ( lib C rate ) ĊĠĠĠĠĠĠĠ ĠnewState . pkgs Ġ+= Ġpkg . pkg ĊĠĠĠĠĠĠĠ ĠnewState . non Library Cr ates . add If NotNull ( custom Build C rate ) ĊĊĠĠĠĠĠĠĠ Ġstates [ pkg . root Directory ] Ġ= ĠnewState ĊĠĠĠĠĠĠĠ Ġtop Sorted Cr ates . add If NotNull ( lib C rate ) ĊĊĠĠĠĠĠĠĠ Ġlower Non Library Cr ates Later ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠNon Library Cr ates ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpkg , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠnewState , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormal And Non Cyc lic Dev Deps , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcy clic Dev Dependencies , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġflat Normal And Non Cyc lic Dev Deps ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġlib C rate ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠReplace Project And Target ( ĊĠĠĠĠĠĠĠ Ġval Ġstate : ĠNode State . Done , ĊĠĠĠĠĠĠĠ Ġval Ġpkg : ĠProject Package ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun ĠReplace Project And Target . replace Project And Target () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlib C rate Ġ= Ġstate . lib C rate ĊĠĠĠĠĠĠĠ Ġif Ġ( lib C rate Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġpkg . pkg . lib Target ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlib C rate . cargo Target Ġ= Ġit ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlib C rate . cargo Project Ġ= Ġpkg . project ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( crate Ġin Ġstate . non Library Cr ates ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Target Ġ= Ġpkg . pkg . targets . find Ġ{ Ġit . name Ġ== Ġcrate . cargo Target . name Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrate . cargo Target Ġ= Ġnew Target ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrate . cargo Project Ġ= Ġpkg . project ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠLower ed Package Dependencies ( ĊĠĠĠĠĠĠĠ Ġval Ġbuild Deps : ĠList < C rate . Dependency >, ĊĠĠĠĠĠĠĠ Ġval Ġnormal And Non Cyc lic Dev Deps : ĠList < C rate . Dependency >, ĊĠĠĠĠĠĠĠ Ġval Ġcy clic Dev Dependencies : ĠList < Cargo Workspace . Dependency > ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġlower Package Dependencies ( pkg : ĠProject Package ): ĠLower ed Package Dependencies Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( val Ġdependencies Ġ= Ġpkg . pkg . dependencies . classify ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSplit Dependencies . Class ified Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Deps Ġ= Ġlower Dependencies ( dependencies . build , Ġpkg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnormal Deps Ġ= Ġlower Dependencies ( dependencies . normal , Ġpkg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( non Cyc lic Dev Deps , Ġcy clic Dev Dependencies ) Ġ= Ġlower Dependencies With Cycles ( dependencies . dev , Ġpkg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnormal And Non Cyc lic Dev Deps Ġ= Ġnormal Deps Ġ+ Ġnon Cyc lic Dev Deps ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLower ed Package Dependencies ( build Deps , Ġnormal And Non Cyc lic Dev Deps , Ġcy clic Dev Dependencies ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠSplit Dependencies . Un class ified Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠHere Ġwe Ġcan 't Ġdistinguish Ġnormal / dev / build Ġdependencies Ġbecause Ġof Ġold ĠC argo Ġ( prior Ġto Ġ` 1 . 4 1 . 0 `). ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġ( lower ed , Ġcy clic ) Ġ= Ġlower Dependencies With Cycles ( dependencies . dependencies , Ġpkg ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠLower ed Package Dependencies ( lower ed , Ġlower ed , Ġcy clic ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġsealed Ġclass ĠSplit Dependencies Ġ{ ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠClass ified ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnormal : ĠCollection < Cargo Workspace . Dependency >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdev : ĠCollection < Cargo Workspace . Dependency >, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild : ĠCollection < Cargo Workspace . Dependency > ĊĠĠĠĠĠĠĠ Ġ) Ġ: ĠSplit Dependencies () ĊĊĠĠĠĠĠĠĠ Ġ// ĠFor Ġold ĠC argo Ġversions Ġprior Ġto Ġ` 1 . 4 1 . 0 ` ĊĠĠĠĠĠĠĠ Ġdata Ġclass ĠUn class ified ( val Ġdependencies : ĠCollection < Cargo Workspace . Dependency >) Ġ: ĠSplit Dependencies () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠCollection < Cargo Workspace . Dependency >. classify (): ĠSplit Dependencies Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġun class ified Ġ= Ġmutable ListOf < Cargo Workspace . Dependency >() ĊĠĠĠĠĠĠĠ Ġval Ġnormal Ġ= Ġmutable ListOf < Cargo Workspace . Dependency >() ĊĠĠĠĠĠĠĠ Ġval Ġdev Ġ= Ġmutable Set Of < Cargo Workspace . Dependency >() ĊĠĠĠĠĠĠĠ Ġval Ġbuild Ġ= Ġmutable ListOf < Cargo Workspace . Dependency >() ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( dependency Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvisited Dep Kinds Ġ= Ġenum Set Of < Cargo Workspace . Dep Kind >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( dep Kind Ġin Ġdependency . dep Kinds ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ` cargo Ġmetadata ` Ġsometimes Ġduplicate Ġ` dep Kinds ` Ġfor Ġsome Ġreason ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! visited Dep Kinds . add ( dep Kind . kind )) Ġcontinue ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( dep Kind . kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC argo Workspace . Dep Kind . Std lib Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnormal Ġ+= Ġdependency ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Ġ+= Ġdependency ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġ` dev Ġ+= Ġdependency ` Ġbecause Ġall Ġcr ates Ġthat Ġuse Ġ` dev ` Ġdependencies Ġalso Ġuse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ` normal ` Ġdependencies ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC argo Workspace . Dep Kind . Un class ified Ġ-> Ġun class ified Ġ+= Ġdependency ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC argo Workspace . Dep Kind . Normal Ġ-> Ġnormal Ġ+= Ġdependency ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC argo Workspace . Dep Kind . Development Ġ-> Ġdev Ġ+= Ġdependency ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC argo Workspace . Dep Kind . Build Ġ-> Ġbuild Ġ+= Ġdependency ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. exhaustive ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdev . removeAll ( normal ) ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( un class ified . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġthese Ġis Ġat Ġleast Ġone Ġun class ified Ġdependency , Ġthen Ġwe 're Ġon Ġold ĠC argo Ġand Ġall Ġdependencies ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġare Ġun class ified ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSplit Dependencies . Un class ified ( un class ified Ġ+ Ġnormal ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSplit Dependencies . Class ified ( normal , Ġdev , Ġbuild ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlower Dependencies ( ĊĠĠĠĠĠĠĠ Ġdeps : ĠIterable < Cargo Workspace . Dependency >, ĊĠĠĠĠĠĠĠ Ġpkg : ĠProject Package ĊĠĠĠ Ġ): ĠList < C rate . Dependency > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdeps . map NotNull Ġ{ Ġdep Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlower Package ( Project Package ( pkg . project , Ġdep . pkg )) ?. let Ġ{ ĠC rate . Dependency ( dep . name , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠC yc lic Graph Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġstates . remove ( pkg . root Directory ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġe . push C rate ( pkg . pkg . name ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow Ġe ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġdata Ġclass ĠLower ed And Cyc lic Dependencies ( ĊĠĠĠĠĠĠĠ Ġval Ġlower ed : ĠList < C rate . Dependency >, ĊĠĠĠĠĠĠĠ Ġval Ġcy clic : ĠList < Cargo Workspace . Dependency > ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun Ġlower Dependencies With Cycles ( ĊĠĠĠĠĠĠĠ Ġdev Dependencies : ĠCollection < Cargo Workspace . Dependency >, ĊĠĠĠĠĠĠĠ Ġpkg : ĠProject Package ĊĠĠĠ Ġ): ĠLower ed And Cyc lic Dependencies Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcy clic Ġ= Ġmutable ListOf < Cargo Workspace . Dependency >() ĊĠĠĠĠĠĠĠ Ġval Ġlower ed Ġ= Ġdev Dependencies . map NotNull Ġ{ Ġdep Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlower Package ( Project Package ( pkg . project , Ġdep . pkg )) ?. let Ġ{ ĠC rate . Dependency ( dep . name , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignored : ĠC yc lic Graph Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġcan Ġoccur Ġbecause Ġ` dev - dependencies ` Ġcan Ġcy clic Ġdepends Ġon Ġthis Ġpackage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠC rate Graph Test marks . cyc lic Dev Dependency . hit () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcy clic Ġ+= Ġdep ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠLower ed And Cyc lic Dependencies ( lower ed , Ġcy clic ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġlower Non Library Cr ates Later ( ctx : ĠNon Library Cr ates ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( ctx . cyc lic Dev Dependencies . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . lower Non Library Cr ates () ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcr ates ToLower Later Ġ+= Ġctx ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġclass ĠNon Library Cr ates ( ĊĠĠĠĠĠĠĠ Ġval Ġpkg : ĠProject Package , ĊĠĠĠĠĠĠĠ Ġval Ġdone State : ĠNode State . Done , ĊĠĠĠĠĠĠĠ Ġval Ġnormal And Non Cyc lic Test Deps : ĠList < C rate . Dependency >, ĊĠĠĠĠĠĠĠ Ġval Ġcy clic Dev Dependencies : ĠList < Cargo Workspace . Dependency >, ĊĠĠĠĠĠĠĠ Ġval Ġflat Normal And Non Cyc lic Dev Deps : ĠLinked HashSet < C rate > ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġprivate Ġfun ĠNon Library Cr ates . lower Non Library Cr ates () Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcy clic Dev Deps Ġ= Ġlower Dependencies ( cyc lic Dev Dependencies , Ġpkg ) ĊĠĠĠĠĠĠĠ Ġval Ġnormal And Test Deps Ġ= Ġnormal And Non Cyc lic Test Deps Ġ+ Ġcy clic Dev Deps ĊĊĠĠĠĠĠĠĠ Ġval Ġlib C rate Ġ= Ġdone State . lib C rate ĊĠĠĠĠĠĠĠ Ġval Ġ( deps With Lib , Ġflat Deps With Lib ) Ġ= Ġif Ġ( lib C rate Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlib Dep Ġ= ĠC rate . Dependency ( lib C rate . norm Name , Ġlib C rate ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġflat Deps Ġ= ĠLinked HashSet < C rate >( flat Normal And Non Cyc lic Dev Deps ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflat Deps Ġ+= Ġcy clic Dev Deps . flatten Top Sorted Deps () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġflat Deps Ġ+= Ġlib C rate ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠPair ( normal And Test Deps Ġ+ Ġlib Dep , Ġflat Deps ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnormal And Test Deps Ġto Ġflat Normal And Non Cyc lic Dev Deps ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġnon Library Cr ates Ġ= Ġpkg . pkg . targets . map NotNull Ġ{ Ġtarget Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target . kind . is Lib Ġ|| Ġtarget . kind Ġ== ĠC argo Workspace . Target Kind . Custom Build ) Ġreturn @ map NotNull Ġnull ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠC argo Based C rate ( pkg . project , Ġtarget , Ġdeps With Lib , Ġflat Deps With Lib ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġdone State . non Library Cr ates Ġ+= Ġnon Library Cr ates ĊĠĠĠĠĠĠĠ Ġtop Sorted Cr ates Ġ+= Ġnon Library Cr ates ĊĠĠĠĠĠĠĠ Ġif Ġ( cyc lic Dev Deps . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlib C rate ?. cyc lic Dev Deps Ġ= Ġcy clic Dev Deps ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġbuild (): ĠC rate Graph Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( ctx Ġin Ġcr ates ToLower Later ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . lower Non Library Cr ates () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġfor Ġ( ctx Ġin Ġcr ates To Replace Target Later ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġctx . replace Project And Target () ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġtop Sorted Cr ates . assert Top Sorted () ĊĊĠĠĠĠĠĠĠ Ġval Ġid To C rate Ġ= ĠT Int Object HashMap < C rate >() ĊĠĠĠĠĠĠĠ Ġfor Ġ( crate Ġin Ġtop Sorted Cr ates ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcrate . check In variants () ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġid Ġ= Ġcrate . id ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( id Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġid To C rate . put ( id , Ġcrate ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠC rate Graph ( top Sorted Cr ates , Ġid To C rate ) ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠC rate . check In variants () Ġ{ ĊĠĠĠ Ġif Ġ(! is UnitTest Mode ) Ġreturn ĊĊĠĠĠ Ġflat Dependencies . assert Top Sorted () ĊĊĠĠĠ Ġfor Ġ( dep Ġin Ġdependencies ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( dep . crate Ġin Ġflat Dependencies ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Error Ġin Ġstructure Ġof Ġcrate Ġ`$ this `: Ġno Ġ`${ dep . crate }` " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Ġdependency Ġin Ġflat Dependencies : Ġ$ flat Dependencies " ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun ĠIterable < C rate >. assert Top Sorted () Ġ{ ĊĠĠĠ Ġif Ġ(! is UnitTest Mode ) Ġreturn ĊĠĠĠ Ġval Ġset Ġ= Ġhash Set Of < C rate >() ĊĠĠĠ Ġfor Ġ( crate Ġin Ġthis ) Ġ{ ĊĠĠĠĠĠĠĠ Ġcheck ( crate . dependencies . all Ġ{ Ġit . crate Ġin Ġset Ġ}) ĊĠĠĠĠĠĠĠ Ġset Ġ+= Ġcrate ĊĠĠĠ Ġ} Ċ } Ċ Ċ private Ġfun Ġmerge Features ( ĊĠĠĠ Ġfeatures 1 : ĠMap < String , ĠFeature State >, ĊĠĠĠ Ġfeatures 2 : ĠMap < String , ĠFeature State > Ċ ): ĠMap < String , ĠFeature State > Ġ{ ĊĠĠĠ Ġval Ġfeature Map Ġ= Ġfeatures 1 . to Mutable Map () ĊĠĠĠ Ġfor Ġ(( k , Ġv ) Ġin Ġfeatures 2 ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfeature Map . merge ( k , Ġv ) Ġ{ Ġv 1 , Ġv 2 Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 1 Ġ== ĠFeature State . Enabled Ġ-> ĠFeature State . Enabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġv 2 Ġ== ĠFeature State . Enabled Ġ-> ĠFeature State . Enabled ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠFeature State . Disabled ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġreturn Ġfeature Map Ċ } Ċ Ċ private Ġdata Ġclass ĠProject Package ( ĊĠĠĠ Ġval Ġproject : ĠC argo Project , ĊĠĠĠ Ġval Ġpkg : ĠC argo Workspace . Package , ĊĠĠĠ Ġ// ĠExtract ed Ġto Ġa Ġfield Ġdue Ġto Ġperformance Ġreasons ĊĠĠĠ Ġval Ġroot Directory : ĠPath Ġ= Ġpkg . root Directory Ċ ) Ċ Ċ private Ġsealed Ġclass ĠNode State Ġ{ ĊĠĠĠ Ġdata Ġclass ĠDone ( ĊĠĠĠĠĠĠĠ Ġval Ġlib C rate : ĠC argo Based C rate ?, ĊĠĠĠĠĠĠĠ Ġval Ġnon Library Cr ates : ĠMutable List < Cargo Based C rate > Ġ= Ġmutable ListOf (), ĊĠĠĠĠĠĠĠ Ġval Ġpk gs : ĠMutable Set < Cargo Workspace . Package > Ġ= Ġhash Set Of () ĊĠĠĠ Ġ) Ġ: ĠNode State () ĊĊĠĠĠ Ġobject ĠProcessing Ġ: ĠNode State () Ċ } Ċ Ċ private Ġclass ĠC yc lic Graph Exception ( crate Name : ĠString ) Ġ: ĠRuntimeException (" Cyc lic Ġgraph Ġdetected ") Ġ{ ĊĠĠĠ Ġprivate Ġval Ġstack : ĠMutable List < String > Ġ= Ġmutable ListOf ( crate Name ) ĊĊĠĠĠ Ġfun Ġpush C rate ( crate Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġstack Ġ+= Ġcrate Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġval Ġmessage : ĠString ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġsuper . message Ġ+ Ġstack . as Re versed (). join ToString ( prefix Ġ= Ġ" Ġ( ", Ġseparator Ġ= Ġ" Ġ-> Ġ", Ġpostfix Ġ= Ġ") ") Ċ } ĊĊ