/* Ċ Ġ* ĠCopyright Ġ( c ) Ġ 2 0 2 1 ĠFranc is ĠWang Ċ Ġ* Ċ Ġ* Ġ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 Ċ Ġ* Ċ Ġ* ĠĠĠĠ Ġhttps :// 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 Ġio . ver ik . compiler . resolve Ċ Ċ import Ġio . ver ik . compiler . util . Base Test Ċ import Ġio . ver ik . compiler . util . Test ErrorException Ċ import Ġio . ver ik . compiler . util . find Declaration Ċ import Ġio . ver ik . compiler . util . find Expression Ċ import Ġorg . junit . jupiter . api . Assertions . assertEquals Ċ import Ġorg . junit . jupiter . api . Test Ċ import Ġorg . junit . jupiter . api . assert Throws Ċ Ċ internal Ġclass ĠType Resolver Stage Test Ġ: ĠBaseTest () Ġ{ ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` resolve Ġproperty `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Context Ġ= Ġdrive Test ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Resolver Stage :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Element Equals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kt Property ( x , ĠBoolean , Ġ*, Ġ[]) ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Context . find Declaration (" x ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` resolve Ġproperty Ġtype Ġparameter ized `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Context Ġ= Ġdrive Test ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Resolver Stage :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠC < N Ġ: Ġ` *` > ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġc Ġ= ĠC < ` 8 ` >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Element Equals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kt Property ( c , ĠC < ` 8 ` >, ĠK t Call Expression ( C < ` 8 ` >, Ġ< init >, Ġnull , Ġ[], Ġ[` 8 ` ]), Ġ[]) ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Context . find Declaration (" c ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` resolve Ġreference Ġexpression `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Context Ġ= Ġdrive Test ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Resolver Stage :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvar Ġx Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġf () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġx ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Element Equals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kt Reference Expression ( Boolean , Ġx , Ġnull )", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Context . find Expression (" f ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` resolve Ġreference Ġexpression Ġwith Ġreceiver `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Context Ġ= Ġdrive Test ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Resolver Stage :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġclass ĠS ( val Ġx : ĠU bit < ` 8 ` >) Ġ: ĠStruct () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġs Ġ= ĠS ( u 0 ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġf () Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġs . x ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Element Equals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kt Reference Expression ( U bit < ` 8 ` >, Ġx , Ġ*) ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Context . find Expression (" f ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` resolve Ġcall Ġexpression Ġplus `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Context Ġ= Ġdrive Test ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Resolver Stage :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġu ( 0 x 0 0 ) Ġ+ Ġu ( 0 x 0 ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Element Equals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kt Call Expression ( U bit < MAX < ` 8 `,` 4 ` >>, Ġplus , Ġ*, Ġ*, Ġ[]) ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Context . find Expression (" x ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` resolve Ġcall Ġexpression Ġu `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Context Ġ= Ġdrive Test ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Resolver Stage :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġu < ` 8 ` >() ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Element Equals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kt Call Expression ( U bit < WIDTH < ` 8 ` >>, Ġu , Ġnull , Ġ[], Ġ[` 8 ` ]) ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Context . find Expression (" x ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` resolve Ġcall Ġexpression Ġcat `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Context Ġ= Ġdrive Test ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Resolver Stage :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġcat ( u ( 0 ), Ġfalse ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Element Equals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kt Call Expression ( U bit < ADD < ` 1 `, Ġ` 1 ` >>, Ġcat , Ġnull , Ġ*, Ġ[]) ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Context . find Expression (" x ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` resolve Ġcall Ġexpression Ġcat Ġillegal `() Ġ{ ĊĠĠĠĠĠĠĠ ĠassertThrows < Test ErrorException > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdrive Test ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠType Resolver Stage :: class , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġcat ( posed ge ( false )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġ}. apply Ġ{ ĠassertEquals (" Could Ġnot Ġget Ġwidth Ġof Ġtype : ĠEvent ", Ġmessage ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` resolve Ġcall Ġexpression Ġrep `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Context Ġ= Ġdrive Test ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Resolver Stage :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġrep < ` 3 ` >( false ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Element Equals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kt Call Expression ( U bit < MUL < ` 1 `, Ġ` 3 ` >>, Ġrep , Ġnull , Ġ*, Ġ[` 3 ` ]) ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Context . find Expression (" x ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` resolve Ġcall Ġexpression Ġfunction `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Context Ġ= Ġdrive Test ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Resolver Stage :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġf ( x : ĠU bit < ` 8 ` >) Ġ{} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġx Ġ= Ġf ( u 0 ()) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Element Equals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Kt Call Expression ( Unit , Ġf , Ġnull , Ġ[ Kt Call Expression ( U bit < ` 8 ` >, Ġu 0 , Ġnull , Ġ[], Ġ[` 8 ` ]) ], Ġ[]) ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Context . find Expression (" x ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` resolve Ġreturn Ġstatement `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġproject Context Ġ= Ġdrive Test ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠType Resolver Stage :: class , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfun Ġf (): ĠU bit < ` 8 ` > Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġu 0 () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ""" . trim Indent () ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠ Ġassert Element Equals ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Return Statement ( Nothing , ĠK t Call Expression ( U bit < ` 8 ` >, Ġu 0 , Ġnull , Ġ[], Ġ[` 8 ` ])) ", ĊĠĠĠĠĠĠĠĠĠĠĠ Ġproject Context . find Expression (" f ") ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} Ċ } Ċ