To: vim_dev@googlegroups.com
Subject: Patch 7.4.355
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.355
Problem: Several problems with Javascript indenting.
Solution: Improve Javascript indenting.
Files: src/misc1.c
*** ../vim-7.4.354/src/misc1.c 2014-07-02 18:27:44.662290695 +0200
--- src/misc1.c 2014-07-03 22:42:20.315848662 +0200
***************
*** 5382,5387 ****
--- 5382,5388 ----
static char_u *cin_skipcomment __ARGS((char_u *));
static int cin_nocode __ARGS((char_u *));
static pos_T *find_line_comment __ARGS((void));
+ static int cin_has_js_key __ARGS((char_u *text));
static int cin_islabel_skip __ARGS((char_u **));
static int cin_isdefault __ARGS((char_u *));
static char_u *after_label __ARGS((char_u *l));
***************
*** 5410,5415 ****
--- 5411,5417 ----
static int cin_skip2pos __ARGS((pos_T *trypos));
static pos_T *find_start_brace __ARGS((void));
static pos_T *find_match_paren __ARGS((int));
+ static pos_T *find_match_char __ARGS((int c, int ind_maxparen));
static int corr_ind_maxparen __ARGS((pos_T *startpos));
static int find_last_paren __ARGS((char_u *l, int start, int end));
static int find_match __ARGS((int lookfor, linenr_T ourscope));
***************
*** 5494,5500 ****
--- 5496,5533 ----
}
/*
+ * Return TRUE if "text" starts with "key:".
+ */
+ static int
+ cin_has_js_key(text)
+ char_u *text;
+ {
+ char_u *s = skipwhite(text);
+ int quote = 0;
+
+ if (*s == '\'' || *s == '"')
+ {
+ /* can be 'key': or "key": */
+ quote = *s;
+ ++s;
+ }
+ if (!vim_isIDc(*s)) /* need at least one ID character */
+ return FALSE;
+
+ while (vim_isIDc(*s))
+ ++s;
+ if (*s == quote)
+ ++s;
+
+ s = cin_skipcomment(s);
+
+ /* "::" is not a label, it's C++ */
+ return (*s == ':' && s[1] != ':');
+ }
+
+ /*
* Check if string matches "label:"; move to character after ':' if true.
+ * "*s" must point to the start of the label, if there is one.
*/
static int
cin_islabel_skip(s)
***************
*** 6621,6632 ****
find_match_paren(ind_maxparen) /* XXX */
int ind_maxparen;
{
pos_T cursor_save;
pos_T *trypos;
static pos_T pos_copy;
cursor_save = curwin->w_cursor;
! if ((trypos = findmatchlimit(NULL, '(', 0, ind_maxparen)) != NULL)
{
/* check if the ( is in a // comment */
if ((colnr_T)cin_skip2pos(trypos) > trypos->col)
--- 6654,6673 ----
find_match_paren(ind_maxparen) /* XXX */
int ind_maxparen;
{
+ return find_match_char('(', ind_maxparen);
+ }
+
+ static pos_T *
+ find_match_char(c, ind_maxparen) /* XXX */
+ int c;
+ int ind_maxparen;
+ {
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)
***************
*** 6976,6981 ****
--- 7017,7024 ----
#define LOOKFOR_NOBREAK 8
#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;
***************
*** 6986,6991 ****
--- 7029,7035 ----
int cont_amount = 0; /* amount for continuation line */
int original_line_islabel;
int added_to_amount = 0;
+ int js_cur_has_key = 0;
/* make a copy, value is changed below */
int ind_continuation = curbuf->b_ind_continuation;
***************
*** 7209,7214 ****
--- 7253,7268 ----
}
/*
+ * Are we looking at a ']' that has a match?
+ */
+ else if (*skipwhite(theline) == ']'
+ && (trypos = find_match_char('[', curbuf->b_ind_maxparen)) != NULL)
+ {
+ /* align with the line containing the '['. */
+ amount = get_indent_lnum(trypos->lnum);
+ }
+
+ /*
* Are we inside parentheses or braces?
*/ /* XXX */
else if (((trypos = find_match_paren(curbuf->b_ind_maxparen)) != NULL
***************
*** 7473,7486 ****
if (cin_iscomment(theline))
amount += curbuf->b_ind_comment;
}
-
- /*
- * Are we at least inside braces, then?
- */
else
{
trypos = tryposBrace;
-
ourscope = trypos->lnum;
start = ml_get(ourscope);
--- 7527,7539 ----
if (cin_iscomment(theline))
amount += curbuf->b_ind_comment;
}
else
{
+ /*
+ * We are inside braces, there is a { before this line at the position
+ * stored in tryposBrace.
+ */
trypos = tryposBrace;
ourscope = trypos->lnum;
start = ml_get(ourscope);
***************
*** 7502,7525 ****
}
else
{
! /*
! * that opening brace might have been on a continuation
! * line. if so, find the start of the line.
! */
curwin->w_cursor.lnum = ourscope;
! /*
! * position the cursor over the rightmost paren, so that
! * matching it will take us back to the start of the line.
! */
lnum = ourscope;
if (find_last_paren(start, '(', ')')
&& (trypos = find_match_paren(curbuf->b_ind_maxparen))
!= NULL)
lnum = trypos->lnum;
! /*
! * It could have been something like
* case 1: if (asdf &&
* ldfd) {
* }
--- 7555,7573 ----
}
else
{
! /* That opening brace might have been on a continuation
! * line. if so, find the start of the line. */
curwin->w_cursor.lnum = ourscope;
! /* Position the cursor over the rightmost paren, so that
! * matching it will take us back to the start of the line. */
lnum = ourscope;
if (find_last_paren(start, '(', ')')
&& (trypos = find_match_paren(curbuf->b_ind_maxparen))
!= NULL)
lnum = trypos->lnum;
! /* It could have been something like
* case 1: if (asdf &&
* ldfd) {
* }
***************
*** 7535,7542 ****
start_brace = BRACE_AT_END;
}
/*
! * if we're looking at a closing brace, that's where
* we want to be. otherwise, add the amount of room
* that an indent is supposed to be.
*/
--- 7583,7594 ----
start_brace = BRACE_AT_END;
}
+ /* For Javascript check if the line starts with "key:". */
+ if (curbuf->b_ind_js)
+ js_cur_has_key = cin_has_js_key(theline);
+
/*
! * If we're looking at a closing brace, that's where
* we want to be. otherwise, add the amount of room
* that an indent is supposed to be.
*/
***************
*** 7643,7649 ****
* Search backwards. If we find something we recognize, line up
* with that.
*
! * if we're looking at an open brace, indent
* the usual amount relative to the conditional
* that opens the block.
*/
--- 7695,7701 ----
* Search backwards. If we find something we recognize, line up
* with that.
*
! * If we're looking at an open brace, indent
* the usual amount relative to the conditional
* that opens the block.
*/
***************
*** 8051,8056 ****
--- 8103,8143 ----
*/
terminated = cin_isterminated(l, FALSE, TRUE);
+ if (js_cur_has_key)
+ {
+ js_cur_has_key = 0; /* only check the first line */
+ if (curbuf->b_ind_js && terminated == ',')
+ {
+ /* For Javascript we might be inside an object:
+ * key: something, <- align with this
+ * key: something
+ * or:
+ * key: something + <- align with this
+ * something,
+ * key: something
+ */
+ lookfor = LOOKFOR_JS_KEY;
+ }
+ }
+ if (lookfor == LOOKFOR_JS_KEY && cin_has_js_key(l))
+ {
+ 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 == ','))
{
***************
*** 8062,8072 ****
* bar )
*/
/*
! * position the cursor over the rightmost paren, so that
* matching it will take us back to the start of the line.
*/
(void)find_last_paren(l, '(', ')');
trypos = find_match_paren(corr_ind_maxparen(&cur_curpos));
/*
* If we are looking for ',', we also look for matching
--- 8149,8164 ----
* bar )
*/
/*
! * Position the cursor over the rightmost paren, so that
* matching it will take us back to the start of the line.
+ * Ignore a match before the start of the block.
*/
(void)find_last_paren(l, '(', ')');
trypos = find_match_paren(corr_ind_maxparen(&cur_curpos));
+ if (trypos != NULL && (trypos->lnum < tryposBrace->lnum
+ || (trypos->lnum == tryposBrace->lnum
+ && trypos->col < tryposBrace->col)))
+ trypos = NULL;
/*
* If we are looking for ',', we also look for matching
***************
*** 8117,8126 ****
* Get indent and pointer to text for current line,
* ignoring any jump label. XXX
*/
! if (!curbuf->b_ind_js)
! cur_amount = skip_label(curwin->w_cursor.lnum, &l);
! else
cur_amount = get_indent();
/*
* If this is just above the line we are indenting, and it
* starts with a '{', line it up with this line.
--- 8209,8218 ----
* Get indent and pointer to text for current line,
* ignoring any jump label. XXX
*/
! if (curbuf->b_ind_js)
cur_amount = get_indent();
+ else
+ cur_amount = skip_label(curwin->w_cursor.lnum, &l);
/*
* If this is just above the line we are indenting, and it
* starts with a '{', line it up with this line.
***************
*** 8142,8148 ****
if (*skipwhite(l) != '{')
amount += curbuf->b_ind_open_extra;
! if (curbuf->b_ind_cpp_baseclass)
{
/* have to look back, whether it is a cpp base
* class declaration or initialization */
--- 8234,8240 ----
if (*skipwhite(l) != '{')
amount += curbuf->b_ind_open_extra;
! if (curbuf->b_ind_cpp_baseclass && !curbuf->b_ind_js)
{
/* have to look back, whether it is a cpp base
* class declaration or initialization */
***************
*** 8302,8309 ****
*/
if (lookfor == LOOKFOR_INITIAL && terminated == ',')
{
! lookfor = LOOKFOR_ENUM_OR_INIT;
! cont_amount = cin_first_id_amount();
}
else
{
--- 8394,8434 ----
*/
if (lookfor == LOOKFOR_INITIAL && terminated == ',')
{
! if (curbuf->b_ind_js)
! {
! /* Search for a line ending in a comma
! * and line up with the line below it
! * (could be the current line).
! * some = [
! * 1, <- line up here
! * 2,
! * some = [
! * 3 + <- line up here
! * 4 *
! * 5,
! * 6,
! */
! lookfor = LOOKFOR_NO_COMMA;
! amount = get_indent(); /* XXX */
! trypos = find_match_char('[',
! curbuf->b_ind_maxparen);
! if (trypos != NULL)
! {
! if (trypos->lnum
! == curwin->w_cursor.lnum - 1)
! {
! /* Current line is first inside
! * [], line up with it. */
! break;
! }
! ourscope = trypos->lnum;
! }
! }
! else
! {
! lookfor = LOOKFOR_ENUM_OR_INIT;
! cont_amount = cin_first_id_amount();
! }
}
else
{
***************
*** 8313,8319 ****
/* XXX */
cont_amount = cin_get_equal_amount(
curwin->w_cursor.lnum);
! if (lookfor != LOOKFOR_TERM)
lookfor = LOOKFOR_UNTERM;
}
}
--- 8438,8445 ----
/* XXX */
cont_amount = cin_get_equal_amount(
curwin->w_cursor.lnum);
! if (lookfor != LOOKFOR_TERM
! && lookfor != LOOKFOR_JS_KEY)
lookfor = LOOKFOR_UNTERM;
}
}
***************
*** 8324,8331 ****
* Check if we are after a while (cond);
* If so: Ignore until the matching "do".
*/
! /* XXX */
! else if (cin_iswhileofdo_end(terminated))
{
/*
* Found an unterminated line after a while ();, line up
--- 8450,8456 ----
* Check if we are after a while (cond);
* If so: Ignore until the matching "do".
*/
! else if (cin_iswhileofdo_end(terminated)) /* XXX */
{
/*
* Found an unterminated line after a while ();, line up
***************
*** 8538,8555 ****
if (curbuf->b_ind_jump_label > 0 && original_line_islabel)
amount -= curbuf->b_ind_jump_label;
}
-
- /*
- * ok -- we're not inside any sort of structure at all!
- *
- * this means we're at the top level, and everything should
- * basically just match where the previous line is, except
- * for the lines immediately following a function declaration,
- * which are K&R-style parameters and need to be indented.
- */
else
{
/*
* if our line starts with an open brace, forget about any
* prevailing indent and make sure it looks like the start
* of a function
--- 8663,8678 ----
if (curbuf->b_ind_jump_label > 0 && original_line_islabel)
amount -= curbuf->b_ind_jump_label;
}
else
{
/*
+ * ok -- we're not inside any sort of structure at all!
+ *
+ * This means we're at the top level, and everything should
+ * basically just match where the previous line is, except
+ * for the lines immediately following a function declaration,
+ * which are K&R-style parameters and need to be indented.
+ *
* if our line starts with an open brace, forget about any
* prevailing indent and make sure it looks like the start
* of a function
***************
*** 8700,8705 ****
--- 8823,8840 ----
break;
/*
+ * If the previous line ends on '[' we are probably in an
+ * array constant:
+ * something = [
+ * 234, <- extra indent
+ */
+ if (cin_ends_in(l, (char_u *)"[", NULL))
+ {
+ amount = get_indent() + ind_continuation;
+ break;
+ }
+
+ /*
* Find a line only has a semicolon that belongs to a previous
* line ending in '}', e.g. before an #endif. Don't increase
* indent then.
*** ../vim-7.4.354/src/testdir/test3.in 2014-07-02 18:27:44.662290695 +0200
--- src/testdir/test3.in 2014-07-03 22:41:38.743848025 +0200
***************
*** 1432,1438 ****
STARTTEST
:set cino=(0,ts
! 2kdd=][
ENDTEST
void func(int a
--- 1432,1438 ----
STARTTEST
:set cino=(0,ts
! 2kdd2j=][
ENDTEST
void func(int a
***************
*** 1446,1452 ****
STARTTEST
:set cino=(0
! 2kdd=][
ENDTEST
void
--- 1446,1452 ----
STARTTEST
:set cino=(0
! 2kdd2j=][
ENDTEST
void
***************
*** 1461,1467 ****
STARTTEST
:set cino&
! 2kdd=7][
ENDTEST
void func(void)
--- 1461,1467 ----
STARTTEST
:set cino&
! 2kdd2j=7][
ENDTEST
void func(void)
***************
*** 1538,1544 ****
STARTTEST
:set cino&
:set cino+=l1
! 2kdd=][
ENDTEST
void func(void)
--- 1538,1544 ----
STARTTEST
:set cino&
:set cino+=l1
! 2kdd2j=][
ENDTEST
void func(void)
***************
*** 1567,1573 ****
STARTTEST
:set cino&
! 2kdd=][
ENDTEST
void func(void)
--- 1567,1573 ----
STARTTEST
:set cino&
! 2kdd2j=][
ENDTEST
void func(void)
***************
*** 1592,1598 ****
STARTTEST
:set cino&
! 2kdd=][
ENDTEST
void func(void)
--- 1592,1598 ----
STARTTEST
:set cino&
! 2kdd2j=][
ENDTEST
void func(void)
***************
*** 1919,1928 ****
JSSTART
var foo = [
! 1, // indent 8 more
2,
3
! ]; // indent 8 less
JSEND
STARTTEST
--- 1919,1928 ----
JSSTART
var foo = [
! 1,
2,
3
! ];
JSEND
STARTTEST
***************
*** 1937,1943 ****
1,
2,
3
! ]; // indent 16 less
}
JSEND
--- 1937,1943 ----
1,
2,
3
! ];
}
JSEND
***************
*** 1954,1959 ****
--- 1954,1961 ----
cond) {
stmt;
}
+ window.something.left =
+ (width - 50 + offset) + "px";
var class_name='myclass';
function private_method() {
***************
*** 1969,1983 ****
$(this).data(class_name+'_public',$.extend({},{
foo: 'bar',
! bar: 2, // indent 8 more
! foobar: [ // indent 8 more
! 1, // indent 8 more
! 2, // indent 16 more
! 3 // indent 16 more
],
! callback: function(){ // indent 8 more
! return true; // indent 8 more
! } // indent 8 more
}, options||{}));
}
--- 1971,1985 ----
$(this).data(class_name+'_public',$.extend({},{
foo: 'bar',
! bar: 2,
! foobar: [
! 1,
! 2,
! 3
],
! callback: function(){
! return true;
! }
}, options||{}));
}
***************
*** 2018,2026 ****
foo: 'bar',
bar: 2,
foobar: [
! 1, // indent 8 more
! 2, // indent 8 more
! 3 // indent 8 more
],
callback: function(){
return true;
--- 2020,2028 ----
foo: 'bar',
bar: 2,
foobar: [
! 1,
! 2,
! 3
],
callback: function(){
return true;
***************
*** 2040,2054 ****
function init(options) {
$(this).data(class_name+'_public',$.extend({},{
foo: 'bar',
! bar: 2, // indent 8 more
! foobar: [ // indent 8 more
! 1, // indent 8 more
! 2, // indent 16 more
! 3 // indent 16 more
],
! callback: function(){ // indent 8 more
! return true; // indent 8 more
! } // indent 8 more
}, options||{}));
}
})(jQuery);
--- 2042,2056 ----
function init(options) {
$(this).data(class_name+'_public',$.extend({},{
foo: 'bar',
! bar: 2,
! foobar: [
! 1,
! 2,
! 3
],
! callback: function(){
! return true;
! }
}, options||{}));
}
})(jQuery);
*** ../vim-7.4.354/src/testdir/test3.ok 2014-07-02 18:27:44.662290695 +0200
--- src/testdir/test3.ok 2014-07-03 22:18:58.167827177 +0200
***************
*** 1707,1716 ****
JSSTART
var foo = [
! 1, // indent 8 more
2,
3
! ]; // indent 8 less
JSEND
--- 1707,1716 ----
JSSTART
var foo = [
! 1,
2,
3
! ];
JSEND
***************
*** 1720,1726 ****
1,
2,
3
! ]; // indent 16 less
}
JSEND
--- 1720,1726 ----
1,
2,
3
! ];
}
JSEND
***************
*** 1732,1737 ****
--- 1732,1739 ----
cond) {
stmt;
}
+ window.something.left =
+ (width - 50 + offset) + "px";
var class_name='myclass';
function private_method() {
***************
*** 1747,1761 ****
$(this).data(class_name+'_public',$.extend({},{
foo: 'bar',
! bar: 2, // indent 8 more
! foobar: [ // indent 8 more
! 1, // indent 8 more
! 2, // indent 16 more
! 3 // indent 16 more
],
! callback: function(){ // indent 8 more
! return true; // indent 8 more
! } // indent 8 more
}, options||{}));
}
--- 1749,1763 ----
$(this).data(class_name+'_public',$.extend({},{
foo: 'bar',
! bar: 2,
! foobar: [
! 1,
! 2,
! 3
],
! callback: function(){
! return true;
! }
}, options||{}));
}
***************
*** 1791,1799 ****
foo: 'bar',
bar: 2,
foobar: [
! 1, // indent 8 more
! 2, // indent 8 more
! 3 // indent 8 more
],
callback: function(){
return true;
--- 1793,1801 ----
foo: 'bar',
bar: 2,
foobar: [
! 1,
! 2,
! 3
],
callback: function(){
return true;
***************
*** 1808,1822 ****
function init(options) {
$(this).data(class_name+'_public',$.extend({},{
foo: 'bar',
! bar: 2, // indent 8 more
! foobar: [ // indent 8 more
! 1, // indent 8 more
! 2, // indent 16 more
! 3 // indent 16 more
],
! callback: function(){ // indent 8 more
! return true; // indent 8 more
! } // indent 8 more
}, options||{}));
}
})(jQuery);
--- 1810,1824 ----
function init(options) {
$(this).data(class_name+'_public',$.extend({},{
foo: 'bar',
! bar: 2,
! foobar: [
! 1,
! 2,
! 3
],
! callback: function(){
! return true;
! }
}, options||{}));
}
})(jQuery);
*** ../vim-7.4.354/src/version.c 2014-07-03 22:54:04.911859458 +0200
--- src/version.c 2014-07-03 22:54:40.971860011 +0200
***************
*** 736,737 ****
--- 736,739 ----
{ /* Add new patch number below this line */
+ /**/
+ 355,
/**/
--
MESKIMEN'S LAW
There's never time to do it right, but always time to do it over.
/// 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 ///