package Ġde . mf . k mf . k apt . types Ċ Ċ import Ġde . mf . k mf . api . Contains Ċ import Ġde . mf . k mf . k apt . log Error Ċ import Ġde . mf . k mf . k apt . process Environment Ċ import Ġorg . eclipse . emf . common . util . E List Ċ import Ġorg . eclipse . emf . ecore . EObject Ċ import Ġjava . math . BigDecimal Ċ import Ġjava . math . BigInteger Ċ import Ġjavax . lang . model . element . Executable Element Ċ import Ġjavax . lang . model . element . Type Element Ċ import Ġjavax . lang . model . type . Declared Type Ċ import Ġjavax . lang . model . type . Primitive Type Ċ import Ġjavax . lang . model . type . Type Mirror Ċ Ċ data Ġclass ĠK MF Entity ( ĊĠĠĠ Ġval ĠpackageName : ĠString , ĊĠĠĠ Ġval Ġtype Element : ĠType Element , ĊĠĠĠ Ġval Ġproperties : ĠList < K MF Property > Ċ ) Ċ Ċ data Ġclass ĠK MF Property ( ĊĠĠĠ Ġval Ġname : ĠString , ĊĠĠĠ Ġval Ġtype : ĠK MF PropertyType , ĊĠĠĠ Ġval Ġgetter : ĠExec utable Element , ĊĠĠĠ Ġval Ġsetter : ĠExec utable Element ?, ĊĠĠĠ Ġval Ġis Contain ment : ĠBoolean , ĊĠĠĠ Ġval ĠdefaultValue Literal : ĠString ? Ċ ) Ġ{ Ċ } Ċ Ċ data Ġclass ĠK MF PropertyType ( ĊĠĠĠ Ġval Ġtype Mirror : ĠType Mirror , ĊĠĠĠ Ġval Ġis Nullable : ĠBoolean , ĊĠĠĠ Ġ/** ĠIncludes ĠString , ĠBigDecimal Ġand ĠBigInteger Ġ*/ ĊĠĠĠ Ġval Ġis Primitive : ĠBoolean , ĊĠĠĠ Ġval Ġis Many : ĠBoolean Ċ ) Ġ{ Ċ } Ċ Ċ private Ġval Ġgetter P atter Ġ= Ġ"^ ( is | get )( \\ p { java UpperCase }. +) ". to Regex () Ċ Ċ fun Ġcreate K MF Entity ( type Element : ĠType Element ): ĠK MF Entity ? Ġ{ ĊĠĠĠ Ġval ĠpackageName Ġ= Ġprocess Environment ĊĠĠĠĠĠĠĠ Ġ. element Utils . get Package Of ( type Element ) ĊĠĠĠĠĠĠĠ Ġ. qualified Name . toString () ĊĊĠĠĠ Ġval Ġmethods Ġ= ĊĠĠĠĠĠĠĠ Ġtype Element . enc losed Elements . filter Is Instance < Executable Element >() ĊĊĠĠĠ Ġval Ġproperties Ġ= ĊĠĠĠĠĠĠĠ Ġmethods . as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġgetter P atter . matches ( it . simple Name ) Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġgetter Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġget Ġactual Ġname ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsimple PropertyName Ġ= Ġgetter P atter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. find ( getter . simple Name ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . group Values ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . take If Ġ{ Ġ! it . isEmpty () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ? . get OrNull ( 2 ) ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠpropertyName Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( simple PropertyName Ġ!= Ġnull Ġ&& ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgetter . simple Name . startsWith (" is ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" is $ simple PropertyName " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsimple PropertyName ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( propertyName Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Failed Ġto Ġfind Ġname Ġof Ġproperty Ġfor Ġgetter : Ġ${ type Element . qualified Name }.${ getter . simple Name }", ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgetter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġlc Pro per y Name Ġ= ĠpropertyName . toCharArray (). let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit [ 0 ] Ġ= Ġit [ 0 ]. toLowerCase () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠString ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfind Ġcorresponding Ġsetter ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsetter Ġ= Ġmethods ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . simple Name . toString () Ġ== Ġ" set $ propertyName " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ?: Ġmethods ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. first OrNull Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġit . simple Name . toString () Ġ== Ġ" set $ simple PropertyName " ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprocess Ġannotations ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġannotations Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgetter . annotation Mir rors ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Sequence () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . annotation Type . as Element () Ġas ĠType Element Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. map Ġ{ Ġit . qualified Name . toString () Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. toSet () ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfind Ġreturn Ġtype Mirror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠreturnType Ġ= Ġgetter . returnType !! ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġproperty Type Ġ= Ġcreate K MF PropertyType ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotations . contains (" org . jetbrains . annotations . Nullable "), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) Ġ?: Ġrun Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Error Ġdetect ing Ġproperty Ġtype Mirror Ġfor Ġ${ type Element . qualified Name }.${ getter . simple Name }") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn @ map Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġfind Ġdefault Ġvalue Ġtype Mirror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval ĠdefaultValue Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! property Type . is Nullable Ġ&& Ġproperty Type . is Primitive Ġ&& Ġ! property Type . is Many Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġbox ed Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ( property Type . type Mirror Ġas ? ĠPrimitive Type )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Environment . type Utils . boxed Class ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. as Type () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġ?: Ġproperty Type . type Mirror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox ed . is Same ( String :: class . java ) Ġ-> Ġ"" ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox ed . is Same ( java . lang . Integer :: class . java ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox ed . is Same ( java . lang . Long :: class . java ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox ed . is Same ( java . lang . Short :: class . java ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox ed . is Same ( java . lang . Character :: class . java ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox ed . is Same ( BigInteger :: class . java ) Ġ-> Ġ" 0 " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox ed . is Same ( java . lang . Float :: class . java ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox ed . is Same ( java . lang . Double :: class . java ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox ed . is Same ( BigDecimal :: class . java ) Ġ-> Ġ" 0 . 0 " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġbox ed . is Same ( java . lang . Boolean :: class . java ) Ġ-> Ġ" false " ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> ĠTODO (" set Ġdefault Ġvalue Ġfor Ġprimitive Ġtype Mirror Ġ$ boxed ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK MF Property ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlc Pro per y Name , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġproperty Type , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġgetter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġsetter , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġannotations . contains ( Contains :: class . qualified Name !! ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠdefaultValue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter Ġ{ Ġprop Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġvalidation Ġstuff ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprop Ġ?: Ġreturn @ filter Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġqual Name Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ"${ type Element . qualified Name }.${ prop . getter . simple Name }" ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġerror Ġ= Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprop . is Contain ment Ġ&& Ġprop . type . is Primitive Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Contain ment Ġproperty Ġ$ qual Name Ġmust Ġnot Ġbe Ġprimitive ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġprop . type . is Many Ġ&& Ġprop . setter Ġ!= Ġnull Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Many Ġproperty Ġ$ qual Name Ġmust Ġbe Ġread - only Ġ( val )." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! prop . type . is Many Ġ&& Ġprop . setter Ġ== Ġnull Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Non - list Ġproperty Ġ$ qual Name Ġmust Ġbe Ġmutable Ġ( var )." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ! prop . type . is Many Ġ&& Ġ! prop . type . is Primitive Ġ&& Ġ! prop . type . is Nullable Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" Reference Ġ( non - primitive ) Ġtype Mirror Ġproperty Ġ$ qual Name Ġmust Ġbe Ġmutable Ġand Ġnullable ." ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( error Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error ( error ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. filter NotNull () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toList () ĊĠĠĠ Ġreturn ĠK MF Entity ( packageName , Ġtype Element , Ġproperties ) Ċ } Ċ Ċ private Ġfun Ġcreate K MF PropertyType ( ĊĠĠĠ Ġis Nullable : ĠBoolean , ĊĠĠĠ ĠreturnType : ĠType Mirror Ċ ): ĠK MF PropertyType ? Ġ= Ġwhen Ġ( returnType ) Ġ{ ĊĠĠĠ Ġis ĠPrimitive Type Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ ĠK MF PropertyType ( returnType , Ġfalse , Ġtrue , Ġfalse ) ĊĠĠĠ Ġ} ĊĠĠĠ Ġis ĠDecl ared Type Ġ-> Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġun boxed Ġ= Ġtry Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġprocess Environment . type Utils . un boxed Type ( returnType ) ĊĠĠĠĠĠĠĠ Ġ} Ġcatch Ġ( e : ĠIllegalArgumentException ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġwhen Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType . is Same ( BigInteger :: class . java ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType . is Same ( BigDecimal :: class . java ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType . is Same ( String :: class . java ) Ġ|| ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġun boxed Ġ!= Ġnull Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġprimitive ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK MF PropertyType ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Nullable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType . is Same ( E List :: class . java , Ġraw Ġ= Ġtrue ) Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġmany Ġtype Mirror ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġelement Type Ġ= ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġcreate K MF PropertyType ( false , ĠreturnType . type Arguments [ 0 ]) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( elementType Ġ== Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Lists Ġelement Ġtype Mirror Ġdoesn 't Ġmeet Ġrequirements Ġor Ġcan 't Ġbe Ġprocessed .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( elementType . is Nullable Ġ|| Ġelement Type . is Many ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Lists Ġelement Ġtype Mirror Ġmust Ġnot Ġbe Ġnull Ġnor Ġanother ĠE List .") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK MF PropertyType ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Type . type Mirror , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelement Type . is Primitive , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġtrue ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType . is Subtype Of ( EObject :: class . java ) Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Ġreference ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠK MF PropertyType ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠreturnType , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġis Nullable , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse , ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ) ĊĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse Ġ-> Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġlog Error (" Type Ġof Ġproperty Ġmust Ġbe Ġeither Ġprimitive , ĠE List Ġor Ġimplement ĠE Object ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġnull ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĠĠĠ Ġelse Ġ-> Ġnull Ċ }