Last active
November 2, 2016 21:57
-
-
Save jmlopez-rod/da74fd48e8f963322ba24a92947b5ed0 to your computer and use it in GitHub Desktop.
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
"use strict"; | |
var __extends = (this && this.__extends) || function (d, b) { | |
for (var p in b) if (b.hasOwnProperty(p)) d[p] = b[p]; | |
function __() { this.constructor = d; } | |
d.prototype = b === null ? Object.create(b) : (__.prototype = b.prototype, new __()); | |
}; | |
var ts = require('typescript'); | |
var Lint = require('tslint/lib/lint'); | |
var DEFAULT_VARIABLE_INDENT = 1; | |
var DEFAULT_PARAMETER_INDENT = null; | |
var DEFAULT_FUNCTION_BODY_INDENT = 1; | |
var indentType = 'space'; | |
var indentSize = 4; | |
var OPTIONS; | |
function assign(target) { | |
var sources = []; | |
for (var _i = 1; _i < arguments.length; _i++) { | |
sources[_i - 1] = arguments[_i]; | |
} | |
sources.forEach(function (source) { | |
if (source !== undefined && source !== null) { | |
for (var nextKey in source) { | |
if (source.hasOwnProperty(nextKey)) { | |
target[nextKey] = source[nextKey]; | |
} | |
} | |
} | |
}); | |
return target; | |
} | |
function isKind(node, kind) { | |
return node.kind === ts.SyntaxKind[kind]; | |
} | |
function isOneOf(node, kinds) { | |
return kinds.some(function (kind) { return node.kind === ts.SyntaxKind[kind]; }); | |
} | |
var Rule = (function (_super) { | |
__extends(Rule, _super); | |
function Rule() { | |
_super.apply(this, arguments); | |
} | |
Rule.prototype.apply = function (sourceFile) { | |
var walker = new IndentWalker(sourceFile, this.getOptions()); | |
return this.applyWithWalker(walker); | |
}; | |
Rule.metadata = { | |
ruleName: 'ter-indent', | |
description: 'enforce consistent indentation', | |
rationale: (_a = ["\n Using only one of tabs or spaces for indentation leads to more consistent editor behavior,\n cleaner diffs in version control, and easier programmatic manipulation."], _a.raw = ["\n Using only one of tabs or spaces for indentation leads to more consistent editor behavior,\n cleaner diffs in version control, and easier programmatic manipulation."], Lint.Utils.dedent(_a)), | |
optionsDescription: (_b = ["\n The string 'tab' or an integer indicating the number of spaces to use per tab.\n\n An object may be provided to fine tune the indentation rules:\n \n * `\"SwitchCase\"` (default: 0) enforces indentation level for `case` clauses in \n `switch` statements\n * `\"VariableDeclarator\"` (default: 1) enforces indentation level for `var` declarators;\n can also take an object to define separate rules for `var`,\n `let` and `const` declarations.\n * `\"outerIIFEBody\"` (default: 1) enforces indentation level for file-level IIFEs.\n * `\"MemberExpression\"` (off by default) enforces indentation level for multi-line\n property chains (except in variable declarations and assignments)\n * `\"FunctionDeclaration\"` takes an object to define rules for function declarations.\n * `\"parameters\"` (off by default) enforces indentation level for parameters in a\n function declaration. This can either be a number indicating\n indentation level, or the string `\"first\"` indicating that all\n parameters of the declaration must be aligned with the first parameter.\n * `\"body\"` (default: 1) enforces indentation level for the body of a function expression.\n * `\"FunctionExpression\"` takes an object to define rules for function declarations.\n * `\"parameters\"` (off by default) enforces indentation level for parameters in a\n function declaration. This can either be a number indicating\n indentation level, or the string `\"first\"` indicating that all\n parameters of the declaration must be aligned with the first parameter.\n * `\"body\"` (default: 1) enforces indentation level for the body of a function expression.\n "], _b.raw = ["\n The string 'tab' or an integer indicating the number of spaces to use per tab.\n\n An object may be provided to fine tune the indentation rules:\n \n * \\`\"SwitchCase\"\\` (default: 0) enforces indentation level for \\`case\\` clauses in \n \\`switch\\` statements\n * \\`\"VariableDeclarator\"\\` (default: 1) enforces indentation level for \\`var\\` declarators;\n can also take an object to define separate rules for \\`var\\`,\n \\`let\\` and \\`const\\` declarations.\n * \\`\"outerIIFEBody\"\\` (default: 1) enforces indentation level for file-level IIFEs.\n * \\`\"MemberExpression\"\\` (off by default) enforces indentation level for multi-line\n property chains (except in variable declarations and assignments)\n * \\`\"FunctionDeclaration\"\\` takes an object to define rules for function declarations.\n * \\`\"parameters\"\\` (off by default) enforces indentation level for parameters in a\n function declaration. This can either be a number indicating\n indentation level, or the string \\`\"first\"\\` indicating that all\n parameters of the declaration must be aligned with the first parameter.\n * \\`\"body\"\\` (default: 1) enforces indentation level for the body of a function expression.\n * \\`\"FunctionExpression\"\\` takes an object to define rules for function declarations.\n * \\`\"parameters\"\\` (off by default) enforces indentation level for parameters in a\n function declaration. This can either be a number indicating\n indentation level, or the string \\`\"first\"\\` indicating that all\n parameters of the declaration must be aligned with the first parameter.\n * \\`\"body\"\\` (default: 1) enforces indentation level for the body of a function expression.\n "], Lint.Utils.dedent(_b)), | |
options: { | |
type: 'array', | |
items: [{ | |
type: 'number', | |
minimum: '0' | |
}, { | |
type: 'string', | |
enum: ['tab'] | |
}, { | |
type: 'object', | |
properties: { | |
SwitchCase: { | |
type: 'number', | |
minimum: 0 | |
}, | |
VariableDeclarator: { | |
type: 'object', | |
properties: { | |
var: { | |
type: 'number', | |
minimum: 0 | |
}, | |
let: { | |
type: 'number', | |
minimum: 0 | |
}, | |
const: { | |
type: 'number', | |
minimum: 0 | |
} | |
} | |
}, | |
outerIIFEBody: { | |
type: 'number' | |
}, | |
FunctionDeclaration: { | |
type: 'object', | |
properties: { | |
parameters: { | |
type: 'number', | |
minimum: 0 | |
}, | |
body: { | |
type: 'number', | |
minimum: 0 | |
} | |
} | |
}, | |
FunctionExpression: { | |
type: 'object', | |
properties: { | |
parameters: { | |
type: 'number', | |
minimum: 0 | |
}, | |
body: { | |
type: 'number', | |
minimum: 0 | |
} | |
} | |
}, | |
MemberExpression: { | |
type: 'number' | |
} | |
}, | |
additionalProperties: false | |
}], | |
minLength: 1, | |
maxLength: 2 | |
}, | |
optionExamples: [], | |
type: 'maintainability' | |
}; | |
return Rule; | |
var _a, _b; | |
}(Lint.Rules.AbstractRule)); | |
exports.Rule = Rule; | |
var IndentWalker = (function (_super) { | |
__extends(IndentWalker, _super); | |
function IndentWalker(sourceFile, options) { | |
_super.call(this, sourceFile, options); | |
this.caseIndentStore = {}; | |
this.varIndentStore = {}; | |
OPTIONS = { | |
SwitchCase: 0, | |
VariableDeclarator: { | |
var: DEFAULT_VARIABLE_INDENT, | |
let: DEFAULT_VARIABLE_INDENT, | |
const: DEFAULT_VARIABLE_INDENT | |
}, | |
outerIIFEBody: null, | |
FunctionDeclaration: { | |
parameters: DEFAULT_PARAMETER_INDENT, | |
body: DEFAULT_FUNCTION_BODY_INDENT | |
}, | |
FunctionExpression: { | |
parameters: DEFAULT_PARAMETER_INDENT, | |
body: DEFAULT_FUNCTION_BODY_INDENT | |
} | |
}; | |
var firstParam = this.getOptions()[0]; | |
if (firstParam === 'tab') { | |
indentSize = 1; | |
indentType = 'tab'; | |
} | |
else { | |
indentSize = firstParam || 4; | |
indentType = 'space'; | |
} | |
var userOptions = this.getOptions()[1]; | |
if (userOptions) { | |
OPTIONS.SwitchCase = userOptions.SwitchCase || 0; | |
if (typeof userOptions.VariableDeclarator === 'number') { | |
OPTIONS.VariableDeclarator = { | |
var: userOptions.VariableDeclarator, | |
let: userOptions.VariableDeclarator, | |
const: userOptions.VariableDeclarator | |
}; | |
} | |
else if (typeof userOptions.VariableDeclarator === 'object') { | |
assign(OPTIONS.VariableDeclarator, userOptions.VariableDeclarator); | |
} | |
if (typeof userOptions.outerIIFEBody === 'number') { | |
OPTIONS.outerIIFEBody = userOptions.outerIIFEBody; | |
} | |
if (typeof userOptions.MemberExpression === 'number') { | |
OPTIONS.MemberExpression = userOptions.MemberExpression; | |
} | |
if (typeof userOptions.FunctionDeclaration === 'object') { | |
assign(OPTIONS.FunctionDeclaration, userOptions.FunctionDeclaration); | |
} | |
if (typeof userOptions.FunctionExpression === 'object') { | |
assign(OPTIONS.FunctionExpression, userOptions.FunctionExpression); | |
} | |
} | |
this.srcFile = sourceFile; | |
this.srcText = sourceFile.getFullText(); | |
} | |
IndentWalker.prototype.getSourceSubstr = function (start, end) { | |
return this.srcText.substr(start, end - start); | |
}; | |
IndentWalker.prototype.getLineAndCharacter = function (node, byEndLocation) { | |
if (byEndLocation === void 0) { byEndLocation = false; } | |
var index = byEndLocation ? node.getEnd() : node.getStart(); | |
return this.srcFile.getLineAndCharacterOfPosition(index); | |
}; | |
IndentWalker.prototype.getLine = function (node, byEndLocation) { | |
if (byEndLocation === void 0) { byEndLocation = false; } | |
return this.getLineAndCharacter(node, byEndLocation).line; | |
}; | |
IndentWalker.prototype.createErrorMessage = function (expectedAmount, actualSpaces, actualTabs) { | |
var expectedStatement = expectedAmount + " " + indentType + (expectedAmount === 1 ? '' : 's'); | |
var foundSpacesWord = "space" + (actualSpaces === 1 ? '' : 's'); | |
var foundTabsWord = "tab" + (actualTabs === 1 ? '' : 's'); | |
var foundStatement; | |
if (actualSpaces > 0 && actualTabs > 0) { | |
foundStatement = actualSpaces + " " + foundSpacesWord + " and " + actualTabs + " " + foundTabsWord; | |
} | |
else if (actualSpaces > 0) { | |
foundStatement = indentType === 'space' ? actualSpaces : actualSpaces + " " + foundSpacesWord; | |
} | |
else if (actualTabs > 0) { | |
foundStatement = indentType === 'tab' ? actualTabs : actualTabs + " " + foundTabsWord; | |
} | |
else { | |
foundStatement = '0'; | |
} | |
return "Expected indentation of " + expectedStatement + " but found " + foundStatement + "."; | |
}; | |
IndentWalker.prototype.report = function (node, needed, gottenSpaces, gottenTabs) { | |
if (gottenSpaces && gottenTabs) { | |
return; | |
} | |
var msg = this.createErrorMessage(needed, gottenSpaces, gottenTabs); | |
var width = gottenSpaces + gottenTabs; | |
this.addFailure(this.createFailure(node.getStart() - width, width, msg)); | |
}; | |
IndentWalker.prototype.isNodeFirstInLine = function (node, byEndLocation) { | |
if (byEndLocation === void 0) { byEndLocation = false; } | |
var token = byEndLocation ? node.getLastToken() : node.getFirstToken(); | |
var pos = token.getStart() - 1; | |
while ([' ', '\t'].indexOf(this.srcText.charAt(pos)) !== -1) { | |
pos -= 1; | |
} | |
return this.srcText.charAt(pos) === '\n'; | |
}; | |
IndentWalker.prototype.getNodeIndent = function (node) { | |
if (node === this.getSourceFile()) { | |
return { space: 0, tab: 0, goodChar: 0, badChar: 0 }; | |
} | |
if (node.kind === ts.SyntaxKind.SyntaxList) { | |
return this.getNodeIndent(node.parent); | |
} | |
var endIndex = node.getStart(); | |
var pos = endIndex - 1; | |
while (pos > 0 && this.srcText.charAt(pos) !== '\n') { | |
pos -= 1; | |
} | |
var str = this.getSourceSubstr(pos + 1, endIndex); | |
var whiteSpace = (str.match(/^\s+/) || [''])[0]; | |
var indentChars = whiteSpace.split(''); | |
var spaces = indentChars.filter(function (char) { return char === ' '; }).length; | |
var tabs = indentChars.filter(function (char) { return char === '\t'; }).length; | |
var firstInLine = false; | |
var comments = ts.getLeadingCommentRanges(node.getFullText(), 0); | |
if (comments && comments.length) { | |
var offset = node.getFullStart(); | |
var lastComment = comments[comments.length - 1]; | |
var comment = this.getSourceSubstr(lastComment.pos + offset, lastComment.end + offset); | |
if (comment.indexOf('\n') !== -1) { | |
firstInLine = true; | |
} | |
} | |
return { | |
firstInLine: spaces + tabs === str.length || firstInLine, | |
space: spaces, | |
tab: tabs, | |
goodChar: indentType === 'space' ? spaces : tabs, | |
badChar: indentType === 'space' ? tabs : spaces | |
}; | |
}; | |
IndentWalker.prototype.checkNodeIndent = function (node, neededIndent) { | |
var actualIndent = this.getNodeIndent(node); | |
if (!isKind(node, 'ArrayLiteralExpression') && | |
!isKind(node, 'ObjectLiteralExpression') && | |
(actualIndent.goodChar !== neededIndent || actualIndent.badChar !== 0) && | |
actualIndent.firstInLine) { | |
this.report(node, neededIndent, actualIndent.space, actualIndent.tab); | |
} | |
if (isKind(node, 'IfStatement')) { | |
var elseStatement = node.elseStatement; | |
if (elseStatement) { | |
var elseKeyword = node.getChildren().filter(function (ch) { return isKind(ch, 'ElseKeyword'); }).shift(); | |
this.checkNodeIndent(elseKeyword, neededIndent); | |
if (!this.isNodeFirstInLine(elseStatement)) { | |
this.checkNodeIndent(elseStatement, neededIndent); | |
} | |
} | |
} | |
}; | |
IndentWalker.prototype.isSingleLineNode = function (node) { | |
var text = node.kind === ts.SyntaxKind.SyntaxList ? node.getFullText() : node.getText(); | |
return text.indexOf('\n') === -1; | |
}; | |
IndentWalker.prototype.blockIndentationCheck = function (node) { | |
if (this.isSingleLineNode(node)) { | |
return; | |
} | |
var functionLike = ['FunctionExpression', 'FunctionDeclaration', 'ArrowFunction']; | |
if (node.parent && isOneOf(node.parent, functionLike)) { | |
this.checkIndentInFunctionBlock(node); | |
return; | |
} | |
var indent; | |
var nodesToCheck = []; | |
var statementsWithProperties = [ | |
'IfStatement', | |
'WhileStatement', | |
'ForStatement', | |
'ForInStatement', | |
'ForOfStatement', | |
'DoStatement', | |
'ClassDeclaration', | |
'ClassExpression', | |
'SourceFile' | |
]; | |
if (node.parent && isOneOf(node.parent, statementsWithProperties) && this.isNodeBodyBlock(node)) { | |
indent = this.getNodeIndent(node.parent).goodChar; | |
} | |
else { | |
indent = this.getNodeIndent(node).goodChar; | |
} | |
if (isKind(node, 'IfStatement') && !isKind(node['thenStatement'], 'Block')) { | |
nodesToCheck = [node['thenStatement']]; | |
} | |
else { | |
if (node.kind === ts.SyntaxKind.Block) { | |
nodesToCheck = node.getChildren()[1].getChildren(); | |
} | |
else if (isOneOf(node.parent, ['ClassDeclaration', 'ClassExpression'])) { | |
nodesToCheck = node.getChildren(); | |
} | |
else { | |
nodesToCheck = [node.statement]; | |
} | |
} | |
this.checkNodeIndent(node, indent); | |
if (nodesToCheck.length > 0) { | |
this.checkNodesIndent(nodesToCheck, indent + indentSize); | |
} | |
if (isKind(node, 'Block')) { | |
this.checkLastNodeLineIndent(node, indent); | |
} | |
}; | |
IndentWalker.prototype.isClassLike = function (node) { | |
return isOneOf(node, ['ClassDeclaration', 'ClassExpression']); | |
}; | |
IndentWalker.prototype.isAssignment = function (node) { | |
if (!isKind(node, 'BinaryExpression')) { | |
return false; | |
} | |
return node.operatorToken.getText() === '='; | |
}; | |
IndentWalker.prototype.isNodeBodyBlock = function (node) { | |
return node.kind === ts.SyntaxKind.Block || | |
(node.kind === ts.SyntaxKind.SyntaxList && this.isClassLike(node.parent.kind)); | |
}; | |
IndentWalker.prototype.checkFirstNodeLineIndent = function (node, firstLineIndent) { | |
var startIndent = this.getNodeIndent(node); | |
var firstInLine = startIndent.firstInLine; | |
if (firstInLine && (startIndent.goodChar !== firstLineIndent || startIndent.badChar !== 0)) { | |
this.report(node, firstLineIndent, startIndent.space, startIndent.tab); | |
} | |
}; | |
IndentWalker.prototype.checkLastNodeLineIndent = function (node, lastLineIndent) { | |
var lastToken = node.getLastToken(); | |
var endIndent = this.getNodeIndent(lastToken); | |
var firstInLine = endIndent.firstInLine; | |
if (firstInLine && (endIndent.goodChar !== lastLineIndent || endIndent.badChar !== 0)) { | |
this.report(lastToken, lastLineIndent, endIndent.space, endIndent.tab); | |
} | |
}; | |
IndentWalker.prototype.isOuterIIFE = function (node) { | |
var parent = node.parent; | |
var expressionIsNode = parent.expression !== node; | |
if (isKind(parent, 'ParenthesizedExpression')) { | |
parent = parent.parent; | |
} | |
var stmt = parent.parent; | |
if (!isKind(parent, 'CallExpression') || expressionIsNode) { | |
return false; | |
} | |
while (isKind(stmt, 'PrefixUnaryExpression') && (stmt.operator === ts.SyntaxKind.ExclamationToken || | |
stmt.operator === ts.SyntaxKind.TildeToken || | |
stmt.operator === ts.SyntaxKind.PlusToken || | |
stmt.operator === ts.SyntaxKind.MinusToken) || | |
isKind(stmt, 'BinaryExpression') || | |
isKind(stmt, 'SyntaxList') || | |
isKind(stmt, 'VariableDeclaration') || | |
isKind(stmt, 'VariableDeclarationList') || | |
isKind(stmt, 'ParenthesizedExpression')) { | |
stmt = stmt.parent; | |
} | |
return ((isKind(stmt, 'ExpressionStatement') || | |
isKind(stmt, 'VariableStatement')) && | |
stmt.parent && isKind(stmt.parent, 'SourceFile')); | |
}; | |
IndentWalker.prototype.isArgBeforeCalleeNodeMultiline = function (node) { | |
var parent = node.parent; | |
if (parent['arguments'].length >= 2 && parent['arguments'][1] === node) { | |
var firstArg = parent['arguments'][0]; | |
return this.getLine(firstArg, true) > this.getLine(firstArg); | |
} | |
return false; | |
}; | |
IndentWalker.prototype.checkIndentInFunctionBlock = function (node) { | |
var calleeNode = node.parent; | |
var indent = this.getNodeIndent(calleeNode).goodChar; | |
if (calleeNode.parent.kind === ts.SyntaxKind.CallExpression) { | |
var calleeParent = calleeNode.parent; | |
if (calleeNode.kind !== ts.SyntaxKind.FunctionExpression && calleeNode.kind !== ts.SyntaxKind.ArrowFunction) { | |
if (calleeParent && this.getLine(calleeParent) < this.getLine(node)) { | |
indent = this.getNodeIndent(calleeParent).goodChar; | |
} | |
} | |
else { | |
var callee = calleeParent.expression; | |
if (this.isArgBeforeCalleeNodeMultiline(calleeNode) && | |
this.getLine(callee) === this.getLine(callee, true) && | |
!this.isNodeFirstInLine(calleeNode)) { | |
indent = this.getNodeIndent(calleeParent).goodChar; | |
} | |
} | |
} | |
var functionOffset = indentSize; | |
if (OPTIONS.outerIIFEBody !== null && this.isOuterIIFE(calleeNode)) { | |
functionOffset = OPTIONS.outerIIFEBody * indentSize; | |
} | |
else if (calleeNode.kind === ts.SyntaxKind.FunctionExpression) { | |
functionOffset = OPTIONS.FunctionExpression.body * indentSize; | |
} | |
else if (calleeNode.kind === ts.SyntaxKind.FunctionDeclaration) { | |
functionOffset = OPTIONS.FunctionDeclaration.body * indentSize; | |
} | |
indent += functionOffset; | |
var parentVarNode = this.getVariableDeclaratorNode(node); | |
if (parentVarNode && this.isNodeInVarOnTop(node, parentVarNode)) { | |
var varKind = parentVarNode.parent.getFirstToken().getText(); | |
indent += indentSize * OPTIONS.VariableDeclarator[varKind]; | |
} | |
if (node.statements.length) { | |
this.checkNodesIndent(node.statements, indent); | |
} | |
this.checkLastNodeLineIndent(node, indent - functionOffset); | |
}; | |
IndentWalker.prototype.checkNodesIndent = function (nodes, indent) { | |
var _this = this; | |
nodes.forEach(function (node) { return _this.checkNodeIndent(node, indent); }); | |
}; | |
IndentWalker.prototype.expectedCaseIndent = function (node, switchIndent) { | |
var switchNode = (node.kind === ts.SyntaxKind.SwitchStatement) ? node : node.parent; | |
var line = this.getLine(switchNode); | |
var caseIndent; | |
if (this.caseIndentStore[line]) { | |
return this.caseIndentStore[line]; | |
} | |
else { | |
if (typeof switchIndent === 'undefined') { | |
switchIndent = this.getNodeIndent(switchNode).goodChar; | |
} | |
caseIndent = switchIndent + (indentSize * OPTIONS.SwitchCase); | |
this.caseIndentStore[line] = caseIndent; | |
return caseIndent; | |
} | |
}; | |
IndentWalker.prototype.expectedVarIndent = function (node, varIndent) { | |
var varNode = node.parent.parent; | |
var line = this.getLine(varNode); | |
var indent; | |
if (this.varIndentStore[line]) { | |
return this.varIndentStore[line]; | |
} | |
else { | |
if (typeof varIndent === 'undefined') { | |
varIndent = this.getNodeIndent(varNode).goodChar; | |
} | |
var varKind = varNode.getFirstToken().getText(); | |
indent = varIndent + (indentSize * OPTIONS.VariableDeclarator[varKind]); | |
this.varIndentStore[line] = indent; | |
return indent; | |
} | |
}; | |
IndentWalker.prototype.getParentNodeByType = function (node, kind) { | |
var parent = node.parent; | |
while (parent.kind !== kind && parent.kind !== ts.SyntaxKind.SourceFile) { | |
parent = parent.parent; | |
} | |
return parent.kind === kind ? parent : null; | |
}; | |
IndentWalker.prototype.getVariableDeclaratorNode = function (node) { | |
return this.getParentNodeByType(node, ts.SyntaxKind.VariableDeclaration); | |
}; | |
IndentWalker.prototype.getBinaryExpressionNode = function (node) { | |
return this.getParentNodeByType(node, ts.SyntaxKind.BinaryExpression); | |
}; | |
IndentWalker.prototype.checkIndentInArrayOrObjectBlock = function (node) { | |
if (this.isSingleLineNode(node)) { | |
return; | |
} | |
var elements = isKind(node, 'ObjectLiteralExpression') ? node['properties'] : node['elements']; | |
elements = elements.filter(function (elem) { | |
return elem.getText() !== ''; | |
}); | |
if (elements.length && this.getLine(elements[0]) === this.getLine(node)) { | |
return; | |
} | |
var nodeLine = this.getLine(node); | |
var nodeEndLine = this.getLine(node, true); | |
if (elements.length) { | |
var firstElementLine = this.getLine(elements[0]); | |
if (nodeLine === firstElementLine) { | |
return; | |
} | |
} | |
var nodeIndent; | |
var elementsIndent; | |
var varKind; | |
var parentVarNode = this.getVariableDeclaratorNode(node); | |
if (this.isNodeFirstInLine(node)) { | |
var parent_1 = node.parent; | |
var effectiveParent = parent_1; | |
if (parent_1.kind === ts.SyntaxKind.PropertyDeclaration) { | |
if (this.isNodeFirstInLine(parent_1)) { | |
effectiveParent = parent_1.parent.parent; | |
} | |
else { | |
effectiveParent = parent_1.parent; | |
} | |
} | |
nodeIndent = this.getNodeIndent(effectiveParent).goodChar; | |
if (parentVarNode && this.getLine(parentVarNode) !== nodeLine) { | |
if (!isKind(parent_1, 'VariableDeclaration') || parentVarNode === parentVarNode.parent.declarations[0]) { | |
var parentVarLine = this.getLine(parentVarNode); | |
var effectiveParentLine = this.getLine(effectiveParent); | |
if (isKind(parent_1, 'VariableDeclaration') && parentVarLine === effectiveParentLine) { | |
varKind = parentVarNode.parent.getFirstToken().getText(); | |
nodeIndent = nodeIndent + (indentSize * OPTIONS.VariableDeclarator[varKind]); | |
} | |
else if (isOneOf(parent_1, [ | |
'ObjectLiteralExpression', | |
'ArrayLiteralExpression', | |
'CallExpression', | |
'ArrowFunction', | |
'NewExpression', | |
'BinaryExpression' | |
])) { | |
nodeIndent = nodeIndent + indentSize; | |
} | |
} | |
} | |
else if (!parentVarNode && | |
!this.isFirstArrayElementOnSameLine(parent_1) && | |
effectiveParent.kind !== ts.SyntaxKind.PropertyAccessExpression && | |
effectiveParent.kind !== ts.SyntaxKind.ExpressionStatement && | |
effectiveParent.kind !== ts.SyntaxKind.PropertyAssignment && | |
!(this.isAssignment(effectiveParent))) { | |
nodeIndent = nodeIndent + indentSize; | |
} | |
elementsIndent = nodeIndent + indentSize; | |
this.checkFirstNodeLineIndent(node, nodeIndent); | |
} | |
else { | |
nodeIndent = this.getNodeIndent(node).goodChar; | |
elementsIndent = nodeIndent + indentSize; | |
} | |
if (parentVarNode && this.isNodeInVarOnTop(node, parentVarNode)) { | |
varKind = parentVarNode.parent.getFirstToken().getText(); | |
elementsIndent += indentSize * OPTIONS.VariableDeclarator[varKind]; | |
} | |
this.checkNodesIndent(elements, elementsIndent); | |
if (elements.length > 0) { | |
var lastLine = this.getLine(elements[elements.length - 1], true); | |
if (lastLine === nodeEndLine) { | |
return; | |
} | |
} | |
this.checkLastNodeLineIndent(node, elementsIndent - indentSize); | |
}; | |
IndentWalker.prototype.isFirstArrayElementOnSameLine = function (node) { | |
if (isKind(node, 'ArrayLiteralExpression')) { | |
var ele = node.elements[0]; | |
if (ele) { | |
return isKind(ele, 'ObjectLiteralExpression') && this.getLine(ele) === this.getLine(node); | |
} | |
} | |
return false; | |
}; | |
IndentWalker.prototype.isNodeInVarOnTop = function (node, varNode) { | |
var nodeLine = this.getLine(node); | |
var parentLine = this.getLine(varNode.parent); | |
return varNode && | |
parentLine === nodeLine && | |
varNode.parent.declarations.length > 1; | |
}; | |
IndentWalker.prototype.blockLessNodes = function (node) { | |
if (!isKind(node.statement, 'Block')) { | |
this.blockIndentationCheck(node); | |
} | |
}; | |
IndentWalker.prototype.checkIndentInVariableDeclarations = function (node) { | |
var indent = this.expectedVarIndent(node); | |
this.checkNodeIndent(node, indent); | |
}; | |
IndentWalker.prototype.visitCase = function (node) { | |
if (this.isSingleLineNode(node)) { | |
return; | |
} | |
var caseIndent = this.expectedCaseIndent(node); | |
this.checkNodesIndent(node.statements, caseIndent + indentSize); | |
}; | |
IndentWalker.prototype.visitClassDeclaration = function (node) { | |
var len = node.getChildCount(); | |
this.blockIndentationCheck(node.getChildAt(len - 2)); | |
_super.prototype.visitClassDeclaration.call(this, node); | |
}; | |
IndentWalker.prototype.visitClassExpression = function (node) { | |
var len = node.getChildCount(); | |
this.blockIndentationCheck(node.getChildAt(len - 2)); | |
_super.prototype.visitClassExpression.call(this, node); | |
}; | |
IndentWalker.prototype.visitBlock = function (node) { | |
this.blockIndentationCheck(node); | |
_super.prototype.visitBlock.call(this, node); | |
}; | |
IndentWalker.prototype.visitIfStatement = function (node) { | |
var thenLine = this.getLine(node.thenStatement); | |
var line = this.getLine(node); | |
if (node.thenStatement.kind !== ts.SyntaxKind.Block && thenLine > line) { | |
this.blockIndentationCheck(node); | |
} | |
_super.prototype.visitIfStatement.call(this, node); | |
}; | |
IndentWalker.prototype.visitObjectLiteralExpression = function (node) { | |
this.checkIndentInArrayOrObjectBlock(node); | |
_super.prototype.visitObjectLiteralExpression.call(this, node); | |
}; | |
IndentWalker.prototype.visitArrayLiteralExpression = function (node) { | |
this.checkIndentInArrayOrObjectBlock(node); | |
_super.prototype.visitArrayLiteralExpression.call(this, node); | |
}; | |
IndentWalker.prototype.visitSwitchStatement = function (node) { | |
var switchIndent = this.getNodeIndent(node).goodChar; | |
var caseIndent = this.expectedCaseIndent(node, switchIndent); | |
this.checkNodesIndent(node.caseBlock.clauses, caseIndent); | |
this.checkLastNodeLineIndent(node, switchIndent); | |
_super.prototype.visitSwitchStatement.call(this, node); | |
}; | |
IndentWalker.prototype.visitCaseClause = function (node) { | |
this.visitCase(node); | |
_super.prototype.visitCaseClause.call(this, node); | |
}; | |
IndentWalker.prototype.visitDefaultClause = function (node) { | |
this.visitCase(node); | |
_super.prototype.visitDefaultClause.call(this, node); | |
}; | |
IndentWalker.prototype.visitWhileStatement = function (node) { | |
this.blockLessNodes(node); | |
_super.prototype.visitWhileStatement.call(this, node); | |
}; | |
IndentWalker.prototype.visitForStatement = function (node) { | |
this.blockLessNodes(node); | |
_super.prototype.visitForStatement.call(this, node); | |
}; | |
IndentWalker.prototype.visitForInStatement = function (node) { | |
this.blockLessNodes(node); | |
_super.prototype.visitForInStatement.call(this, node); | |
}; | |
IndentWalker.prototype.visitDoStatement = function (node) { | |
this.blockLessNodes(node); | |
_super.prototype.visitDoStatement.call(this, node); | |
}; | |
IndentWalker.prototype.visitVariableDeclaration = function (node) { | |
this.checkIndentInVariableDeclarations(node); | |
_super.prototype.visitVariableDeclaration.call(this, node); | |
}; | |
IndentWalker.prototype.visitVariableStatement = function (node) { | |
_super.prototype.visitVariableStatement.call(this, node); | |
var list = node.getChildAt(0).getChildAt(1); | |
if (!list) { | |
return; | |
} | |
var len = list.getChildCount(); | |
var lastElement = list.getChildAt(len - 1); | |
var lastToken = node.getLastToken(); | |
var lastTokenLine = this.getLine(lastToken, true); | |
var lastElementLine = this.getLine(lastElement, true); | |
if (lastTokenLine <= lastElementLine) { | |
return; | |
} | |
var tokenBeforeLastElement = list.getChildAt(len - 2); | |
if (isKind(tokenBeforeLastElement, 'CommaToken')) { | |
this.checkLastNodeLineIndent(node, this.getNodeIndent(tokenBeforeLastElement).goodChar); | |
} | |
else { | |
} | |
}; | |
IndentWalker.prototype.visitFunctionDeclaration = function (node) { | |
if (this.isSingleLineNode(node)) { | |
return; | |
} | |
if (OPTIONS.FunctionDeclaration.parameters === 'first' && node.parameters.length) { | |
var indent = this.getLineAndCharacter(node.parameters[0]).character; | |
this.checkNodesIndent(node.parameters.slice(1), indent); | |
} | |
else if (OPTIONS.FunctionDeclaration.parameters !== null) { | |
this.checkNodesIndent(node.parameters, this.getNodeIndent(node).goodChar + indentSize * OPTIONS.FunctionDeclaration.parameters); | |
} | |
_super.prototype.visitFunctionDeclaration.call(this, node); | |
}; | |
IndentWalker.prototype.visitFunctionExpression = function (node) { | |
if (this.isSingleLineNode(node)) { | |
return; | |
} | |
if (OPTIONS.FunctionExpression.parameters === 'first' && node.parameters.length) { | |
var indent = this.getLineAndCharacter(node.parameters[0]).character; | |
this.checkNodesIndent(node.parameters.slice(1), indent); | |
} | |
else if (OPTIONS.FunctionExpression.parameters !== null) { | |
this.checkNodesIndent(node.parameters, this.getNodeIndent(node).goodChar + indentSize * OPTIONS.FunctionExpression.parameters); | |
} | |
_super.prototype.visitFunctionExpression.call(this, node); | |
}; | |
IndentWalker.prototype.visitPropertyAccessExpression = function (node) { | |
if (typeof OPTIONS.MemberExpression === 'undefined') { | |
return; | |
} | |
if (this.isSingleLineNode(node)) { | |
return; | |
} | |
if (this.getVariableDeclaratorNode(node)) { | |
return; | |
} | |
var binaryNode = this.getBinaryExpressionNode(node); | |
if (binaryNode && this.isAssignment(binaryNode)) { | |
return; | |
} | |
var propertyIndent = this.getNodeIndent(node).goodChar + indentSize * OPTIONS.MemberExpression; | |
var dotToken = node.getChildAt(1); | |
var checkNodes = [node.name, dotToken]; | |
this.checkNodesIndent(checkNodes, propertyIndent); | |
_super.prototype.visitPropertyAccessExpression.call(this, node); | |
}; | |
IndentWalker.prototype.visitSourceFile = function (node) { | |
this.checkNodesIndent(node.statements, 0); | |
_super.prototype.visitSourceFile.call(this, node); | |
}; | |
return IndentWalker; | |
}(Lint.RuleWalker)); | |
//# sourceMappingURL=data:application/json;charset=utf8;base64,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QUFDLHlCQUF5QixDQUFDLElBQUksQ0FBQyxDQUFDLENBQUMsQ0FBQztZQUN6QyxNQUFNLENBQUM7UUFDVCxDQUFDO1FBRUQsSUFBTSxVQUFVLEdBQXdCLElBQUksQ0FBQyx1QkFBdUIsQ0FBQyxJQUFJLENBQUMsQ0FBQztRQUMzRSxFQUFFLENBQUMsQ0FBQyxVQUFVLElBQUksSUFBSSxDQUFDLFlBQVksQ0FBQyxVQUFVLENBQUMsQ0FBQyxDQUFDLENBQUM7WUFDaEQsTUFBTSxDQUFDO1FBQ1QsQ0FBQztRQUVELElBQU0sY0FBYyxHQUFHLElBQUksQ0FBQyxhQUFhLENBQUMsSUFBSSxDQUFDLENBQUMsUUFBUSxHQUFHLFVBQVUsR0FBRyxPQUFPLENBQUMsZ0JBQWdCLENBQUM7UUFJakcsSUFBTSxRQUFRLEdBQUcsSUFBSSxDQUFDLFVBQVUsQ0FBQyxDQUFDLENBQUMsQ0FBQztRQUNwQyxJQUFNLFVBQVUsR0FBRyxDQUFDLElBQUksQ0FBQyxJQUFJLEVBQUUsUUFBUSxDQUFDLENBQUM7UUFFekMsSUFBSSxDQUFDLGdCQUFnQixDQUFDLFVBQVUsRUFBRSxjQUFjLENBQUMsQ0FBQztRQUNsRCxnQkFBSyxDQUFDLDZCQUE2QixZQUFDLElBQUksQ0FBQyxDQUFDO0lBQzVDLENBQUM7SUFFUyxzQ0FBZSxHQUF6QixVQUEwQixJQUFtQjtRQUUzQyxJQUFJLENBQUMsZ0JBQWdCLENBQUMsSUFBSSxDQUFDLFVBQVUsRUFBRSxDQUFDLENBQUMsQ0FBQztRQUMxQyxnQkFBSyxDQUFDLGVBQWUsWUFBQyxJQUFJLENBQUMsQ0FBQztJQUM5QixDQUFDO0lBQ0gsbUJBQUM7QUFBRCxDQWwxQkEsQUFrMUJDLENBbDFCMEIsSUFBSSxDQUFDLFVBQVUsR0FrMUJ6QyIsImZpbGUiOiJydWxlcy90ZXJJbmRlbnRSdWxlLmpzIiwic291cmNlUm9vdCI6Ii9Vc2Vycy9qbWxvcGV6L1dvcmtzcGFjZS90c2xpbnQtZXNsaW50LXJ1bGVzL3NyYyJ9 |
Sign up for free
to join this conversation on GitHub.
Already have an account?
Sign in to comment