package Ġcom . k ox ud axi . py d antic Ċ Ċ import Ġcom . intellij . code Inspection . Local Inspection Tool Session Ċ import Ġcom . intellij . code Inspection . Problems Holder Ċ import Ġcom . intellij . openapi . diagnostic . Logger Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . Key Ċ import Ġcom . intellij . psi . Psi Element Visitor Ċ import Ġcom . jetbrains . python . code Insight . typing . matching Protocol Definitions Ċ import Ġcom . jetbrains . python . documentation . Python Documentation Provider Ċ import Ġcom . jetbrains . python . ins pe ctions . Py Inspection Visitor Ċ import Ġcom . jetbrains . python . ins pe ctions . Py Type Checker Inspection Ċ import Ġcom . jetbrains . python . psi . Py Call Expression Ċ import Ġcom . jetbrains . python . psi . Py Call Expression . Py Arguments Mapping Ċ import Ġcom . jetbrains . python . psi . Py Call Site Expression Ċ import Ġcom . jetbrains . python . psi . Py Class Ċ import Ġcom . jetbrains . python . psi . impl . Py Call Expression Helper Ċ import Ġcom . jetbrains . python . psi . types .* Ċ import Ġcom . jetbrains . python . psi . types . Py Literal Type . Companion . prom ote To Literal ĊĊ Ċ class ĠPy d antic Type Checker Inspection Ġ: ĠPy Type Checker Inspection () Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġbuild Visitor ( ĊĠĠĠĠĠĠĠ Ġholder : ĠPro blems Holder , ĊĠĠĠĠĠĠĠ Ġis On The Fly : ĠBoolean , ĊĠĠĠĠĠĠĠ Ġsession : ĠLocal Inspection Tool Session , ĊĠĠĠ Ġ): ĠPsi Element Visitor Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( LOG . isDebugEnabled ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsession . put UserData ( TIME _ KEY , ĠSystem . nano Time ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn ĠVisitor ( holder , ĠPy Inspection Visitor . getContext ( session )) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠVisitor ( holder : ĠPro blems Holder ?, Ġcontext : ĠType Eval Context ) Ġ: ĊĠĠĠĠĠĠĠ ĠPy Type Checker Inspection . Visitor ( holder , Ġcontext ) Ġ{ ĊĊĠĠĠĠĠĠĠ Ġval Ġpy d antic Config Service Ġ= ĠPy d antic Config Service . getInstance ( holder !!. project ) ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġvisit Py Call Expression ( node : ĠPy Call Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpy Class Ġ= Ġget Py Class By Py Call Expression ( node , Ġtrue , Ġmy Type Eval Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Py Class By Py Call Expression ( node , Ġtrue , Ġmy Type Eval Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( py Class Ġis ĠPy Class Ġ&& Ġis Py d antic Model ( py Class , Ġtrue , Ġmy Type Eval Context )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcheck Call Site For Py d antic ( node ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsuper . visit Py Call Expression ( node ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġcheck Call Site For Py d antic ( call Site : ĠPy Call Site Expression ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPy Call Expression Helper . map Arguments ( call Site , Ġresolve Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġmapping : ĠPy Arguments Mapping ? Ġ-> Ġmapping !!. un mapped Arguments . isEmpty () Ġ&& Ġmapping . un mapped Parameters . isEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġmapping : ĠPy Arguments Mapping Ġ-> Ġanalyze Cal lee ( call Site , Ġmapping ) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Par s able Type From TypeMap ( type For Parameter : ĠPy Type , Ġcache : ĠMutable Map < Py Type , ĠPy Type ?> ): ĠPy Type ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠgetType From TypeMap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġproject : ĠProject Ġ-> ĠPy d antic Config Service . getInstance ( project ). pars able TypeMap Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype For Parameter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġget Accept able Type From TypeMap ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype For Parameter : ĠPy Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache : ĠMutable Map < Py Type , ĠPy Type ? >, ĊĠĠĠĠĠĠĠ Ġ): ĠPy Type ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠgetType From TypeMap ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ{ Ġproject : ĠProject Ġ-> ĠPy d antic Config Service . getInstance ( project ). accept able TypeMap Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype For Parameter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcache ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠgetType From TypeMap ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠgetType Map : Ġ( project : ĠProject ) Ġ-> Ġ( Map < String , ĠList < String >> ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype For Parameter : ĠPy Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache : ĠMutable Map < Py Type , ĠPy Type ? >, ĊĠĠĠĠĠĠĠ Ġ): ĠPy Type ? Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( cache . containsKey ( type For Parameter )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġcache [ type For Parameter ] ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnew Type Ġ= Ġwhen Ġ( type For Parameter ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠPy Collection Type Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtype For Parameter . element Types . filter NotNull (). map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetType From TypeMap ( getType Map , Ġit , Ġcache ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}. toList (). take If Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . isNotEmpty () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ?. let Ġ{ ĠPy Collection Type Impl ( type For Parameter . py Class , Ġtype For Parameter . is Definition , Ġit ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproject Ġ= Ġholder !!. project ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPy Union Type . union ( type For Parameter . py Class Types . toSet (). flatMap Ġ{ Ġtype Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠgetType Map ( project )[ type . class QName ]?. map NotNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate Py ClassType Impl ( it , Ġproject , Ġmy Type Eval Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġas ? ĠList < Py Type > Ġ?: ĠlistOf () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ}) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġcache [ type For Parameter ] Ġ= Ġnew Type ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnew Type ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġanalyze Cal lee ( call Site : ĠPy Call Site Expression , Ġmapping : ĠPy Arguments Mapping ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcallable Type Ġ= Ġmapping . callable Type Ġ?: Ġreturn ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġreceiver Ġ= Ġcall Site . get Receiver ( callable Type . callable ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsubstitution s Ġ= ĠPy Type Checker . un ify Receiver With Param Specs ( receiver , Ġmy Type Eval Context ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġmapped Parameters Ġ= Ġmapping . mapped Parameters ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcached Par s able TypeMap Ġ= Ġmutable Map Of < Py Type , ĠPy Type ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġcached Accept able TypeMap Ġ= Ġmutable Map Of < Py Type , ĠPy Type ?> () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġfor Ġ(( argument , Ġparameter ) Ġin ĠPy Call Expression Helper . get Regular Mapped Parameters ( mapped Parameters )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Ġ= Ġparameter . get Argument Type ( my Type Eval Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġprom oted To Literal Ġ= Ġpromote To Literal ( argument , Ġexpected , Ġmy Type Eval Context , Ġsubstitution s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Ġ= Ġprom oted To Literal Ġ?: Ġmy Type Eval Context . getType ( argument ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstrict Matched Ġ= Ġmatch Parameter And Argument ( expected , Ġactual , Ġsubstitution s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġstrict Result Ġ= ĠAn alyze Argument Result ( expected , Ġactual , Ġstrict Matched ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! strict Result . is Matched ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġexpected Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPython Documentation Provider . getType Name ( strict Result . expected Type , Ġmy Type Eval Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġactual Type Ġ= ĠPython Documentation Provider . getType Name ( strict Result . actual Type , Ġmy Type Eval Context ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( expected Ġis ĠPy Type ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpar s able Type Ġ= Ġget Par s able Type From TypeMap ( expected , Ġcached Par s able TypeMap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( pars able Type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpar s able Matched Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Parameter And Argument ( pars able Type , Ġactual , Ġsubstitution s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Analyze Argument Result ( pars able Type , Ġactual , Ġpar s able Matched ). is Matched ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister Problem ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format (" Field Ġis Ġof Ġtype Ġ'% s ', Ġ'% s ' Ġmay Ġnot Ġbe Ġpar s able Ġto Ġ'% s '", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpy d antic Config Service . pars able Type Highlight Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġacceptable Type Ġ= Ġget Accept able Type From TypeMap ( expected , Ġcached Accept able TypeMap ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( accept able Type Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġacceptable Matched Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmatch Parameter And Argument ( accept able Type , Ġactual , Ġsubstitution s ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( Analyze Argument Result ( accept able Type , Ġactual , Ġacceptable Matched ). is Matched ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister Problem ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString . format (" Field Ġis Ġof Ġtype Ġ'% s ', Ġ'% s ' Ġis Ġset Ġas Ġan Ġacceptable Ġtype Ġin Ġpy project . toml ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Type ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġpy d antic Config Service . accept able Type Highlight Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcontinue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġregister Problem ( argument , ĠString . format (" Expected Ġtype Ġ'% s ', Ġgot Ġ'% s ' Ġinstead ", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġexpected Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġactual Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun Ġmatch Parameter And Argument ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġparameter Type : ĠPy Type ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġargument Type : ĠPy Type ?, ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsubstitution s : ĠPy Type Checker . Generic Substitution s , ĊĠĠĠĠĠĠĠ Ġ): ĠBoolean Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn ĠPy Type Checker . match ( parameter Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġargument Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġmy Type Eval Context , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsubstitution s ) Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! matching Protocol Definitions ( parameter Type , Ġargument Type , Ġmy Type Eval Context ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġinternal Ġclass ĠAn alyze Argument Result ( ĊĠĠĠĠĠĠĠ Ġval Ġexpected Type : ĠPy Type ?, ĊĠĠĠĠĠĠĠ Ġval Ġactual Type : ĠPy Type ?, ĊĠĠĠĠĠĠĠ Ġval Ġis Matched : ĠBoolean , ĊĠĠĠ Ġ) ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠLOG Ġ= ĠLogger . getInstance ( Py d antic Type Checker Inspection :: class . java . name ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠTIME _ KEY Ġ= ĠKey . create < Long >(" Py d antic Type Checker Inspection . StartTime ") ĊĠĠĠ Ġ} Ċ }