// ĠCopyright Ġ 2 0 0 0 - 2 0 1 9 ĠJetBrains Ġs . r . o . ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe ĠLICENSE Ġfile . Ċ package Ġcom . jetbrains . python . psi . impl . stubs Ċ Ċ import Ġcom . intellij . psi . stubs . Stub InputStream Ċ import Ġcom . intellij . psi . stubs . Stub OutputStream Ċ import Ġcom . intellij . psi . util . QualifiedName Ċ import Ġcom . jetbrains . python . code Insight . typing . Py Typed Dict Type Provider Ċ import Ġcom . jetbrains . python . psi .* Ċ import Ġcom . jetbrains . python . psi . impl . Py Evaluator Ċ import Ġcom . jetbrains . python . psi . impl . Py Psi Utils Ċ import Ġcom . jetbrains . python . psi . resolve . Py Resolve Util Ċ import Ġcom . jetbrains . python . psi . stubs . Py Typed Dict Stub Ċ import Ġcom . jetbrains . python . psi . types . Py Typed Dict Type . Companion . TYPE D _ DICT _ FIELDS _ PARAMETER Ċ import Ġcom . jetbrains . python . psi . types . Py Typed Dict Type . Companion . TYPE D _ DICT _ NAME _ PARAMETER Ċ import Ġcom . jetbrains . python . psi . types . Py Typed Dict Type . Companion . TYPE D _ DICT _ TOTAL _ PARAMETER Ċ import Ġjava . io . IOException Ċ import Ġjava . util .* Ċ Ċ class ĠPy Typed Dict Stub Impl Ġprivate Ġconstructor ( private Ġval Ġmy Cal lee Name : ĠQual ified Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġname : ĠString , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġfields : ĠLinkedHashMap < String , ĠOptional < String >>, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġoverride Ġval Ġis Required : ĠBoolean Ġ= Ġtrue ) Ġ: ĠPy Typed Dict Stub Ġ{ ĊĊĠ Ġoverride Ġfun ĠgetType Class (): ĠClass < out ĠCustom Target Expression Stub Type <* >> Ġ{ ĊĠĠĠ Ġreturn ĠPy Typed Dict Stub Type :: class . java ĊĠ Ġ} ĊĊĠ Ġ@ Throws ( IOException :: class ) ĊĠ Ġoverride Ġfun Ġserialize ( stream : ĠStub OutputStream ) Ġ{ ĊĠĠĠ Ġstream . write Name ( my Cal lee Name . toString ()) ĊĠĠĠ Ġstream . write Name ( name ) ĊĠĠĠ Ġstream . write Boolean ( isRequired ) ĊĠĠĠ Ġstream . write Var Int ( fields . size ) ĊĊĠĠĠ Ġfor Ġ(( key , Ġvalue ) Ġin Ġfields ) Ġ{ ĊĠĠĠĠĠ Ġstream . write Name ( key ) ĊĠĠĠĠĠ Ġstream . write Name ( value . orElse ( null )) ĊĠĠĠ Ġ} ĊĠ Ġ} ĊĊĠ Ġoverride Ġfun Ġget Cal lee Name (): ĠQual ified Name Ġ{ ĊĠĠĠ Ġreturn Ġmy Cal lee Name ĊĠ Ġ} ĊĊĠ Ġcompanion Ġobject Ġ{ ĊĊĠĠĠ Ġfun Ġcreate ( expression : ĠPy Target Expression ): ĠPy Typed Dict Stub ? Ġ{ ĊĠĠĠĠĠ Ġval Ġassigned Value Ġ= Ġexpression . find Assigned Value () ĊĊĠĠĠĠĠ Ġreturn Ġif Ġ( assigned Value Ġis ĠPy Call Expression ) Ġcreate ( assigned Value ) Ġelse Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġfun Ġcreate ( expression : ĠPy Call Expression ): ĠPy Typed Dict Stub ? Ġ{ ĊĠĠĠĠĠ Ġval Ġcal lee Reference Ġ= Ġexpression . callee Ġas ? ĠPy Reference Expression Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠ Ġval Ġcal lee Name Ġ= Ġget Cal lee Name ( callee Reference ) ĊĊĠĠĠĠĠ Ġif Ġ( callee Name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= ĠPy Resolve Util . resolve Str Argument ( expression , Ġ 0 , ĠTYPE D _ DICT _ NAME _ PARAMETER ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġfields Argument Ġ= Ġexpression . get Argument ( 1 , ĠTYPE D _ DICT _ FIELDS _ PARAMETER , ĠPy Dict Literal Expression :: class . java ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġfields Ġ= Ġget Typing TD Fields From Iterable ( fields Argument ) ĊĠĠĠĠĠĠĠ Ġif Ġ( fields Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn ĠPy Typed Dict Stub Impl ( callee Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġname , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfields , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPy Evaluator . evaluate As Boolean ( expression . getKey word Argument ( TYPE D _ DICT _ TOTAL _ PARAMETER ), Ġtrue )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġfun Ġdeserialize ( stream : ĠStub InputStream ): ĠPy Typed Dict Stub ? Ġ{ ĊĠĠĠĠĠ Ġval Ġcal lee Name Ġ= Ġstream . read Name String () ĊĠĠĠĠĠ Ġval Ġname Ġ= Ġstream . read Name String () ĊĠĠĠĠĠ Ġval Ġis Required Ġ= Ġstream . read Boolean () ĊĠĠĠĠĠ Ġval Ġfields Ġ= Ġdeserialize Fields ( stream , Ġstream . read Var Int ()) ĊĊĠĠĠĠĠ Ġreturn Ġif Ġ( callee Name Ġ== Ġnull Ġ|| Ġname Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġelse ĠPy Typed Dict Stub Impl ( QualifiedName . from Dot ted String ( callee Name ), Ġname , Ġfields , Ġis Required ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Cal lee Name ( reference Expression : ĠPy Reference Expression ): ĠQual ified Name ? Ġ{ ĊĠĠĠĠĠ Ġval Ġcal lee Name Ġ= ĠPy Psi Utils . as QualifiedName ( reference Expression ) Ġ?: Ġreturn Ġnull ĊĊĠĠĠĠĠ Ġfor Ġ( name Ġin ĠPy Resolve Util . resolve Imported Element QName Loc ally ( reference Expression ). map Ġ{ Ġit . toString () Ġ}) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( Py Typed Dict Type Provider . name Is Typed Dict ( name )) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġreturn Ġcal lee Name ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Throws ( IOException :: class ) ĊĠĠĠ Ġprivate Ġfun Ġdeserialize Fields ( stream : ĠStub InputStream , Ġfields Size : ĠInt ): ĠLinkedHashMap < String , ĠOptional < String >> Ġ{ ĊĠĠĠĠĠ Ġval Ġfields Ġ= ĠLinkedHashMap < String , ĠOptional < String >>( fields Size ) ĊĊĠĠĠĠĠ Ġfor Ġ( i Ġin Ġ 0 Ġuntil Ġfields Size ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġname Ġ= Ġstream . read Name String () ĊĠĠĠĠĠĠĠ Ġval Ġtype Ġ= Ġstream . read Name String () ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠ Ġfields [ name ] Ġ= ĠOptional . of Nullable ( type ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġfields ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Typing TD Fields From Iterable ( fields : ĠPy Sequence Expression ): ĠLinkedHashMap < String , ĠOptional < String >> ? Ġ{ ĊĠĠĠĠĠ Ġval Ġresult Ġ= ĠLinkedHashMap < String , ĠOptional < String >>() ĊĊĠĠĠĠĠ Ġfields . elements . forEach Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( it Ġ! is ĠPy KeyValue Expression ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġval Ġname : ĠPy Expression Ġ= Ġit . key ĊĠĠĠĠĠĠĠ Ġval Ġtype : ĠPy Expression ? Ġ= Ġit . value ĊĊĠĠĠĠĠĠĠ Ġif Ġ( name Ġ! is ĠPy StringLiteral Expression ) Ġreturn Ġnull ĊĊĠĠĠĠĠĠĠ Ġresult [ name . stringValue ] Ġ= ĠOptional . of Nullable ( type ?. text ) ĊĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠ Ġreturn Ġresult ĊĠĠĠ Ġ} ĊĠ Ġ} Ċ } Ċ