/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 1 5 Ġ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 . resolve . constraint System Ċ Ċ import Ġorg . jetbrains . kotlin . test . Configuration Kind Ċ import Ġorg . jetbrains . kotlin . test . Jet Lite Fixture Ċ import Ġorg . jetbrains . kotlin . test . Jet TestUtils Ċ import Ġorg . jetbrains . kotlin . cli . jvm . compiler . Jet Core Environment Ċ import Ġorg . jetbrains . kotlin . di . Injector For Tests Ċ import Ġorg . jetbrains . kotlin . descriptors . Type Parameter Descriptor Ċ import Ġorg . jetbrains . kotlin . diagnostics . rendering . Render ers Ċ import Ġorg . jetbrains . kotlin . resolve .* Ċ import Ġorg . jetbrains . kotlin . resolve . calls . inference . Constraint System Impl Ċ import Ġorg . jetbrains . kotlin . types . Variance Ċ import Ġjava . io . File Ċ import Ġjava . util . regex . Pattern Ċ import Ġorg . jetbrains . kotlin . resolve . constraint System . Abstract Constraint System Test . My Constraint Kind Ċ import Ġorg . jetbrains . kotlin . resolve . constraint System . Abstract Constraint System Test . My Constraint Ċ import Ġjava . util . ArrayList Ċ import Ġjava . util . Linked HashMap Ċ import Ġorg . jetbrains . kotlin . resolve . lazy . Jvm Resolve Util Ċ import Ġorg . jetbrains . kotlin . resolve . calls . inference . constraint Position . Constraint Position Kind .* Ċ Ċ abstract Ġpublic Ġclass ĠAbstract Constraint System Test () Ġ: ĠJet Lite Fixture () Ġ{ ĊĠĠĠ Ġprivate Ġval Ġtype Pattern Ġ= Ġ""" ([\ w |< |> |\ (| \ )] +) """ ĊĠĠĠ Ġval Ġconstraint Pattern Ġ= ĠPattern . compile (""" ( SUB TYPE | SUPER TYPE )\ s + ${ type Pattern }\ s + ${ type Pattern }\ s +( weak )? """, ĠPattern . MULT IL INE ) ĊĠĠĠ Ġval Ġvariables Pattern Ġ= ĠPattern . compile (" VARIABLE S \\ s +( .* )") ĊĊĠĠĠ Ġprivate Ġvar Ġ_ type Resolver : ĠType Resolver ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġtype Resolver : ĠType Resolver ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ type Resolver !! ĊĊĠĠĠ Ġprivate Ġvar Ġ_ test Declarations : ĠConstraint System TestData ? Ġ= Ġnull ĊĠĠĠ Ġprivate Ġval Ġtest Declarations : ĠConstraint System TestData ĊĠĠĠĠĠĠĠ Ġget () Ġ= Ġ_ test Declarations !! ĊĊĠĠĠ Ġoverride Ġfun Ġcreate Environment (): ĠJet Core Environment Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġcreate Environment With Mock J dk ( Configuration Kind . ALL ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠsetUp () Ġ{ ĊĠĠĠĠĠĠĠ Ġsuper . setUp () ĊĊĠĠĠĠĠĠĠ Ġval Ġinjector Ġ= ĠInject or For Tests ( getProject (), ĠJet TestUtils . create Empty Module ()) ĊĠĠĠĠĠĠĠ Ġ_ type Resolver Ġ= Ġinjector . getType Resolver () !! ĊĠĠĠĠĠĠĠ Ġ_ test Declarations Ġ= Ġanalyze Declarations () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtearDown () Ġ{ ĊĠĠĠĠĠĠĠ Ġ_ type Resolver Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġ_ test Declarations Ġ= Ġnull ĊĠĠĠĠĠĠĠ Ġsuper < Jet Lite Fixture >. te ar Down () ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġget TestData Path (): ĠString Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġsuper . get TestData Path () Ġ+ Ġ"/ constraint System /" ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġanalyze Declarations (): ĠConstraint System TestData Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠfileName Ġ= Ġ" declarations / declarations . kt " ĊĊĠĠĠĠĠĠĠ Ġval Ġpsi File Ġ= Ġcreate Psi File ( null , ĠfileName , Ġload File ( fileName )) !! ĊĠĠĠĠĠĠĠ Ġval Ġbinding Context Ġ= ĠJ vm Resolve Util . analyze One File With Java Integration And Check For Errors ( psi File ). binding Context ĊĠĠĠĠĠĠĠ Ġreturn ĠConstraint System TestData ( binding Context , Ġget Project (), Ġtype Resolver ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġpublic Ġfun Ġdo Test ( filePath : ĠString ) Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġfile Ġ= ĠFile ( filePath ) ĊĠĠĠĠĠĠĠ Ġval Ġfile Text Ġ= ĠJet TestUtils . do Load File ( file ) !! ĊĊĠĠĠĠĠĠĠ Ġval Ġconstraint System Ġ= ĠConstraint System Impl () ĊĊĠĠĠĠĠĠĠ Ġval Ġtype Parameter Descriptors Ġ= ĠLinkedHashMap < Type Parameter Descriptor , ĠVari ance >() ĊĠĠĠĠĠĠĠ Ġval Ġvariables Ġ= Ġparse Variables ( file Text ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( variable Ġin Ġvariables ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġtype Parameter Descriptors . put ( test Declarations . getParameter Descriptor ( variable ), ĠVari ance . IN VARIANT ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconstraint System . register Type Variables ( type Parameter Descriptors ) ĊĊĠĠĠĠĠĠĠ Ġval Ġconstraints Ġ= Ġparse Constraints ( file Text ) ĊĠĠĠĠĠĠĠ Ġfor Ġ( constraint Ġin Ġconstraints ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Type Ġ= Ġtest Declarations . getType ( constraint . first Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecond Type Ġ= Ġtest Declarations . getType ( constraint . second Type ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġposition Ġ= Ġif Ġ( constraint . is Weak ) ĠTYPE _ BOUND _ POSITION . position ( 0 ) Ġelse ĠSPECIAL . position () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ( constraint . kind ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMy Constraint Kind . SUB TYPE Ġ-> Ġconstraint System . add Subtype Constraint ( first Type , Ġsecond Type , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠMy Constraint Kind . SUPER TYPE Ġ-> Ġconstraint System . add Sup ertype Constraint ( first Type , Ġsecond Type , Ġposition ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġconstraint System . process Declared Bound Constraints () ĊĊĠĠĠĠĠĠĠ Ġval Ġresulting Status Ġ= ĠRender ers . RENDER _ CONSTRAINT _ SYSTEM . render ( constraint System ) ĊĊĠĠĠĠĠĠĠ Ġval Ġresulting Subst it utor Ġ= Ġconstraint System . getResult ing Subst it utor () ĊĠĠĠĠĠĠĠ Ġval Ġresult Ġ= ĠStringBuilder () Ġappend Ġ" result :\ n " ĊĠĠĠĠĠĠĠ Ġfor Ġ(( type Parameter , Ġvariance ) Ġin Ġtype Parameter Descriptors ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġparameter Type Ġ= Ġtest Declarations . getType ( type Parameter . getName (). asString ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresult Type Ġ= Ġresulting Subst it utor . substitute ( parameter Type , Ġvariance ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġresult Ġappend Ġ"${ type Parameter . getName ()} =${ result Type ?. let { ĠRender ers . RENDER _ TYPE . render ( it ) Ġ}} \ n " ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ ĠJet TestUtils . assertEquals ToFile ( file , Ġ"${ get Constraints Text ( file Text )} ${ result ing Status }\ n \ n ${ result }\ n ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġclass ĠMy Constraint ( val Ġkind : ĠMy Constraint Kind , Ġval Ġfirst Type : ĠString , Ġval Ġsecond Type : ĠString , Ġval Ġis Weak : ĠBoolean ) ĊĠĠĠ Ġenum Ġclass ĠMy Constraint Kind Ġ{ ĊĠĠĠĠĠĠĠ ĠSUB TYPE ĠSUP ER TYPE ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Variables ( text : ĠString ): ĠList < String > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= Ġvariables Pattern . matcher ( text ) ĊĠĠĠĠĠĠĠ Ġif Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariables Text Ġ= Ġmatcher . group ( 1 ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġvariables Ġ= Ġvariables Text . split (' Ġ') ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġvariables . toList () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġthrow ĠAssertionError (" Type Ġvariable Ġnames Ġshould Ġbe Ġdeclared ") ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġparse Constraints ( text : ĠString ): ĠList < My Constraint > Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġconstraints Ġ= ĠArrayList < My Constraint >() ĊĠĠĠĠĠĠĠ Ġval Ġmatcher Ġ= Ġconstraint Pattern . matcher ( text ) ĊĠĠĠĠĠĠĠ Ġwhile Ġ( matcher . find ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġkind Ġ= ĠMy Constraint Kind . valueOf ( matcher . group ( 1 ) !! ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġfirst Type Ġ= Ġmatcher . group ( 2 ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsecond Type Ġ= Ġmatcher . group ( 3 ) !! ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġis Weak Ġ= Ġmatcher . group Count () Ġ== Ġ 4 Ġ&& Ġmatcher . group ( 4 ) Ġ== Ġ" weak " ĊĠĠĠĠĠĠĠĠĠĠĠ Ġconstraints . add ( My Constraint ( kind , Ġfirst Type , Ġsecond Type , Ġis Weak )) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġconstraints ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġget Constraints Text ( text : ĠString ) Ġ= Ġtext . substring ( 0 , Ġtext . indexOf (" type Ġparameter Ġbounds ")) Ċ } Ċ