X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/a42893dda5f4dd2b89fbfe4e497da261159225ca..f64eb323a5798e155cc494043f5f750abf50a482:/src/class-make-impl.lisp diff --git a/src/class-make-impl.lisp b/src/class-make-impl.lisp index bd2407e..7263e44 100644 --- a/src/class-make-impl.lisp +++ b/src/class-make-impl.lisp @@ -72,9 +72,13 @@ :name name :type type :location (file-location location) - :pset pset))) + :pset pset)) + (initarg-name (get-property pset :initarg :id))) (with-slots (slots) class (setf slots (append slots (list slot)))) + (when initarg-name + (make-sod-slot-initarg-using-slot class initarg-name + slot pset location)) slot))) (defmethod shared-initialize :after ((slot sod-slot) slot-names &key pset) @@ -92,14 +96,20 @@ ((class sod-class) nick name value pset &optional location) (with-default-error-location (location) (let* ((slot (find-instance-slot-by-name class nick name)) + (initarg-name (get-property pset :initarg :id)) (initializer (and value (make-sod-initializer-using-slot class slot 'sod-instance-initializer value pset (file-location location))))) (with-slots (instance-initializers) class - - (setf instance-initializers - (append instance-initializers (list initializer)))) + (unless (or initarg-name initializer) + (error "Slot initializer declaration with no effect")) + (when initarg-name + (make-sod-slot-initarg-using-slot class initarg-name slot + pset location)) + (when initializer + (setf instance-initializers + (append instance-initializers (list initializer))))) initializer))) (defmethod make-sod-class-initializer @@ -132,6 +142,36 @@ (declare (ignore slot-names pset)) nil) +(defmethod make-sod-user-initarg + ((class sod-class) name type pset &optional default location) + (declare (ignore pset)) + (with-slots (initargs) class + (push (make-instance 'sod-user-initarg :location (file-location location) + :class class :name name :type type :default default) + initargs))) + +(defmethod make-sod-slot-initarg + ((class sod-class) name nick slot-name pset &optional location) + (let ((slot (find-instance-slot-by-name class nick slot-name))) + (make-sod-slot-initarg-using-slot class name slot pset location))) + +(defmethod make-sod-slot-initarg-using-slot + ((class sod-class) name (slot sod-slot) pset &optional location) + (declare (ignore pset)) + (with-slots (initargs) class + (with-slots ((type %type)) slot + (push (make-instance 'sod-slot-initarg + :location (file-location location) + :class class :name name :type type :slot slot) + initargs)))) + +(defmethod sod-initarg-default ((initarg sod-initarg)) nil) + +(defmethod sod-initarg-argument ((initarg sod-initarg)) + (make-argument (sod-initarg-name initarg) + (sod-initarg-type initarg) + (sod-initarg-default initarg))) + ;;;-------------------------------------------------------------------------- ;;; Initialization and teardown fragments.