unofficial mirror of emacs-devel@gnu.org 
 help / color / mirror / code / Atom feed
From: "Adrian Robert" <adrian.b.robert@gmail.com>
To: "Alan Mackenzie" <acm@muc.de>
Cc: emacs-devel@gnu.org
Subject: Re: cc-mode enhancement for Objective-C
Date: Mon, 15 Oct 2007 18:35:03 +0300	[thread overview]
Message-ID: <55f7df060710150835o386887d7mf0e514c1e75d5b8e@mail.gmail.com> (raw)
In-Reply-To: <E1IhEt2-0001f7-PO@fencepost.gnu.org>

[-- Attachment #1: Type: text/plain, Size: 473 bytes --]

Here is a new version of the patch with 'c-' prepended to the style
variables, plus a simple test file.  I wasn't sure how to make a
".res" file for it -- if that's documented somewhere let me know.
Both indentation line-up and coloration should be tested (explained in
the comments).

Re: assignment papers, I could have sworn we had finished the process
and Michael's papers were sent in, however I can't find an email
record of that right now, so I'll ask him.

-Adrian

[-- Attachment #2: objc-enhance_v4.patch --]
[-- Type: application/octet-stream, Size: 9442 bytes --]

Index: cc-align.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/cc-align.el,v
retrieving revision 1.20.2.13
diff -c -r1.20.2.13 cc-align.el
*** cc-align.el	27 Jul 2007 10:51:17 -0000	1.20.2.13
--- cc-align.el	14 Oct 2007 06:04:12 -0000
***************
*** 908,915 ****
  	   )
        (- target-col open-bracket-col extra))))
  
  (defun c-lineup-ObjC-method-args (langelem)
!   "Line up the colons that separate args.
  The colon on the current line is aligned with the one on the first
  line.
  
--- 908,958 ----
  	   )
        (- 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 (cdr langelem))
+ 		      (if (eq ?: (char-before))
+ 			  (c-get-offset '(c-objc-method-parameter-offset . nil))
+ 			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-get-offset
+ 			   '(c-objc-method-arg-unfinished-offset . nil))))))
+ 
+ 	(if (>= arg-ralign-colon-ofs
+ 		(c-get-offset '(c-objc-method-arg-min-delta-to-bracket . nil)))
+ 	    (+ arg-ralign-colon-ofs extra)
+ 	  (throw 'no-idea nil))))))
+ 
  (defun c-lineup-ObjC-method-args (langelem)
!   "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.
  
***************
*** 933,939 ****
  	  c-basic-offset)))))
  
  (defun c-lineup-ObjC-method-args-2 (langelem)
!   "Line up the colons that separate args.
  The colon on the current line is aligned with the one on the previous
  line.
  
--- 976,982 ----
  	  c-basic-offset)))))
  
  (defun c-lineup-ObjC-method-args-2 (langelem)
!   "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: cc-fonts.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/cc-fonts.el,v
retrieving revision 1.2.2.17
diff -c -r1.2.2.17 cc-fonts.el
*** cc-fonts.el	27 Jul 2007 10:51:18 -0000	1.2.2.17
--- cc-fonts.el	14 Oct 2007 06:04:14 -0000
***************
*** 1319,1325 ****
  				  nil)))
  		'((c-put-char-property (1- (match-end 1))
  				       'c-type 'c-decl-end)))
! 	      c-font-lock-objc-methods))
  
        ;; Fontify all declarations, casts and normal labels.
        c-font-lock-declarations
--- 1319,1353 ----
  				  nil)))
  		'((c-put-char-property (1- (match-end 1))
  				       'c-type 'c-decl-end)))
! 
! 	      c-font-lock-objc-methods
! 
! 	      ;; Parts of selector name in messages
! 	      ;; PENDING: perhaps should change to only pick up inside brackets
! 	      ("\\sw*:" 0 font-lock-function-name-face keep t)
! 
! 	      ;; get argument-less selectors' highlighting right
! 	      ;; [[foo _bar_] _baz_] -> bar, baz are highlighted
! 	      ("\\(\\sw+\\)[ \t]*[]]"
! 		(1 (let ((non-ws-before-match (char-before 
! 			      (save-excursion
! 				(goto-char (match-beginning 1))
! 				;; expensive!
! 				(c-backward-syntactic-ws (c-point 'bol))
! 				(point)
! 				))))
! 		      (unless (or (eq ?:  non-ws-before-match)
! 				  (eq ?\[ non-ws-before-match)
! 				  (eq ?> non-ws-before-match))
! 			font-lock-function-name-face)))))
! 	  ;; PENDING: unsure if c-nonlabel-token-key or c-opt-extra-label-key
! 	  ;;          should be used here
! 	  (when (c-lang-const c-opt-extra-label-key)
! 	    `(,(c-make-font-lock-search-function
! 		(c-lang-const c-opt-extra-label-key)
! 		'((c-put-char-property (1- (match-end 0))
! 				       'c-type 'c-decl-end)))))
! 	  )
  
        ;; Fontify all declarations, casts and normal labels.
        c-font-lock-declarations
Index: cc-langs.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/cc-langs.el,v
retrieving revision 1.25.2.19
diff -c -r1.25.2.19 cc-langs.el
*** cc-langs.el	3 Aug 2007 05:20:32 -0000	1.25.2.19
--- cc-langs.el	14 Oct 2007 06:04:18 -0000
***************
*** 2062,2068 ****
    t       nil
    (c c++) '("NULL" ;; Not a keyword, but practically works as one.
  	    "false" "true")		; Defined in C99.
!   objc    '("nil" "Nil")
    idl     '("TRUE" "FALSE")
    pike    '("UNDEFINED")) ;; Not a keyword, but practically works as one.
  
--- 2062,2068 ----
    t       nil
    (c c++) '("NULL" ;; Not a keyword, but practically works as one.
  	    "false" "true")		; Defined in C99.
!   objc    '("nil" "Nil" "YES" "NO" "NS_DURING" "NS_HANDLER" "NS_ENDHANDLER" "ASSIGN" "RELEASE" "AUTORELEASE" "RETAIN" "DESTROY" "CREATE_AUTORELEASE_POOL" "RECREATE_AUTORELEASE_POOL")
    idl     '("TRUE" "FALSE")
    pike    '("UNDEFINED")) ;; Not a keyword, but practically works as one.
  
Index: cc-menus.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/cc-menus.el,v
retrieving revision 1.25.2.9
diff -c -r1.25.2.9 cc-menus.el
*** cc-menus.el	27 Jul 2007 10:51:14 -0000	1.25.2.9
--- cc-menus.el	14 Oct 2007 06:04:18 -0000
***************
*** 329,338 ****
  	     'buffer-substring-no-properties
  	   'buffer-substring)))
      (goto-char (point-max))
-     (imenu-progress-message stupid 0)
      ;;
      (while (re-search-backward cc-imenu-objc-generic-expression nil t)
-       (imenu-progress-message stupid)
        (setq langnum (if (match-beginning OBJC) 
  			OBJC
  		      (cond
--- 329,336 ----
***************
*** 384,390 ****
  					  methodlist) toplist))
  	      methodlist nil))))
      ;; 
-     (imenu-progress-message stupid 100)
      (if (eq (car toplist) nil)
  	(setq toplist (cdr toplist)))
  
--- 382,387 ----
Index: cc-vars.el
===================================================================
RCS file: /cvsroot/emacs/emacs/lisp/progmodes/cc-vars.el,v
retrieving revision 1.31.2.17
diff -c -r1.31.2.17 cc-vars.el
*** cc-vars.el	13 Aug 2007 13:47:30 -0000	1.31.2.17
--- cc-vars.el	14 Oct 2007 06:04:20 -0000
***************
*** 912,917 ****
--- 912,956 ----
    :type 'integer
    :group 'c)
  
+ (defcustom-c-stylevar 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-stylevar 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-stylevar 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.
***************
*** 1097,1103 ****
         ;; 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)
         ;; Anchor pos: At the open bracket.
         (extern-lang-open      . 0)
         (namespace-open        . 0)
--- 1136,1147 ----
         ;; 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-colons
! 			        c-lineup-ObjC-method-call +))
!        ;; Anchor pos: (used by c-lineup-method-call-colons)
!        (c-objc-method-arg-min-delta-to-bracket	. *)
!        (c-objc-method-arg-unfinished-offset	. +)
!        (c-objc-method-parameter-offset		. +)
         ;; Anchor pos: At the open bracket.
         (extern-lang-open      . 0)
         (namespace-open        . 0)

[-- Attachment #3: testObjCmethodCallAlign.m --]
[-- Type: application/octet-stream, Size: 413 bytes --]

/* Tests lineup of colons in method calls, and fontification thereof. */

#import <Foundation/Foundation.h>

int main(int argc, char *argv[])
{
  int bar, baz;
  id someObject = [[NSObject alloc] init];

  // colons should be lined up in same column, and selector portions should
  // be in font-lock-function-name-face
  [someObject someMethodWithArg1: bar
                            arg2: baz];

  return 0;
}

[-- Attachment #4: Type: text/plain, Size: 142 bytes --]

_______________________________________________
Emacs-devel mailing list
Emacs-devel@gnu.org
http://lists.gnu.org/mailman/listinfo/emacs-devel

  reply	other threads:[~2007-10-15 15:35 UTC|newest]

Thread overview: 13+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2007-10-13  6:43 cc-mode enhancement for Objective-C Adrian Robert
2007-10-13 19:48 ` Richard Stallman
2007-10-14  5:49   ` Adrian Robert
2007-10-15  1:36     ` Richard Stallman
2007-10-15 15:35       ` Adrian Robert [this message]
2007-10-17 11:12       ` Adrian Robert
2007-10-17 20:49         ` Richard Stallman
2007-10-23  6:33           ` Adrian Robert
     [not found]             ` <55f7df060711230243i27c14a3fj44cce23ec26d76e8@mail.gmail.com>
2008-03-05  5:01               ` Adrian Robert
2007-10-13 21:13 ` Alan Mackenzie
2007-10-14  6:08   ` Adrian Robert
2007-10-14  6:10     ` Adrian Robert
2007-10-14  8:29     ` Alan Mackenzie

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://www.gnu.org/software/emacs/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=55f7df060710150835o386887d7mf0e514c1e75d5b8e@mail.gmail.com \
    --to=adrian.b.robert@gmail.com \
    --cc=acm@muc.de \
    --cc=emacs-devel@gnu.org \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://git.savannah.gnu.org/cgit/emacs.git

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).