package Ġorg . nb kit . gen . psi . ext Ċ Ċ import Ġcom . intellij . ext api . psi . AST Wrapper Psi Element Ċ import Ġcom . intellij . ext api . psi . Stub Based Psi Element Base Ċ import Ġcom . intellij . lang . AST Node Ċ import Ġcom . intellij . psi . Psi Element Ċ import Ġcom . intellij . psi . stubs . I Stub ElementType Ċ import Ġcom . intellij . psi . stubs . Stub Element Ċ import Ġcom . squareup . kotlin po et .* Ċ import Ġorg . nb kit . lang . Scope Rule Ċ import Ġorg . nb kit . gen . Base Spec Ċ import Ġjava . nio . file . Path Ċ Ċ class ĠElement Spec ( ĊĠĠĠĠĠĠĠ ĠfileName Prefix : ĠString , ĊĠĠĠĠĠĠĠ Ġbase PackageName : ĠString , ĊĠĠĠĠĠĠĠ Ġgen Path : ĠPath , ĊĠĠĠĠĠĠĠ Ġscope Rules : ĠList < Scope Rule > Ċ ) Ġ: ĠBase Spec ( fileName Prefix , Ġbase PackageName , Ġgen Path , Ġscope Rules ) Ġ{ ĊĠĠĠ Ġoverride Ġfun Ġgenerate () Ġ{ ĊĠĠĠĠĠĠĠ ĠType Spec . interface Builder ("${ fileName Prefix } Element ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Super interface ( Psi Element :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addFunction ( Fun Spec . builder (" getReference ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . OVERRIDE , ĠK Modifier . AB STR ACT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( reference Class . as Nullable ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġadd Type ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠType Spec . class Builder ("${ fileName Prefix } Element Impl ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . AB STR ACT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. primary Constructor ( Fun Spec . constructor Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" node ", ĠAST Node :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Super interface ( element Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. super class ( AST Wrapper Psi Element :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Super class Constructor Parameter (" node ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addFunction ( Fun Spec . builder (" getReference ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . OVERRIDE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( reference Class . as Nullable ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" return Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġadd Type ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ ĠType Spec . class Builder ("${ fileName Prefix } Stub bed Element Impl ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . AB STR ACT ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Type Variable ( stub Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. with Bounds ( Parameterized TypeName . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStub Element :: class . as ClassName (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW ildcard TypeName . subtype Of ( ANY )) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Super interface ( element Class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. super class ( Parameterized TypeName . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠStub Based Psi Element Base :: class . as ClassName (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġstub Type ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addFunction ( Fun Spec . constructor Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" node ", ĠAST Node :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. call Super Constructor (" node ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addFunction ( Fun Spec . constructor Builder () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" node ", Ġstub Type ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Parameter (" nodeType ", ĠParameter ized TypeName . get ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠI Stub ElementType :: class . as TypeName (), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW ildcard TypeName . subtype Of ( ANY ), ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠW ildcard TypeName . subtype Of ( ANY ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ)) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. call Super Constructor (" node ", Ġ" nodeType ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addFunction ( Fun Spec . builder (" toString ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . OVERRIDE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( String :: class ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" return Ġ\" \ ${ java Class . simple Name }(\ $ elementType ) \" ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. addFunction ( Fun Spec . builder (" getReference ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Modifiers ( K Modifier . OVERRIDE ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. returns ( reference Class . as Nullable ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. add Statement (" return Ġnull ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build ()) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. build () ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. also Ġ{ Ġadd Type ( it ) Ġ} ĊĊĠĠĠĠĠĠĠ Ġwrite ToFile () ĊĠĠĠ Ġ} Ċ } Ċ