open import MJ.Types
import MJ.Classtable.Core as Core
module MJ.Classtable.Code {c}(Ct : Core.Classtable c) where
open import Prelude hiding (erase)
open import Data.Maybe as Maybe using (Maybe; just; nothing)
open import Data.Maybe.All as MayAll
open import Data.Vec as Vec hiding (_∈_)
open import Data.Star as Star
open import Data.List.Most as List
open import Data.List.Properties.Extra as List+
open import Relation.Binary.PropositionalEquality
open import Relation.Nullary.Decidable
open import Data.String
import Data.Vec.All as Vec∀
open Core c
open Classtable Ct
open import MJ.Classtable.Membership Ct
open import MJ.LexicalScope c
open import MJ.Syntax Ct
data Body (I : Ctx) : Ty c → Set where
body : ∀ {r}{O : Ctx} → Stmts I r O → Expr O r → Body I r
methodctx : Cid c → List (Ty c) → Ctx
methodctx cid as = (ref cid ∷ as)
constrctx : Cid c → Ctx
constrctx cid = let cl = Σ cid in (ref cid ∷ Class.constr cl)
data Method (cid : Cid c)(m : String) : Sig c → Set where
super_⟨_⟩then_ : ∀ {as b} →
let
pid = Class.parent (Σ cid)
Γ = methodctx cid as
in
AccMember pid METHOD m (as , b) →
All (Expr Γ) as →
Body (Γ +local b) b → Method cid m (as , b)
body : ∀ {as b} → Body (methodctx cid as) b → Method cid m (as , b)
data Constructor (cid : Cid c) : Set where
super_then_ : let
pid = Class.parent (Σ cid)
pclass = Σ pid
Γ = constrctx cid
in
All (Expr Γ) (Class.constr pclass) →
Body Γ void →
Constructor cid
body : Body (constrctx cid) void → Constructor cid
record Implementation (cid : Cid c) : Set where
constructor implementation
open Class (Σ cid) public
field
construct : Constructor cid
mbodies : All (λ{ (name , sig) → Method cid name sig }) (decls METHOD)
Code = ∀ cid → Implementation cid
InheritedMethod : ∀ (cid : Cid c)(m : String) → Sig c → Set
InheritedMethod cid m s = ∃ λ pid → Σ ⊢ cid <: pid × Method pid m s