1 ! Copyright (C) 2008 Slava Pestov.
2 ! See http://factorcode.org/license.txt for BSD license.
3 USING: accessors kernel sets namespaces sequences parser
4 lexer combinators words classes.parser classes.tuple arrays ;
5 IN: classes.tuple.parser
7 : slot-names ( slots -- seq )
8 [ dup array? [ first ] when ] map ;
10 : shadowed-slots ( superclass slots -- shadowed )
11 [ all-slots [ name>> ] map ] [ slot-names ] bi* intersect ;
13 : check-slot-shadowing ( class superclass slots -- )
16 "Definition of slot ``" %
20 "'' shadows a superclass slot" %
24 ERROR: duplicate-slot-names names ;
26 : check-duplicate-slots ( slots -- )
28 dup empty? [ drop ] [ duplicate-slot-names ] if ;
30 ERROR: invalid-slot-name name ;
32 : parse-long-slot-name ( -- )
33 [ scan , \ } parse-until % ] { } make ;
35 : parse-slot-name ( string/f -- ? )
36 #! This isn't meant to enforce any kind of policy, just
37 #! to check for mistakes of this form:
39 #! TUPLE: blahblah foo bing
43 { [ dup not ] [ unexpected-eof ] }
44 { [ dup { ":" "(" "<" "\"" "!" } member? ] [ invalid-slot-name ] }
45 { [ dup ";" = ] [ drop f ] }
46 [ dup "{" = [ drop parse-long-slot-name ] when , t ]
49 : parse-tuple-slots ( -- )
50 scan parse-slot-name [ parse-tuple-slots ] when ;
52 : parse-tuple-definition ( -- class superclass slots )
56 { "<" [ scan-word [ parse-tuple-slots ] { } make ] }
57 [ tuple swap [ parse-slot-name [ parse-tuple-slots ] when ] { } make ]
59 dup check-duplicate-slots
60 3dup check-slot-shadowing ;