/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ċ Ġ* Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . resolve . calls . check ers Ċ Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġorg . jetbrains . kotlin . diagnostics . Errors Ċ import Ġorg . jetbrains . kotlin . diagnostics . report Diagnostic Once Ċ import Ġorg . jetbrains . kotlin . psi . Kt Binary Expression Ċ import Ġorg . jetbrains . kotlin . psi . Kt Psi Util Ċ import Ġorg . jetbrains . kotlin . resolve . calls . inference . model . Type Variable Type Constructor Ċ import Ġorg . jetbrains . kotlin . resolve . calls . model . Resolved Call Ċ import Ġorg . jetbrains . kotlin . resolve . calls . smart casts . Null ability Ċ import Ġorg . jetbrains . kotlin . types . Type Utils Ċ import Ġorg . jetbrains . kotlin . types . expressions . Control Structure Typing Utils Ċ import Ġorg . jetbrains . kotlin . types . isError Ċ import Ġorg . jetbrains . kotlin . types . isNull ability Flex ible Ċ import Ġorg . jetbrains . kotlin . types . type Util . contains Ċ Ċ class ĠUse less El vis Call Checker Ġ: ĠCall Checker Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġcheck ( resolved Call : ĠResolved Call <* >, Ġreport On : ĠPsi Element , Ġcontext : ĠCall Checker Context ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( resolved Call . result ing Descriptor . name Ġ!= ĠControl Structure Typing Utils . Resolve Construct . EL VIS . special FunctionName ) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġel vis Binary Expression Ġ= Ġresolved Call . call . call Element Ġas ? ĠK t Binary Expression Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġleft Ġ= Ġel vis Binary Expression . left Ġ?: Ġreturn ĊĠĠĠĠĠĠĠ Ġval Ġright Ġ= Ġel vis Binary Expression . right Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġval Ġleft Type Ġ= Ġcontext . trace . getType ( left ) Ġ?: Ġreturn ĊĊĠĠĠĠĠĠĠ Ġ// Ġif Ġtype Ġcontains Ġnot Ġfixed Ġ` Type Variable ` Ġit Ġmeans Ġthat Ġcall Ġwasn 't Ġcompleted , Ġwe Ġshould Ġwait Ġfor Ġits Ġcompletion Ġfirst ĊĠĠĠĠĠĠĠ Ġif Ġ( left Type . isError Ġ|| Ġleft Type . contains Ġ{ Ġit . constructor Ġis ĠType Variable Type Constructor Ġ}) Ġreturn ĊĊĠĠĠĠĠĠĠ Ġif Ġ(! Type Utils . is Nullable Type ( left Type )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . trace . report Diagnostic Once ( Errors . USE LESS _ EL VIS . on ( el vis Binary Expression , Ġleft Type )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġval Ġdata Flow Value Ġ= Ġcontext . data Flow Value Factory . create Data Flow Value ( left , Ġleft Type , Ġcontext . resolution Context ) ĊĠĠĠĠĠĠĠ Ġif Ġ( context . data Flow Info . get Stable Null ability ( data Flow Value ) Ġ== ĠNull ability . NOT _ NULL ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . trace . report Diagnostic Once ( Errors . USE LESS _ EL VIS . on ( el vis Binary Expression , Ġleft Type )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġif Ġ( Kt Psi Util . isNull Constant ( right ) Ġ&& Ġ! left Type . isNull ability Flex ible ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcontext . trace . report Diagnostic Once ( Errors . USE LESS _ EL VIS _ RIGHT _ IS _ NULL . on ( el vis Binary Expression )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }