X-Git-Url: https://www.chiark.greenend.org.uk/ucgi/~mdw/git/sod/blobdiff_plain/8152ead4c5c5980414d1a4f21a98e851cc25c9b1..57b365324f35a6237602ab840c23f4f06c8c317c:/src/module-parse.lisp diff --git a/src/module-parse.lisp b/src/module-parse.lisp index c5b28a6..747bdf7 100644 --- a/src/module-parse.lisp +++ b/src/module-parse.lisp @@ -260,6 +260,21 @@ (defun parse-class-body (scanner pset name supers) (with-parser-context (token-scanner-context :scanner scanner) (when name (make-class-type name)) (let* ((duff (null name)) + (superclasses + (let ((superclasses (restart-case + (mapcar #'find-sod-class + (or supers (list "SodObject"))) + (continue () + (setf duff t) + (list (find-sod-class "SodObject")))))) + (find-duplicates (lambda (first second) + (declare (ignore second)) + (setf duff t) + (cerror* "Class `~A' has duplicate ~ + direct superclass `~A'" + name first)) + superclasses) + (delete-duplicates superclasses))) (synthetic-name (or name (let ((var (synthetic-name))) (unless pset @@ -267,14 +282,7 @@ (defun parse-class-body (scanner pset name supers) (unless (pset-get pset "nick") (add-property pset "nick" var :type :id)) var))) - (class (make-sod-class synthetic-name - (restart-case - (mapcar #'find-sod-class - (or supers (list "SodObject"))) - (continue () - (setf duff t) - (list (find-sod-class "SodObject")))) - pset scanner)) + (class (make-sod-class synthetic-name superclasses pset scanner)) (nick (sod-class-nickname class))) (labels ((must-id ()