package Ġdev . ab la . frontend Ċ Ċ import Ġdev . ab la . common . Symbol Table Ċ import Ġdev . ab la . language . nodes . Property Declaration Ċ import Ġjava . lang . IllegalStateException Ċ Ċ open Ġclass ĠExecution Scope ( val Ġparent : ĠExecution Scope ?, Ġval Ġsymbol Table : ĠSymbol Table ) Ġ{ ĊĠĠĠ Ġprivate Ġval Ġvalues Ġ= Ġmutable Map Of < String , ĠExecution Value >() ĊĊĠĠĠ Ġoperator Ġfun Ġget ( identifier : ĠString ) Ġ: ĠExecution Value ? Ġ= ĊĠĠĠĠĠĠĠ Ġvalues [ identifier ] Ġ?: ĊĠĠĠĠĠĠĠ Ġsymbol Table . get This ( identifier )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExecution Value . Const Symbol ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. copy With ( it . node . let Ġ{ Ġnode Ġ-> Ġif Ġ( node Ġis ĠProperty Declaration ) Ġnode . is Final Ġelse Ġfalse Ġ}) ĊĠĠĠĠĠĠĠ Ġ} Ġ?: ĊĠĠĠĠĠĠĠ Ġparent ?. get ( identifier ) Ġ?: ĊĠĠĠĠĠĠĠ Ġsymbol Table . find ( identifier )?. let Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ ĠExecution Value . Const Symbol ( it ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ. copy With ( it . node . let Ġ{ Ġnode Ġ-> Ġif Ġ( node Ġis ĠProperty Declaration ) Ġnode . is Final Ġelse Ġfalse Ġ}) ĊĠĠĠĠĠĠĠ Ġ} ĊĊĠĠĠ Ġoperator Ġfun Ġset ( identifier : ĠString , Ġvalue : ĠExecution Value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġvalues [ identifier ] Ġ= Ġvalue ĊĠĠĠ Ġ} ĊĊĠĠĠ Ġopen Ġsuspend Ġfun Ġmodify ( identifier : ĠString , Ġvalue : ĠExecution Value ) Ġ{ ĊĠĠĠĠĠĠĠ Ġif Ġ( values . containsKey ( identifier )) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġvalues [ identifier ] Ġ= Ġvalue . copy With ( values [ identifier ] !!. is Final ) ĊĠĠĠĠĠĠĠ Ġelse Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġsymbol Ġ= Ġsymbol Table . get This ( identifier ) ĊĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( symbol Ġ!= Ġnull ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġval Ġnode Ġ= Ġsymbol . node ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ( node Ġis ĠProperty Declaration ) Ġ{ ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġif Ġ(! node . is Final ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġvalues [ identifier ] Ġ= Ġvalue . copy With ( false ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Cannot Ġassign Ġvalue Ġto Ġ$ identifier ") ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Can 't Ġmodify Ġparameters Ġyet ") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġ} Ġelse Ġif Ġ( parent Ġ== Ġnull ) ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġthrow ĠIllegalStateException (" Can 't Ġfind Ġ$ identifier Ġto Ġmodify .") ĊĠĠĠĠĠĠĠĠĠĠĠ Ġelse ĊĠĠĠĠĠĠĠĠĠĠĠĠĠĠĠ Ġparent . modify ( identifier , Ġvalue ) ĊĠĠĠĠĠĠĠ Ġ} ĊĠĠĠ Ġ} Ċ }