package Ġde . j ens k ling en berg . kt _ dart _ builder . main . specs Ċ Ċ import Ġde . j ens k ling en berg . kt _ dart _ builder . main . Spec Ċ import Ġde . j ens k ling en berg . kt _ dart _ builder . main . Spec Visitor Ċ import Ġde . j ens k ling en berg . kt _ dart _ builder . main . mixins . Allocate ĊĊ Ċ interface ĠCode Ġ: ĠSpec Ġ{ ĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġscope ( code : Ġ( Allocate ) Ġ-> ĠString ): ĠCode Ġ= ĠScoped Code ( code ) ĊĠĠĠ Ġ} Ċ Ċ } ĊĊ Ċ interface ĠCode Visitor < T > Ġ: ĠSpec Visitor < T > Ġ{ ĊĠĠĠ Ġfun Ġvisit Block ( code : ĠBlock , Ġoutput : ĠT ?): ĠT ĊĠĠĠ Ġfun Ġvisit Static Code ( code : ĠStatic Code , Ġcontext : ĠString Sink ?): ĠT ĊĠĠĠ Ġfun Ġvisit Scoped Code ( code : ĠScoped Code , Ġoutput : ĠString Sink ?): ĠT Ċ } Ċ Ċ class ĠBlock ( val Ġstatements : ĠList < Code > Ġ= Ġempty List ()) Ġ: ĠCode , ĠSpec Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġaccept ( visitor : ĠSpec Visitor < T >, Ġcontext : ĠT ?): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġvisitor Ġas ĠCode Visitor ĊĠĠĠĠĠĠĠ Ġreturn Ġvisitor . visit Block ( this , Ġcontext ) ĊĊĠĠĠ Ġ} ĊĊĠĠĠ Ġcompanion Ġobject Ġ{ ĊĠĠĠĠĠĠĠ Ġfun Ġof ( statements : ĠList < Code >): ĠBlock Ġ= ĠBlock ( statements ) ĊĊĠĠĠ Ġ} Ċ } ĊĊ Ċ /// ĠRepresents Ġa Ġsimple , Ġliteral Ġcode Ġblock Ġto Ġbe Ġinserted Ġas - is . Ċ class ĠStatic Code ( val Ġcode : ĠString ) Ġ: ĠCode Ġ{ ĊĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġaccept ( visitor : ĠSpec Visitor < T >, Ġcontext : ĠT ?): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġvisitor Ġas ĠCode Visitor ĊĠĠĠĠĠĠĠ Ġreturn Ġvisitor . visit Static Code ( this , Ġcontext Ġas ĠString Sink ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġcode Ċ } ĊĊ Ċ /// ĠRepresents Ġa Ġcode Ġblock Ġthat Ġmay Ġrequire Ġsco ping . Ċ class ĠScoped Code ( val Ġcode : Ġ( Allocate ) Ġ-> ĠString ) Ġ: ĠCode Ġ{ ĊĊĠĠĠ Ġoverride Ġfun Ġ< T > Ġaccept ( visitor : ĠSpec Visitor < T >, Ġcontext : ĠT ?): ĠT Ġ{ ĊĠĠĠĠĠĠĠ Ġvisitor Ġas ĠCode Visitor ĊĠĠĠĠĠĠĠ Ġreturn Ġvisitor . visit Scoped Code ( this , Ġcontext Ġas ĠString Sink ) ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġoverride Ġfun ĠtoString () Ġ= Ġcode Ġ{ Ġref Ġ-> Ġref . symbol Ġ} Ċ Ċ } ĊĊĊ