/* Ċ Ġ* ĠCopyright Ġ 2 0 1 0 - 2 0 2 2 ĠJetBrains Ġs . r . o . Ġand ĠKotlin ĠProgramming ĠLanguage Ġcontributors . Ċ Ġ* ĠUse Ġof Ġthis Ġsource Ġcode Ġis Ġgoverned Ġby Ġthe ĠApache Ġ 2 . 0 Ġlicense Ġthat Ġcan Ġbe Ġfound Ġin Ġthe Ġlicense / LICENSE . txt Ġfile . Ċ Ġ*/ Ċ Ċ package Ġorg . jetbrains . kotlin . gradle . k pm . idea Ċ Ċ import Ġorg . junit . runner . RunWith Ċ import Ġorg . junit . runners . Parameterized Ċ import Ġorg . reflection s . Reflection s Ċ import Ġjava . lang . reflect . Field Ċ import Ġjava . lang . reflect . Modifier Ċ import Ġkotlin . reflect . K Class Ċ import Ġkotlin . reflect . K Visibility Ċ import Ġkotlin . reflect . K Visibility . PUBLIC Ċ import Ġkotlin . reflect . full . member Properties Ċ import Ġkotlin . test . Test Ċ import Ġkotlin . test . assertEquals Ċ import Ġkotlin . test . assertNotNull Ċ import Ġkotlin . test . assertTrue Ċ Ċ @ Opt In ( Experimental Std lib Api :: class ) Ċ @ RunWith ( Parameterized :: class ) Ċ class ĠIde a Kotlin Project Model Object Graph Test ( private Ġval Ġnode : ĠK Class <* >, Ġ@ Suppress (" unused _ parameter ") Ġclazz Name : ĠString ) Ġ{ ĊĊĠĠĠ Ġprivate Ġval Ġreflection s Ġ= ĠReflection s (" org . jetbrains . kotlin ") ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġ- Ġnode Ġimplements ĠSerializable `() Ġ{ ĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġjava . io . Serializable :: class . java . isAssignableFrom ( node . java ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġnode Ġ${ node . simple Name } Ġto Ġimplement Ġ` Serializable `" ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġ- Ġnode Ġimplementations Ġcontain ĠserialVersionUID `() Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġimplementations Ġ= Ġreflection s . getSub Types Of ( node . java ). plus ( node . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġsubtype Ġ-> Ġ! subtype . is Interface Ġ&& Ġ! Modifier . is Abstract ( subtype . modifiers ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimplementations . isNotEmpty (), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" No Ġimplementations Ġfound Ġfor Ġ$ node " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ Ġimplementations . forEach Ġ{ Ġimplementation Ġ-> Ġassert Node Implementation Defines Serial VersionUID ( implementation ) Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ@ Test ĊĠĠĠ Ġfun Ġ` test Ġ- Ġnode Ġimplementations Ġare Ġmarked Ġwith ĠInternal Kotlin Gradle Plugin Api Ġwhen Ġdata Ġclass `() Ġ{ ĊĠĠĠĠĠĠĠ Ġreflection s . getSub Types Of ( node . java ). plus ( node . java ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġsubtype Ġ-> Ġsubtype . kotlin . is Data Ġ&& Ġsubtype . kotlin . visibility Ġ== ĠPUBLIC Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. forEach Ġ{ Ġdata Class Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġdata Class . annotations . any Ġ{ Ġit . annotation Class . simple Name Ġ== Ġ" Internal Kotlin Gradle Plugin Api " Ġ}, ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġ$ data Class Ġto Ġbe Ġannotated Ġwith Ġ'@ Internal Kotlin Gradle Plugin Api '" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun Ġassert Node Implementation Defines Serial VersionUID ( implementation Class : ĠClass <* >) Ġ{ ĊĠĠĠĠĠĠĠ Ġval ĠserialVersionUID Ġ= ĠassertNotNull ( ĊĠĠĠĠĠĠĠĠĠĠĠ Ġimplementation Class . getDeclared Field OrNull (" serial VersionUID "), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġ$ implementation Class Ġto Ġdeclare Ġ' serial VersionUID ' Ġfield " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠModifier . is Static ( serial VersionUID . modifiers ), ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġ$ implementation Class Ġto Ġdeclare Ġ' serial VersionUID ' Ġstatic ally " ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertTrue ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠserialVersionUID . type . is Primitive , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġ$ implementation Class Ġto Ġdeclare Ġprimitive Ġ' serial VersionUID '" ĊĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠ ĠassertEquals ( ĊĠĠĠĠĠĠĠĠĠĠĠ ĠserialVersionUID . type , ĠLong :: class . java Primitive Type , ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ" Expected Ġ$ implementation Class Ġto Ġdeclare Ġ' serial VersionUID ' Ġof Ġtype ĠLong " ĊĠĠĠĠĠĠĠ Ġ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġprivate Ġfun ĠClass <* >. getDeclared Field OrNull ( name : ĠString ): ĠField ? Ġ{ ĊĠĠĠĠĠĠĠ Ġreturn Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġget Declared Field ( name ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( t : ĠNoSuch Field Exception ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġ@ Jvm Static ĊĠĠĠĠĠĠĠ Ġ@ Parameterized . Parameters ( name Ġ= Ġ"{ 1 }") ĊĠĠĠĠĠĠĠ Ġfun Ġfind Nodes (): ĠList < Array < Any >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġclasses Ġ= Ġmutable Set Of < K Class < *> >( Ide a Kotlin Project Model :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġresolve Queue Ġ= ĠArray Deque ( classes ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġwhile Ġ( resolve Queue . isNotEmpty ()) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġchildren Ġ= Ġresolve Queue . remove First (). resolve Reach able Classes () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġchildren . forEach Ġ{ Ġchild Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( classes . add ( child )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġresolve Queue . add ( child ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġclasses . map Ġ{ Ġclazz Ġ-> ĠarrayOf ( clazz , ĠcheckNotNull ( clazz . simple Name )) Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġprivate Ġfun ĠK Class <* >. resolve Reach able Classes (): ĠSet < K Class <* >> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġthis . member Properties ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġmember Ġ-> Ġmember . returnType Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. flatMap Ġ{ Ġtype Ġ-> Ġset Of ( type ) Ġ+ Ġtype . arguments . map NotNull Ġ{ Ġit . type Ġ} Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map NotNull Ġ{ Ġtype Ġ-> Ġtype . classifier Ġas ? ĠK Class < *> Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġclazz Ġ-> Ġclazz . java . name . startsWith (" org . jetbrains ") Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ } Ċ