/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 8 ĠJetBrains Ġs . r . o . Ċ Ġ* Ċ Ġ* Ġ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 Ġorg . jetbrains . kotlin . backend . kon an . ir as descriptors Ċ Ċ import Ġorg . jetbrains . kotlin . builtins . functions . Function Class Descriptor Ċ import Ġorg . jetbrains . kotlin . builtins . get Functional Class Kind Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Class Ċ import Ġorg . jetbrains . kotlin . ir . declarations . Ir Type Parameter Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Class Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Classifier Symbol Ċ import Ġorg . jetbrains . kotlin . ir . symbols . Ir Type Parameter Symbol Ċ import Ġorg . jetbrains . kotlin . ir . types .* Ċ import Ġorg . jetbrains . kotlin . ir . types . impl . Ir Simple Type Impl Ċ import Ġorg . jetbrains . kotlin . ir . types . impl . Ir Star Projection Impl Ċ import Ġorg . jetbrains . kotlin . ir . types . impl . make Type Projection Ċ import Ġorg . jetbrains . kotlin . types . Kotlin Type Ċ import Ġorg . jetbrains . kotlin . types . Variance Ċ import Ġorg . jetbrains . kotlin . types . type Util . is Subtype Of Ċ Ċ val ĠIr Classifier Symbol . type Without Arguments : ĠIr Type ĊĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠIr Class Symbol Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġrequire ( this . descriptor . declared Type Parameters . isEmpty ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġthis . type With ( arguments Ġ= Ġempty List ()) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġis ĠIr Type Parameter Symbol Ġ-> Ġthis . default Type ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ( this ) ĊĠĠĠ Ġ} Ċ Ċ val ĠIr Classifier Symbol . type With Star Projection s ĊĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠIr Class Symbol Ġ-> Ġcreate Type ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Question Mark Ġ= Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments Ġ= Ġthis . descriptor . declared Type Parameters . map Ġ{ ĠIr Star Projection Impl Ġ} ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġis ĠIr Type Parameter Symbol Ġ-> Ġthis . default Type ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ( this ) ĊĠĠĠ Ġ} Ċ Ċ val ĠIr Type Parameter Symbol . default Type : ĠIr Type Ġget () Ġ= Ġ ĠIr Simple Type Impl ( ĊĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠ Ġempty List (), ĊĠĠĠĠĠĠĠ Ġempty List () Ċ ) Ċ val ĠIr Type Parameter . default Type : ĠIr Type Ġget () Ġ= Ġthis . symbol . default Type Ċ Ċ fun ĠIr Classifier Symbol . type With ( var arg Ġarguments : ĠIr Type ): ĠIr Simple Type Ġ= Ġtype With ( arguments . toList ()) Ċ Ċ fun ĠIr Classifier Symbol . type With ( arguments : ĠList < Ir Type >): ĠIr Simple Type Ġ= ĊĠĠĠĠĠĠĠ ĠIr Simple Type Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments . map Ġ{ Ġmake Type Projection ( it , ĠVari ance . IN VARIANT ) Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ) Ċ Ċ fun ĠIr Class . type With ( arguments : ĠList < Ir Type >) Ġ= Ġthis . symbol . type With ( arguments ) Ċ Ċ fun ĠIr Class Symbol . create Type ( has Question Mark : ĠBoolean , Ġarguments : ĠList < Ir Type Argument >): ĠIr Simple Type Ġ= ĊĠĠĠĠĠĠĠ ĠIr Simple Type Impl ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthis , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġhas Question Mark , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġarguments , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġempty List () ĊĠĠĠĠĠĠĠ Ġ) Ċ Ċ fun ĠIr Type . getClass (): ĠIr Class ? Ġ= ĊĠĠĠĠĠĠĠ Ġ( this . classifier OrNull Ġas ? ĠIr Class Symbol )?. owner Ċ Ċ fun ĠIr Type . make Nullable As Specified ( nullable : ĠBoolean ): ĠIr Type Ġ= ĊĠĠĠĠĠĠĠ Ġif Ġ( nullable ) Ġthis . make Nullable () Ġelse Ġthis . make NotNull () Ċ Ċ fun ĠIr Type . contains Null (): ĠBoolean Ġ= Ġif Ġ( this Ġis ĠIr Simple Type ) Ġ{ ĊĠĠĠ Ġif Ġ( this . has Question Mark ) Ġ{ ĊĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠ Ġ} Ġelse Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġclassifier Ġ= Ġthis . classifier ĊĠĠĠĠĠĠĠ Ġwhen Ġ( classifier ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Class Symbol Ġ-> Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġis ĠIr Type Parameter Symbol Ġ-> Ġclassifier . owner . super Types . any Ġ{ Ġit . contains Null () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ( classifier ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ġelse Ġ{ ĊĠĠĠ Ġtrue Ċ } Ċ Ċ // ĠTODO : Ġget Ġrid Ġof Ġthese : Ċ fun ĠIr Type . is Subtype Of ( other : ĠKotlin Type ): ĠBoolean Ġ= Ġthis . to Kotlin Type (). is Subtype Of ( other ) Ċ fun ĠIr Type . is Subtype Of ( other : ĠIr Type ): ĠBoolean Ġ= Ġthis . is Subtype Of ( other . to Kotlin Type ()) Ċ Ċ val ĠIr Type . isFunction Or K FunctionType : ĠBoolean ĊĠĠĠ Ġget () Ġ= Ġwhen Ġ( this ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠIr Simple Type Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkind Ġ= Ġclassifier . descriptor . get Functional Class Kind () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġkind Ġ== ĠFunction Class Descriptor . Kind . Function Ġ|| Ġkind Ġ== ĠFunction Class Descriptor . Kind . K Function ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġfalse ĊĠĠĠ Ġ} Ċ Ċ internal Ġtail rec Ġfun ĠIr Type . get Erase d Type Class (): ĠIr Class Symbol Ġ{ ĊĠĠĠ Ġval Ġclassifier Ġ= Ġthis . classifier OrFail ĊĠĠĠ Ġreturn Ġwhen Ġ( classifier ) Ġ{ ĊĠĠĠĠĠĠĠ Ġis ĠIr Class Symbol Ġ-> Ġclassifier ĊĠĠĠĠĠĠĠ Ġis ĠIr Type Parameter Symbol Ġ-> Ġclassifier . owner . super Types . first (). get Erase d Type Class () ĊĠĠĠĠĠĠĠ Ġelse Ġ-> Ġerror ( classifier ) ĊĠĠĠ Ġ} Ċ } Ċ