3b6e51bf6958b3c822c36381412c4a93cb5a5322
[platform/framework/web/crosswalk-tizen.git] /
1 "use strict";
2
3 var _tk = require('rocambole-token');
4 var _limit = require('../limit');
5 var _parens = require('./expressionParentheses');
6
7
8 exports.format = function CallExpression(node) {
9   var openingParentheses = _tk.findNext(node.callee.endToken, '(');
10   var closingParentheses = node.endToken;
11
12   _limit.around(openingParentheses, 'CallExpressionOpeningParentheses');
13   _limit.around(closingParentheses, 'CallExpressionClosingParentheses');
14
15   var args = node['arguments'];
16
17   if (args.length) {
18     _limit.before(_tk.findNextNonEmpty(openingParentheses), 'ArgumentList');
19
20     args.forEach(function(arg) {
21       var next = _tk.findInBetween(arg.endToken, closingParentheses, ',');
22       if (next && next.value === ',') {
23         _limit.around(next, 'ArgumentComma');
24       }
25     });
26
27     _limit.after(_tk.findPrevNonEmpty(closingParentheses), 'ArgumentList');
28
29   } else {
30     _limit.after(openingParentheses, 0);
31     _limit.before(closingParentheses, 0);
32   }
33
34   // iife
35   if (node.callee.type !== 'FunctionExpression') {
36     return;
37   }
38
39   var parens = _parens.getParentheses({
40     type: 'Special',
41     startToken: node.startToken,
42     endToken: node.endToken
43   });
44
45   if (parens) {
46     _limit.after(parens.opening, 'IIFEOpeningParentheses');
47     _limit.before(parens.closing, 'IIFEClosingParentheses');
48   }
49
50 };
51
52 exports.getIndentEdges = function(node, opts) {
53
54   var openingParentheses = _tk.findNext(node.callee.endToken, '(');
55
56   if (!node.arguments.length) {
57     // it might contain comments inside even tho there are no args
58     return {
59       startToken: openingParentheses,
60       endToken: _tk.findNext(openingParentheses, ')')
61     };
62   }
63
64   var start;
65
66   function hasBr(start, end) {
67     return _tk.findInBetween(start, end, _tk.isBr);
68   }
69
70   node.arguments.some(function(arg, i, args) {
71     var prev = i ? args[i - 1].endToken.next : openingParentheses;
72     if (hasBr(prev, arg.startToken)) {
73       start = prev;
74       return true;
75     }
76   });
77
78   if (!start) {
79     // we handle BinaryExpressions here because multiple operations are grouped
80     // inside the same root node, and we need to indent if it breaks lines
81     node.arguments.some(function(arg) {
82       if (opts['CallExpression.' + arg.type] &&
83         hasBr(arg.startToken, arg.endToken)) {
84         start = arg.startToken.next;
85         return true;
86       }
87     });
88   }
89
90   return start ? {
91     startToken: start,
92     endToken: node.endToken
93   } : false;
94
95 };