# # $Id: parsedclass.icn,v 1.1 2004/02/12 17:01:53 rparlett Exp $ # # This file is in the public domain. # # Author: Robert Parlett (parlett@dial.pipex.com) # package parser class ParsedClass : ParsedObject(superclasses, superclasses_nodes, methods, variables, initially_method) method add_method(n) put(methods, ParsedMethod(n, self)) end method init(n) local classhead, arglist superclasses := [] superclasses_nodes := [] methods := [] variables := [] initially_method := &null classhead := n.children[1] name := classhead.children[2].s every sc := tree_seq1_pre(\classhead.children[3], 3, 2) do { if type(sc) == "token" then pref := sc.s else { # It's a packageref node if *sc.children = 2 then pref := "::" || sc.children[2].s else pref := sc.children[1].s || "::" || sc.children[3].s } put(superclasses, pref) put(superclasses_nodes, sc) } arglist := classhead.children[5] every x := tree_seq2((\arglist).children[1], "parmlist") do { if type(x) == "token" then put(variables, x.s) else put(variables, x.children[1].s) } if *n.children = 5 then { every x := tree_seq1_pre(\n.children[2], 2, 1) do { case x.label of { # "Inner" records/globals are treated as # top-level definitions. "record" : parent.add_record(x) "global" : parent.add_global(x) "method": add_method(x) } } if \n.children[4] then initially_method := ParsedInitiallyMethod(n.children[4], self) } end method to_string() s := "class " || name every s ||:= " : " || !superclasses s ||:= "(" every s ||:= !variables || "," if *variables > 0 then s[-1] := "" s ||:= ")" every s ||:= "\n" || (!methods).to_string() s ||:= "\n" || (\initially_method).to_string() return s end initially(n, p) self.ParsedObject.initially(n, p) end