Blob Blame History Raw
To: vim_dev@googlegroups.com
Subject: Patch 7.4.670
Fcc: outbox
From: Bram Moolenaar <Bram@moolenaar.net>
Mime-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
------------

Patch 7.4.670
Problem:    Using 'cindent' for Javascript is less than perfect.
Solution:   Improve indenting of continuation lines. (Hirohito Higashi)
Files:	    src/misc1.c, src/testdir/test3.in, src/testdir/test3.ok


*** ../vim-7.4.669/src/misc1.c	2015-03-06 22:00:06.813457075 +0100
--- src/misc1.c	2015-03-20 18:52:24.283668213 +0100
***************
*** 6670,6689 ****
      pos_T	cursor_save;
      pos_T	*trypos;
      static pos_T pos_copy;
  
      cursor_save = curwin->w_cursor;
!     if ((trypos = findmatchlimit(NULL, c, 0, ind_maxparen)) != NULL)
      {
  	/* check if the ( is in a // comment */
  	if ((colnr_T)cin_skip2pos(trypos) > trypos->col)
  	    trypos = NULL;
  	else
  	{
  	    pos_copy = *trypos;	    /* copy trypos, findmatch will change it */
  	    trypos = &pos_copy;
  	    curwin->w_cursor = *trypos;
! 	    if (ind_find_start_comment() != NULL) /* XXX */
  		trypos = NULL;
  	}
      }
      curwin->w_cursor = cursor_save;
--- 6670,6712 ----
      pos_T	cursor_save;
      pos_T	*trypos;
      static pos_T pos_copy;
+     int		ind_maxp_wk;
  
      cursor_save = curwin->w_cursor;
!     ind_maxp_wk = ind_maxparen;
! retry:
!     if ((trypos = findmatchlimit(NULL, c, 0, ind_maxp_wk)) != NULL)
      {
  	/* check if the ( is in a // comment */
  	if ((colnr_T)cin_skip2pos(trypos) > trypos->col)
+ 	{
+ 	    ind_maxp_wk = ind_maxparen - (int)(cursor_save.lnum - trypos->lnum);
+ 	    if (ind_maxp_wk > 0)
+ 	    {
+ 		curwin->w_cursor = *trypos;
+ 		curwin->w_cursor.col = 0;	/* XXX */
+ 		goto retry;
+ 	    }
  	    trypos = NULL;
+ 	}
  	else
  	{
+ 	    pos_T	*trypos_wk;
+ 
  	    pos_copy = *trypos;	    /* copy trypos, findmatch will change it */
  	    trypos = &pos_copy;
  	    curwin->w_cursor = *trypos;
! 	    if ((trypos_wk = ind_find_start_comment()) != NULL) /* XXX */
! 	    {
! 		ind_maxp_wk = ind_maxparen - (int)(cursor_save.lnum
! 			- trypos_wk->lnum);
! 		if (ind_maxp_wk > 0)
! 		{
! 		    curwin->w_cursor = *trypos_wk;
! 		    goto retry;
! 		}
  		trypos = NULL;
+ 	    }
  	}
      }
      curwin->w_cursor = cursor_save;
***************
*** 7024,7030 ****
  #define LOOKFOR_CPP_BASECLASS	9
  #define LOOKFOR_ENUM_OR_INIT	10
  #define LOOKFOR_JS_KEY		11
! #define LOOKFOR_NO_COMMA	12
  
      int		whilelevel;
      linenr_T	lnum;
--- 7047,7053 ----
  #define LOOKFOR_CPP_BASECLASS	9
  #define LOOKFOR_ENUM_OR_INIT	10
  #define LOOKFOR_JS_KEY		11
! #define LOOKFOR_COMMA	12
  
      int		whilelevel;
      linenr_T	lnum;
***************
*** 7842,7848 ****
  		    else
  		    {
  			if (lookfor != LOOKFOR_TERM
! 					  && lookfor != LOOKFOR_CPP_BASECLASS)
  			{
  			    amount = scope_amount;
  			    if (theline[0] == '{')
--- 7865,7872 ----
  		    else
  		    {
  			if (lookfor != LOOKFOR_TERM
! 					&& lookfor != LOOKFOR_CPP_BASECLASS
! 					&& lookfor != LOOKFOR_COMMA)
  			{
  			    amount = scope_amount;
  			    if (theline[0] == '{')
***************
*** 8134,8156 ****
  		    amount = get_indent();
  		    break;
  		}
! 		if (lookfor == LOOKFOR_NO_COMMA)
  		{
! 		    if (terminated != ',')
  			/* line below current line is the one that starts a
  			 * (possibly broken) line ending in a comma. */
  			break;
! 		    amount = get_indent();
! 		    if (curwin->w_cursor.lnum - 1 == ourscope)
! 			/* line above is start of the scope, thus current line
! 			 * is the one that stars a (possibly broken) line
! 			 * ending in a comma. */
! 			break;
  		}
  
  		if (terminated == 0 || (lookfor != LOOKFOR_UNTERM
  							&& terminated == ','))
  		{
  		    /*
  		     * if we're in the middle of a paren thing,
  		     * go back to the line that starts it so
--- 8158,8188 ----
  		    amount = get_indent();
  		    break;
  		}
! 		if (lookfor == LOOKFOR_COMMA)
  		{
! 		    if (tryposBrace != NULL && tryposBrace->lnum
! 						    >= curwin->w_cursor.lnum)
! 			break;
! 		    if (terminated == ',')
  			/* line below current line is the one that starts a
  			 * (possibly broken) line ending in a comma. */
  			break;
! 		    else
! 		    {
! 			amount = get_indent();
! 			if (curwin->w_cursor.lnum - 1 == ourscope)
! 			    /* line above is start of the scope, thus current
! 			     * line is the one that stars a (possibly broken)
! 			     * line ending in a comma. */
! 			    break;
! 		    }
  		}
  
  		if (terminated == 0 || (lookfor != LOOKFOR_UNTERM
  							&& terminated == ','))
  		{
+ 		    if (*skipwhite(l) == '[' || l[STRLEN(l) - 1] == '[')
+ 			amount += ind_continuation;
  		    /*
  		     * if we're in the middle of a paren thing,
  		     * go back to the line that starts it so
***************
*** 8389,8395 ****
--- 8421,8430 ----
  			     *	    100 +
  			     * ->	    here;
  			     */
+ 			    l = ml_get_curline();
  			    amount = cur_amount;
+ 			    if (*skipwhite(l) == ']' || l[STRLEN(l) - 1] == ']')
+ 				break;
  
  			    /*
  			     * If previous line ends in ',', check whether we
***************
*** 8418,8425 ****
  				     *        5,
  				     *     6,
  				     */
! 				    lookfor = LOOKFOR_NO_COMMA;
! 				    amount = get_indent();	    /* XXX */
  				    trypos = find_match_char('[',
  						      curbuf->b_ind_maxparen);
  				    if (trypos != NULL)
--- 8453,8461 ----
  				     *        5,
  				     *     6,
  				     */
! 				    if (cin_iscomment(skipwhite(l)))
! 					break;
! 				    lookfor = LOOKFOR_COMMA;
  				    trypos = find_match_char('[',
  						      curbuf->b_ind_maxparen);
  				    if (trypos != NULL)
***************
*** 8449,8455 ****
  				    cont_amount = cin_get_equal_amount(
  						       curwin->w_cursor.lnum);
  				if (lookfor != LOOKFOR_TERM
! 						 && lookfor != LOOKFOR_JS_KEY)
  				    lookfor = LOOKFOR_UNTERM;
  			    }
  			}
--- 8485,8492 ----
  				    cont_amount = cin_get_equal_amount(
  						       curwin->w_cursor.lnum);
  				if (lookfor != LOOKFOR_TERM
! 						&& lookfor != LOOKFOR_JS_KEY
! 						&& lookfor != LOOKFOR_COMMA)
  				    lookfor = LOOKFOR_UNTERM;
  			    }
  			}
*** ../vim-7.4.669/src/testdir/test3.in	2014-08-06 17:44:09.867161966 +0200
--- src/testdir/test3.in	2015-03-20 18:48:42.478174688 +0100
***************
*** 2065,2070 ****
--- 2065,2228 ----
  JSEND
  
  STARTTEST
+ :set cino=j1,J1,+2
+ /^JSSTART
+ =/^JSEND
+ ENDTEST
+ 
+ JSSTART
+ // Results of JavaScript indent
+ // 1
+ (function(){
+ var a = [
+ 'a',
+ 'b',
+ 'c',
+ 'd',
+ 'e',
+ 'f',
+ 'g',
+ 'h',
+ 'i'
+ ];
+ }())
+ 
+ // 2
+ (function(){
+ var a = [
+ 0 +
+ 5 *
+ 9 *
+ 'a',
+ 'b',
+ 0 +
+ 5 *
+ 9 *
+ 'c',
+ 'd',
+ 'e',
+ 'f',
+ 'g',
+ 'h',
+ 'i'
+ ];
+ }())
+ 
+ // 3
+ (function(){
+ var a = [
+ 0 +
+ // comment 1
+ 5 *
+ /* comment 2 */
+ 9 *
+ 'a',
+ 'b',
+ 0 +
+ 5 *
+ 9 *
+ 'c',
+ 'd',
+ 'e',
+ 'f',
+ 'g',
+ 'h',
+ 'i'
+ ];
+ }())
+ 
+ // 4
+ {
+ var a = [
+ 0,
+ 1
+ ];
+ var b;
+ var c;
+ }
+ 
+ // 5
+ {
+ var a = [
+ [
+ 0
+ ],
+ 2,
+ 3
+ ];
+ }
+ 
+ // 6
+ {
+ var a = [
+ [
+ 0,
+ 1
+ ],
+ 2,
+ 3
+ ];
+ }
+ 
+ // 7
+ {
+ var a = [
+ // [
+ 0,
+ // 1
+ // ],
+ 2,
+ 3
+ ];
+ }
+ 
+ // 8
+ var x = [
+ (function(){
+ var a,
+ b,
+ c,
+ d,
+ e,
+ f,
+ g,
+ h,
+ i;
+ })
+ ];
+ 
+ // 9
+ var a = [
+ 0 +
+ 5 *
+ 9 *
+ 'a',
+ 'b',
+ 0 +
+ 5 *
+ 9 *
+ 'c',
+ 'd',
+ 'e',
+ 'f',
+ 'g',
+ 'h',
+ 'i'
+ ];
+ 
+ // 10
+ var a,
+ b,
+ c,
+ d,
+ e,
+ f,
+ g,
+ h,
+ i;
+ JSEND
+ 
+ STARTTEST
  :g/^STARTTEST/.,/^ENDTEST/d
  :1;/start of AUTO/,$wq! test.out
  ENDTEST
*** ../vim-7.4.669/src/testdir/test3.ok	2014-08-06 17:44:09.867161966 +0200
--- src/testdir/test3.ok	2015-03-20 18:55:10.709787690 +0100
***************
*** 1832,1834 ****
--- 1832,1987 ----
  })(jQuery);
  JSEND
  
+ 
+ JSSTART
+ // Results of JavaScript indent
+ // 1
+ (function(){
+ 	var a = [
+ 	  'a',
+ 	  'b',
+ 	  'c',
+ 	  'd',
+ 	  'e',
+ 	  'f',
+ 	  'g',
+ 	  'h',
+ 	  'i'
+ 	];
+ }())
+ 
+ // 2
+ (function(){
+ 	var a = [
+ 	  0 +
+ 		5 *
+ 		9 *
+ 		'a',
+ 	  'b',
+ 	  0 +
+ 		5 *
+ 		9 *
+ 		'c',
+ 	  'd',
+ 	  'e',
+ 	  'f',
+ 	  'g',
+ 	  'h',
+ 	  'i'
+ 	];
+ }())
+ 
+ // 3
+ (function(){
+ 	var a = [
+ 	  0 +
+ 		// comment 1
+ 		5 *
+ 		/* comment 2 */
+ 		9 *
+ 		'a',
+ 	  'b',
+ 	  0 +
+ 		5 *
+ 		9 *
+ 		'c',
+ 	  'd',
+ 	  'e',
+ 	  'f',
+ 	  'g',
+ 	  'h',
+ 	  'i'
+ 	];
+ }())
+ 
+ // 4
+ {
+ 	var a = [
+ 	  0,
+ 	  1
+ 	];
+ 	var b;
+ 	var c;
+ }
+ 
+ // 5
+ {
+ 	var a = [
+ 	  [
+ 		0
+ 	  ],
+ 	  2,
+ 	  3
+ 	];
+ }
+ 
+ // 6
+ {
+ 	var a = [
+ 	  [
+ 		0,
+ 		1
+ 	  ],
+ 	  2,
+ 	  3
+ 	];
+ }
+ 
+ // 7
+ {
+ 	var a = [
+ 	  // [
+ 	  0,
+ 	  // 1
+ 	  // ],
+ 	  2,
+ 	  3
+ 	];
+ }
+ 
+ // 8
+ var x = [
+   (function(){
+ 	  var a,
+ 	  b,
+ 	  c,
+ 	  d,
+ 	  e,
+ 	  f,
+ 	  g,
+ 	  h,
+ 	  i;
+   })
+ ];
+ 
+ // 9
+ var a = [
+   0 +
+   5 *
+   9 *
+   'a',
+   'b',
+   0 +
+   5 *
+   9 *
+   'c',
+   'd',
+   'e',
+   'f',
+   'g',
+   'h',
+   'i'
+ ];
+ 
+ // 10
+ var a,
+ 	b,
+ 	c,
+ 	d,
+ 	e,
+ 	f,
+ 	g,
+ 	h,
+ 	i;
+ JSEND
+ 
*** ../vim-7.4.669/src/version.c	2015-03-20 18:11:44.971196311 +0100
--- src/version.c	2015-03-20 18:53:43.626771663 +0100
***************
*** 743,744 ****
--- 743,746 ----
  {   /* Add new patch number below this line */
+ /**/
+     670,
  /**/

-- 
ARTHUR:        What?
BLACK KNIGHT:  None shall pass.
ARTHUR:        I have no quarrel with you, good Sir knight, but I must cross
               this bridge.
BLACK KNIGHT:  Then you shall die.
                                  The Quest for the Holy Grail (Monty Python)

 /// Bram Moolenaar -- Bram@Moolenaar.net -- http://www.Moolenaar.net   \\\
///        sponsor Vim, vote for features -- http://www.Vim.org/sponsor/ \\\
\\\  an exciting new programming language -- http://www.Zimbu.org        ///
 \\\            help me help AIDS victims -- http://ICCF-Holland.org    ///