/* Ċ Ġ* ĠCopyright Ġ( C ) Ġ 2 0 1 7 ĠSquare , ĠInc . Ċ Ġ* Ċ Ġ* Ġ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 . fr an ke gan . sql k ite Ċ Ċ import Ġcom . android . tools . lint . detector . api . Category Ċ import Ġcom . android . tools . lint . detector . api . Constant Evaluator . evaluate String Ċ import Ġcom . android . tools . lint . detector . api . Detector Ċ import Ġcom . android . tools . lint . detector . api . Implementation Ċ import Ġcom . android . tools . lint . detector . api . Issue Ċ import Ġcom . android . tools . lint . detector . api . Java Context Ċ import Ġcom . android . tools . lint . detector . api . Scope . JAVA _ FILE Ċ import Ġcom . android . tools . lint . detector . api . Scope . TEST _ SOURCES Ċ import Ġcom . android . tools . lint . detector . api . Severity Ċ import Ġcom . intellij . psi . Psi Method Ċ import Ġorg . jetbrains . u ast . U Call Expression Ċ import Ġjava . util . Enum Set Ċ Ċ private Ġconst Ġval ĠK ITE _ DATABASE Ġ= Ġ" com . fr an ke gan . sql k ite . K ite Database " Ċ private Ġconst Ġval ĠQUERY _ METHOD _ NAME Ġ= Ġ" query " Ċ private Ġconst Ġval ĠCREATE _ QUERY _ METHOD _ NAME Ġ= Ġ" createQuery " Ċ Ċ class ĠSql K ite Arg Count Detector Ġ: ĠDetector (), ĠDetector . U ast Scanner Ġ{ ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠ Ġval ĠISS UE : ĠIssue Ġ= ĠIssue . create ( ĊĠĠĠĠĠĠĠ Ġ" Sql K ite Arg Count ", ĊĠĠĠĠĠĠĠ Ġ" Number Ġof Ġprovided Ġarguments Ġdoesn 't Ġmatch Ġnumber Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" of Ġarguments Ġspecified Ġin Ġquery ", ĊĠĠĠĠĠĠĠ Ġ" When Ġproviding Ġarguments Ġto Ġquery Ġyou Ġneed Ġto Ġprovide Ġthe Ġsame Ġamount Ġof Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" arguments Ġthat Ġis Ġspecified Ġin Ġquery .", ĊĠĠĠĠĠĠĠ ĠCategory . MESSAGES , ĊĠĠĠĠĠĠĠĠ 9 , ĊĠĠĠĠĠĠĠ ĠSeverity . ERROR , ĊĠĠĠĠĠĠĠ ĠImplementation ( Sql K ite Arg Count Detector :: class . java , ĠEnum Set . of ( JAVA _ FILE , ĠTEST _ SOURCES ))) ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Applicable Method Names () Ġ= ĠlistOf ( CREATE _ QUERY _ METHOD _ NAME , ĠQUERY _ METHOD _ NAME ) ĊĊĠĠĠ Ġoverride Ġfun Ġvisit MethodCall ( context : ĠJava Context , Ġcall : ĠU Call Expression , Ġmethod : ĠPsi Method ) Ġ{ ĊĠĠĠ Ġval Ġevaluator Ġ= Ġcontext . evaluator ĊĊĠĠĠ Ġif Ġ( evaluator . is Member In Class ( method , ĠK ITE _ DATABASE )) Ġ{ ĊĠĠĠĠĠ Ġ// ĠSkip Ġnon Ġvar args Ġover loads . ĊĠĠĠĠĠ Ġif Ġ(! method . is Var Args ) Ġreturn ĊĊĠĠĠĠĠ Ġ// ĠPosition Ġof Ġsql Ġparameter Ġdepends Ġon Ġmethod . ĊĠĠĠĠĠ Ġval Ġsql Ġ= Ġevaluate String ( context , ĊĠĠĠĠĠĠĠĠĠ Ġcall . value Arguments [ if Ġ( call . is Query Method ()) Ġ 0 Ġelse Ġ 1 ], Ġtrue ) Ġ?: Ġreturn ĊĊĠĠĠĠĠ Ġ// ĠCount Ġonly Ġvar arg Ġarguments . ĊĠĠĠĠĠ Ġval Ġarguments Count Ġ= Ġcall . value Argument Count Ġ- Ġif Ġ( call . is Query Method ()) Ġ 1 Ġelse Ġ 2 ĊĠĠĠĠĠ Ġval Ġquestion Marks Count Ġ= Ġsql . count Ġ{ Ġit Ġ== Ġ' ?' Ġ} ĊĠĠĠĠĠ Ġif Ġ( arguments Count Ġ!= Ġquestion Marks Count ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġrequired Arguments Ġ= Ġ"$ question Marks Count Ġ${ " argument ". plural ize ( question Marks Count )}" ĊĠĠĠĠĠĠĠ Ġval Ġactual Arguments Ġ= Ġ"$ arguments Count Ġ${ " argument ". plural ize ( arguments Count )}" ĊĠĠĠĠĠĠĠ Ġcontext . report ( ISSUE , Ġcall , Ġcontext . getLocation ( call ), Ġ" Wrong Ġargument Ġcount , Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" query Ġ$ sql Ġrequires Ġ$ required Arguments , Ġbut Ġwas Ġprovided Ġ$ actual Arguments ") ĊĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġprivate Ġfun ĠU Call Expression . is Query Method () Ġ= ĠmethodName Ġ== ĠQUERY _ METHOD _ NAME ĊĊĠ Ġprivate Ġfun ĠString . plural ize ( count : ĠInt ) Ġ= Ġif Ġ( count Ġ== Ġ 1 ) Ġthis Ġelse Ġthis Ġ+ Ġ" s " Ċ }