X-Git-Url: https://git.distorted.org.uk/~mdw/sod/blobdiff_plain/a888e3acc123993fa6fca9338f291b306aa131e2..12386a2694932857981a076536c6297f8eaa661f:/src/class-make-impl.lisp diff --git a/src/class-make-impl.lisp b/src/class-make-impl.lisp index d2f3093..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,51 @@ (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. + +(defmethod make-sod-class-initfrag + ((class sod-class) frag pset &optional location) + (declare (ignore pset location)) + (with-slots (initfrags) class + (setf initfrags (append initfrags (list frag))))) + +(defmethod make-sod-class-tearfrag + ((class sod-class) frag pset &optional location) + (declare (ignore pset location)) + (with-slots (tearfrags) class + (setf tearfrags (append tearfrags (list frag))))) + ;;;-------------------------------------------------------------------------- ;;; Messages.