package Ġsoftware . amazon . smithy . intellij Ċ Ċ import Ġcom . intellij . openapi . file Editor . File Document Manager Ċ import Ġcom . intellij . openapi . project . Project Ċ import Ġcom . intellij . openapi . util . Text Range Ċ import Ġcom . intellij . psi . Psi Document Manager Ċ import Ġcom . intellij . psi . Psi File Factory Ċ import Ġcom . intellij . psi . Psi Manager Ċ import Ġcom . intellij . psi . Psi Reference Ċ import Ġcom . intellij . psi . Psi Reference Base Ċ import Ġcom . intellij . psi . search . FileType Index Ċ import Ġcom . intellij . psi . search . Global Search Scope Ċ import Ġcom . intellij . psi . util . Psi Tree Util Ċ import Ġcom . jetbrains . rd . util . get OrCreate Ċ import Ġsoftware . amazon . smithy . intellij . psi . Sm ithy Aggregate Shape Ċ import Ġsoftware . amazon . smithy . intellij . psi . Sm ithy Entry Ċ import Ġsoftware . amazon . smithy . intellij . psi . Sm ithy Key Ċ import Ġsoftware . amazon . smithy . intellij . psi . Sm ithy Member Ċ import Ġsoftware . amazon . smithy . intellij . psi . Sm ithy Shape Ċ import Ġsoftware . amazon . smithy . intellij . psi . Sm ithy Shape Id Ċ import Ġsoftware . amazon . smithy . intellij . psi . Sm ithy Shape Name Ċ import Ġsoftware . amazon . smithy . intellij . psi . Sm ithy Trait Ċ import Ġjava . nio . charset . StandardCharsets Ċ Ċ /** Ċ Ġ* ĠA Ġ[ Psi Reference ] Ġfrom Ġa Ġ[ Sm ithy Shape Id ] Ġto Ġits Ġoriginal Ġ[ Sm ithy Shape ]. Ċ Ġ* Ċ Ġ* Ġ@ author ĠI an ĠC aff ey Ċ Ġ* Ġ@ since Ġ 1 . 0 Ċ Ġ*/ Ċ class ĠSm ithy Shape Reference ( shape Id : ĠSm ithy Shape Id ) Ġ: ĠPsi Reference Base < Sm ithy Shape Id >( ĊĠĠĠ Ġshape Id , ĠText Range . from ( 0 , Ġshape Id . text Length ), Ġtrue Ċ ) Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval ĠP REL UDE _ TEXT Ġ= Ġthis :: class . java . getResource AsStream ("/ prelude / 1 . 0 . smithy ") !!. read All Bytes () ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ. toString ( StandardCharsets . UTF _ 8 ) ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġpre lude s Ġ= Ġmutable Map Of < Project , ĠSm ithy File >() ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun Ġhandle Element Rename ( new ElementName : ĠString ) Ġ= Ġmy Element . setName ( new ElementName ) ĊĠĠĠ Ġoverride Ġfun Ġget Absolute Range (): ĠText Range Ġ= Ġmy Element . text Range ĊĠĠĠ Ġoverride Ġfun Ġresolve (): ĠSm ithy Shape ? Ġ{ ĊĠĠĠĠĠĠĠ Ġval Ġdeclared Namespace Ġ= Ġmy Element . declared Namespace ĊĠĠĠĠĠĠĠ Ġval Ġen closing Namespace Ġ= Ġmy Element . enc lo sing Namespace ĊĠĠĠĠĠĠĠ Ġ// Note : Ġcurrently Ġthis Ġcan Ġonly Ġresolve Ġreferences Ġbetween Ġproject Ġsource Ġfiles ĊĠĠĠĠĠĠĠ ĠFile Type Index . get Files ( Sm ithy FileType , ĠGlobal Search Scope . all Scope ( my Element . project )). forEach Ġ{ Ġfile Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsmithy File Ġ= ĠPsi Manager . getInstance ( my Element . project ). find File ( file ) Ġas ĠSm ithy File ? Ġ?: Ġreturn @ forEach ĊĠĠĠĠĠĠĠĠĠĠĠ Ġsmithy File . model . shapes . forEach Ġ{ Ġshape Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// Note : Ġfor Ġambiguous Ġshape Ġids Ġ( which Ġlack Ġa Ġdeclared Ġnamespace ), Ġmatching Ġcan Ġfallback Ġto Ġthe Ġen closing ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ// namespace Ġto Ġmatch Ġthe Ġmodel Ġfile Ġmerging Ġlogic Ġof Ġnormal ĠSm ithy Ġbuilds ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( shape . name Ġ== Ġmy Element . name Ġ&& Ġ( shape . namespace Ġ== Ġdeclared Namespace Ġ|| Ġ( declared Namespace Ġ== Ġnull Ġ&& Ġshape . namespace Ġ== Ġen closing Namespace ))) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġshape ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġ// Attempt Ġto Ġfind Ġthe Ġshape Ġwithin Ġthe Ġbundled Ġpre lude ĊĠĠĠĠĠĠĠ Ġif Ġ(( declared Namespace Ġ== Ġnull Ġ|| Ġ" smithy . api " Ġ== Ġdeclared Namespace )) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġpre lude Ġ= Ġpre lude s . get OrCreate ( my Element . project ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPsi File Factory . getInstance ( it ). create File FromText ( ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ" prelude . smithy ", ĠSm ithy Language , ĠP REL UDE _ TEXT ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ). apply Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvirtual File . is Writable Ġ= Ġfalse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Document Manager . getInstance ( my Element . project ). getDocument ( this )?. set ReadOnly ( true ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġas ĠSm ithy File ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġpre lude . model . shapes . find Ġ{ Ġit . name Ġ== Ġmy Element . name Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠĠĠĠĠ Ġreturn Ġnull ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġ[ Psi Reference ] Ġfrom Ġa Ġ[ Sm ithy Shape Name ] Ġwhich Ġcan Ġresolve Ġto Ġits Ġoriginal Ġ[ Sm ithy Shape ] Ġusing Ġthe Ġparent Ġ[ Sm ithy Shape Id ] Ġor Ġ[ Sm ithy Shape ] Ġ( for Ġown Ġreferences ). ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ author ĠI an ĠC aff ey ĊĠĠĠĠ Ġ* Ġ@ since Ġ 1 . 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠBy Name ( shape Name : ĠSm ithy Shape Name ) Ġ: ĠPsi Reference Base < Sm ithy Shape Name >( ĊĠĠĠĠĠĠĠ Ġshape Name , ĠText Range . from ( 0 , Ġshape Name . text Length ), Ġtrue ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġown Ref Ġ= Ġshape Name . parent Ġas ? ĠSm ithy Shape ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdelegate Ġ= Ġ( shape Name . parent Ġas ? ĠSm ithy Shape Id )?. let Ġ{ ĠSm ithy Shape Reference ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Absolute Range (): ĠText Range Ġ= Ġmy Element . text Range ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġresolve () Ġ= Ġown Ref Ġ?: Ġdelegate ?. resolve () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Element Rename ( new ElementName : ĠString ): ĠSm ithy Shape Name Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Range Ġ= Ġmy Element . text Range ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= ĠFile Document Manager . getInstance (). getDocument ( my Element . containing File . virtual File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument !!. replace String ( text Range . start Offset , Ġtext Range . end Offset , Ġnew ElementName ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Document Manager . getInstance ( my Element . project ). commit Document ( document ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmy Element ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġ[ Psi Reference ] Ġfrom Ġa Ġ[ Sm ithy Entry ] Ġwhich Ġcan Ġresolve Ġto Ġits Ġoriginal Ġ[ Sm ithy Member ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ author ĠI an ĠC aff ey ĊĠĠĠĠ Ġ* Ġ@ since Ġ 1 . 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠBy Member ( entry : ĠSm ithy Entry ) Ġ: ĠPsi Reference Base < Sm ithy Entry >( ĊĠĠĠĠĠĠĠ Ġentry , ĠText Range . from ( 0 , Ġentry . text Length ), Ġtrue ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdelegate Ġ= ĠPsi Tree Util . findFirst Parent ( entry ) Ġ{ Ġit Ġis ĠSm ithy Trait Ġ} ?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠSm ithy Shape Reference (( it Ġas ĠSm ithy Trait ). shape Id ) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Element Rename ( new ElementName : ĠString ) Ġ= Ġmy Element . setName ( new ElementName ) ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Absolute Range (): ĠText Range Ġ= Ġmy Element . text Range ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġresolve () Ġ= Ġ( delegate ?. resolve () Ġas ? ĠSm ithy Aggregate Shape )?. let Ġ{ Ġshape Ġ-> ĊĠĠĠĠĠĠĠĠĠĠĠ Ġshape . body . members . find Ġ{ Ġit . name Ġ== Ġmy Element . name Ġ} ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġ/** ĊĠĠĠĠ Ġ* ĠA Ġ[ Psi Reference ] Ġfrom Ġa Ġ[ Sm ithy Key ] Ġwhich Ġcan Ġresolve Ġto Ġits Ġoriginal Ġ[ Sm ithy Member ] Ġusing Ġthe Ġparent Ġ[ Sm ithy Entry ]. ĊĠĠĠĠ Ġ* ĊĠĠĠĠ Ġ* Ġ@ author ĠI an ĠC aff ey ĊĠĠĠĠ Ġ* Ġ@ since Ġ 1 . 0 ĊĠĠĠĠ Ġ*/ ĊĠĠĠ Ġclass ĠBy Key ( key : ĠSm ithy Key ) Ġ: ĠPsi Reference Base < Sm ithy Key >( ĊĠĠĠĠĠĠĠ Ġkey , ĠText Range . from ( 0 , Ġkey . text Length ), Ġtrue ĊĠĠĠ Ġ) Ġ{ ĊĠĠĠĠĠĠĠ Ġprivate Ġval Ġdelegate Ġ= Ġ( my Element . parent Ġas ? ĠSm ithy Entry )?. let Ġ{ ĠBy Member ( it ) Ġ} ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġget Absolute Range (): ĠText Range Ġ= Ġmy Element . text Range ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġresolve () Ġ= Ġdelegate ?. resolve () ĊĠĠĠĠĠĠĠ Ġoverride Ġfun Ġhandle Element Rename ( new ElementName : ĠString ): ĠSm ithy Key Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġtext Range Ġ= Ġmy Element . text Range ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġdocument Ġ= ĠFile Document Manager . getInstance (). getDocument ( my Element . containing File . virtual File ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġdocument !!. replace String ( text Range . start Offset , Ġtext Range . end Offset , Ġnew ElementName ) ĊĠĠĠĠĠĠĠĠĠĠĠ ĠPsi Document Manager . getInstance ( my Element . project ). commit Document ( document ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġreturn Ġmy Element ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }