"use strict"; /** * @license * Copyright 2017 Palantir Technologies, Inc. * * Licensed under the Apache License, Version 2.0 (the "License"); * you may not use this file except in compliance with the License. * You may obtain a copy of the License at * * http://www.apache.org/licenses/LICENSE-2.0 * * Unless required by applicable law or agreed to in writing, software * distributed under the License is distributed on an "AS IS" BASIS, * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. * See the License for the specific language governing permissions and * limitations under the License. */ Object.defineProperty(exports, "__esModule", { value: true }); var tslib_1 = require("tslib"); var tsutils_1 = require("tsutils"); var ts = require("typescript"); var Lint = require("../index"); var Rule = /** @class */ (function (_super) { tslib_1.__extends(Rule, _super); function Rule() { return _super !== null && _super.apply(this, arguments) || this; } Rule.FAILURE_NEEDS_SPACE = function (count) { return "Needs " + count + " whitespace" + (count > 1 ? "s" : "") + " within parentheses"; }; Rule.FAILURE_NO_EXTRA_SPACE = function (count) { return "No more than " + count + " whitespace" + (count > 1 ? "s" : "") + " within parentheses allowed"; }; Rule.prototype.apply = function (sourceFile) { return this.applyWithWalker(new SpaceWithinParensWalker(sourceFile, this.ruleName, parseOptions(this.ruleArguments[0]))); }; /* tslint:disable:object-literal-sort-keys */ Rule.metadata = { ruleName: "space-within-parens", description: "Enforces spaces within parentheses or disallow them. Empty parentheses () are always allowed.", hasFix: true, optionsDescription: Lint.Utils.dedent(templateObject_1 || (templateObject_1 = tslib_1.__makeTemplateObject(["\n You may enforce the amount of whitespace within parentheses.\n "], ["\n You may enforce the amount of whitespace within parentheses.\n "]))), options: { type: "number", min: 0 }, type: "style", typescriptOnly: false, }; /* tslint:enable:object-literal-sort-keys */ Rule.FAILURE_NO_SPACE = "Whitespace within parentheses is not allowed"; return Rule; }(Lint.Rules.AbstractRule)); exports.Rule = Rule; function parseOptions(whitespaceSize) { var size = 0; if (typeof whitespaceSize === "number") { if (whitespaceSize >= 0) { size = whitespaceSize; } } else if (typeof whitespaceSize === "string") { var parsedSize = parseInt(whitespaceSize, 10); if (!Number.isNaN(parsedSize) && parsedSize >= 0) { size = parsedSize; } } return { size: size, }; } var SpaceWithinParensWalker = /** @class */ (function (_super) { tslib_1.__extends(SpaceWithinParensWalker, _super); function SpaceWithinParensWalker() { return _super !== null && _super.apply(this, arguments) || this; } SpaceWithinParensWalker.prototype.walk = function (sourceFile) { var _this = this; tsutils_1.forEachToken(sourceFile, function (token) { if (token.kind === ts.SyntaxKind.OpenParenToken) { if (sourceFile.text.charAt(token.end) !== ")") { _this.checkOpenParenToken(token); } } else if (token.kind === ts.SyntaxKind.CloseParenToken) { if (sourceFile.text.charAt(token.end - 2) !== "(") { _this.checkCloseParenToken(token); } } }); }; SpaceWithinParensWalker.prototype.checkOpenParenToken = function (tokenNode) { var currentPos = tokenNode.end; var currentChar = this.sourceFile.text.charCodeAt(currentPos); var allowedSpaceCount = this.options.size; while (ts.isWhiteSpaceSingleLine(currentChar)) { ++currentPos; currentChar = this.sourceFile.text.charCodeAt(currentPos); } if (!ts.isLineBreak(currentChar)) { var whitespaceCount = currentPos - tokenNode.end; if (whitespaceCount !== allowedSpaceCount) { var length = 0; var pos = tokenNode.end; if (whitespaceCount > allowedSpaceCount) { pos += allowedSpaceCount; length = whitespaceCount - allowedSpaceCount; } else if (whitespaceCount > 0 && whitespaceCount < allowedSpaceCount) { pos += allowedSpaceCount - whitespaceCount; } this.addFailureAtWithFix(pos, length, whitespaceCount); } } }; SpaceWithinParensWalker.prototype.checkCloseParenToken = function (tokenNode) { var currentPos = tokenNode.end - 2; var currentChar = this.sourceFile.text.charCodeAt(currentPos); var allowedSpaceCount = this.options.size; while (ts.isWhiteSpaceSingleLine(currentChar)) { --currentPos; currentChar = this.sourceFile.text.charCodeAt(currentPos); } /** * Number 40 is open parenthese char code, we skip this cause * it's already been caught by `checkOpenParenToken` */ if (!ts.isLineBreak(currentChar) && currentChar !== 40) { var whitespaceCount = tokenNode.end - currentPos - 2; if (whitespaceCount !== allowedSpaceCount) { var length = 0; var pos = currentPos + 1; if (whitespaceCount > allowedSpaceCount) { length = whitespaceCount - allowedSpaceCount; } this.addFailureAtWithFix(pos, length, whitespaceCount); } } }; SpaceWithinParensWalker.prototype.addFailureAtWithFix = function (position, length, whitespaceCount) { var lintMsg; var lintFix; var allowedSpaceCount = this.options.size; if (allowedSpaceCount === 0) { lintMsg = Rule.FAILURE_NO_SPACE; lintFix = Lint.Replacement.deleteText(position, length); } else if (allowedSpaceCount > whitespaceCount) { lintMsg = Rule.FAILURE_NEEDS_SPACE(allowedSpaceCount - whitespaceCount); var whitespace = " ".repeat(allowedSpaceCount - whitespaceCount); lintFix = Lint.Replacement.appendText(position, whitespace); } else { lintMsg = Rule.FAILURE_NO_EXTRA_SPACE(allowedSpaceCount); lintFix = Lint.Replacement.deleteText(position, whitespaceCount - allowedSpaceCount); } this.addFailureAt(position, length, lintMsg, lintFix); }; return SpaceWithinParensWalker; }(Lint.AbstractWalker)); var templateObject_1;