/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 9 ĠThe ĠAndroid ĠOpen ĠSource ĠProject Ċ Ġ* Ċ Ġ* ĠLicensed Ġunder Ġthe ĠApache ĠLicense , ĠVersion Ġ 2 . 0 Ġ( the Ġ" License "); Ċ Ġ* Ġyou Ġmay Ġnot Ġuse Ġthis Ġfile Ġexcept Ġin Ġcompliance Ġwith Ġthe ĠLicense . Ċ Ġ* ĠYou Ġmay Ġobtain Ġa Ġcopy Ġof Ġthe ĠLicense Ġat Ċ Ġ* Ċ Ġ* ĠĠĠĠĠ Ġhttp :// www . apache . org / licenses / LICENSE - 2 . 0 Ċ Ġ* Ċ Ġ* ĠUnless Ġrequired Ġby Ġapplicable Ġlaw Ġor Ġagreed Ġto Ġin Ġwriting , Ġsoftware Ċ Ġ* Ġdistributed Ġunder Ġthe ĠLicense Ġis Ġdistributed Ġon Ġan Ġ" AS ĠIS " ĠBASIS , Ċ Ġ* ĠWITHOUT ĠWARRANTIES ĠOR ĠCONDITIONS ĠOF ĠANY ĠKIND , Ġeither Ġexpress Ġor Ġimplied . Ċ Ġ* ĠSee Ġthe ĠLicense Ġfor Ġthe Ġspecific Ġlanguage Ġgoverning Ġpermissions Ġand Ċ Ġ* Ġlimitations Ġunder Ġthe ĠLicense . Ċ Ġ*/ Ċ package Ġcom . android . build . at tribution . analy zers Ċ Ċ import Ġcom . android . build . at tribution . data . Task Data Ċ import Ġorg . gradle . language . base . plugins . Lifecycle Base Plugin Ċ Ċ /** Ċ Ġ* ĠThis Ġis Ġa Ġmarker Ġinterface Ġfor Ġthe Ġoutput Ġof Ġany Ġbuild Ġanalyzer . Ċ Ġ*/ Ċ interface ĠAnalyzer Result Ċ Ċ /** Ċ Ġ* ĠBase Ġclass Ġfor Ġall Ġbuild Ġanaly zers , Ġprovides Ġlogic Ġfor Ġcomputing Ġthe Ġfinal Ġresult Ġl az ily Ġand Ġcaching Ġit , Ċ Ġ* Ġrequests Ġcleaning Ġinternal Ġtemporal Ġstate Ġwhen Ġit Ġis Ġnot Ġneeded Ġanymore . Ċ Ġ* ĠSub - classes Ġshould Ġimplement Ġthe Ġresult Ġcomputation Ġand Ġcleaning Ġinternal Ġstate Ġlogic . Ċ Ġ* ĠAny Ġnew Ġanalyzer Ġshould Ġextend Ġthis . Ċ Ġ* Ċ Ġ* ĠThe Ġgeneral Ġflow Ġfor Ġeach Ġanalyzer Ġwould Ġbe : Ċ Ġ* Ġ 1 ) Ġcollect Ġall Ġdata Ġrequired Ġfrom Ġevents Ġand Ġother Ġinput Ġsources Ġin Ġinternal Ġvariables . Ċ Ġ* Ġ 2 ) Ġconvert Ġthis Ġcollected Ġdata Ġinto Ġa Ġfinal Ġresult Ġobject Ġin Ġ[ calcul ating Result ] Ġwhen Ġrequested . Ċ Ġ* Ġ 3 ) Ġclean Ġup Ġcollected Ġtemporal Ġdata Ġin Ġ[ cleanup Temp State ], Ġcalled Ġautomatically Ġwhen Ġdata Ġis Ġno Ġmore Ġneeded . Ċ Ġ*/ Ċ abstract Ġclass ĠBase Analyzer < T Ġ: ĠAnalyzer Result > Ġ{ ĊĊĠ Ġ/** ĠCache Ġfor Ġcalculated Ġresult . Ġ*/ ĊĠ Ġprivate Ġvar Ġ_ result : ĠT ? Ġ= Ġnull ĊĊĠ Ġ/** ĠMark s Ġthat Ġresult Ġcomputation Ġis Ġin Ġprogress Ġto Ġdetect Ġdependency Ġcycles . Ġ*/ ĊĠ Ġprivate Ġvar Ġcalculating Result Ġ= Ġfalse ĊĊĠ Ġval Ġresult : ĠT ĊĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠ Ġensure Result Calculated () ĊĠĠĠĠĠ Ġreturn Ġ_ result !! ĊĠĠĠ Ġ} ĊĊĠ Ġfun Ġensure Result Calculated () Ġ{ ĊĠĠĠ Ġif Ġ( calcul ating Result ) Ġthrow ĠResult Computation Loop Exception () ĊĠĠĠ Ġif Ġ(_ result Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠ Ġcalculating Result Ġ= Ġtrue ĊĠĠĠĠĠ Ġ_ result Ġ= Ġcalculate Result () ĊĠĠĠĠĠ Ġcleanup Temp State () ĊĠĠĠĠĠ Ġcalculating Result Ġ= Ġfalse ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprotected Ġabstract Ġfun Ġcalculate Result (): ĠT ĊĊĠ Ġabstract Ġfun Ġcleanup Temp State () ĊĊĠ Ġfun Ġon Build Start () Ġ{ ĊĠĠĠ Ġ_ result Ġ= Ġnull ĊĠĠĠ Ġcalculating Result Ġ= Ġfalse ĊĠĠĠ Ġcleanup Temp State () ĊĠ Ġ} ĊĊĠ Ġfun Ġon Build Failure () Ġ= Ġcleanup Temp State () ĊĊĠ Ġ/** ĊĠĠ Ġ* ĠFilter Ġto Ġignore Ġcertain Ġtasks Ġor Ġtasks Ġfrom Ġcertain Ġplugins . ĊĠĠ Ġ*/ ĊĠ Ġprotected Ġfun Ġapply Ignored Tasks Filter ( task : ĠTask Data ): ĠBoolean Ġ{ ĊĠĠĠ Ġ// Ġignore Ġtasks Ġfrom Ġour Ġplugins ĊĠĠĠ Ġreturn Ġ! task . origin Plugin . is Android Plugin () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore Ġtasks Ġfrom ĠGradle Ġplugins ĊĠĠĠĠĠĠĠĠĠĠ Ġ! task . origin Plugin . is Gradle Plugin () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġtask Ġis Ġnot Ġcache able Ġand Ġruns Ġall Ġthe Ġtime Ġintention ally Ġon Ġinvoking Ġ" clean ". ĠWe Ġshould Ġnot Ġsurface Ġthis Ġas Ġan Ġissue . ĊĠĠĠĠĠĠĠĠĠĠ Ġ!( task . task Name Ġ== Ġ" clean " Ġ&& Ġtask . origin Plugin . id Name Ġ== ĠLifecycle Base Plugin :: class . java . canonical Name ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠ Ġ// Ġignore Ġcustom Ġdelete Ġtasks ĊĠĠĠĠĠĠĠĠĠĠ Ġtask . task Type Ġ!= Ġorg . gradle . api . tasks . Delete :: class . java . canonical Name ĊĠ Ġ} ĊĊĠ Ġclass ĠResult Computation Loop Exception Ġ: ĠException (" Loop Ġdetected Ġin Ġbuild Ġanalyzer Ġcomputation Ġdependencies , Ġsee Ġstack trace .") Ċ } Ċ