aboutsummaryrefslogtreecommitdiff
path: root/node_modules/tslint/lib/rules/preferObjectSpreadRule.js
diff options
context:
space:
mode:
Diffstat (limited to 'node_modules/tslint/lib/rules/preferObjectSpreadRule.js')
-rw-r--r--node_modules/tslint/lib/rules/preferObjectSpreadRule.js46
1 files changed, 22 insertions, 24 deletions
diff --git a/node_modules/tslint/lib/rules/preferObjectSpreadRule.js b/node_modules/tslint/lib/rules/preferObjectSpreadRule.js
index f08a648ca..c835ed693 100644
--- a/node_modules/tslint/lib/rules/preferObjectSpreadRule.js
+++ b/node_modules/tslint/lib/rules/preferObjectSpreadRule.js
@@ -28,40 +28,37 @@ var Rule = (function (_super) {
Rule.prototype.apply = function (sourceFile) {
return this.applyWithFunction(sourceFile, walk);
};
+ /* tslint:disable:object-literal-sort-keys */
+ Rule.metadata = {
+ ruleName: "prefer-object-spread",
+ description: "Enforces the use of the ES2015 object spread operator over `Object.assign()` where appropriate.",
+ rationale: "Object spread allows for better type checking and inference.",
+ optionsDescription: "Not configurable.",
+ options: null,
+ optionExamples: [true],
+ type: "functionality",
+ typescriptOnly: false,
+ hasFix: true,
+ };
+ /* tslint:enable:object-literal-sort-keys */
+ Rule.FAILURE_STRING = "Use the object spread operator instead.";
+ Rule.ASSIGNMENT_FAILURE_STRING = "'Object.assign' returns the first argument. Prefer object spread if you want a new object.";
return Rule;
}(Lint.Rules.AbstractRule));
-/* tslint:disable:object-literal-sort-keys */
-Rule.metadata = {
- ruleName: "prefer-object-spread",
- description: "Enforces the use of the ES2015 object spread operator over `Object.assign()` where appropriate.",
- rationale: "Object spread allows for better type checking and inference.",
- optionsDescription: "Not configurable.",
- options: null,
- optionExamples: [true],
- type: "functionality",
- typescriptOnly: false,
- hasFix: true,
-};
-/* tslint:enable:object-literal-sort-keys */
-Rule.FAILURE_STRING = "Use the object spread operator instead.";
-Rule.ASSIGNMENT_FAILURE_STRING = "'Object.assign' returns the first argument. Prefer object spread if you want a new object.";
exports.Rule = Rule;
function walk(ctx) {
return ts.forEachChild(ctx.sourceFile, function cb(node) {
if (tsutils_1.isCallExpression(node) && node.arguments.length !== 0 &&
tsutils_1.isPropertyAccessExpression(node.expression) && node.expression.name.text === "assign" &&
tsutils_1.isIdentifier(node.expression.expression) && node.expression.expression.text === "Object" &&
+ !ts.isFunctionLike(node.arguments[0]) &&
// Object.assign(...someArray) cannot be written as object spread
!node.arguments.some(tsutils_1.isSpreadElement)) {
if (node.arguments[0].kind === ts.SyntaxKind.ObjectLiteralExpression) {
ctx.addFailureAtNode(node, Rule.FAILURE_STRING, createFix(node, ctx.sourceFile));
}
- else {
- var parent = node.parent;
- if (parent.kind === ts.SyntaxKind.VariableDeclaration ||
- tsutils_1.isBinaryExpression(parent) && parent.operatorToken.kind === ts.SyntaxKind.EqualsToken) {
- ctx.addFailureAtNode(node, Rule.ASSIGNMENT_FAILURE_STRING, createFix(node, ctx.sourceFile));
- }
+ else if (tsutils_1.isExpressionValueUsed(node) && !tsutils_1.hasSideEffects(node.arguments[0], 2 /* Constructor */)) {
+ ctx.addFailureAtNode(node, Rule.ASSIGNMENT_FAILURE_STRING, createFix(node, ctx.sourceFile));
}
}
return ts.forEachChild(node, cb);
@@ -69,9 +66,10 @@ function walk(ctx) {
}
function createFix(node, sourceFile) {
var args = node.arguments;
+ var objectNeedsParens = node.parent.kind === ts.SyntaxKind.ArrowFunction;
var fix = [
- Lint.Replacement.replaceFromTo(node.getStart(sourceFile), args[0].getStart(sourceFile), "{"),
- new Lint.Replacement(node.end - 1, 1, "}"),
+ Lint.Replacement.replaceFromTo(node.getStart(sourceFile), args[0].getStart(sourceFile), (objectNeedsParens ? "(" : "") + "{"),
+ new Lint.Replacement(node.end - 1, 1, "}" + (objectNeedsParens ? ")" : "")),
];
for (var i = 0; i < args.length; ++i) {
var arg = args[i];
@@ -81,7 +79,7 @@ function createFix(node, sourceFile) {
if (i !== args.length - 1) {
end = args[i + 1].getStart(sourceFile);
}
- else if (args.hasTrailingComma === true) {
+ else if (args.hasTrailingComma) {
end = args.end;
}
// remove empty object iteral and the following comma if exists