package Ġio . gitlab . art urb os ch . de te kt . rules . performance Ċ Ċ import Ġio . gitlab . art urb os ch . de te kt . api . Code S mell Ċ import Ġio . gitlab . art urb os ch . de te kt . api . Config Ċ import Ġio . gitlab . art urb os ch . de te kt . api . De bt Ċ import Ġio . gitlab . art urb os ch . de te kt . api . Entity Ċ import Ġio . gitlab . art urb os ch . de te kt . api . Issue Ċ import Ġio . gitlab . art urb os ch . de te kt . api . Rule Ċ import Ġio . gitlab . art urb os ch . de te kt . api . Severity Ċ import Ġorg . jetbrains . kotlin . descriptors . Constructor Descriptor Ċ import Ġorg . jetbrains . kotlin . descriptors . Parameter Descriptor Ċ import Ġorg . jetbrains . kotlin . psi . Kt Named Function Ċ import Ġorg . jetbrains . kotlin . psi . Kt Value Argument Ċ import Ġorg . jetbrains . kotlin . psi . Kt Value ArgumentList Ċ import Ġorg . jetbrains . kotlin . psi . psi Util . get Strict Parent OfType Ċ import Ġorg . jetbrains . kotlin . resolve . Binding Context Ċ import Ġorg . jetbrains . kotlin . resolve . Compile Time Constant Utils Ċ import Ġorg . jetbrains . kotlin . resolve . Descriptor Utils Ċ import Ġorg . jetbrains . kotlin . resolve . calls . call Util . get Resolved Call Ċ import Ġorg . jetbrains . kotlin . resolve . calls . components . is Var arg Ċ Ċ /** Ċ Ġ* ĠIn Ġmost Ġcases Ġusing Ġa Ġspread Ġoperator Ġcauses Ġa Ġfull Ġcopy Ġof Ġthe Ġarray Ġto Ġbe Ġcreated Ġbefore Ġcalling Ġa Ġmethod . Ċ Ġ* ĠThis Ġhas Ġa Ġvery Ġhigh Ġperformance Ġpenalty . ĠB ench marks Ġshowing Ġthis Ġperformance Ġpenalty Ġcan Ġbe Ġseen Ġhere : Ċ Ġ* Ġhttps :// sites . google . com / a / ath ay des . com / ren ato - ath ay des / posts / kotlin sh idden costs - benchmarks Ċ Ġ* Ċ Ġ* ĠThe ĠKotlin Ġcompiler Ġsince Ġv 1 . 1 . 6 0 Ġhas Ġan Ġoptimization Ġthat Ġskip s Ġthe Ġarray Ġcopy Ġwhen Ġan Ġarray Ġconstructor Ċ Ġ* Ġfunction Ġis Ġused Ġto Ġcreate Ġthe Ġarguments Ġthat Ġare Ġpassed Ġto Ġthe Ġvar arg Ġparameter . ĠWhen Ġtype Ġresolution Ġis Ġenabled Ġin Ċ Ġ* Ġde te kt Ġthis Ġcase Ġwill Ġnot Ġbe Ġflag ged Ġby Ġthe Ġrule Ġsince Ġit Ġdoesn 't Ġsuffer Ġthe Ġperformance Ġpenalty Ġof Ġan Ġarray Ġcopy . Ċ Ġ* Ċ Ġ* Ġ< non comp liant > Ċ Ġ* Ġval Ġstr s Ġ= ĠarrayOf (" value Ġone ", Ġ" value Ġtwo ") Ċ Ġ* Ġval Ġfoo Ġ= Ġbar (* strs ) Ċ Ġ* Ċ Ġ* Ġfun Ġbar ( var arg Ġstr s : ĠString ) Ġ{ Ċ Ġ* ĠĠĠĠ Ġstr s . forEach Ġ{ Ġprintln ( it ) Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ</ non comp liant > Ċ Ġ* Ċ Ġ* Ġ< comp liant > Ċ Ġ* Ġ// Ġarray Ġcopy Ġskipped Ġin Ġthis Ġcase Ġsince ĠKotlin Ġ 1 . 1 . 6 0 Ċ Ġ* Ġval Ġfoo Ġ= Ġbar (* array Of (" value Ġone ", Ġ" value Ġtwo ")) Ċ Ġ* Ċ Ġ* Ġ// Ġarray Ġnot Ġpassed Ġso Ġno Ġarray Ġcopy Ġis Ġrequired Ċ Ġ* Ġval Ġfoo 2 Ġ= Ġbar (" value Ġone ", Ġ" value Ġtwo ") Ċ Ġ* Ċ Ġ* Ġfun Ġbar ( var arg Ġstr s : ĠString ) Ġ{ Ċ Ġ* ĠĠĠĠ Ġstr s . forEach Ġ{ Ġprintln ( it ) Ġ} Ċ Ġ* Ġ} Ċ Ġ* Ġ</ comp liant > Ċ Ġ* Ċ Ġ* Ġ@ active Ġsince Ġv 1 . 0 . 0 Ċ Ġ*/ Ċ class ĠSp read Operator ( config : ĠConfig Ġ= ĠConfig . empty ) Ġ: ĠRule ( config ) Ġ{ ĊĊĠĠĠ Ġoverride Ġval Ġissue : ĠIssue Ġ= ĠIssue ( ĊĠĠĠĠĠĠĠ Ġ" Spread Operator ", ĊĠĠĠĠĠĠĠ ĠSeverity . Performance , ĊĠĠĠĠĠĠĠ Ġ" In Ġmost Ġcases Ġusing Ġa Ġspread Ġoperator Ġcauses Ġa Ġfull Ġcopy Ġof Ġthe Ġarray Ġto Ġbe Ġcreated Ġbefore Ġcalling Ġa Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" method . ĠThis Ġmay Ġresult Ġin Ġa Ġperformance Ġpenalty .", ĊĠĠĠĠĠĠĠ ĠDeb t . TW ENT Y _ MIN S ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġoverride Ġfun Ġvisit Value ArgumentList ( list : ĠK t Value ArgumentList ) Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . visit Value ArgumentList ( list ) ĊĠĠĠĠĠĠĠ Ġlist . arguments ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġit . is Spread Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġcheck Can Skip Array Copy ( it , Ġlist ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ// ĠCheck Ġfor Ġnon Ġtype Ġresolution Ġcase Ġif Ġcall Ġvar arg Ġargument Ġis Ġexactly Ġthe Ġvar arg Ġparameter . ĊĠĠĠ Ġ// ĠIn Ġthis Ġcase ĠKotlin Ġ 1 . 1 . 6 0 + Ġdoes Ġnot Ġcreate Ġan Ġadditional Ġcopy . ĊĠĠĠ Ġ// ĠNote : Ġthis Ġdoes Ġnot Ġcheck Ġthe Ġcontrol Ġflow Ġlike Ġthe Ġtype Ġsolution Ġcase Ġdoes . ĊĠĠĠ Ġ// ĠIt Ġwill Ġnot Ġreport Ġcorner Ġcases Ġlike Ġshadow ed Ġvariables . ĊĠĠĠ Ġ// ĠThis Ġis Ġokay Ġas Ġour Ġusers Ġare Ġencour aged Ġto Ġuse Ġtype Ġresolution Ġfor Ġbetter Ġresults . ĊĠĠĠ Ġprivate Ġfun Ġis Simple Pass Through Var arg ( arg : ĠK t Value Argument ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġargument Name Ġ= Ġarg . get Argument Expression ()?. text ĊĠĠĠĠĠĠĠ Ġreturn Ġarg . get Strict Parent OfType < Kt Named Function >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . value Parameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ? . any Ġ{ Ġit . is Var Arg Ġ&& Ġit . name Ġ== Ġargument Name Ġ} Ġ== Ġtrue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġcheck Can Skip Array Copy ( arg : ĠK t Value Argument , Ġargs List : ĠK t Value ArgumentList ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( binding Context Ġ== ĠBinding Context . EMPTY ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( is Simple Pass Through Var arg ( arg )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport ( Code S mell ( issue , ĠEntity . from ( args List ), Ġissue . description )) ĊĠĠĠĠĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( arg . can Skip Array Copy For Spread Argument ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreport ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠCode S mell ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġissue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠEntity . from ( args List ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Used Ġin Ġthis Ġway Ġa Ġspread Ġoperator Ġcauses Ġa Ġfull Ġcopy Ġof Ġthe Ġarray Ġto Ġbe Ġcreated Ġbefore Ġ" Ġ+ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" calling Ġa Ġmethod . ĠThis Ġmay Ġresult Ġin Ġa Ġperformance Ġpenalty ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠChecks Ġif Ġan Ġarray Ġcopy Ġcan Ġbe Ġskipped Ġfor Ġthis Ġusage Ġof Ġthe Ġspread Ġoperator . ĠIf Ġnot , Ġan Ġarray Ġcopy Ġis Ġrequired ĊĠĠĠĠ Ġ* Ġfor Ġthis Ġusage Ġof Ġthe Ġspread Ġoperator , Ġwhich Ġwill Ġhave Ġa Ġperformance Ġimpact . ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġprivate Ġfun ĠK t Value Argument . can Skip Array Copy For Spread Argument (): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġresolved Call Ġ= Ġget Argument Expression (). get Resolved Call ( binding Context ) Ġ?: Ġreturn Ġfalse ĊĠĠĠĠĠĠĠ Ġval Ġcal lee Descriptor Ġ= Ġresolved Call . result ing Descriptor ĊĠĠĠĠĠĠĠ Ġif Ġ( callee Descriptor Ġis ĠParameter Descriptor Ġ&& Ġcal lee Descriptor . is Var arg ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġtrue Ġ// ĠAs Ġof ĠKotlin Ġ 1 . 1 . 6 0 Ġpassing Ġvar args Ġparameters Ġto Ġvar arg Ġcalls Ġdoes Ġnot Ġcreate Ġa Ġnew Ġcopy ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġcal lee Descriptor Ġis ĠConstructor Descriptor Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ ĠCompile Time Constant Utils . isArray Function Call ( resolved Call ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠ ĠDescriptor Utils . getF q Name ( callee Descriptor ). asString () Ġ== Ġ" kotlin . array Of Null s " ĊĠĠĠ Ġ} Ċ } Ċ