src/: Lift keyword-argument protocol from effective methods to messages.
[sod] / src / method-impl.lisp
index e93fb3a..91c22bb 100644 (file)
 ;;;--------------------------------------------------------------------------
 ;;; Effective method classes.
 
-(defmethod method-keyword-argument-lists
-    ((method effective-method) direct-methods state)
-  (with-slots (message) method
-    (and (keyword-message-p message)
-        (cons (cons (lambda (arg)
-                      (let ((class (sod-message-class message)))
-                        (info-with-location
-                         message "Type `~A' declared in message ~
-                                  definition in `~A' (here)"
-                         (argument-type arg) class)
-                        (report-inheritance-path state class)))
-                    (c-function-keywords (sod-message-type message)))
-              (mapcar (lambda (m)
-                        (cons (lambda (arg)
-                                (let ((class (sod-method-class m)))
-                                  (info-with-location
-                                   m "Type `~A' declared in ~A direct ~
-                                      method of `~A' (defined here)"
-                                   (argument-type arg)
-                                   (sod-method-description m) class)
-                                  (report-inheritance-path state class)))
-                              (c-function-keywords (sod-method-type m))))
-                      direct-methods)))))
+(defmethod sod-message-keyword-argument-lists
+    ((message sod-message) (class sod-class) direct-methods state)
+  (and (keyword-message-p message)
+       (cons (cons (lambda (arg)
+                    (let ((class (sod-message-class message)))
+                      (info-with-location
+                       message "Type `~A' declared in message ~
+                                definition in `~A' (here)"
+                       (argument-type arg) class)
+                      (report-inheritance-path state class)))
+                  (c-function-keywords (sod-message-type message)))
+            (mapcar (lambda (method)
+                      (cons (lambda (arg)
+                              (let ((class (sod-method-class method)))
+                                (info-with-location
+                                 method "Type `~A' declared in ~A direct ~
+                                         method of `~A' (defined here)"
+                                 (argument-type arg)
+                                 (sod-method-description method) class)
+                                (report-inheritance-path state class)))
+                            (c-function-keywords (sod-method-type method))))
+                    direct-methods))))
+
 
 (defmethod shared-initialize :after
     ((method effective-method) slot-names &key direct-methods)
   ;; class construction.
   (with-slots ((class %class) message keywords) method
     (setf keywords
-         (merge-keyword-lists
-          (lambda ()
-            (values class
-                    (format nil
-                            "methods for message `~A' ~
-                             applicable to class `~A'"
-                            message class)))
-          (method-keyword-argument-lists method direct-methods
-           (make-inheritance-path-reporter-state class))))))
+         (compute-effective-method-keyword-arguments message
+                                                     class
+                                                     direct-methods))))
 
 (export '(basic-effective-method
          effective-method-around-methods effective-method-before-methods