X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/aa14a4cddcb96b681d5c19a2ec8bad382f43b264..fdc3e506a199dcfe32e748de4010e908f5825b37:/src/class-make-impl.lisp?ds=sidebyside diff --git a/src/class-make-impl.lisp b/src/class-make-impl.lisp index 4470416..f9d5734 100644 --- a/src/class-make-impl.lisp +++ b/src/class-make-impl.lisp @@ -79,7 +79,7 @@ (defmethod make-sod-slot ((class sod-class) name type pset &optional location) (with-default-error-location (location) - (let ((slot (make-instance (get-property pset :lisp-class :symbol + (let ((slot (make-instance (get-property pset :slot-class :symbol 'sod-slot) :class class :name name @@ -88,7 +88,7 @@ :pset pset))) (with-slots (slots) class (setf slots (append slots (list slot)))) - (check-unused-properties pset)))) + slot))) (defmethod shared-initialize :after ((slot sod-slot) slot-names &key pset) "This method does nothing. @@ -113,7 +113,7 @@ (with-slots (instance-initializers) class (setf instance-initializers (append instance-initializers (list initializer)))) - (check-unused-properties pset)))) + initializer))) (defmethod make-sod-class-initializer ((class sod-class) nick name value-kind value-form pset @@ -127,12 +127,12 @@ (with-slots (class-initializers) class (setf class-initializers (append class-initializers (list initializer)))) - (check-unused-properties pset)))) + initializer))) (defmethod make-sod-initializer-using-slot ((class sod-class) (slot sod-slot) init-class value-kind value-form pset location) - (make-instance (get-property pset :lisp-class :symbol init-class) + (make-instance (get-property pset :initializer-class :symbol init-class) :class class :slot slot :value-kind value-kind @@ -155,16 +155,19 @@ (defmethod make-sod-message ((class sod-class) name type pset &optional location) (with-default-error-location (location) - (let ((message (make-instance (get-property pset :lisp-class :symbol - 'standard-message) - :class class - :name name - :type type - :location (file-location location) - :pset pset))) + (let* ((msg-class (or (get-property pset :message-class :symbol) + (and (get-property pset :combination :keyword) + 'aggregating-message) + 'standard-message)) + (message (make-instance msg-class + :class class + :name name + :type type + :location (file-location location) + :pset pset))) (with-slots (messages) class (setf messages (append messages (list message)))) - (check-unused-properties pset)))) + message))) (defmethod shared-initialize :after ((message sod-message) slot-names &key pset) @@ -189,12 +192,12 @@ type body pset (file-location location)))) (with-slots (methods) class - (setf methods (append methods (list method))))) - (check-unused-properties pset))) + (setf methods (append methods (list method)))) + method))) (defmethod make-sod-method-using-message ((message sod-message) (class sod-class) type body pset location) - (make-instance (or (get-property pset :lisp-class :symbol) + (make-instance (or (get-property pset :method-class :symbol) (sod-message-method-class message class pset)) :message message :class class @@ -215,7 +218,11 @@ ;; Check that the arguments are named if we have a method body. (with-slots (body type) method (unless (or (not body) - (every #'argument-name (c-function-arguments type))) + (every (lambda (arg) + (or (eq arg :ellipsis) + (argument-name arg) + (eq (argument-type arg) (c-type void)))) + (c-function-arguments type))) (error "Abstract declarators not permitted in method definitions"))) ;; Check the method type.