@@ -310,13 +310,55 @@ relation lookup_class_in_env: (Env.Env,Absyn.Path) => (SCode.Class, Env.Env) =
310310 rule lookup_class_in_frame(items,id) => (c, _)
311311 ---------------------
312312 lookup_class_in_env(env as (Env.FRAME(items)::fs),Absyn.IDENT(id))
313- => (c,env)
313+ => (c,env)
314+
315+ rule lookup_class_in_frame(items, id) => (c, _) &
316+ lookup_class_in_class(env, c, path) => (c2, _)
317+ -------------------------------------------
318+ lookup_class_in_env(env as (Env.FRAME(items)::fs), Absyn.QUALIFIED(id,path))
319+ => (c2,env)
314320
315321 rule lookup_class_in_env(fs,id) => (c, _)
316322 ---------------------
317323 lookup_class_in_env(f::fs,id) => (c, f::fs)
318324
319325end
326+
327+ (** relation: lookup_class_in_class
328+ ** This relation looks up an inner class of a class (The outer class can be a package)
329+ ** Environment is passed along in case it needs to be modified...
330+ **)
331+ relation lookup_class_in_class: (Env.Env, SCode.Class, Absyn.Path) => (SCode.Class, Env.Env) =
332+
333+ rule lookup_class_in_parts(env,classname,parts) => (c,env)
334+ ----------------------------------------------------
335+ lookup_class_in_class (env, SCode.CLASS(_,_,_,SCode.PARTS(parts,_,_)),Absyn.IDENT(classname)) => (c,env)
336+
337+ rule lookup_class_in_parts (env, c1, parts) => (c,env) &
338+ lookup_class_in_class (env,c,p1) => (c',env)
339+ -------------------------------------------
340+ lookup_class_in_class (env, SCode.CLASS(_,_,_,SCode.PARTS(parts,_,_)), Absyn.QUALIFIED(c1,p1)) => (c',env)
341+
342+ end
343+
344+ (** relation: lookup_class_in_parts
345+ ** This relation takes an `Env' and an `Ident' and an `Element' list, and returns the `Class'
346+ ** having the name specified by the `Ident'. If not found, the relation fails.
347+ **)
348+ relation lookup_class_in_parts: (Env.Env, SCode.Ident, SCode.Element list) => (SCode.Class, Env.Env) =
349+
350+ rule name = name2
351+ ------------
352+ lookup_class_in_parts(env, name, SCode.CLASSDEF(name2,_,_,c)::xs) => (c, env)
353+
354+
355+ rule lookup_class_in_parts(env, name, xs) => (c,env)
356+ -----------------------------------------------
357+ lookup_class_in_parts(env, name, _::xs) => (c,env)
358+
359+ axiom lookup_class_in_parts(env, name, []) => fail
360+ end
361+
320362(**)
321363relation lookup_class_in_frame: ((SCode.Ident * Env.Item) list,
322364 SCode.Ident)
0 commit comments