/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 1 Ġ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 . tools . lint . client . api Ċ Ċ import Ġcom . android . Sdk Constants Ċ import Ġcom . android . Sdk Constants . CLASS _ FOLDER Ċ import Ġcom . android . Sdk Constants . CURRENT _ PLATFORM Ċ import Ġcom . android . Sdk Constants . DOT _ A AR Ċ import Ġcom . android . Sdk Constants . DOT _ JAR Ċ import Ġcom . android . Sdk Constants . DOT _ SRC JAR Ċ import Ġcom . android . Sdk Constants . DOT _ XML Ċ import Ġcom . android . Sdk Constants . FD _ AS SETS Ċ import Ġcom . android . Sdk Constants . FN _ AN NOT ATIONS _ ZIP Ċ import Ġcom . android . Sdk Constants . GEN _ FOLDER Ċ import Ġcom . android . Sdk Constants . LIBS _ FOLDER Ċ import Ġcom . android . Sdk Constants . PLATFORM _ LINUX Ċ import Ġcom . android . Sdk Constants . RES _ FOLDER Ċ import Ġcom . android . Sdk Constants . SRC _ FOLDER Ċ import Ġcom . android . ide . common . repository . Gradle Coordinate Ċ import Ġcom . android . ide . common . repository . Gradle Version Ċ import Ġcom . android . ide . common . resources . Resource Item Ċ import Ġcom . android . ide . common . resources . Resource Repository Ċ import Ġcom . android . ide . common . util . Path String Ċ import Ġcom . android . man if mer ger . Actions Ċ import Ġcom . android . prefs . Android Locations Exception Ċ import Ġcom . android . prefs . Android Locations Singleton Ċ import Ġcom . android . sdk lib . I Android Target Ċ import Ġcom . android . sdk lib . Sdk VersionInfo Ċ import Ġcom . android . tools . lint . detector . api . Constraint Ċ import Ġcom . android . tools . lint . detector . api . Context Ċ import Ġcom . android . tools . lint . detector . api . Des ug aring Ċ import Ġcom . android . tools . lint . detector . api . Detector Ċ import Ġcom . android . tools . lint . detector . api . Incident Ċ import Ġcom . android . tools . lint . detector . api . Issue Ċ import Ġcom . android . tools . lint . detector . api . Lint Fix Ċ import Ġcom . android . tools . lint . detector . api . Lint Map Ċ import Ġcom . android . tools . lint . detector . api . Location Ċ import Ġcom . android . tools . lint . detector . api . Partial Result Ċ import Ġcom . android . tools . lint . detector . api . Project Ċ import Ġcom . android . tools . lint . detector . api . Severity Ċ import Ġcom . android . tools . lint . detector . api . Text Format Ċ import Ġcom . android . tools . lint . detector . api . endsWith Ċ import Ġcom . android . tools . lint . detector . api . get Common Parent Ċ import Ġcom . android . tools . lint . detector . api . get Language Level Ċ import Ġcom . android . tools . lint . detector . api . is Manifest Folder Ċ import Ġcom . android . tools . lint . model . Lint Model Android Library Ċ import Ġcom . android . tools . lint . model . Lint Model Library Ċ import Ġcom . android . utils . Char Sequences Ċ import Ġcom . android . utils . Pair Ċ import Ġcom . android . utils . Xml Utils Ċ import Ġcom . android . utils . find Gradle Build File Ċ import Ġcom . google . common . annotations . Beta Ċ import Ġcom . google . common . base . Splitter Ċ import Ġcom . google . common . collect . Lists Ċ import Ġcom . google . common . collect . Maps Ċ import Ġcom . google . common . collect . Sets Ċ import Ġcom . intellij . openapi . util . Comp utable Ċ import Ġcom . intellij . pom . java . Language Level Ċ import Ġcom . intellij . pom . java . Language Level . JDK _ 1 _ 7 Ċ import Ġcom . intellij . pom . java . Language Level . JDK _ 1 _ 8 Ċ import Ġorg . jetbrains . kotlin . config . Language Version Settings Ċ import Ġorg . jetbrains . kotlin . config . Language Version Settings Impl Ċ import Ġorg . k xml 2 . io . K Xml Parser Ċ import Ġorg . w 3 c . dom . Document Ċ import Ġorg . w 3 c . dom . Element Ċ import Ġorg . w 3 c . dom . Node Ċ import Ġorg . xml pull . v 1 . Xml Pull Parser Ċ import Ġjava . io . ByteArray InputStream Ċ import Ġjava . io . File Ċ import Ġjava . io . File . separator Char Ċ import Ġjava . io . FileNotFoundException Ċ import Ġjava . io . IOException Ċ import Ġjava . net . Http URLConnection Ċ import Ġjava . net . URL Ċ import Ġjava . net . URL ClassLoader Ċ import Ġjava . net . URLConnection Ċ import Ġjava . nio . charset . StandardCharsets Ċ import Ġjava . nio . file . Paths Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . HashMap Ċ import Ġjava . util . Locale Ċ import Ġjava . util . function . Predicate Ċ import Ġkotlin . math . max Ċ Ċ /** Ċ Ġ* ĠInformation Ġabout Ġthe Ġtool Ġembedding Ġthe Ġlint Ġanalyzer . ĠIDE s Ġand Ċ Ġ* Ġother Ġtools Ġimplementing Ġlint Ġsupport Ġwill Ġextend Ġthis Ġto Ġintegrate Ċ Ġ* Ġlogging , Ġdisplaying Ġerrors , Ġetc . Ċ Ġ* Ċ Ġ* Ġ** NOTE : ĠThis Ġis Ġnot Ġa Ġpublic Ġor Ġfinal ĠAPI ; Ġif Ġyou Ġrely Ġon Ġthis Ġbe Ċ Ġ* Ġprepared Ġto Ġadjust Ġyour Ġcode Ġfor Ġthe Ġnext Ġtools Ġrelease .** Ċ Ġ*/ Ċ @ Beta Ċ abstract Ġclass ĠL int Client Ġ{ ĊĊĠĠĠ Ġprotected Ġconstructor ( client Name : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ ĠL int Client . client Name Ġ= Ġclient Name ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġconstructor () Ġ{ ĊĠĠĠĠĠĠĠ Ġclient Name Ġ= Ġ" unknown " ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠConfigur ations Ġreferenced Ġby Ġthis Ġclient . Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Le aking This ") ĊĠĠĠ Ġopen Ġval Ġconfigurations : ĠConfiguration Hierarchy Ġ= ĠConfiguration Hierarchy ( this ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġconfiguration Ġfor Ġuse Ġby Ġthe Ġgiven Ġproject . ĠThe ĊĠĠĠĠ Ġ* Ġconfiguration Ġprovides Ġinformation Ġabout Ġwhich Ġissues Ġare ĊĠĠĠĠ Ġ* Ġenabled , Ġany Ġcustom izations Ġto Ġthe Ġseverity Ġof Ġan Ġissue , Ġetc . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠBy Ġdefault Ġthis Ġmethod Ġreturns Ġa Ġ[ Lint Xml Configuration ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġto Ġobtain Ġa Ġconfiguration Ġfor ĊĠĠĠĠ Ġ* Ġ@ param Ġdriver Ġthe Ġcurrent Ġdriver , Ġif Ġany ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġconfiguration , Ġnever Ġnull . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Configuration ( project : ĠProject , Ġdriver : ĠL int Driver ?): ĠConfiguration Ġ= ĊĠĠĠĠĠĠĠ Ġconfigurations . getConfiguration For Project ( project ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġconfiguration Ġfor Ġuse Ġfor Ġthe Ġgiven Ġfile . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfile Ġthe Ġsource Ġfile Ġto Ġobtain Ġa Ġconfiguration Ġfor ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġconfiguration , Ġor Ġnull Ġif Ġno Ġconfiguration Ġis Ġfound ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Configuration ( file : ĠFile ): ĠConfiguration ? Ġ= ĊĠĠĠĠĠĠĠ Ġconfigurations . getConfiguration For Folder ( file . parent File ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReport Ġthe Ġgiven Ġissue . ĠThis Ġmethod Ġwill Ġonly Ġbe Ġcalled Ġif Ġthe ĊĠĠĠĠ Ġ* Ġconfiguration Ġprovided Ġby Ġ[ getConfiguration ] Ġhas Ġreported Ġthe ĊĠĠĠĠ Ġ* Ġcorresponding Ġissue Ġas Ġenabled Ġand Ġhas Ġnot Ġfiltered Ġout Ġthe Ġissue ĊĠĠĠĠ Ġ* Ġwith Ġits Ġ[ Configuration . ignore ] Ġmethod . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcontext Ġthe Ġcontext Ġused Ġby Ġthe Ġdetector Ġwhen Ġthe Ġissue ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġwas Ġfound ĊĠĠĠĠ Ġ* Ġ@ param Ġissue Ġthe Ġissue Ġthat Ġwas Ġfound ĊĠĠĠĠ Ġ* Ġ@ param Ġseverity Ġthe Ġseverity Ġof Ġthe Ġissue ĊĠĠĠĠ Ġ* Ġ@ param Ġlocation Ġthe Ġlocation Ġof Ġthe Ġissue ĊĠĠĠĠ Ġ* Ġ@ param Ġmessage Ġthe Ġassociated Ġuser Ġmessage ĊĠĠĠĠ Ġ* Ġ@ param Ġformat Ġthe Ġformat Ġof Ġthe Ġdescription Ġand Ġlocation ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġdescriptions ĊĠĠĠĠ Ġ* Ġ@ param Ġfix Ġan Ġoptional Ġset Ġof Ġextra Ġdata Ġprovided Ġby Ġthe Ġdetector ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġfor Ġthis Ġissue ; Ġthis Ġis Ġintended Ġto Ġpass Ġmetadata Ġto ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġthe ĠIDE Ġto Ġhelp Ġconstruct Ġquick fixes Ġwithout Ġhaving ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġto Ġparse Ġerror Ġmessages Ġ( which Ġis Ġb rit tle ) Ġor Ġworse ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġhaving Ġto Ġinclude Ġinformation Ġin Ġthe Ġerror Ġmessage Ġ( for ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġlater Ġparsing ) Ġwhich Ġis Ġrequired Ġby Ġthe Ġquick fix Ġbut ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġnot Ġreally Ġhelpful Ġin Ġthe Ġerror Ġmessage Ġitself Ġ( such Ġas ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġthe Ġmax Version Ġfor Ġa Ġpermission Ġtag Ġto Ġbe Ġadded Ġto Ġthe ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Deprecated ( ĊĠĠĠĠĠĠĠ Ġ" Use Ġthe Ġnew Ġreport ( Incident ) Ġmethod Ġinstead ", ĊĠĠĠĠĠĠĠ ĠReplace With ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" report ( context , ĠInc ident ( issue , Ġmessage , Ġlocation , Ġfix ), Ġformat )", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" com . android . tools . lint . detector . api . Incident " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġreport ( ĊĠĠĠĠĠĠĠ Ġcontext : ĠContext , ĊĠĠĠĠĠĠĠ Ġissue : ĠIssue , ĊĠĠĠĠĠĠĠ Ġseverity : ĠSeverity , ĊĠĠĠĠĠĠĠ Ġlocation : ĠLocation , ĊĠĠĠĠĠĠĠ Ġmessage : ĠString , ĊĠĠĠĠĠĠĠ Ġformat : ĠText Format , ĊĠĠĠĠĠĠĠ Ġfix : ĠL int Fix ? ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġincident Ġ= ĠInc ident ( issue , Ġmessage , Ġlocation , Ġfix ) ĊĠĠĠĠĠĠĠ Ġincident . severity Ġ= Ġseverity ĊĠĠĠĠĠĠĠ Ġreport ( context , Ġincident , Ġformat ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReport Ġthe Ġgiven Ġ[ incident ] Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġreport ( context : ĠContext , Ġincident : ĠInc ident , Ġformat : ĠText Format Ġ= ĠText Format . RAW ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReports Ġthe Ġgiven Ġincident Ġto Ġlint Ġas Ġa Ġconditional ĊĠĠĠĠ Ġ* Ġincident , Ġmeaning Ġthat Ġit Ġis Ġnot Ġyet Ġcon clusive . ĊĠĠĠĠ Ġ* ĠThe Ġ[ constraint ] Ġspecifies Ġa Ġcondition Ġto Ġcheck Ġin ĊĠĠĠĠ Ġ* Ġthe Ġreporting Ġproject 's Ġcontext . ĠFor Ġexample , Ġusing ĊĠĠĠĠ Ġ* Ġ[ com . android . tools . lint . detector . api . min Sdk At Least ]( 2 3 ) Ġwill ĊĠĠĠĠ Ġ* Ġonly Ġreport Ġthis Ġincident Ġin Ġconsuming Ġprojects Ġwhere Ġthe ĊĠĠĠĠ Ġ* Ġmin Sdk Version Ġis Ġ 2 3 Ġor Ġhigher . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġreport ( context : ĠContext , Ġincident : ĠInc ident , Ġconstraint : ĠConstraint ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReports Ġthe Ġgiven Ġincident Ġto Ġlint Ġas Ġa Ġprovision al Ġincident , ĊĠĠĠĠ Ġ* Ġmeaning Ġthat Ġit Ġis Ġnot Ġyet Ġcon clusive . ĠL int Ġwill Ġlater Ġcall Ġback ĊĠĠĠĠ Ġ* Ġto Ġthe Ġdetector Ġ( corre sponding Ġto Ġthe Ġreported Ġincident ) Ġand Ġask ĊĠĠĠĠ Ġ* Ġit Ġvia Ġthe Ġ[ Detector . filter Incident ] Ġmethod Ġto Ġdecide Ġwhether ĊĠĠĠĠ Ġ* Ġthe Ġincident Ġshould Ġreally Ġbe Ġreported Ġor Ġnot , Ġand Ġoptionally ĊĠĠĠĠ Ġ* Ġto Ġcustomize Ġthe Ġincident Ġsuch Ġas Ġupdating Ġthe Ġmessage . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġpurpose Ġof Ġthis Ġis Ġto Ġallow Ġlint Ġto Ġprocess Ġsource Ġfiles Ġin ĊĠĠĠĠ Ġ* Ġlibraries Ġonce Ġ( and Ġreport Ġpotential Ġerrors Ġvia Ġthis Ġmethod ), Ġand ĊĠĠĠĠ Ġ* Ġthen Ġlater , Ġwhen Ġgenerating Ġreports Ġin Ġdownstream Ġmodules Ġsuch Ġas ĊĠĠĠĠ Ġ* Ġthe Ġapp Ġmodule , Ġquickly Ġconsider Ġ( in Ġ[ Detector . filter Incident ]) ĊĠĠĠĠ Ġ* Ġall Ġthe Ġpotential Ġmethods Ġand Ġsimply Ġfilter Ġthem Ġby Ġthe ĊĠĠĠĠ Ġ* Ġlocal Ġenvironment , Ġsuch Ġas Ġthe Ġreal Ġapp Ġmin Sdk Version . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġallows Ġlint Ġto Ġonly Ġanalyze Ġthe Ġlibrary Ġonce , Ġand Ġthen Ġreuse ĊĠĠĠĠ Ġ* Ġthose Ġresults Ġmultiple Ġtimes , Ġfor Ġeach Ġtrans itive Ġusage Ġof Ġthe ĊĠĠĠĠ Ġ* Ġlibrary . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġreport ( context : ĠContext , Ġincident : ĠInc ident , Ġmap : ĠL int Map ) Ġ{ ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġpartial Ġresult Ġwhere Ġa Ġ[ Detector ] Ġcan Ġstore Ġstate Ġfor ĊĠĠĠĠ Ġ* Ġlater Ġanalysis Ġin Ġ[ Detector . check Partial Results ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Partial Results ( project : ĠProject , Ġissue : ĠIssue ): ĠPartial Result Ġ{ ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġdefault Ġclient Ġdoes Ġnot Ġsupport Ġpartial Ġanalysis Ġso Ġjust Ġreturn Ġan Ġempty Ġresult ĊĠĠĠĠĠĠĠ Ġreturn ĠPartial Result ( issue , Ġmutable Map Of ()) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠWhether Ġthis Ġclient Ġsupports Ġthe Ġ" partial Ġanalysis " Ġmechanism . ĊĠĠĠĠ Ġ* ĠWhen Ġthis Ġis Ġtrue , Ġa Ġmodule Ġis Ġanalyzed Ġby Ġlint Ġin Ġisolation Ġ( the ĊĠĠĠĠ Ġ* Ġdetector s Ġare Ġnot Ġallowed Ġto Ġquery Ġinformation Ġoutside Ġof Ġthat ĊĠĠĠĠ Ġ* Ġlibrary , Ġsuch Ġas Ġdownstream Ġinformation Ġabout Ġmin Sdk Versions ĊĠĠĠĠ Ġ* Ġin Ġthe Ġconsuming Ġapp Ġmodule ), Ġand Ġthen Ġthe Ġresults Ġcan Ġbe ĊĠĠĠĠ Ġ* Ġreported Ġ** provision ally ** Ġ( via Ġ[ Context . report ] Ġwith Ġeither ĊĠĠĠĠ Ġ* Ġa Ġ[ Constraint ] Ġor Ġ[ Lint Map ]). ĠL int Ġwill Ġstore Ġthese Ġresults , ĊĠĠĠĠ Ġ* Ġand Ġlater Ġwhen Ġthe Ġapp Ġmodule Ġreport Ġis Ġgenerated , Ġload Ġthe ĊĠĠĠĠ Ġ* Ġprovision al Ġerrors Ġand Ġgive Ġthe Ġdetector s Ġa Ġchance Ġto Ġ( che ap ly ) ĊĠĠĠĠ Ġ* Ġfilter Ġtheir Ġpreviously Ġprovision ally Ġreported Ġincident s Ġgiven ĊĠĠĠĠ Ġ* Ġthe Ġactual Ġmin Sdk Version , Ġmerged Ġmanifest , Ġetc , Ġof Ġthe Ġconsuming ĊĠĠĠĠ Ġ* Ġmodule . ĠFor Ġconditions , Ġthis Ġis Ġhandled Ġautomatically ; Ġfor ĊĠĠĠĠ Ġ* Ġmanual Ġlogic Ġvia Ġ[ Lint Map ], Ġoverride Ġ[ Detector . filter Incident ] ĊĠĠĠĠ Ġ* Ġwhich Ġreturns Ġthe Ġpersisted Ġmap Ġwith Ġstate Ġto Ġconsider . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠIn Ġthe ĠIDE , Ġfor Ġexample , Ġwhere Ġwe Ġhave Ġalways Ġhave Ġaccess Ġto ĊĠĠĠĠ Ġ* Ġall Ġthe Ġproject Ġmetadata , Ġthis Ġreturns Ġfalse . ĠWhen Ġthis Ġreturns ĊĠĠĠĠ Ġ* Ġfalse , Ġall Ġprovision ally Ġreported Ġissues Ġare Ġdirectly Ġpassed Ġover ĊĠĠĠĠ Ġ* Ġto Ġthe Ġconditions Ġor Ġ[ Detector . filter Incident ] Ġfor Ġimmediate ĊĠĠĠĠ Ġ* Ġfiltering Ġand Ġreporting . ĠThis Ġlets Ġdetector s Ġhandle Ġboth ĊĠĠĠĠ Ġ* Ġscenarios Ġin Ġa Ġsingle Ġway . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġsupports Partial Analysis (): ĠBoolean Ġ= Ġfalse ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAfter Ġpartial Ġanalysis Ġhas Ġcompleted , Ġlint Ġwill Ġcall Ġthis Ġmethod ĊĠĠĠĠ Ġ* Ġto Ġstore Ġthe Ġ( partial ) Ġresults . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠHow Ġand Ġwhere Ġthe Ġincident s Ġare Ġstored Ġis Ġleft Ġup Ġto Ġthe Ġclient . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠOnly Ġintended Ġfor Ġlint 's Ġown Ġusage . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġstore State ( project : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġerror (" This Ġclient Ġdoes Ġnot Ġsupport Ġpartial Ġlint Ġanalysis .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAfter Ġpartial Ġanalysis Ġhas Ġcompleted Ġfor Ġall Ġdependencies , ĊĠĠĠĠ Ġ* Ġlint Ġwill Ġcall Ġthis Ġmethod Ġduring Ġerror Ġreporting Ġto Ġmerge Ġand ĊĠĠĠĠ Ġ* Ġvalidate Ġthe Ġpartial Ġresults . ĠOnly Ġintended Ġfor Ġlint 's Ġown Ġusage . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġmerge State ( root : ĠProject , Ġdriver : ĠL int Driver ) Ġ{ ĊĠĠĠĠĠĠĠ Ġerror (" This Ġclient Ġdoes Ġnot Ġsupport Ġpartial Ġlint Ġanalysis .") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSend Ġan Ġexception Ġor Ġerror Ġmessage Ġ( with Ġwarning Ġseverity ) Ġto Ġthe ĊĠĠĠĠ Ġ* Ġlog ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġexception Ġthe Ġexception , Ġpossibly Ġnull ĊĠĠĠĠ Ġ* Ġ@ param Ġformat Ġthe Ġerror Ġmessage Ġusing Ġ[ java . lang . String . format ] ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġsyntax , Ġpossibly Ġnull Ġ( though Ġin Ġthat ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġcase Ġthe Ġexception Ġshould Ġnot Ġbe Ġnull ) ĊĠĠĠĠ Ġ* Ġ@ param Ġargs Ġany Ġarguments Ġfor Ġthe Ġformat Ġstring ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġlog ( ĊĠĠĠĠĠĠĠ Ġexception : ĠThrowable ?, ĊĠĠĠĠĠĠĠ Ġformat : ĠString ?, ĊĠĠĠĠĠĠĠ Ġvar arg Ġargs : ĠAny ĊĠĠĠ Ġ) Ġ= Ġlog ( Severity . WARNING , Ġexception , Ġformat , Ġ* args ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠSend Ġan Ġexception Ġor Ġerror Ġmessage Ġto Ġthe Ġlog ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġseverity Ġthe Ġseverity Ġof Ġthe Ġwarning ĊĠĠĠĠ Ġ* Ġ@ param Ġexception Ġthe Ġexception , Ġpossibly Ġnull ĊĠĠĠĠ Ġ* Ġ@ param Ġformat Ġthe Ġerror Ġmessage Ġusing Ġ[ java . lang . String . format ] ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġsyntax , Ġpossibly Ġnull Ġ( though Ġin Ġthat ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġcase Ġthe Ġexception Ġshould Ġnot Ġbe Ġnull ) ĊĠĠĠĠ Ġ* Ġ@ param Ġargs Ġany Ġarguments Ġfor Ġthe Ġformat Ġstring ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġlog ( ĊĠĠĠĠĠĠĠ Ġseverity : ĠSeverity , ĊĠĠĠĠĠĠĠ Ġexception : ĠThrowable ?, ĊĠĠĠĠĠĠĠ Ġformat : ĠString ?, ĊĠĠĠĠĠĠĠ Ġvar arg Ġargs : ĠAny ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġ[ Xml Parser ] Ġto Ġuse Ġto Ġparse ĠXML ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġnew Ġ[ Xml Parser ], Ġor Ġnull Ġif Ġthis Ġclient Ġdoes Ġnot ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġsupport ĠXML Ġanalysis ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġval Ġxml Parser : ĠXml Parser ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReads Ġthe Ġgiven Ġ[ file ] Ġ( or Ġin Ġthe ĠIDE , Ġf etches Ġthe Ġpossibly ĊĠĠĠĠ Ġ* Ġedited Ġeditor Ġcontents Ġcorresponding Ġto Ġthe Ġgiven Ġfile ) Ġad Ġparses ĊĠĠĠĠ Ġ* Ġit Ġinto Ġan ĠXML Ġdocument . ĠThis Ġis Ġa Ġconvenience Ġwrapper Ġaround ĊĠĠĠĠ Ġ* Ġ[ xml Parser ] Ġbut Ġallows Ġthe Ġclient Ġto Ġdo Ġsome Ġcaching . ĠIf Ġthe ĊĠĠĠĠ Ġ* Ġoptional Ġ[ contents ] Ġparameter Ġis Ġnon Ġnull , Ġit Ġwill Ġbe Ġtaken Ġto Ġbe ĊĠĠĠĠ Ġ* Ġthe Ġcontent Ġof Ġthe Ġfile . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Xml Document ( file : ĠFile , Ġcontents : ĠCharSequence ? Ġ= Ġnull ): ĠDocument ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( contents ?. isNotBlank () Ġ== Ġtrue ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġxml Parser . parse Xml ( contents , Ġfile ) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġxml Parser . parse Xml ( file ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġ[ U ast Parser ] Ġto Ġuse Ġto Ġparse ĠJava ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġto Ġparse , Ġif Ġknown Ġ( this Ġcan Ġbe Ġused ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġto Ġlook Ġup Ġthe Ġclass Ġpath Ġfor Ġtype Ġat tribution ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġetc , Ġand Ġit Ġcan Ġalso Ġbe Ġused Ġto Ġmore Ġefficiently ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġprocess Ġa Ġset Ġof Ġfiles , Ġfor Ġexample Ġto Ġperform Ġtype ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġat tribution Ġfor Ġmultiple Ġunits Ġin Ġa Ġsingle Ġpass ) ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġnew Ġ[ U ast Parser ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġget U ast Parser ( project : ĠProject ?): ĠU ast Parser ĊĊĠĠĠ Ġ/** ĠReturns Ġa Ġvisitor Ġto Ġuse Ġto Ġanalyze ĠGradle Ġbuild Ġscripts . Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġget Gradle Visitor (): ĠGradle Visitor ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReads Ġthe Ġgiven Ġtext Ġfile Ġand Ġreturns Ġthe Ġcontent Ġas Ġa Ġstring ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfile Ġthe Ġfile Ġto Ġread ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġstring Ġto Ġreturn , Ġnever Ġnull Ġ( will Ġbe Ġempty Ġif Ġthere ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġis Ġan ĠI / O Ġerror ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun ĠreadFile ( file : ĠFile ): ĠCharSequence ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReads Ġthe Ġgiven Ġbinary Ġfile Ġand Ġreturns Ġthe Ġcontent Ġas Ġa Ġbyte ĊĠĠĠĠ Ġ* Ġarray . ĠBy Ġdefault Ġthis Ġmethod Ġwill Ġread Ġthe Ġbytes Ġfrom Ġthe ĊĠĠĠĠ Ġ* Ġfile Ġdirectly , Ġbut Ġthis Ġcan Ġbe Ġcustomized Ġby Ġa Ġclient Ġif Ġfor ĊĠĠĠĠ Ġ* Ġexample ĠI / O Ġcould Ġbe Ġheld Ġin Ġmemory Ġand Ġnot Ġfl ushed Ġto Ġdisk Ġyet . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfile Ġthe Ġfile Ġto Ġread ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġbytes Ġin Ġthe Ġfile , Ġnever Ġnull ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException Ġif Ġthe Ġfile Ġdoes Ġnot Ġexist , Ġor Ġif Ġthe Ġfile ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġcannot Ġbe Ġread Ġfor Ġsome Ġreason ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġopen Ġfun Ġread Bytes ( file : ĠFile ): ĠByteArray Ġ= Ġfile . read Bytes () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReads Ġand Ġreturns Ġthe Ġcontents Ġof Ġa Ġfile Ġresource . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġresource Path Ġthe Ġpath Ġto Ġa Ġfile ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġcontents Ġof Ġthe Ġfile Ġresource ĊĠĠĠĠ Ġ* Ġ@ throws ĠFileNotFoundException Ġif Ġthe Ġresource Ġdoesn 't Ġexist ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException Ġin Ġcase Ġof Ġan ĠI / O Ġerror ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġopen Ġfun Ġread Bytes ( resource Path : ĠPath String ): ĠByteArray Ġ= ĊĠĠĠĠĠĠĠ Ġresource Path . to File ()?. read Bytes () Ġ?: Ġthrow ĠFileNotFoundException ( resource Path . toString ()) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġlist Ġof Ġsource Ġfolders Ġfor ĠJava Ġsource Ġfiles ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġto Ġlook Ġup ĠJava Ġsource Ġfile Ġlocations ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġfor ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġlist Ġof Ġsource Ġfolders Ġto Ġsearch Ġfor Ġ. java Ġfiles ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Java Source Folders ( project : ĠProject ): ĠList < File > Ġ= ĊĠĠĠĠĠĠĠ ĠgetClass Path ( project ). source Folders ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġlist Ġof Ġgenerated Ġsource Ġfolders ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġto Ġlook Ġup Ġgenerated Ġsource Ġfile ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġlocations Ġfor ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġlist Ġof Ġgenerated Ġsource Ġfolders Ġto Ġsearch Ġfor Ġsource ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġfiles ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Generated Source Folders ( project : ĠProject ): ĠList < File > Ġ= ĊĠĠĠĠĠĠĠ ĠgetClass Path ( project ). generated Folders ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġlist Ġof Ġoutput Ġfolders Ġfor Ġclass Ġfiles ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġto Ġlook Ġup Ġclass Ġfile Ġlocations Ġfor ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġlist Ġof Ġoutput Ġfolders Ġto Ġsearch Ġfor Ġ. class Ġfiles ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Java Class Folders ( project : ĠProject ): ĠList < File > Ġ= ĠgetClass Path ( project ). class Folders ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġlist Ġof ĠJava Ġlibraries ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġto Ġlook Ġup Ġjar Ġdependencies Ġfor ĊĠĠĠĠ Ġ* Ġ@ param Ġinclude Provided ĠIf Ġtrue , Ġincluded Ġprovided Ġlibraries Ġtoo ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ( libraries Ġthat Ġare Ġnot Ġpackaged Ġwith Ġthe Ġapp , ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġbut Ġare Ġprovided Ġfor Ġcompilation Ġpurposes Ġand Ġare ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġassumed Ġto Ġbe Ġpresent Ġin Ġthe Ġrunning Ġenvironment ) ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġlist Ġof Ġjar Ġdependencies Ġcontaining Ġ. class Ġfiles ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Java Libraries ( project : ĠProject , Ġinclude Provided : ĠBoolean ): ĠList < File > Ġ= ĊĠĠĠĠĠĠĠ ĠgetClass Path ( project ). get Libraries ( include Provided ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġlist Ġof Ġsource Ġfolders Ġfor Ġtest Ġsource Ġfiles ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġto Ġlook Ġup Ġtest Ġsource Ġfile Ġlocations ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġfor ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġlist Ġof Ġsource Ġfolders Ġto Ġsearch Ġfor Ġ. java Ġfiles ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Test Source Folders ( project : ĠProject ): ĠList < File > Ġ= ĊĠĠĠĠĠĠĠ ĠgetClass Path ( project ). test Source Folders ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġlist Ġof Ġlibraries Ġneeded Ġto Ġcompile Ġthe Ġtest Ġsource ĊĠĠĠĠ Ġ* Ġfiles ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġto Ġlook Ġup Ġtest Ġsource Ġfile Ġlocations ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġfor ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġlist Ġof Ġjar Ġfiles Ġto Ġadd Ġto Ġthe Ġregular Ġproject ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġdependencies Ġwhen Ġcompiling Ġthe Ġtest Ġsources ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Test Libraries ( project : ĠProject ): ĠList < File > Ġ= ĊĠĠĠĠĠĠĠ ĠgetClass Path ( project ). test Libraries ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġresource Ġfolders . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġto Ġlook Ġup Ġthe Ġresource Ġfolders Ġfor ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġlist Ġof Ġfiles Ġpointing Ġto Ġthe Ġresource Ġfolders , ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġpossibly Ġempty ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun ĠgetResource Folders ( project : ĠProject ): ĠList < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġres Ġ= ĠFile ( project . dir , ĠRES _ FOLDER ) ĊĠĠĠĠĠĠĠ Ġif Ġ( res . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( res ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġgenerated Ġresource Ġfolders . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġto Ġlook Ġup Ġthe Ġgenerated Ġresource ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġfolders Ġfor ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġlist Ġof Ġfiles Ġpointing Ġto Ġthe Ġgenerated Ġresource ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġfolders , Ġpossibly Ġempty ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Generated Resource Folders ( project : ĠProject ): ĠList < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġasset Ġfolders . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġto Ġlook Ġup Ġthe Ġasset Ġfolder Ġfor ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġlist Ġof Ġfiles Ġpointing Ġto Ġthe Ġasset Ġfolders , Ġpossibly ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġempty ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Asset Folders ( project : ĠProject ): ĠList < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġassets Ġ= ĠFile ( project . dir , ĠFD _ AS SETS ) ĊĠĠĠĠĠĠĠ Ġif Ġ( assets . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( assets ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġ[ Sdk Info ] Ġto Ġuse Ġfor Ġthe Ġgiven Ġproject . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġto Ġlook Ġup Ġan Ġ[ Sdk Info ] Ġfor ĊĠĠĠĠ Ġ* Ġ@ return Ġan Ġ[ Sdk Info ] Ġfor Ġthe Ġproject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Sdk Info ( project : ĠProject ): ĠS dk Info Ġ= Ġ// ĠBy Ġdefault Ġno Ġper - platform ĠSDK Ġinfo ĊĠĠĠĠĠĠĠ ĠDefault Sdk Info () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġsuitable Ġlocation Ġfor Ġstoring Ġcache Ġfiles Ġof Ġa Ġgiven ĊĠĠĠĠ Ġ* Ġnamed Ġtype . ĠThe Ġnamed Ġtype Ġis Ġtypically Ġcreated Ġas Ġa Ġdirectory ĊĠĠĠĠ Ġ* Ġwithin Ġthe Ġshared Ġcache Ġdirectory . ĠFor Ġexample , Ġfrom Ġthe ĊĠĠĠĠ Ġ* Ġcommand Ġline , Ġlint Ġwill Ġtypically Ġstore Ġits Ġcache Ġfiles Ġin ĊĠĠĠĠ Ġ* Ġ~/. android / cache /. ĠIn Ġorder Ġto Ġavoid Ġfiles Ġcoll iding , Ġcaches Ġthat ĊĠĠĠĠ Ġ* Ġcreate Ġa Ġlot Ġof Ġfiles Ġshould Ġprovide Ġa Ġspecific Ġname Ġsuch Ġthat ĊĠĠĠĠ Ġ* Ġthe Ġcache Ġis Ġisolated Ġto Ġa Ġsub Ġdirectory . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġin Ġsome Ġcases Ġlint Ġmay Ġinterpret Ġthat Ġname Ġto ĊĠĠĠĠ Ġ* Ġprovide Ġan Ġalternate Ġcache . ĠFor Ġexample , Ġwhen Ġlint Ġruns Ġin Ġthe ĊĠĠĠĠ Ġ* ĠIDE Ġit Ġnormally Ġuses Ġthe Ġsame Ġcache Ġas Ġlint Ġon Ġthe Ġcommand ĊĠĠĠĠ Ġ* Ġline Ġ(~ /. android / cache ), Ġbut Ġspecifically Ġfor Ġthe Ġcache Ġfor ĊĠĠĠĠ Ġ* Ġmaven . google . com Ġrepository Ġversions , Ġit Ġwill Ġinstead Ġpoint Ġto ĊĠĠĠĠ Ġ* Ġthe Ġsame Ġcache Ġdirectory Ġas Ġthe ĠIDE Ġis Ġalready Ġusing Ġfor Ġnon - lint ĊĠĠĠĠ Ġ* Ġpurposes , Ġin Ġorder Ġto Ġshare Ġdata Ġthat Ġmay Ġalready Ġexist Ġthere . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġthe Ġcache Ġdirectory Ġmay Ġnot Ġexist . ĠYou Ġcan Ġoverride ĊĠĠĠĠ Ġ* Ġthe Ġdefault Ġlocation Ġusing Ġ`$ ANDROID _ SDK _ CACHE _ DIR ` Ġ( though Ġnote ĊĠĠĠĠ Ġ* Ġthat Ġspecific Ġlint Ġintegr ations Ġmay Ġnot Ġhon or Ġthat Ġenvironment ĊĠĠĠĠ Ġ* Ġvariable ; Ġfor Ġexample , Ġin ĠGradle Ġthe Ġcache Ġdirectory Ġwill ĊĠĠĠĠ Ġ* Ġ** always ** Ġbe Ġbuild / inter medi ates / lint - cache /. ) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcreate Ġif Ġtrue , Ġattempt Ġto Ġcreate Ġthe Ġcache Ġdir Ġif Ġit Ġdoes ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġnot Ġexist ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġsuitable Ġlocation Ġfor Ġstoring Ġcache Ġfiles , Ġwhich Ġmay Ġbe ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġnull Ġif Ġthe Ġcreate Ġflag Ġwas Ġfalse , Ġor Ġif Ġfor ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġsome Ġreason Ġthe Ġdirectory Ġcould Ġnot Ġbe Ġcreated ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Cache Dir ( name : ĠString ?, Ġcreate : ĠBoolean ): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġpath : ĠString ? Ġ= ĠSystem . getenv (" ANDROID _ SDK _ CACHE _ DIR ") ĊĠĠĠĠĠĠĠ Ġif Ġ( path Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ+= ĠFile . separator Ġ+ Ġname ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( create Ġ&& Ġ! dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! dir . mkdir s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdir ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġhome Ġ= ĠSystem . getProperty (" user . home ") ĊĠĠĠĠĠĠĠ Ġvar Ġrelative Ġ= Ġ". android " Ġ+ ĠFile . separator Ġ+ Ġ" cache " ĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrelative Ġ+= ĠFile . separator Ġ+ Ġname ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġdir Ġ= ĠFile ( home , Ġrelative ) ĊĠĠĠĠĠĠĠ Ġif Ġ( create Ġ&& Ġ! dir . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! dir . mkdir s ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdir ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe ĠFile Ġpointing Ġto Ġthe Ġuser 's ĠSDK Ġinstall Ġarea . ĠThis Ġis ĊĠĠĠĠ Ġ* Ġgenerally Ġthe Ġroot Ġdirectory Ġcontaining Ġthe Ġlint Ġtool Ġ( but Ġalso ĊĠĠĠĠ Ġ* Ġplatforms / Ġetc ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġfile Ġpointing Ġto Ġthe Ġuser 's ĠAndroid ĠSDK Ġinstall Ġarea ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Sdk Home (): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbin Dir Ġ= Ġlint Bin Dir ĊĠĠĠĠĠĠĠ Ġif Ġ( bin Dir Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġbin Dir . parent File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( root Ġ!= Ġnull Ġ&& Ġroot . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġroot ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ@ Suppress (" DE PREC ATION ") ĊĠĠĠĠĠĠĠ Ġreturn ĠgetFile From Env Var ( Sdk Constants . ANDROID _ SDK _ ROOT _ ENV ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: ĠgetFile From Env Var ( Sdk Constants . ANDROID _ HOME _ ENV ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe ĠJDK Ġto Ġuse Ġwhen Ġanaly zing Ġnon - Android Ġcode Ġfor Ġthe ĊĠĠĠĠ Ġ* Ġgiven Ġproject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget J dk Home ( project : ĠProject ? Ġ= Ġnull ): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠNon Ġandroid Ġproject , Ġe . g . Ġperhaps Ġa Ġpure ĠKotlin Ġproject ĊĠĠĠĠĠĠĠ Ġ// ĠGradle Ġdoesn 't Ġlet Ġyou Ġconfigure Ġseparate ĠSDK s ; Ġit Ġruns Ġthe ĠGradle ĊĠĠĠĠĠĠĠ Ġ// Ġdaemon Ġon Ġthe ĠJDK Ġthat Ġshould Ġbe Ġused Ġfor Ġcompilation Ġso Ġlook Ġup Ġthe ĊĠĠĠĠĠĠĠ Ġ// Ġcurrent Ġenvironment : ĊĠĠĠĠĠĠĠ Ġvar Ġjava Home Ġ= ĠSystem . getProperty (" java . home ") ĊĠĠĠĠĠĠĠ Ġif Ġ( java Home Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava Home Ġ= ĠSystem . getenv (" JAVA _ HOME ") ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( java Home Ġ!= Ġnull ) Ġ{ Ġ// Ġbut Ġjava . home Ġshould Ġalways Ġbe Ġset ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj dk Home Ġ= ĠFile ( java Home ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( jdk Home . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġj dk Home ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠgetFile From Env Var ( name : ĠString ): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġhome Ġ= ĠSystem . getenv ( name ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( home ) ĊĠĠĠĠĠĠĠ Ġif Ġ(! file . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmessage Ġ= Ġ"` \ $$ name ` Ġpoints Ġto Ġnon - existent Ġdirectory Ġ$ file " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Ġ= Ġthis , Ġissue Ġ= ĠIssue Registry . L INT _ ERROR , Ġmessage Ġ= Ġmessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ= ĠLocation . create ( file ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġmost Ġrecent Ġplatform Ġ( e . g . Ġsomething Ġlike Ġthe Ġtarget ĊĠĠĠĠ Ġ* Ġfor Ġ$ ANDROID _ HOME / platforms / android - 3 0 ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Latest Sdk Target ( min Api : ĠInt Ġ= Ġ 1 , Ġinclude Pre views : ĠBoolean Ġ= Ġtrue ): ĠI Android Target ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġget Platform Lookup ()?. get Latest Sdk Target ( min Api , Ġinclude Pre views ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLoc ates Ġan ĠSDK Ġresource Ġ( relative Ġto Ġthe ĠSDK Ġroot Ġdirectory ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠTODO : ĠConsider Ġswitching Ġto Ġa Ġ[ URL ] Ġreturn Ġtype Ġinstead . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġrelative Path ĠA Ġrelative Ġpath Ġ( using Ġ[ File . separator ] Ġto ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġseparate Ġpath Ġcomponents ) Ġto Ġthe Ġgiven Ġresource ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġ[ File ] Ġpointing Ġto Ġthe Ġresource , Ġor Ġnull Ġif Ġit Ġdoes Ġnot ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġexist ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġfind Resource ( relative Path : ĠString ): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġtop Ġ= Ġget Sdk Home () Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( relative Path ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile . exists () Ġ-> Ġfile . absolute File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠLook ed Ġup Ġby ĠExternal Annotation Repository ĊĠĠĠĠĠĠĠ Ġif Ġ(" annotations . zip " Ġ== Ġrelative Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAllow ĠGradle Ġbuilds Ġetc Ġto Ġpoint Ġto Ġa Ġspecific Ġlocation ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= ĠSystem . getenv (" SDK _ AN NOT ATIONS ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlatest Platform Ġ= Ġget Latest Sdk Target ( min Api Ġ= ĠSDK _ DATABASE _ MIN _ VERSION ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( latest Platform Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( latest Platform . location , Ġrelative Path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . isFile ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠF allback Ġto Ġlooking Ġin Ġthe Ġold Ġlocation : Ġplatform - tools / api /< name > Ġunder Ġthe ĠSDK ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtop , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" platform - tools " Ġ+ ĠFile . separator Ġ+ Ġ" api " Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile . separator Ġ+ Ġrelative Path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( top , Ġrelative Path ) ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile . exists () Ġ-> Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġval Ġproject Info : ĠMutable Map < Project , ĠClass Path Info > Ġ= Ġmutable Map Of () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthis Ġproject Ġis Ġa ĠGradle - based ĠAndroid Ġproject ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġto Ġcheck ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthis Ġis Ġa ĠGradle - based Ġproject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġis Gradle Project ( project : ĠProject ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠThis Ġis Ġnot Ġan Ġaccurate Ġtest ; Ġspecific ĠL int Client Ġimplementations Ġ( e . g . ĊĠĠĠĠĠĠĠ Ġ// ĠIDE s Ġor Ġa Ġgradle - integration Ġof Ġlint ) Ġhave Ġmore Ġcontext Ġand Ġcan Ġperform Ġa Ġmore Ġaccurate ĊĠĠĠĠĠĠĠ Ġ// Ġcheck ĊĠĠĠĠĠĠĠ Ġif Ġ( File ( project . dir , ĠS dk Constants . FN _ BUILD _ GRAD LE ). exists () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( project . dir , ĠS dk Constants . FN _ BUILD _ GRAD LE _ K TS ). exists () ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġproject . dir . parent File ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ!= Ġnull Ġ&& Ġparent . name Ġ== ĠS dk Constants . FD _ SOURCES ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġroot Ġ= Ġparent . parent File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( root Ġ!= Ġnull Ġ&& Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( root , ĠS dk Constants . FN _ BUILD _ GRAD LE ). exists () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( root , ĠS dk Constants . FN _ BUILD _ GRAD LE _ K TS ). exists () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfalse ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠInformation Ġabout Ġclass Ġpaths Ġ( sources , Ġclass Ġfiles Ġand ĊĠĠĠĠ Ġ* Ġlibraries ) Ġusually Ġassociated Ġwith Ġa Ġproject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠClass Path Info ( ĊĠĠĠĠĠĠĠ Ġval Ġsource Folders : ĠList < File >, ĊĠĠĠĠĠĠĠ Ġval Ġclass Folders : ĠList < File >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlibraries : ĠList < File >, ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġnon Provided Libraries : ĠList < File >, ĊĠĠĠĠĠĠĠ Ġval Ġtest Source Folders : ĠList < File >, ĊĠĠĠĠĠĠĠ Ġval Ġtest Libraries : ĠList < File >, ĊĠĠĠĠĠĠĠ Ġval Ġgenerated Folders : ĠList < File > ĊĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġfun Ġget Libraries ( include Provided : ĠBoolean ): ĠList < File > Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( include Provided ) Ġlibraries Ġelse Ġnon Provided Libraries ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCon sid ers Ġthe Ġgiven Ġproject Ġas Ġan ĠEclipse Ġproject Ġand Ġreturns ĊĠĠĠĠ Ġ* Ġclass Ġpath Ġinformation Ġfor Ġthe Ġproject Ġ- Ġthe Ġsource Ġfolder ( s ), ĊĠĠĠĠ Ġ* Ġthe Ġoutput Ġfolder Ġand Ġany Ġlibraries . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠCall ers Ġwill Ġnot Ġcache Ġcalls Ġto Ġthis Ġmethod , Ġso Ġif Ġit 's Ġexpensive ĊĠĠĠĠ Ġ* Ġto Ġcompute Ġthe Ġclasspath Ġinfo , Ġthis Ġmethod Ġshould Ġperform Ġits Ġown ĊĠĠĠĠ Ġ* Ġcaching . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġto Ġlook Ġup Ġclass Ġpath Ġinfo Ġfor ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġclass Ġpath Ġinfo Ġobject , Ġnever Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun ĠgetClass Path ( project : ĠProject ): ĠClass Path Info Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġinfo Ġ= Ġproject Info [ project ] ĊĠĠĠĠĠĠĠ Ġif Ġ( info Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsources Ġ= ĠArrayList < File >( 2 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclasses Ġ= ĠArrayList < File >( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgenerated Ġ= ĠArrayList < File >( 1 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlibraries Ġ= ĠArrayList < File >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNo Ġtest Ġfolders Ġin ĠEclipse : ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġhttps :// bugs . eclipse . org / bugs / show _ bug . cgi ? id = 2 2 4 7 0 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtests Ġ= Ġempty List < File >() ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Dir Ġ= Ġproject . dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclasspath File Ġ= ĠFile ( project Dir , Ġ". classpath ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġhave Class Path Ġ= Ġclasspath File . exists () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( have Class Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclasspath Xml Ġ= ĠreadFile ( classpath File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= ĠChar Sequences . parse Document Sil ently ( classpath Xml , Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( document Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtags Ġ= Ġdocument . getElementsByTagName (" classpath entry ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġi Ġ= Ġ 0 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġn Ġ= Ġtags . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( i Ġ< Ġn ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Ġ= Ġtags . item ( i ) Ġas ĠElement ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkind Ġ= Ġelement . getAttribute (" kind ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar ĠaddTo : ĠMutable List < File >? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" src " Ġ-> ĠaddTo Ġ= Ġsources ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" output " Ġ-> ĠaddTo Ġ= Ġclasses ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" lib " Ġ-> ĠaddTo Ġ= Ġlibraries ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( addTo Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġelement . getAttribute (" path ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfolder Ġ= ĠFile ( project Dir , Ġpath ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( folder . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo . add ( folder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . is Absolute Ġ&& Ġfile . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠaddTo . add ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġi ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAdd Ġin Ġlibraries Ġthat Ġaren 't Ġspecified Ġin Ġthe Ġ. classpath Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlibs Ġ= ĠFile ( project . dir , ĠLIB S _ FOLDER ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( libs . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġj ars Ġ= Ġlibs . list Files () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( j ars Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( jar Ġin Ġj ars ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( endsWith ( jar . path , ĠDOT _ JAR ) Ġ&& Ġ! libraries . contains ( jar )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlibraries . add ( jar ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( endsWith ( jar . path , ĠDOT _ SRC JAR ) Ġ&& Ġ! sources . contains ( jar )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsources . add ( jar ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( classes . isEmpty () Ġ|| Ġ! have Class Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġfolder Ġ= ĠFile ( project Dir , ĠCLASS _ FOLDER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( folder . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclasses . add ( folder ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠMaven Ġchecks ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfolder Ġ= ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Dir , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" target " Ġ+ ĠFile . separator Ġ+ Ġ" classes " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( folder . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclasses . add ( folder ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġit 's Ġmaven , Ġalso Ġcorrect Ġthe Ġsource Ġpath , Ġ" src " Ġworks Ġbut ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġit 's Ġin Ġa Ġmore Ġspecific Ġsub folder ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sources . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġsrc Ġ= ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Dir , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" src " Ġ+ ĠFile . separator Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" main " Ġ+ ĠFile . separator Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" java " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsources . add ( src ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsrc Ġ= ĠFile ( project Dir , ĠSRC _ FOLDER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsources . add ( src ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgen Ġ= ĠFile ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Dir , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" target " Ġ+ ĠFile . separator Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" generated - sources " Ġ+ ĠFile . separator Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" r " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( gen . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerated . add ( gen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠF allback , Ġin Ġcase Ġthere Ġis Ġno ĠEclipse Ġproject Ġmetadata Ġhere ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sources . isEmpty () Ġ|| Ġ! have Class Path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsrc Ġ= ĠFile ( project Dir , ĠSRC _ FOLDER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( src . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsources . add ( src ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġgen Ġ= ĠFile ( project Dir , ĠGEN _ FOLDER ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( gen . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgenerated . add ( gen ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġinfo Ġ= ĠClass Path Info ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsources , Ġclasses , Ġlibraries , Ġlibraries , Ġtests , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List (), Ġgenerated ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Info [ project ] Ġ= Ġinfo ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġinfo ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġmap Ġfrom Ġdirectory Ġto Ġexisting Ġprojects , Ġor Ġnull . ĠUsed Ġto ĊĠĠĠĠ Ġ* Ġensure Ġthat Ġprojects Ġare Ġunique Ġfor Ġa Ġdirectory Ġ( in Ġcase Ġwe ĊĠĠĠĠ Ġ* Ġprocess Ġa Ġlibrary Ġproject Ġbefore Ġits Ġincluding Ġproject Ġfor ĊĠĠĠĠ Ġ* Ġexample ) ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġval Ġdir To Project : ĠMutable Map < File , ĠProject > Ġ= ĠHashMap () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġproject Ġfor Ġthe Ġgiven Ġdirectory . ĠThis Ġshould Ġreturn Ġthe ĊĠĠĠĠ Ġ* Ġsame Ġproject Ġfor Ġthe Ġsame Ġdirectory Ġif Ġcalled Ġrepeatedly . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdir Ġthe Ġdirectory Ġcontaining Ġthe Ġproject ĊĠĠĠĠ Ġ* Ġ@ param Ġreference Dir ĠSee Ġ[ Project . getReference Dir ]. ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġproject , Ġnever Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Project ( dir : ĠFile , Ġreference Dir : ĠFile ): ĠProject Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcanonical Dir Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAttempt Ġto Ġuse Ġthe Ġcanonical Ġhandle Ġfor Ġthe Ġfile , Ġin Ġcase Ġthere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġare Ġsymlink s Ġetc Ġpresent Ġ( since Ġwhen Ġhandling Ġlibrary Ġprojects , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġalso Ġcall Ġget Canonical File Ġto Ġcompute Ġthe Ġresult Ġof Ġapp ending ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrelative Ġpaths , Ġwhich Ġcan Ġthen Ġresolve Ġsymlink s Ġand Ġend Ġup Ġwith ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġa Ġdifferent Ġprefix ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir . canonical File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġexisting Project : ĠProject ? Ġ= Ġdir To Project [ canonical Dir ] ĊĠĠĠĠĠĠĠ Ġif Ġ( existing Project Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġexisting Project ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġcreate Project ( dir , Ġreference Dir ) ĊĠĠĠĠĠĠĠ Ġdir To Project [ canonical Dir ] Ġ= Ġproject ĊĠĠĠĠĠĠĠ Ġreturn Ġproject ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġtrue Ġif Ġthis Ġis Ġa Ġknown Ġproject Ġdirectory . Ġ*/ ĊĠĠĠ Ġfun Ġis Known Project Dir ( dir : ĠFile ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcanonical Dir Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSee Ġget Project () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir . canonical File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġdir To Project [ canonical Dir ] Ġ!= Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġlist Ġof Ġknown Ġprojects Ġ( projects Ġregistered Ġvia ĊĠĠĠĠ Ġ* Ġ[ getProject ]). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġcollection Ġof Ġprojects Ġin Ġany Ġorder ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġval Ġknown Projects : ĠCollection < Project > ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġdir To Project . values ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRegisters Ġthe Ġgiven Ġproject Ġfor Ġthe Ġgiven Ġdirectory . ĠThis Ġcan Ġbe ĊĠĠĠĠ Ġ* Ġused Ġwhen Ġprojects Ġare Ġinitialized Ġoutside Ġof Ġthe Ġclient Ġitself . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdir Ġthe Ġdirectory Ġof Ġthe Ġproject , Ġwhich Ġmust Ġbe Ġunique ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġregister Project ( dir : ĠFile , Ġproject : ĠProject ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġcanonical Dir Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAttempt Ġto Ġuse Ġthe Ġcanonical Ġhandle Ġfor Ġthe Ġfile , Ġin Ġcase Ġthere ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġare Ġsymlink s Ġetc Ġpresent Ġ( since Ġwhen Ġhandling Ġlibrary Ġprojects , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwe Ġalso Ġcall Ġget Canonical File Ġto Ġcompute Ġthe Ġresult Ġof Ġapp ending ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrelative Ġpaths , Ġwhich Ġcan Ġthen Ġresolve Ġsymlink s Ġand Ġend Ġup Ġwith ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġa Ġdifferent Ġprefix ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir . canonical File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( io e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġassert (! dir To Project . containsKey ( dir )) Ġ{ Ġdir Ġ} ĊĠĠĠĠĠĠĠ Ġdir To Project [ canonical Dir ] Ġ= Ġproject ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprotected Ġval Ġproject Dirs : ĠMutable Set < File > Ġ= ĠSets . new HashSet < File >() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreate Ġa Ġproject Ġfor Ġthe Ġgiven Ġdirectory ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdir Ġthe Ġroot Ġdirectory Ġof Ġthe Ġproject ĊĠĠĠĠ Ġ* Ġ@ param Ġreference Dir ĠSee Ġ[ Project . getReference Dir ]. ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġnew Ġproject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġcreate Project ( dir : ĠFile , Ġreference Dir : ĠFile ): ĠProject Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( project Dirs . contains ( dir )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠCircular Dependency Exception ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Circular Ġlibrary Ġdependencies ; Ġcheck Ġyour Ġproject . properties Ġfiles Ġcarefully " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġproject Dirs . add ( dir ) ĊĠĠĠĠĠĠĠ Ġreturn ĠProject . create ( this , Ġdir , Ġreference Dir ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerform Ġany Ġstartup Ġinitialization Ġof Ġthe Ġfull Ġset Ġof Ġprojects ĊĠĠĠĠ Ġ* Ġthat Ġlint Ġwill Ġbe Ġrun Ġon , Ġif Ġnecessary . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġknown Projects Ġthe Ġlist Ġof Ġprojects ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġinitialize Projects ( known Projects : ĠCollection < Project >) Ġ= ĠUnit ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠPerform Ġany Ġpost - analysis Ġclean in up Ġof Ġthe Ġfull Ġset Ġof Ġprojects ĊĠĠĠĠ Ġ* Ġthat Ġlint Ġwas Ġrun Ġon , Ġif Ġnecessary . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġknown Projects Ġthe Ġlist Ġof Ġprojects ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprotected Ġopen Ġfun Ġdispose Projects ( known Projects : ĠCollection < Project >) Ġ= ĠUnit ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTr amp oline Ġmethod Ġto Ġlet Ġ[ Lint Driver ] Ġaccess Ġprotected Ġmethod . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġperform GetClass Path ( project : ĠProject ): ĠClass Path Info Ġ= ĠgetClass Path ( project ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTr amp oline Ġmethod Ġto Ġlet Ġ[ Lint Driver ] Ġaccess Ġprotected Ġmethod . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġperform Initialize Projects ( known Projects : ĠCollection < Project >) Ġ= ĊĠĠĠĠĠĠĠ Ġinitialize Projects ( known Projects ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTr amp oline Ġmethod Ġto Ġlet Ġ[ Lint Driver ] Ġaccess Ġprotected Ġmethod . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġinternal Ġfun Ġperform Dispose Projects ( known Projects : ĠCollection < Project >) Ġ= ĊĠĠĠĠĠĠĠ Ġdispose Projects ( known Projects ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġname Ġof Ġthe Ġgiven Ġproject ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġto Ġlook Ġup ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġname Ġof Ġthe Ġproject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget ProjectName ( project : ĠProject ): ĠString Ġ= Ġproject . dir . name ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġall Ġthe Ġ[ I Android Target ] Ġversions Ġinstalled Ġin Ġthe Ġuser 's ĊĠĠĠĠ Ġ* ĠSDK Ġinstall Ġarea . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġall Ġthe Ġinstalled Ġtargets ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Targets (): ĠList < I Android Target > Ġ= Ġget Platform Lookup ()?. get Targets () Ġ?: Ġempty List () ĊĊĠĠĠ Ġ/** ĠCache Ġfor Ġ[ get Platform Lookup ] Ġ*/ ĊĠĠĠ Ġprivate Ġvar Ġplatform Lookup : ĠPlatform Lookup ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġa Ġservice Ġto Ġlook Ġup Ġ[ I Android Target ] Ġinstances Ġby ĊĠĠĠĠ Ġ* Ġcriteria Ġlike Ġspecific ĠAPI Ġlevels , Ġcompile Sdk Versions , Ġhash ĊĠĠĠĠ Ġ* Ġstrings Ġand Ġ" most Ġrecent " ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Platform Lookup (): ĠPlatform Lookup ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠUse Ġche aper Ġimplementation Ġthan Ġthe Ġfull ĠAndroid Sdk Handler ĊĠĠĠĠĠĠĠ Ġ// Ġwhen Ġrunning Ġoutside Ġof Ġthe ĠIDE , Ġwhere Ġthere Ġisn 't Ġa Ġlive ĊĠĠĠĠĠĠĠ Ġ// Ġinstance Ġalready ; Ġthis Ġis Ġoverridden Ġin Ġthe ĠIDE Ġclient ĊĠĠĠĠĠĠĠ Ġreturn Ġplatform Lookup ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsdk Home Ġ= Ġget Sdk Home () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( sdk Home Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSimple Platform Lookup ( sdk Home ). also Ġ{ Ġplatform Lookup Ġ= Ġit Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġcompile Ġtarget Ġto Ġuse Ġfor Ġthe Ġgiven Ġproject ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġin Ġquestion ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġcompile Ġtarget Ġto Ġuse Ġto Ġbuild Ġthe Ġgiven Ġproject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Compile Target ( project : ĠProject ): ĠI Android Target ? Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ(! project . is Android Project ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlookup Ġ= Ġget Platform Lookup () Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġbuild Target Hash Ġ= Ġproject . build Target Hash ĊĠĠĠĠĠĠĠ Ġif Ġ( build Target Hash Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġlookup . getTarget ( build Target Hash ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( target Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtarget ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠMatch Ġby ĠAPI Ġlevel Ġinstead ĊĠĠĠĠĠĠĠ Ġval Ġbuild Sdk Ġ= Ġproject . build Sdk ĊĠĠĠĠĠĠĠ Ġval Ġtarget Ġ= Ġlookup . getTarget ( build Sdk ) ĊĠĠĠĠĠĠĠ Ġif Ġ( target Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtarget ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠPick Ġthe Ġhighest Ġcompilation Ġtarget Ġwe Ġcan Ġfind ; Ġthe Ġbuild ĠAPI Ġlevel ĊĠĠĠĠĠĠĠ Ġ// Ġis Ġnot Ġknown Ġor Ġnot Ġfound , Ġbut Ġhaving Ġ* any * ĠSDK Ġis Ġbetter Ġthan Ġnot Ġ( without ĊĠĠĠĠĠĠĠ Ġ// Ġit , Ġmost Ġsymbol Ġresolution Ġwill Ġfail .) ĊĠĠĠĠĠĠĠ Ġreturn Ġlookup . get Latest Sdk Target ( include Pre views Ġ= Ġfalse ) Ġ// Ġprefer Ġstable ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġlookup . get Latest Sdk Target ( include Pre views Ġ= Ġtrue ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠThe Ġhighest Ġknown ĠAPI Ġlevel . Ġ*/ ĊĠĠĠ Ġval Ġhighest Known Api Level : ĠInt ĊĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Target Ġ= Ġget Latest Sdk Target () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmax Target Api Ġ= Ġmax Target ?. version ?. api Level Ġ?: Ġ 1 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmax ( max Target Api , ĠS dk VersionInfo . HIG HE ST _ KNOWN _ ST ABLE _ API ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġexpected Ġlanguage Ġlevel Ġfor ĠJava Ġsource Ġfiles Ġin Ġthe ĊĠĠĠĠ Ġ* Ġgiven Ġproject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Java Language Level ( project : ĠProject ): ĠLanguage Level Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġproject . build Module ĊĠĠĠĠĠĠĠ Ġif Ġ( model Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsource Compatibility Ġ= Ġmodel . java Source Level ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjava Language Level Ġ= ĠLanguage Level . parse ( source Compatibility ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( java Language Level Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġjava Language Level ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( project . is Android Project ) ĠJDK _ 1 _ 7 Ġelse ĠLanguage Level . JDK _ 1 1 ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġexpected Ġlanguage Ġlevel Ġfor ĠKotlin Ġsource Ġfiles Ġin ĊĠĠĠĠ Ġ* Ġthe Ġgiven Ġproject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Kotlin Language Level ( project : ĠProject ): ĠLanguage Version Settings Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn ĠLanguage Version Settings Impl . DEFAULT ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġset Ġof Ġdes ug aring Ġoperations Ġin Ġeffect Ġfor Ġthe Ġgiven ĊĠĠĠĠ Ġ* Ġproject . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Des ug aring ( project : ĠProject ): ĠSet < Des ug aring > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠIf Ġthere 's Ġno Ġgradle Ġversion , Ġyou 're Ġusing Ġsome Ġother Ġbuild Ġsystem ; ĊĠĠĠĠĠĠĠ Ġ// Ġthe Ġmost Ġlikely Ġcandidate Ġis Ġb azel Ġwhich Ġalready Ġsupports Ġdes ug aring ĊĠĠĠĠĠĠĠ Ġ// Ġso Ġwe Ġdefault Ġto Ġtrue . Ġ( Pro per Ġlint Ġintegration Ġshould Ġextend ĠL int Client ĊĠĠĠĠĠĠĠ Ġ// Ġanyway Ġand Ġoverride Ġthe Ġget Des ug aring Ġmethod Ġabove ; Ġthis Ġis Ġthe Ġdefault ĊĠĠĠĠĠĠĠ Ġ// Ġhandling .) ĊĠĠĠĠĠĠĠ Ġval Ġversion Ġ= Ġproject . gradle Model Version Ġ?: Ġreturn ĠDes ug aring . DEFAULT ĊĠĠĠĠĠĠĠ Ġreturn Ġget Gradle Des ug aring ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion , Ġget Language Level ( project , ĠJDK _ 1 _ 7 ), Ġproject . is Core Library Des ug aring Enabled ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġsuper Ġclass Ġfor Ġthe Ġgiven Ġclass Ġname , Ġwhich Ġshould Ġbe ĊĠĠĠĠ Ġ* Ġin ĠVM Ġformat Ġ( e . g . Ġjava / lang / Integer , Ġnot Ġjava . lang . Integer , Ġand ĊĠĠĠĠ Ġ* Ġusing Ġ$ Ġrather Ġthan Ġ. Ġfor Ġinner Ġclasses ). ĠIf Ġthe Ġsuper Ġclass Ġis ĊĠĠĠĠ Ġ* Ġnot Ġknown , Ġreturns Ġnull . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThis Ġis Ġtypically Ġnot Ġnecessary , Ġsince Ġlint Ġanaly zes Ġall Ġthe ĊĠĠĠĠ Ġ* Ġavailable Ġclasses . ĠHowever , Ġif Ġthis Ġlint Ġclient Ġis Ġinvoking ĊĠĠĠĠ Ġ* Ġlint Ġin Ġan Ġincremental Ġcontext Ġ( for Ġexample , Ġan ĠIDE Ġoffering ĊĠĠĠĠ Ġ* Ġincremental Ġanalysis Ġof Ġa Ġsingle Ġsource Ġfile ), Ġthen Ġlint Ġmay Ġnot ĊĠĠĠĠ Ġ* Ġsee Ġall Ġthe Ġclasses , Ġand Ġthe Ġclient Ġcan Ġprovide Ġits Ġown Ġsuper ĊĠĠĠĠ Ġ* Ġclass Ġlookup . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġcontaining Ġthe Ġclass ĊĠĠĠĠ Ġ* Ġ@ param Ġname Ġthe Ġfully Ġqualified Ġclass Ġname ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġcorresponding Ġsuper Ġclass Ġname Ġ( in ĠVM Ġformat ), Ġor ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġnull Ġif Ġnot Ġknown ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Super Class ( project : ĠProject , Ġname : ĠString ): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġassert ( name . indexOf ('.') Ġ== Ġ- 1 ) Ġ{ Ġ" Use ĠVM Ġsignatures , Ġe . g . Ġjava / lang / Integer " Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ(" java / lang / Object " Ġ== Ġname ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠsuperClass : ĠString ? Ġ= Ġproject . super Class Map [ name ] ĊĠĠĠĠĠĠĠ Ġif Ġ( super Class Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠsuperClass ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġfor Ġ( library Ġin Ġproject . all Libraries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlibrary Super Class Ġ= Ġlibrary . super Class Map [ name ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( library Super Class Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġlibrary Super Class ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġsuper Ġclass Ġmap Ġfor Ġthe Ġgiven Ġproject . ĠThe Ġmap ĊĠĠĠĠ Ġ* Ġmaps Ġfrom Ġinternal Ġclass Ġname Ġ( e . g . Ġjava / lang / Integer , Ġnot ĊĠĠĠĠ Ġ* Ġjava . lang . Integer ) Ġto Ġits Ġcorresponding Ġsuper Ġclass Ġname . ĠThe ĊĠĠĠĠ Ġ* Ġroot Ġclass , Ġjava / lang / Object , Ġis Ġnot Ġin Ġthe Ġmap . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġto Ġinitialize Ġthe Ġsuper Ġclass Ġwith ; ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġthis Ġwill Ġinclude Ġlocal Ġclasses Ġas Ġwell Ġas Ġany ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġlocal Ġ. jar Ġlibraries ; Ġnot Ġtrans itive Ġdependencies ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġmap Ġfrom Ġclass Ġto Ġits Ġcorresponding Ġsuper Ġclass ; Ġnever ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġnull ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġcreate Super Class Map ( project : ĠProject ): ĠMap < String , ĠString > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlibraries Ġ= Ġproject . get Java Libraries ( true ) ĊĠĠĠĠĠĠĠ Ġval Ġclass Folders Ġ= Ġproject . java Class Folders ĊĠĠĠĠĠĠĠ Ġval Ġclass Entries Ġ= ĠClass Entry . from Class Path ( this , Ġclass Folders , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġif Ġ( libraries . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠClass Entry . create Super Class Map ( this , Ġclass Entries ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġlibrary Entries Ġ= ĠClass Entry . from Class Path ( this , Ġlibraries , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġreturn ĠClass Entry . create Super Class Map ( this , Ġlibrary Entries , Ġclass Entries ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġwhether Ġthe Ġgiven Ġname Ġis Ġa Ġsubclass Ġof Ġthe Ġgiven ĊĠĠĠĠ Ġ* Ġsuper Ġclass . ĠIf Ġthe Ġmethod Ġdoes Ġnot Ġknow , Ġit Ġshould Ġreturn ĊĠĠĠĠ Ġ* Ġnull , Ġand Ġotherwise Ġreturn Ġ[ java . lang . Boolean . TRUE ] Ġor ĊĠĠĠĠ Ġ* Ġ[ java . lang . Boolean . FALSE ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠNote Ġthat Ġthe Ġclass Ġnames Ġare Ġin Ġinternal ĠVM Ġformat ĊĠĠĠĠ Ġ* Ġ( java / lang / Integer , Ġnot Ġjava . lang . Integer , Ġand Ġusing Ġ$ Ġrather ĊĠĠĠĠ Ġ* Ġthan Ġ. Ġfor Ġinner Ġclasses ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġcontext Ġto Ġlook Ġup Ġthe Ġclass Ġin ĊĠĠĠĠ Ġ* Ġ@ param Ġname Ġthe Ġname Ġof Ġthe Ġclass Ġto Ġbe Ġchecked ĊĠĠĠĠ Ġ* Ġ@ param Ġsuper ClassName Ġthe Ġname Ġof Ġthe Ġsuper Ġclass Ġto Ġcompare Ġto ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġclass Ġof Ġthe Ġgiven Ġname Ġextends Ġthe Ġgiven ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġsuper Ġclass ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġis Subclass Of ( ĊĠĠĠĠĠĠĠ Ġproject : ĠProject , ĊĠĠĠĠĠĠĠ Ġname : ĠString , ĊĠĠĠĠĠĠĠ Ġsuper ClassName : ĠString ĊĠĠĠ Ġ): ĠBoolean ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġany Ġcustom Ġlint Ġrule Ġj ars Ġthat Ġshould Ġbe Ġincluded Ġfor ĊĠĠĠĠ Ġ* Ġanalysis , Ġregardless Ġof Ġproject . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠThe Ġdefault Ġimplementation Ġloc ates Ġcustom Ġlint Ġj ars Ġin ĊĠĠĠĠ Ġ* Ġ~/. android / lint / Ġand Ġin Ġ$ ANDROID _ L INT _ J ARS ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġlist Ġof Ġrule Ġj ars Ġ( possibly Ġempty ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġfind Global Rule J ars (): ĠList < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠLook Ġfor Ġadditional Ġdetector s Ġregistered Ġby Ġthe Ġuser , Ġvia ĊĠĠĠĠĠĠĠ Ġ// Ġ( 1 ) Ġan Ġenvironment Ġvariable Ġ( useful Ġfor Ġbuild Ġservers Ġetc ), Ġand ĊĠĠĠĠĠĠĠ Ġ// Ġ( 2 ) Ġvia Ġjar Ġfiles Ġin Ġthe Ġ. android / lint Ġdirectory ĊĠĠĠĠĠĠĠ Ġvar Ġfiles : ĠMutable List < File >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlint Ġ= ĠAndroid Locations Singleton . prefs Location . resolve (" lint "). to File () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lint . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlist Ġ= Ġlint . list Files () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( list Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( jar File Ġin Ġlist ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( endsWith ( jar File . name , ĠDOT _ JAR )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( files Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles Ġ= ĠArrayList () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . add ( jar File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠSeverity . WARNING , Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Loaded Ġlint Ġjar Ġfile Ġfrom Ġ% 1 \$ s Ġ(% 2 \$ s ); Ġthis Ġwill Ġstop Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" working Ġsoon . ĠIf Ġyou Ġneed Ġto Ġpush Ġlint Ġrules Ġinto Ġa Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" build , Ġuse Ġthe ĠAND ROID _ L INT _ J ARS Ġenvironment Ġvariable .", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġjar File . parent , Ġjar File . name ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignore : ĠAndroid Locations Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIgnore Ġ-- Ġno Ġandroid Ġdir , Ġso Ġno Ġrules Ġto Ġload . ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġlint Class Path Ġ= ĠSystem . getenv (" ANDROID _ L INT _ J ARS ") ĊĠĠĠĠĠĠĠ Ġif Ġ( lint Class Path Ġ!= Ġnull Ġ&& Ġ! lint Class Path . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpaths Ġ= Ġlint Class Path . split ( File . path Separator ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( path Ġin Ġpaths ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġjar File Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( jar File . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( files Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles Ġ= Ġmutable ListOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( files . contains ( jar File )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . add ( jar File ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġif Ġ( files Ġ!= Ġnull ) Ġfiles Ġelse Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFinds Ġany Ġcustom Ġlint Ġrule Ġj ars Ġthat Ġshould Ġbe Ġincluded Ġfor ĊĠĠĠĠ Ġ* Ġanalysis Ġin Ġthe Ġgiven Ġproject ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġproject Ġto Ġlook Ġup Ġrule Ġj ars Ġfrom ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġlist Ġof Ġrule Ġj ars Ġ( possibly Ġempty ). ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġfind Rule J ars ( project : ĠProject ): ĠIterable < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( project . is Gradle Project ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( project . is Library Ġ&& Ġproject . build Library Model Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġproject . build Library Model ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( model Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlint Jar Ġ= Ġmodel . lint Jar ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lint Jar Ġ!= Ġnull Ġ&& Ġlint Jar . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( lint Jar ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( project . subset Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠProbably Ġjust Ġanaly zing Ġa Ġsingle Ġfile : Ġwe Ġstill Ġwant Ġto Ġlook Ġfor Ġcustom ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġrules Ġapplicable Ġto Ġthe Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariant Ġ= Ġproject . build Variant ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( variant Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrules Ġ= ĠArrayList < File >( 4 ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġadd Lint J ars From Dependencies ( rules , Ġvariant . main Artifact . dependencies . getAll ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmodel Ġ= Ġvariant . module ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLoc ally Ġpackaged Ġj ars ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrules . addAll ( model . lint Rule J ars . filter Ġ{ Ġit . exists () Ġ}) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( rules . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġrules ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( project . dir . path . endsWith ( DOT _ A AR )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlint Jar Ġ= ĠFile ( project . dir , Ġ" lint . jar ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( lint Jar . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠlistOf ( lint Jar ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġempty List () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe cursively Ġadd Ġall Ġlint Ġj ars Ġfound Ġrecursively Ġfrom Ġthe Ġgiven ĊĠĠĠĠ Ġ* Ġcollection Ġof Ġ[ Lint Model Android Library ] Ġinstances Ġinto Ġthe Ġgiven ĊĠĠĠĠ Ġ* Ġ[ lint J ars ] Ġlist . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Lint J ars From Dependencies ( ĊĠĠĠĠĠĠĠ Ġlint J ars : ĠMutable List < File >, ĊĠĠĠĠĠĠĠ Ġlibraries : ĠCollection < Lint Model Library > ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġfor Ġ( library Ġin Ġlibraries ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġadd Lint J ars From Dependency ( lint J ars , Ġlibrary ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRe cursively Ġadd Ġall Ġlint Ġj ars Ġfound Ġfrom Ġthe Ġgiven ĊĠĠĠĠ Ġ* Ġ[ Lint Model Android Library ] Ġ** or Ġits Ġdependencies ** Ġinto Ġthe Ġgiven ĊĠĠĠĠ Ġ* Ġ[ lint J ars ] Ġlist . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun Ġadd Lint J ars From Dependency ( ĊĠĠĠĠĠĠĠ Ġlint J ars : ĠMutable List < File >, ĊĠĠĠĠĠĠĠ Ġlibrary : ĠL int Model Library ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġlint Jar Ġ= Ġlibrary . lint Jar ĊĠĠĠĠĠĠĠ Ġif Ġ( lint Jar Ġ!= Ġnull Ġ&& Ġlint Jar . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlint J ars . add ( lint Jar ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( library Ġis ĠL int Model Android Library ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfolder Ġ= Ġlibrary . folder ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( folder . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLocal Ġproject : Ġmight Ġhave Ġlocally Ġpackaged Ġlint Ġjar ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠKe pt Ġfor Ġbackward Ġcompatibility , Ġsee Ġb / 6 6 1 6 6 5 2 1 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbuild Dir Ġ= Ġfolder . path . substring Before (" inter medi ates ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlint Paths Ġ= ĠarrayOf ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPaths . get ( build Dir , Ġ" inter medi ates ", Ġ" lint ", ĠS dk Constants . FN _ L INT _ JAR ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPaths . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Dir , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" inter medi ates ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" lint _ publish _ jar ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" global ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS dk Constants . FN _ L INT _ JAR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPaths . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbuild Dir , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" inter medi ates ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" lint _ publish _ jar ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" global ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" prepare Lint Jar For Publish ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠS dk Constants . FN _ L INT _ JAR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( lint Path Ġin Ġlint Paths ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmanual Lint Jar Ġ= Ġlint Path . to File () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( manual Lint Jar . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlint J ars . add ( manual Lint Jar ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOpen s Ġa ĠURL Ġconnection . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠClients Ġsuch Ġas ĠIDE s Ġcan Ġoverride Ġthis Ġto Ġfor Ġexample Ġconsider ĊĠĠĠĠ Ġ* Ġthe Ġuser 's ĠIDE Ġproxy Ġsettings . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġurl Ġthe ĠURL Ġto Ġread ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġ[ URLConnection ] Ġor Ġnull ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException Ġif Ġany Ġkind Ġof ĠIO Ġexception Ġoccurs ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġopen Ġfun Ġopen Connection ( url : ĠURL ): ĠURL Connection ? Ġ= Ġopen Connection ( url , Ġ 0 ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠOpen s Ġa ĠURL Ġconnection . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* ĠClients Ġsuch Ġas ĠIDE s Ġcan Ġoverride Ġthis Ġto Ġfor Ġexample Ġconsider ĊĠĠĠĠ Ġ* Ġthe Ġuser 's ĠIDE Ġproxy Ġsettings . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġurl Ġthe ĠURL Ġto Ġread ĊĠĠĠĠ Ġ* Ġ@ param Ġtimeout Ġthe Ġtimeout Ġto Ġapply Ġfor ĠHTTP Ġconnections Ġ( or Ġ 0 Ġto ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġwait Ġin def initely ) ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġ[ URLConnection ] Ġor Ġnull ĊĠĠĠĠ Ġ* Ġ@ throws ĠIOException Ġif Ġany Ġkind Ġof ĠIO Ġexception Ġoccurs Ġincluding ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġtimeouts ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġopen Ġfun Ġopen Connection ( url : ĠURL , Ġtimeout : ĠInt ): ĠURL Connection ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconnection Ġ= Ġurl . open Connection () ĊĠĠĠĠĠĠĠ Ġif Ġ( timeout Ġ> Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . connect Timeout Ġ= Ġtimeout ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconnection . read Timeout Ġ= Ġtimeout ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġconnection ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠCloses Ġa Ġconnection Ġpreviously Ġreturned Ġby Ġ[ open Connection ] Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġclose Connection ( connection : ĠURL Connection ) Ġ{ ĊĠĠĠĠĠĠĠ Ġ( connection Ġas ? ĠHttp URLConnection )?. disconnect () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe Ġgiven Ġdirectory Ġis Ġa Ġlint Ġproject Ġdirectory . ĊĠĠĠĠ Ġ* ĠBy Ġdefault , Ġa Ġproject Ġdirectory Ġis Ġthe Ġdirectory Ġcontaining Ġa ĊĠĠĠĠ Ġ* Ġmanifest Ġfile , Ġbut Ġin ĠGradle Ġprojects Ġfor Ġexample Ġit 's Ġthe Ġroot ĊĠĠĠĠ Ġ* Ġgradle Ġdirectory . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġdir Ġthe Ġdirectory Ġto Ġcheck ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthe Ġdirectory Ġrepresents Ġa Ġlint Ġproject ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġis Project Directory ( dir : ĠFile ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġis Manifest Folder ( dir ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ ĠProject . is Ao sp Frameworks Related Project ( dir ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfind Gradle Build File ( dir ). exists () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġwhether Ġlint Ġshould Ġlook Ġfor Ġsuppress Ġcomments . ĠTools ĊĠĠĠĠ Ġ* Ġthat Ġalready Ġdo Ġthis Ġon Ġtheir Ġown Ġcan Ġreturn Ġfalse Ġhere Ġto Ġavoid ĊĠĠĠĠ Ġ* Ġdoing Ġunnecessary Ġwork . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġcheck For Suppress Comments (): ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠAdds Ġin Ġany Ġcustom Ġlint Ġrules Ġand Ġreturns Ġthe Ġresult Ġas Ġa Ġnew ĊĠĠĠĠ Ġ* Ġissue Ġregistry , Ġor Ġthe Ġsame Ġone Ġif Ġno Ġcustom Ġrules Ġwere Ġfound ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġregistry Ġthe Ġmain Ġregistry Ġto Ġadd Ġrules Ġto ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġnew Ġregistry Ġcontaining Ġthe Ġpassed Ġin Ġrules Ġplus Ġany ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġcustom Ġrules , Ġor Ġthe Ġoriginal Ġregistry ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġif Ġno Ġcustom Ġrules Ġwere Ġfound ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġadd Custom Lint Rules ( registry : ĠIssue Registry ): ĠIssue Registry Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġjar Files Ġ= Ġfind Global Rule J ars () ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! jar Files . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġextra Regist ries Ġ= ĠJar File Issue Registry . get ( this , Ġjar Files , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( extra Regist ries . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠJar File Issue Registry . join ( registry , Ġ* extra Regist ries . to Typed Array ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġregistry ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġ[ ClassLoader ] Ġwhich Ġcan Ġload Ġin Ġa Ġset Ġof ĠJar Ġfiles . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġurls Ġthe ĠURLs ĊĠĠĠĠ Ġ* Ġ@ param Ġparent Ġthe Ġparent Ġclass Ġloader ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġnew Ġclass Ġloader ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġcreate Url ClassLoader ( urls : ĠArray < URL >, Ġparent : ĠClassLoader ): ĠClassLoader Ġ= ĊĠĠĠĠĠĠĠ ĠURL ClassLoader ( urls , Ġparent ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġmerged Ġmanifest Ġof Ġthe Ġgiven Ġproject . ĠThis Ġmay ĊĠĠĠĠ Ġ* Ġreturn Ġnull Ġif Ġnot Ġcalled Ġon Ġthe Ġmain Ġproject . ĠNote Ġthat Ġthe ĊĠĠĠĠ Ġ* Ġfile Ġreference Ġin Ġthe Ġmerged Ġmanifest Ġisn 't Ġaccurate ; Ġthe ĊĠĠĠĠ Ġ* Ġmerged Ġmanifest Ġacc umul ates Ġinformation Ġfrom Ġa Ġwide Ġvariety Ġof ĊĠĠĠĠ Ġ* Ġlocations . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ return ĠThe Ġmerged Ġmanifest , Ġif Ġavailable . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Merged Manifest ( project : ĠProject ): ĠDocument ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmanifest Files Ġ= Ġproject . manifest Files ĊĠĠĠĠĠĠĠ Ġif Ġ( manifest Files . size Ġ== Ġ 1 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprimary Ġ= Ġmanifest Files [ 0 ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġxml Ġ= Ġprimary . read Text () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= ĠXml Utils . parse Document Sil ently ( xml , Ġtrue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdocument ?. set UserData ( File :: class . java . name , Ġprimary , Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġdocument ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog ( Severity . ERROR , Ġe , Ġ" Could Ġnot Ġread Ġmanifest Ġ$ primary ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRecord Ġthat Ġthe Ġgiven Ġdocument Ġcorresponds Ġto Ġa Ġmerged Ġmanifest ĊĠĠĠĠ Ġ* Ġfile ; Ġlocations Ġfrom Ġthis Ġdocument Ġshould Ġattempt Ġto Ġresolve Ġback ĊĠĠĠĠ Ġ* Ġto Ġthe Ġoriginal Ġsource Ġlocation ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmerged Manifest Ġthe Ġdocument Ġfor Ġthe Ġmerged Ġmanifest ĊĠĠĠĠ Ġ* Ġ@ param Ġreport File Ġthe Ġmanifest Ġmer ger Ġreport Ġfile , Ġor Ġthe Ġreport ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġitself ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġresolve Merge Manifest Sources ( merged Manifest : ĠDocument , Ġreport File : ĠAny ) Ġ{ ĊĠĠĠĠĠĠĠ Ġmerged Manifest . set UserData ( MER GED _ MAN IFEST , Ġreport File , Ġnull ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe Ġgiven Ġnode Ġis Ġpart Ġof Ġa Ġmerged Ġmanifest ĊĠĠĠĠ Ġ* Ġdocument Ġ( already Ġconfigured Ġvia Ġ[ resolve Merge Manifest Sources ]) ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġnode Ġthe Ġnode Ġto Ġlook Ġup ĊĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġthis Ġnode Ġis Ġpart Ġof Ġa Ġmerged Ġmanifest Ġdocument ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġfun Ġis Merge Manifest Node ( node : ĠNode ): ĠBoolean Ġ= ĊĠĠĠĠĠĠĠ Ġnode . owner Document ?. getUser Data ( MER GED _ MAN IFEST ) Ġ!= Ġnull ĊĊĠĠĠ Ġ/** ĠCache Ġused Ġby Ġ[ find Manifest Source Node ] Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Member Visibility Can Be Private ") ĊĠĠĠ Ġprotected Ġval Ġreport File Cache : ĠMutable Map < Any , ĠBl ame File > Ġ= ĊĠĠĠĠĠĠĠ ĠMaps . new HashMap < Any , ĠBl ame File >() ĊĊĠĠĠ Ġ/** ĠCache Ġused Ġby Ġ[ find Manifest Source Node ] Ġ*/ ĊĠĠĠ Ġ@ Suppress (" Member Visibility Can Be Private ") ĊĠĠĠ Ġprotected Ġval Ġsource Node Cache : ĠMutable Map < Node , ĠPair < File , Ġout ĠNode >> Ġ= ĊĠĠĠĠĠĠĠ ĠMaps . new Identity HashMap < Node , ĠPair < File , Ġout ĠNode >>() ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠLooks Ġup Ġthe Ġhighest Ġknown Ġversion Ġof Ġthe Ġgiven Ġlibrary Ġif ĊĠĠĠĠ Ġ* Ġpossible , Ġpossibly Ġapplying Ġthe Ġgiven Ġ[ filter ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Highest Known Version ( ĊĠĠĠĠĠĠĠ Ġcoordinate : ĠGradle Coordinate , ĊĠĠĠĠĠĠĠ Ġfilter : ĠPredicate < Gradle Version >? ĊĠĠĠ Ġ): ĠGradle Version ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠOver ridden Ġin ĠStudio Ġto Ġconsult ĠSDK Ġmanager 's Ġcache ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġthe Ġgiven Ġnode Ġfrom Ġa Ġmerged Ġmanifest , Ġfind Ġthe Ġcorresponding ĊĠĠĠĠ Ġ* Ġsource Ġmanifest Ġnode , Ġif Ġpossible ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġmerged Node Ġthe Ġnode Ġfrom Ġthe Ġmerged Ġmanifest ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġcorresponding Ġmanifest Ġnode Ġin Ġone Ġof Ġthe Ġsource ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġfiles , Ġif Ġpossible ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġfind Manifest Source Node ( merged Node : ĠNode ): ĠPair < File , Ġout ĠNode >? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdoc Ġ= Ġmerged Node . owner Document Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġreport Ġ= Ġdoc . getUser Data ( MER GED _ MAN IFEST ) Ġ?: Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġval Ġcached Ġ= Ġsource Node Cache [ merged Node ] ĊĠĠĠĠĠĠĠ Ġif Ġ( cached Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cached Ġ=== ĠNOT _ FOUND ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcached ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġbl ame File Ġ= Ġreport File Cache [ report ] ĊĠĠĠĠĠĠĠ Ġif Ġ( bl ame File Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( report ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠFile Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( report . path . endsWith ( DOT _ XML )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSingle Ġmanifest Ġfile : Ġno Ġmanifest Ġmerging , Ġpassed Ġsource Ġdocument ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġstraight Ġthrough ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPair . of ( report , Ġmerged Node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl ame File Ġ= ĠBl ame File . parse ( report ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠString Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlines Ġ= ĠSplit ter . on ('\ n '). split ToList ( report ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl ame File Ġ= ĠBl ame File . parse ( lines ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠActions Ġ-> Ġbl ame File Ġ= ĠBl ame File . parse ( report ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġassert ( false ) Ġ{ Ġreport Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl ame File Ġ= ĠBl ame File . NONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignore : ĠIOException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbl ame File Ġ= ĠBl ame File . NONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ@ Suppress (" ALWAYS _ NULL ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbl ame File !! ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport File Cache [ report ] Ġ= Ġbl ame File ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġvar Ġsource : ĠPair < File , Ġout ĠNode >? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġif Ġ( bl ame File Ġ!== ĠBl ame File . NONE ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsource Ġ= Ġbl ame File . find Source Node ( this , Ġmerged Node ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠCache Ġfor Ġnext Ġtime ĊĠĠĠĠĠĠĠ Ġval Ġcache Value Ġ= Ġsource Ġ?: ĠNOT _ FOUND ĊĠĠĠĠĠĠĠ Ġsource Node Cache [ merged Node ] Ġ= Ġcache Value ĊĊĠĠĠĠĠĠĠ Ġreturn Ġsource ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġlocation Ġfor Ġa Ġgiven Ġnode Ġfrom Ġa Ġmerged Ġmanifest ĊĠĠĠĠ Ġ* Ġfile . ĠConvenience Ġwrapper Ġaround Ġ[ find Manifest Source Node ] Ġand ĊĠĠĠĠ Ġ* Ġ[ Xml Parser . getLocation ]. ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġfind Manifest Source Location ( merged Node : ĠNode ): ĠLocation ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġsource Ġ= Ġfind Manifest Source Node ( merged Node ) ĊĠĠĠĠĠĠĠ Ġif Ġ( source Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġxml Parser . getLocation ( source . first , Ġsource . second ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠForm ats Ġthe Ġgiven Ġpath ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġfile Ġthe Ġpath Ġto Ġcompute Ġa Ġdisplay Ġname Ġfor ĊĠĠĠĠ Ġ* Ġ@ param Ġproject Ġthe Ġassociated Ġproject , Ġif Ġany ĊĠĠĠĠ Ġ* Ġ@ param Ġformat Ġthe Ġmessage Ġformat Ġto Ġformat Ġas ; Ġdefaults Ġto ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġ[ Text Format . RAW ], Ġe . g . Ġwith Ġback sl ashes ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġand Ġaster is ks Ġin Ġthe Ġpath Ġescaped ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġpath Ġformatted Ġfor Ġuser Ġdisplay ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Display Path ( ĊĠĠĠĠĠĠĠ Ġfile : ĠFile , ĊĠĠĠĠĠĠĠ Ġproject : ĠProject ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠ Ġformat : ĠText Format Ġ= ĠText Format . RAW ĊĠĠĠ Ġ): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbase Ġ= Ġproject ?. reference Dir Ġ?: Ġget Root Dir () ĊĠĠĠĠĠĠĠ Ġif Ġ( base Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠbasePath Ġ= Ġbase . path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpath Ġ= Ġfile . path ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path . startsWith ( basePath )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġlength Ġ= ĠbasePath . length ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path . length Ġ> Ġlength Ġ&& Ġpath [ length ] Ġ== Ġseparator Char ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlength ++ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrelative Ġ= Ġpath . substring ( length ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠText Format . TEXT . convertTo ( relative , Ġformat ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn ĠText Format . TEXT . convertTo ( file . path , Ġformat ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠOb solete ; Ġhere Ġfor Ġbackwards Ġcompatibility . Ġ*/ ĊĠĠĠ Ġ@ Deprecated ( ĊĠĠĠĠĠĠĠ Ġ" Resource Ġrepositories Ġare Ġnow Ġalways Ġsupported ", ĊĠĠĠĠĠĠĠ Ġreplace With Ġ= ĠReplace With (" true ") ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun Ġsupports Project Resources (): ĠBoolean Ġ= Ġtrue ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġproject Ġresources , Ġif Ġavailable ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġinclude Module Dependencies Ġif Ġtrue , Ġinclude Ġmerged Ġview Ġof ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġall Ġmodule Ġdependencies ĊĠĠĠĠ Ġ* Ġ@ param Ġinclude Libraries Ġif Ġtrue , Ġinclude Ġmerged Ġview Ġof Ġall ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġlibrary Ġdependencies Ġ( this Ġalso Ġrequires Ġall Ġmodule Ġdependencies ) ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġproject Ġresources , Ġor Ġnull Ġif Ġnot Ġavailable ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Deprecated ( ĊĠĠĠĠĠĠĠ Ġ" Use Ġget Resources ( project , Ġscope ) Ġinstead ", ĊĠĠĠĠĠĠĠ Ġreplace With Ġ= ĠReplace With (" getResources ( project , Ġscope ") ĊĠĠĠ Ġ) ĊĠĠĠ Ġfun ĠgetResource Repository ( ĊĠĠĠĠĠĠĠ Ġproject : ĠProject , ĊĠĠĠĠĠĠĠ Ġinclude Module Dependencies : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġinclude Libraries : ĠBoolean ĊĠĠĠ Ġ): ĠResource Repository Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġscope Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Libraries Ġ-> ĠResource Repository Scope . ALL _ DEPEND ENCI ES ĊĠĠĠĠĠĠĠĠĠĠĠ Ġinclude Module Dependencies Ġ-> ĠResource Repository Scope . LOCAL _ DEPEND ENCI ES ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠResource Repository Scope . PROJECT _ ONLY ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġget Resources ( project , Ġscope ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġresources Ġfrom Ġthe Ġgiven Ġ[ project ] Ġwith Ġthe Ġgiven ĊĠĠĠĠ Ġ* Ġ[ scope ] ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġabstract Ġfun Ġget Resources ( ĊĠĠĠĠĠĠĠ Ġproject : ĠProject , ĊĠĠĠĠĠĠĠ Ġscope : ĠResource Repository Scope ĊĠĠĠ Ġ): ĠResource Repository ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠFor Ġa Ġlint Ġclient Ġwhich Ġsupports Ġresource Ġitems Ġ( via ĊĠĠĠĠ Ġ* Ġ[ supports Project Resources ]) Ġreturn Ġa Ġhandle Ġfor Ġa Ġresource Ġitem . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġitem Ġthe Ġresource Ġitem Ġto Ġlook Ġup Ġa Ġlocation Ġhandle Ġfor ĊĠĠĠĠ Ġ* Ġ@ return Ġa Ġcorresponding Ġhandle ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġcreate Resource Item Handle ( ĊĠĠĠĠĠĠĠ Ġitem : ĠResource Item , ĊĠĠĠĠĠĠĠ Ġname Only : ĠBoolean Ġ= Ġfalse , ĊĠĠĠĠĠĠĠ Ġvalue Only : ĠBoolean Ġ= Ġtrue ĊĠĠĠ Ġ): ĠLocation . Resource Item Handle Ġ= ĊĠĠĠĠĠĠĠ ĠLocation . Resource Item Handle ( this , Ġitem , Ġname Only , Ġvalue Only ) ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠCreates Ġa Ġ[ Xml Pull Parser ] Ġfor Ġthe Ġgiven ĠXML Ġfile Ġresource . ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġresource Path Ġthe Ġpath Ġto Ġa Ġfile ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġparser Ġfor Ġthe Ġresource , Ġor Ġnull Ġif Ġthe Ġresource Ġdoes ĊĠĠĠĠ Ġ* ĠĠĠĠ Ġnot Ġexist . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġopen Ġfun Ġcreate Xml Pull Parser ( resource Path : ĠPath String ): ĠXml Pull Parser ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġbytes Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġread Bytes ( resource Path ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠFileNotFoundException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġval Ġparser Ġ= ĠK Xml Parser () ĊĠĠĠĠĠĠĠ Ġparser . set Feature ( Xml Pull Parser . FEATURE _ PROCESS _ NAMES P ACES , Ġtrue ) ĊĠĠĠĠĠĠĠ Ġparser . setInput ( ByteArray InputStream ( bytes ), ĠStandard Charsets . UTF _ 8 . name ()) ĊĠĠĠĠĠĠĠ Ġreturn Ġparser ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġversion Ġnumber Ġof Ġthis Ġlint Ġclient , Ġif Ġknown . Ġ*/ ĊĠĠĠ Ġopen Ġfun ĠgetClient Revision (): ĠString ? Ġ= Ġnull ĊĊĠĠĠ Ġ/** ĠReturns Ġthe Ġdisplay Ġname Ġof Ġthis Ġlint Ġclient , Ġif Ġknown . Ġ*/ ĊĠĠĠ Ġopen Ġfun ĠgetClient DisplayName (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠF allback Ġimplementation Ġif Ġnot Ġoverridden Ġby ĠL int Client ĊĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ( client Name ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠThis Ġwill Ġnever Ġbe ĠCLIENT _ ST UDIO Ġbecause Ġthis Ġmethod ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġis Ġoverridden Ġin Ġthe ĠIDE Ġto Ġreturn Ġthe Ġright ĠIDE Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġwhich Ġcould Ġbe ĠAndroid ĠStudio , Ġor ĠIntelliJ , Ġetc . ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCLIENT _ GRAD LE Ġ-> Ġ" Android ĠGradle ĠPlugin " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCLIENT _ UNIT _ TESTS Ġ-> Ġ" Lint ĠUnit ĠTest " ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCLIENT _ CLI , ĠCLIENT _ UNKNOWN Ġ-> Ġ" Lint " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġclient Name ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġversion Ġnumber Ġof Ġthis Ġlint Ġclient , Ġif Ġknown . ĠThis Ġis ĊĠĠĠĠ Ġ* Ġthe Ġone Ġmeant Ġto Ġbe Ġdisplayed Ġto Ġusers ; Ġe . g . Ġfor ĠStudio , Ġclient ĊĠĠĠĠ Ġ* Ġrevision Ġmay Ġbe Ġ" 3 . 4 . 0 . 0 " Ġand Ġdisplay Ġrevision Ġmight Ġbe Ġ" 3 . 4 ĊĠĠĠĠ Ġ* ĠCan ary Ġ 1 ". ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun ĠgetClient Display Revision (): ĠString ? Ġ= ĠgetClient Revision () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRuns Ġthe Ġgiven Ġrunnable Ġunder Ġa Ġread Ġlock Ġsuch Ġthat Ġit Ġcan Ġaccess ĊĠĠĠĠ Ġ* Ġthe ĠP SI ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġrunnable Ġthe Ġrunnable Ġto Ġbe Ġrun ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġrun Read Action ( run nable : ĠRunnable ) Ġ= Ġrunnable . run () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠRuns Ġthe Ġgiven Ġcomputation Ġunder Ġa Ġread Ġlock Ġsuch Ġthat Ġit Ġcan ĊĠĠĠĠ Ġ* Ġaccess Ġthe ĠP SI ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ param Ġcomp utable Ġthe Ġcomputation Ġto Ġperform ĊĠĠĠĠ Ġ* Ġ@ return Ġthe Ġresult Ġreturned Ġby Ġthe Ġcomputation ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġ< T > Ġrun Read Action ( comp utable : ĠComp utable < T >): ĠT Ġ= Ġcomp utable . compute () ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġexternal Ġannotation Ġzip Ġfiles Ġfor Ġthe Ġgiven Ġprojects ĊĠĠĠĠ Ġ* Ġ( transit ively ), Ġif Ġany . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget External Annotations ( projects : ĠCollection < Project >): ĠList < File > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfiles Ġ= ĠLists . newArrayList With Expected Size < File >( 2 ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( project Ġin Ġprojects ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariant Ġ= Ġproject . build Variant Ġ?: Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ( library Ġin Ġvariant . main Artifact . dependencies . getAll ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( library Ġis ĠL int Model Android Library ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠAs Ġof Ġ 1 . 2 Ġthis Ġis Ġavailable Ġin Ġthe Ġmodel : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ Ġhttps :// android - review . google source . com /#/ c / 1 3 7 7 5 0 / ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠSwitch Ġover Ġto Ġthis Ġwhen Ġit 's Ġin Ġmore Ġcommon Ġusage ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ( until Ġit Ġis , Ġwe 'll Ġpay Ġfor Ġfailed Ġproxy ing Ġerrors ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzip Ġ= Ġlibrary . external Annotations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( zip . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . add ( zip ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( ignore : ĠThrowable ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUsing Ġsome Ġolder Ġversion Ġthan Ġ 1 . 2 ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġzip Ġ= ĠFile ( library . res Folder . parent , ĠFN _ AN NOT ATIONS _ ZIP ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( zip . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfiles . add ( zip ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġfiles ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġpath Ġto Ġa Ġgiven Ġ[ file ], Ġgiven Ġa Ġ[ base File ] Ġto Ġmake Ġit ĊĠĠĠĠ Ġ* Ġrelative Ġto . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget RelativePath ( base File : ĠFile ?, Ġfile : ĠFile ?): ĠString ? Ġ{ ĊĠĠĠĠĠĠĠ Ġ// ĠBased Ġon Ġsimilar Ġcode Ġin Ġcom . intellij . openapi . util . io . File Util Rt ĊĠĠĠĠĠĠĠ Ġvar Ġbase Ġ= Ġbase File ĊĠĠĠĠĠĠĠ Ġif Ġ( base Ġ== Ġnull Ġ|| Ġfile Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ(! base . isDirectory ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġbase Ġ= Ġbase . parent File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( base Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( base . path Ġ== Ġfile . path ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"." ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval ĠfilePath Ġ= Ġfile . absolute Path ĊĠĠĠĠĠĠĠ Ġvar ĠbasePath Ġ= Ġbase . absolute Path ĊĊĠĠĠĠĠĠĠ Ġ// ĠTODO : ĠMake Ġthis Ġreturn Ġnull Ġif Ġwe Ġgo Ġall Ġthe Ġway Ġto Ġthe Ġroot ! ĊĊĠĠĠĠĠĠĠ ĠbasePath Ġ= Ġif Ġ(! basePath . isEmpty () Ġ&& ĠbasePath [ basePath . length Ġ- Ġ 1 ] Ġ== Ġseparator Char ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠbasePath ĊĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠ ĠbasePath Ġ+ Ġseparator Char ĊĊĠĠĠĠĠĠĠ Ġ// ĠWhether Ġfilesystem Ġis Ġcase Ġsensitive . ĠTech n ically Ġon ĠOSX Ġyou Ġcould Ġcreate Ġa ĊĠĠĠĠĠĠĠ Ġ// Ġsensitive Ġone , Ġbut Ġit 's Ġnot Ġthe Ġdefault . ĊĠĠĠĠĠĠĠ Ġval Ġcase Sensitive Ġ= ĠCURRENT _ PLATFORM Ġ== ĠPLATFORM _ LINUX ĊĠĠĠĠĠĠĠ Ġval Ġl Ġ= ĠLocale . getDefault () ĊĠĠĠĠĠĠĠ Ġval ĠbasePath To Compare Ġ= Ġif Ġ( case Sensitive ) ĠbasePath Ġelse ĠbasePath . toLowerCase ( l ) ĊĠĠĠĠĠĠĠ Ġval ĠfilePath To Compare Ġ= Ġif Ġ( case Sensitive ) ĠfilePath Ġelse ĠfilePath . toLowerCase ( l ) ĊĠĠĠĠĠĠĠ Ġif Ġ( basePath To Compare Ġ== Ġ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! filePath To Compare . isEmpty () Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath To Compare [ filePath To Compare . length Ġ- Ġ 1 ] Ġ== Ġseparator Char ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath To Compare ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath To Compare Ġ+ Ġseparator Char ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġ"." ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġvar Ġlen Ġ= Ġ 0 ĊĠĠĠĠĠĠĠ Ġvar Ġlast Separator Index Ġ= Ġ 0 ĊĊĠĠĠĠĠĠĠ Ġwhile Ġ( len Ġ< ĠfilePath . length Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlen Ġ< ĠbasePath . length Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠ ĠfilePath To Compare [ len ] Ġ== ĠbasePath To Compare [ len ] ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( basePath [ len ] Ġ== Ġseparator Char ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlast Separator Index Ġ= Ġlen ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlen ++ ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġif Ġ( len Ġ== Ġ 0 ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġrelative Path Ġ= ĠStringBuilder () ĊĠĠĠĠĠĠĠ Ġfor Ġ( i Ġin Ġlen Ġuntil ĠbasePath . length ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( basePath [ i ] Ġ== Ġseparator Char ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelative Path . append (" .. ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġrelative Path . append ( separator Char ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġrelative Path . append ( filePath . substring ( last Separator Index Ġ+ Ġ 1 )) ĊĠĠĠĠĠĠĠ Ġreturn Ġrelative Path . toString () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠReturns Ġthe Ġroot Ġdirectory Ġfor Ġanalysis , Ġif Ġknown . ĠThe Ġactual ĊĠĠĠĠ Ġ* Ġsource Ġprojects Ġcan Ġbe Ġbelow Ġthis Ġdirectory , Ġnot Ġnecessarily ĊĠĠĠĠ Ġ* Ġdirectly . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġfun Ġget Root Dir (): ĠFile ? Ġ{ ĊĠĠĠĠĠĠĠ Ġvar Ġroot : ĠFile ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġfor Ġ( project Ġin Ġknown Projects ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! project . report Issues ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġroot Ġ= Ġif Ġ( root Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . dir ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġget Common Parent ( root , Ġproject . dir ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ// ĠWork around : Ġwe Ġneed Ġthe Ġroot Ġproject ; Ġit 's Ġnot Ġyet Ġpart Ġof Ġthe Ġmodel , ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġadding Ġit Ġnow Ġwould Ġcl ash Ġwith Ġsimultaneous Ġedits Ġto Ġde co uple ĠGradle ĊĠĠĠĠĠĠĠ Ġ// Ġand Ġlint ĊĠĠĠĠĠĠĠ Ġval Ġparent Ġ= Ġroot ?. parent File ĊĠĠĠĠĠĠĠ Ġif Ġ( parent Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( File ( parent , ĠS dk Constants . FN _ BUILD _ GRAD LE ). exists () Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠFile ( parent , ĠS dk Constants . FN _ BUILD _ GRAD LE _ K TS ). exists () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġparent ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġreturn Ġroot ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠPROP _ BIN _ DIR Ġ= Ġ" com . android . tools . lint . bindir " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturns Ġthe ĠFile Ġcorresponding Ġto Ġthe Ġsystem Ġproperty Ġor ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġenvironment Ġvariable Ġfor Ġ[ PROP _ BIN _ DIR ]. ĠThis Ġproperty ĊĠĠĠĠĠĠĠĠ Ġ* Ġis Ġtypically Ġset Ġby Ġthe ĠSDK / cmdline - tools / latest / bin / lint ĊĠĠĠĠĠĠĠĠ Ġ* Ġwrapper . ĠIt Ġden otes Ġthe Ġpath Ġof Ġthe Ġwrapper Ġon Ġdisk . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return ĠA Ġnew ĠFile Ġcorresponding Ġto Ġ[ Lint Client . PROP _ BIN _ DIR ] ĊĠĠĠĠĠĠĠĠ Ġ* ĠĠĠĠ Ġor Ġnull . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġlint Bin Dir : ĠFile ? ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠFirst Ġcheck Ġthe ĠJava Ġproperties Ġ( e . g . Ġset Ġusing Ġ" java Ġ- jar Ġ... Ġ- D name = value ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġnot Ġfound , Ġcheck Ġenvironment Ġvariables . ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġpath : ĠString ? Ġ= ĠSystem . getProperty ( PROP _ BIN _ DIR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path Ġ== Ġnull Ġ|| Ġpath . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpath Ġ= ĠSystem . getenv ( PROP _ BIN _ DIR ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( path Ġ!= Ġnull Ġ&& Ġ! path . isEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( path ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . exists ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠDatabase Ġmoved Ġfrom Ġplatform - tools Ġto ĠSDK Ġin ĠAPI Ġlevel Ġ 2 6 . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġduplicates Ġthe Ġconstant Ġin Ġ[ Lint Client ] Ġbut Ġthat ĊĠĠĠĠĠĠĠĠ Ġ* Ġconstant Ġis Ġnot Ġpublic Ġ( because Ġit 's Ġin Ġthe ĠAPI Ġpackage ĊĠĠĠĠĠĠĠĠ Ġ* Ġand ĠI Ġdon 't Ġwant Ġthis Ġpart Ġof Ġthe ĠAPI Ġsurface ; Ġit 's Ġan ĊĠĠĠĠĠĠĠĠ Ġ* Ġimplementation Ġoptimization .) ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġprivate Ġconst Ġval ĠSDK _ DATABASE _ MIN _ VERSION Ġ= Ġ 2 6 ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠKey Ġst ashed Ġas Ġuser Ġdata Ġon Ġmerged Ġmanifest Ġdocuments Ġsuch ĊĠĠĠĠĠĠĠĠ Ġ* Ġthat Ġwe Ġcan Ġquickly Ġdetermine Ġif Ġa Ġnode Ġis Ġoriginally ĊĠĠĠĠĠĠĠĠ Ġ* Ġfrom Ġa Ġmerged Ġmanifest Ġ( this Ġis Ġused Ġto Ġautomatically ĊĠĠĠĠĠĠĠĠ Ġ* Ġresolve Ġreported Ġerrors Ġon Ġthe Ġmerged Ġmanifest Ġback Ġto ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġcorresponding Ġsource Ġlocations , Ġwhen Ġpossible .) ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠMER GED _ MAN IFEST Ġ= Ġ" lint - merged - manifest " ĊĊĠĠĠĠĠĠĠ Ġ@ Jvm Field ĊĠĠĠĠĠĠĠ Ġprotected Ġval ĠNOT _ FOUND : ĠPair < File , ĠNode > Ġ= ĠPair . of < File , ĠNode >( null , Ġnull ) ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġclient Ġname Ġreturned Ġby Ġ[ client Name ] Ġwhen Ġrunning Ġin ĊĠĠĠĠĠĠĠĠ Ġ* ĠAndroid ĠStudio / Int elli J ĠIDEA . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Member Visibility Can Be Private ") ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCLIENT _ ST UDIO Ġ= Ġ" studio " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġclient Ġname Ġreturned Ġby Ġ[ client Name ] Ġwhen Ġrunning Ġin ĊĠĠĠĠĠĠĠĠ Ġ* ĠGradle . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCLIENT _ GRAD LE Ġ= Ġ" gradle " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġclient Ġname Ġreturned Ġby Ġ[ client Name ] Ġwhen Ġrunning Ġin Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* ĠCLI Ġ( command Ġline Ġinterface ) Ġversion Ġof Ġlint , Ġ` lint `. ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCLIENT _ CLI Ġ= Ġ" cli " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġclient Ġname Ġreturned Ġby Ġ[ client Name ] Ġwhen Ġrunning Ġin Ġunit ĊĠĠĠĠĠĠĠĠ Ġ* Ġtests . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Member Visibility Can Be Private ") ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCLIENT _ UNIT _ TESTS Ġ= Ġ" test " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġclient Ġname Ġreturned Ġby Ġ[ client Name ] Ġwhen Ġrunning Ġin Ġsome ĊĠĠĠĠĠĠĠĠ Ġ* Ġunknown Ġclient . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Suppress (" Member Visibility Can Be Private ") ĊĠĠĠĠĠĠĠ Ġconst Ġval ĠCLIENT _ UNKNOWN Ġ= Ġ" unknown " ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠThe Ġname Ġof Ġthe Ġembedding Ġclient . ĠIt Ġcould Ġbe Ġnot Ġjust ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ CLIENT _ ST UDIO ], Ġ[ CLIENT _ GRAD LE ], Ġ[ CLIENT _ CLI ] Ġetc Ġbut Ġother ĊĠĠĠĠĠĠĠĠ Ġ* Ġvalues Ġtoo Ġas Ġlint Ġis Ġintegrated Ġin Ġother Ġembedding Ġcontexts . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠThis Ġis Ġonly Ġintended Ġto Ġbe Ġset Ġby Ġthe Ġlint Ġinfrastructure . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠNote Ġthat Ġif Ġyou Ġare Ġgetting Ġan ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ Un initialized Property AccessException ] Ġhere , Ġyou 're Ġaccessing ĊĠĠĠĠĠĠĠĠ Ġ* Ġcode Ġwhich Ġshould Ġonly Ġbe Ġrun Ġafter Ġthe Ġlint Ġclient Ġname ĊĠĠĠĠĠĠĠĠ Ġ* Ġhas Ġbeen Ġinitialized . ĠThis Ġshould Ġbe Ġperformed Ġearly Ġin Ġthe ĊĠĠĠĠĠĠĠĠ Ġ* Ġinitialization Ġof Ġeach Ġintegration Ġof Ġlint Ġin Ġa Ġtool Ġsuch Ġas ĊĠĠĠĠĠĠĠĠ Ġ* ĠGradle , ĠAndroid ĠStudio , Ġetc . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġthe Ġname Ġof Ġthe Ġembedding Ġclient ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġlateinit Ġvar Ġclient Name : ĠString ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe Ġembedding Ġclient Ġcurrently Ġrunning Ġlint ĊĠĠĠĠĠĠĠĠ Ġ* Ġis ĠAndroid ĠStudio Ġ( or ĠIntelliJ ĠIDEA ) ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġrunning Ġin ĠAndroid ĠStudio Ġ/ ĠIntelliJ ĠIDEA ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval Ġis Studio : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠCLIENT _ ST UDIO Ġ== Ġclient Name ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturns Ġtrue Ġif Ġthe Ġembedding Ġclient Ġcurrently Ġrunning Ġlint ĊĠĠĠĠĠĠĠĠ Ġ* Ġis ĠGradle ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* Ġ@ return Ġtrue Ġif Ġrunning Ġin ĠGradle ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval Ġis Gradle : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠCLIENT _ GRAD LE Ġ== Ġclient Name ĊĊĠĠĠĠĠĠĠ Ġ/** ĠReturns Ġtrue Ġif Ġrunning Ġfrom Ġunit Ġtests . Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġval Ġis UnitTest : ĠBoolean ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget () Ġ= ĠCLIENT _ UNIT _ TESTS Ġ== Ġclient Name ĊĊĠĠĠĠĠĠĠ Ġ/** ĠIn tended Ġonly Ġfor Ġtest Ġinfrastructure . Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġis Client Name Initialized (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis :: client Name . isInitialized ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠIn tended Ġonly Ġfor Ġtest Ġinfrastructure . Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġensure Client Name Initialized () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! is Client Name Initialized ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġerror (" The ĠL int Client . client Name Ġmust Ġbe Ġinitialized Ġbefore Ġrunning Ġother Ġlint Ġcode ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĠIn tended Ġonly Ġfor Ġtest Ġinfrastructure . Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġreset Client Name () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠUse Ġreflection Ġto Ġnull Ġout Ġa Ġlateinit Ġvariable . ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfield Ġ= ĠL int Client :: class . java . getDeclared Field (" client Name ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . is Accessible Ġ= Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfield . set ( null , Ġnull ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReturns Ġthe Ġdes ug aring Ġoperations Ġthat Ġthe ĠGradle Ġplugin Ġwill ĊĠĠĠĠĠĠĠĠ Ġ* Ġuse Ġfor Ġa Ġgiven Ġversion Ġof ĠGradle Ġand Ġa Ġgiven Ġconfigured ĊĠĠĠĠĠĠĠĠ Ġ* Ġlanguage Ġsource Ġlevel . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġfun Ġget Gradle Des ug aring ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġversion : ĠGradle Version , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage Level : ĠLanguage Level ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcore Library Des ug aring Enabled : ĠBoolean ĊĠĠĠĠĠĠĠ Ġ): ĠSet < Des ug aring > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠDes ugar Ġruns Ġif Ġthe ĠGradle Ġplugin Ġis Ġ 2 . 4 . 0 Ġalpha Ġ 8 Ġor Ġhigher ... ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! version . is At Least ( 2 , Ġ 4 , Ġ 0 , Ġ" alpha ", Ġ 8 , Ġtrue )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠDes ug aring . NONE ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġ... Ġ* and * Ġthe Ġlanguage Ġlevel Ġis Ġat Ġleast Ġ 1 . 8 ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠNO : ĠTry Ġwith Ġresources Ġapplies Ġto ĠJDK _ 1 _ 7 , Ġthough Ġin ĠGradle Ġwe Ġdon 't ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġkick Ġin Ġuntil ĠJava Ġ 8 ! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlanguage Level Ġ== Ġnull Ġ|| Ġlanguage Level . is LessThan ( JDK _ 1 _ 8 ) Ġ-> ĠDes ug aring . NONE ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcore Library Des ug aring Enabled Ġ-> ĠDes ug aring . FULL ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠDes ug aring . DEFAULT ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠReports Ġan Ġissue Ġwhere Ġwe Ġdon 't Ġ( ne cess arily ) Ġhave Ġa ĊĠĠĠĠĠĠĠĠ Ġ* Ġ[ Context ] Ġor Ġ[ Project ]. ĠDetector s Ġshould Ġgenerally Ġnot Ġuse ĊĠĠĠĠĠĠĠĠ Ġ* Ġthis Ġfacility ; Ġit 's Ġprimarily Ġused Ġto Ġreport Ġissues Ġthat ĊĠĠĠĠĠĠĠĠ Ġ* Ġhappen Ġoutside Ġof Ġa Ġnormal Ġlint Ġanalysis , Ġe . g . Ġissues Ġwith ĊĠĠĠĠĠĠĠĠ Ġ* Ġthe Ġproject Ġsetup Ġitself , Ġor Ġloading Ġcustom Ġcheck Ġjar Ġfiles , ĊĠĠĠĠĠĠĠĠ Ġ* Ġetc . ĊĠĠĠĠĠĠĠĠ Ġ* ĊĠĠĠĠĠĠĠĠ Ġ* ĠEven Ġthough Ġthis Ġmethod Ġtakes Ġa Ġ[ Lint Client ] Ġinstance , Ġit 's ĊĠĠĠĠĠĠĠĠ Ġ* Ġhere Ġon Ġthe Ġcompanion Ġobject Ġinstead Ġbecause Ġwe Ġdon 't Ġwant ĊĠĠĠĠĠĠĠĠ Ġ* Ġthis Ġreport Ġmethod Ġto Ġbe Ġsurf aced Ġalong Ġwith Ġthe Ġnormal ĊĠĠĠĠĠĠĠĠ Ġ* Ġreport Ġmethods Ġpeople Ġaccess Ġvia Ġcode Ġcompletion . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġreport ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient : ĠL int Client , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġissue : ĠIssue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile : ĠFile ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġformat : ĠText Format Ġ= ĠText Format . RAW , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfix : ĠL int Fix ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration : ĠConfiguration ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġseverity : ĠSeverity ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext : ĠContext ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject : ĠProject ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmain Project : ĠProject ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdriver : ĠL int Driver ? Ġ= Ġnull , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation : ĠLocation ? Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreal Location Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlocation Ġ!= Ġnull Ġ-> Ġlocation ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ!= Ġnull Ġ-> ĠLocation . create ( file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ!= Ġnull Ġ-> ĠLocation . create ( context . file ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Ġ!= Ġnull Ġ-> ĠLocation . create ( project . dir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror (" Must Ġsupply Ġlocation Ġor Ġfile Ġor Ġproject ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreal File Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ!= Ġnull Ġ-> Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġreal Location . file ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreal Project Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Ġ!= Ġnull Ġ-> Ġproject ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ!= Ġnull Ġ-> Ġcontext . project ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdir Ġ= Ġif Ġ( real File . isDirectory ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreal File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġreal File . parent File Ġ?: ĠFile (" "). absolute File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġcurr Ġ= Ġdir ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġproject Dir : ĠFile ? Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠLook Ġthrough Ġexisting Ġprojects Ġcontaining Ġthis Ġpath ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( curr Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( client . dir To Project . containsKey ( curr )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Dir Ġ= Ġcurr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Ġ= Ġcurr . parent File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠIf Ġno Ġexisting Ġproject , Ġat Ġleast Ġpick Ġthe Ġmost Ġreasonable Ġguess ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfor Ġa Ġproject Ġlocation Ġ( pri mar ily Ġused Ġto Ġmake Ġrelative Ġpaths ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġin Ġerror Ġreport ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( project Dir Ġ== Ġnull Ġ&& Ġcurr Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( client . is Project Directory ( curr )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Dir Ġ= Ġcurr ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbreak ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcurr Ġ= Ġcurr . parent File ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . getProject ( project Dir Ġ?: Ġdir , Ġproject Dir Ġ?: Ġdir ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreal Severity Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġseverity Ġ!= Ġnull Ġ-> Ġseverity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġconfiguration Ġ!= Ġnull Ġ-> Ġconfiguration . get Severity ( issue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ!= Ġnull Ġ-> Ġcontext . configuration . get Severity ( issue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ!= Ġnull Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient . configurations . getConfiguration For Folder ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( file . isFile ) Ġfile . parent File Ġelse Ġfile ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . get Severity ( issue ) Ġ?: Ġissue . default Severity ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Ġ!= Ġnull Ġ&& Ġdriver Ġ!= Ġnull Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject . getConfiguration ( driver ). get Severity ( issue ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġissue . default Severity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġ// ĠCreate Ġa Ġcontext Ġto Ġreport Ġthis Ġissue Ġagainst ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreal Context Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontext Ġ!= Ġnull Ġ-> Ġcontext ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreal Driver Ġ= Ġif Ġ( driver Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdriver ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġrequest Ġ= ĠL int Request ( client , Ġempty List ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠL int Driver ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġobject Ġ: ĠIssue Registry () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġissues : ĠList < Issue > Ġ= Ġempty List () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġvendor : ĠVendor Ġ= ĠA O SP _ VENDOR ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient , Ġrequest ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠContext ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreal Driver , Ġreal Project , Ġmain Project Ġ?: Ġreal Project , Ġreal File , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( real File . isDirectory ) Ġ"" Ġelse Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġincident Ġ= ĠInc ident ( issue , Ġreal Location , Ġmessage , Ġfix ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġincident . severity Ġ= Ġreal Severity ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient . report ( real Context , Ġincident , Ġformat ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠConvenience Ġhelper Ġfor ĠJava Ġcalls Ġinto Ġthe Ġabove Ġreporting ĊĠĠĠĠĠĠĠĠ Ġ* Ġmethod , Ġsince ĠJava Ġdoes Ġnot Ġhave Ġdefault Ġparameters . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġreport ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient : ĠL int Client , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġissue : ĠIssue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfile : ĠFile , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject : ĠProject ? ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Ġ= Ġclient , Ġissue Ġ= Ġissue , Ġmessage Ġ= Ġmessage , Ġfile Ġ= Ġfile , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproject Ġ= Ġproject , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġensure Ġwe Ġcall Ġthe Ġmain Ġreporting Ġmethod , Ġnot Ġa Ġrecursive Ġcall Ġto Ġself : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdriver Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġ/** ĊĠĠĠĠĠĠĠĠ Ġ* ĠConvenience Ġhelper Ġfor ĠJava Ġcalls Ġinto Ġthe Ġabove Ġreporting ĊĠĠĠĠĠĠĠĠ Ġ* Ġmethod , Ġsince ĠJava Ġdoes Ġnot Ġhave Ġdefault Ġparameters . ĊĠĠĠĠĠĠĠĠ Ġ*/ ĊĠĠĠĠĠĠĠ Ġfun Ġreport ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġclient : ĠL int Client , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġissue : ĠIssue , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġmessage : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdriver : ĠL int Driver , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject : ĠProject , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġlocation : ĠLocation ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfix : ĠL int Fix ? ĊĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclient Ġ= Ġclient , Ġissue Ġ= Ġissue , Ġmessage Ġ= Ġmessage , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdriver Ġ= Ġdriver , Ġproject Ġ= Ġproject , Ġlocation Ġ= Ġlocation , Ġfix Ġ= Ġfix , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġensure Ġwe Ġcall Ġthe Ġmain Ġreporting Ġmethod , Ġnot Ġa Ġrecursive Ġcall Ġto Ġself : ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfile Ġ= Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠTrue Ġif Ġlint Ġshould Ġprint Ġthe Ġfull Ġstack trace Ġof Ġinternal Ġerrors . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġopen Ġval Ġprint Internal Error StackTrace : ĠBoolean ĊĠĠĠĠĠĠĠ Ġget () Ġ= ĠS dk Constants . VALUE _ TRUE Ġ== ĠSystem . getenv (" L INT _ PRINT _ STACK TRACE ") Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ ĠS dk Constants . VALUE _ TRUE Ġ== ĠSystem . getProperty (" lint . print - stack trace ") Ċ } Ċ