branch: elpa/aidermacs
commit b25fa593e34109adf68a9f151e28a4b27811c4b4
Author: Kang Tu <tni...@gmail.com>
Commit: GitHub <nore...@github.com>

    Feat: Support multi-lines comment based in-place implementation (#73)
    
    * feat: Add aider-implement-todo function to implement TODOs in current 
context
    
    * feat: Add `aider-implement-todo` function description to README
    
    * docs(readme): update aider command description
    
    * merge main
    
    * feat: Add region selection support to aider-implement-todo function
    
    * refactor: Enhance aider-write-unit-test to handle test file and function 
contexts
    
    * update prompt for unit-test
    
    ---------
    
    Co-authored-by: Kang Tu <kang...@apple.com>
---
 aider.el | 60 +++++++++++++++++++++++++++++++++++++++++++-----------------
 1 file changed, 43 insertions(+), 17 deletions(-)

diff --git a/aider.el b/aider.el
index 0243b6676b..51ec11911f 100644
--- a/aider.el
+++ b/aider.el
@@ -587,26 +587,44 @@ If there are more than 40 files, refuse to add and show 
warning message."
 (defun aider-write-unit-test ()
   "Generate unit test code for current buffer.
 Do nothing if current buffer is not visiting a file.
-If current buffer filename contains 'test', do nothing.
-If cursor is on a function, generate unit test for that function.
-Otherwise, generate unit tests for the entire file."
+If current buffer filename contains 'test':
+  - If cursor is inside a test function, implement that test
+  - Otherwise show message asking to place cursor inside a test function
+Otherwise:
+  - If cursor is on a function, generate unit test for that function
+  - Otherwise generate unit tests for the entire file"
   (interactive)
   (if (not buffer-file-name)
       (message "Current buffer is not visiting a file.")
-    (if (string-match-p "test" (file-name-nondirectory buffer-file-name))
-        (message "Current buffer appears to be a test file.")
-      (let* ((function-name (which-function))
-             (common-instructions "Keep existing tests if there are. Do not 
use Mock if possible. Follow standard unit testing practices.")
-             (initial-input
-              (if function-name
-                  (format "Please write unit test code for function '%s'. %s" 
-                         function-name common-instructions)
-                (format "Please write unit test code for file '%s'. For each 
function %s" 
-                       (file-name-nondirectory buffer-file-name) 
common-instructions)))
-             (user-command (aider-read-string "Unit test generation 
instruction: " initial-input))
-             (command (format "/architect %s" user-command)))
-        (aider-add-current-file)
-        (aider--send-command command t)))))
+    (let ((is-test-file (string-match-p "test" (file-name-nondirectory 
buffer-file-name)))
+          (function-name (which-function)))
+      (cond
+       ;; Test file case
+       (is-test-file
+        (if function-name
+            (if (string-match-p "test" function-name)
+                (let* ((initial-input 
+                       (format "Please implement test function '%s'. Follow 
standard unit testing practices and make it a meaningful test. Do not use Mock 
if possible." 
+                              function-name))
+                      (user-command (aider-read-string "Test implementation 
instruction: " initial-input))
+                      (command (format "/architect %s" user-command)))
+                  (aider-add-current-file)
+                  (aider--send-command command t))
+              (message "Current function '%s' does not appear to be a test 
function." function-name))
+          (message "Please place cursor inside a test function to 
implement.")))
+       ;; Non-test file case
+       (t
+        (let* ((common-instructions "Keep existing tests if there are. Follow 
standard unit testing practices. Do not use Mock if possible.")
+               (initial-input
+                (if function-name
+                    (format "Please write unit test code for function '%s'. 
%s" 
+                           function-name common-instructions)
+                  (format "Please write unit test code for file '%s'. For each 
function %s" 
+                         (file-name-nondirectory buffer-file-name) 
common-instructions)))
+               (user-command (aider-read-string "Unit test generation 
instruction: " initial-input))
+               (command (format "/architect %s" user-command)))
+          (aider-add-current-file)
+          (aider--send-command command t)))))))
 
 ;;;###autoload
 (defun aider-fix-failing-test-under-cursor ()
@@ -636,6 +654,7 @@ ignoring leading whitespace."
 ;;;###autoload
 (defun aider-implement-todo ()
   "Implement TODO comments in current context.
+If region is selected, implement that specific region.
 If cursor is on a comment line, implement that specific comment.
 If cursor is inside a function, implement TODOs for that function.
 Otherwise implement TODOs for the entire current file."
@@ -645,8 +664,15 @@ Otherwise implement TODOs for the entire current file."
     (let* ((current-line (string-trim (thing-at-point 'line t)))
            (is-comment (aider--is-comment-line current-line))
            (function-name (which-function))
+           (region-text (when (region-active-p)
+                         (buffer-substring-no-properties 
+                          (region-beginning) 
+                          (region-end))))
            (initial-input
             (cond
+             (region-text
+              (format "Please implement this code block: '%s'. It is already 
inside current code. Please do in-place implementation. Keep the existing code 
structure and implement just this specific block." 
+                      region-text))
              (is-comment
               (format "Please implement this comment: '%s'. It is already 
inside current code. Please do in-place implementation. Keep the existing code 
structure and implement just this specific comment." 
                       current-line))

Reply via email to