]> git.eshelyaron.com Git - emacs.git/commitdiff
Enhancements for Objective-C:
authorAlan Mackenzie <acm@muc.de>
Thu, 30 Apr 2009 10:36:24 +0000 (10:36 +0000)
committerAlan Mackenzie <acm@muc.de>
Thu, 30 Apr 2009 10:36:24 +0000 (10:36 +0000)
cc-vars.el
(c-objc-method-arg-min-delta-to-bracket,
c-objc-method-arg-unfinished-offset, c-objc-method-parameter-offset): New
variables.
(c-offsets-alist): Use c-lineup-ObjC-method-call-colons in entry for
objc-method-call-cont.

cc-langs.el (c-constant-kwds): New ObjC keywords "YES", "NO",
"NS_DURING", "NS_HANDLER", "NS_ENDHANDLER".

cc-align.el (c-lineup-ObjC-method-call-colons): New function.

lisp/progmodes/cc-align.el
lisp/progmodes/cc-langs.el
lisp/progmodes/cc-vars.el

index ff22eba0c3331f039323daf93e33f8eca1d0e83d..c9dd92f46b2138fe1e3a9ba9566093e43bcffd15 100644 (file)
@@ -907,8 +907,48 @@ Works with: objc-method-call-cont."
           )
       (- target-col open-bracket-col extra))))
 
+(defun c-lineup-ObjC-method-call-colons (langelem)
+  "Line up selector args as Project Builder / XCode: colons of first
+   selector portions on successive lines are aligned.  If no decision can
+   be made return NIL, so that other lineup methods can be tried.  This is
+   typically chained with `c-lineup-ObjC-method-call'.
+
+Works with: objc-method-call-cont."
+  (save-excursion
+    (catch 'no-idea
+      (let* ((method-arg-len (progn
+                              (back-to-indentation)
+                              (if (search-forward ":" (c-point 'eol) 'move)
+                                  (- (point) (c-point 'boi))
+                                ; no complete argument to indent yet
+                                (throw 'no-idea nil))))
+
+            (extra (save-excursion 
+                      ; indent parameter to argument if needed
+                     (back-to-indentation)
+                     (c-backward-syntactic-ws (c-langelem-pos langelem))
+                     (if (eq ?: (char-before))
+                         c-objc-method-parameter-offset 0)))
+
+            (open-bracket-col (c-langelem-col langelem))
+
+            (arg-ralign-colon-ofs (progn
+                       (forward-char) ; skip over '['
+                       ; skip over object/class name
+                       ; and first argument
+                       (c-forward-sexp 2)
+                       (if (search-forward ":" (c-point 'eol) 'move)
+                           (- (current-column) open-bracket-col
+                              method-arg-len extra)
+                         ; previous arg has no param
+                         c-objc-method-arg-unfinished-offset))))
+
+       (if (>= arg-ralign-colon-ofs c-objc-method-arg-min-delta-to-bracket)
+           (+ arg-ralign-colon-ofs extra)
+         (throw 'no-idea nil))))))
+
 (defun c-lineup-ObjC-method-args (langelem)
-  "Line up the colons that separate args.
+  "Line up the colons that separate args in a method declaration.
 The colon on the current line is aligned with the one on the first
 line.
 
@@ -932,7 +972,7 @@ Works with: objc-method-args-cont."
          c-basic-offset)))))
 
 (defun c-lineup-ObjC-method-args-2 (langelem)
-  "Line up the colons that separate args.
+  "Line up the colons that separate args in a method declaration.
 The colon on the current line is aligned with the one on the previous
 line.
 
index 1a4fba2c8a12735409df33ba089c3bf540f194c1..cc35daa02ff1fe3f04d703781a591c1f552457f7 100644 (file)
@@ -2149,7 +2149,7 @@ This construct is \"<keyword> <expression> :\"."
   t       nil
   (c c++) '("NULL" ;; Not a keyword, but practically works as one.
            "false" "true")             ; Defined in C99.
-  objc    '("nil" "Nil")
+  objc    '("nil" "Nil" "YES" "NO" "NS_DURING" "NS_HANDLER" "NS_ENDHANDLER")
   idl     '("TRUE" "FALSE")
   java    '("true" "false" "null") ; technically "literals", not keywords
   pike    '("UNDEFINED")) ;; Not a keyword, but practically works as one.
index fa5aa538d7296eb0ed781ed4592493730d3e1100..a1f7d3ad3f202f9447a29110483ce282f0948c22 100644 (file)
@@ -936,6 +936,45 @@ this variable to nil."
   :type 'integer
   :group 'c)
 
+(defcustom c-objc-method-arg-min-delta-to-bracket 2
+  "*Minimum number of chars to the opening bracket.
+
+Consider this ObjC snippet:
+
+       [foo blahBlah: fred
+       |<-x->|barBaz: barney
+
+If `x' is less than this number then `c-lineup-ObjC-method-call-colons'
+will defer the indentation decision to the next function.  By default
+this is `c-lineup-ObjC-method-call', which would align it like:
+
+       [foo blahBlahBlah: fred
+            thisIsTooDamnLong: barney
+
+This behaviour can be overridden by customizing the indentation of
+`objc-method-call-cont' in the \"objc\" style."
+  :type 'integer
+  :group 'c)
+
+(defcustom c-objc-method-arg-unfinished-offset 4
+  "*Offset relative to bracket if first selector is on a new line.
+
+    [aaaaaaaaa
+    |<-x->|bbbbbbb:  cccccc
+             ddddd: eeee];"
+  :type 'integer
+  :group 'c)
+
+(defcustom c-objc-method-parameter-offset 4
+  "*Offset for selector parameter on a new line (relative to first selector.
+
+    [aaaaaaa bbbbbbbbbb:
+            |<-x->|cccccccc
+                    ddd: eeee
+                   ffff: ggg];"
+  :type 'integer
+  :group 'c)
+
 (defcustom c-default-style '((java-mode . "java") (awk-mode . "awk")
                             (other . "gnu"))
   "*Style which gets installed by default when a file is visited.
@@ -1121,7 +1160,8 @@ can always override the use of `c-default-style' by making calls to
        ;; Anchor pos: Boi.
        (objc-method-args-cont . c-lineup-ObjC-method-args)
        ;; Anchor pos: At the method start (always at boi).
-       (objc-method-call-cont . c-lineup-ObjC-method-call)
+       (objc-method-call-cont . (c-lineup-ObjC-method-call-colons
+                               c-lineup-ObjC-method-call +))
        ;; Anchor pos: At the open bracket.
        (extern-lang-open      . 0)
        (namespace-open        . 0)