Skip to content

Commit 5f6d3c4

Browse files
authored
Merge pull request #674 from bmish/require-computed-property-dependencies-two-part-string
Update `require-computed-property-dependencies` rule to handle basic string concatenation in dependent keys
2 parents 70f4941 + 5e1d604 commit 5f6d3c4

File tree

2 files changed

+59
-4
lines changed

2 files changed

+59
-4
lines changed

lib/rules/require-computed-property-dependencies.js

Lines changed: 34 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ const Traverser = getTraverser();
1616
const emberUtils = require('../utils/ember');
1717
const types = require('../utils/types');
1818
const propertyGetterUtils = require('../utils/property-getter');
19+
const assert = require('assert');
1920

2021
/**
2122
* Checks whether the node is an identifier and optionally, its name.
@@ -69,6 +70,37 @@ function isEmberComputed(node) {
6970
return isIdentifier(node, 'computed') || isMemberExpression(node, 'Ember', 'computed');
7071
}
7172

73+
/**
74+
* Checks if a node looks like: 'part1' + 'part2'
75+
*
76+
* @param {ASTNode} node
77+
* @returns {boolean}
78+
*/
79+
function isTwoPartStringLiteral(node) {
80+
return (
81+
types.isBinaryExpression(node) &&
82+
types.isStringLiteral(node.left) &&
83+
types.isStringLiteral(node.right)
84+
);
85+
}
86+
87+
/**
88+
* Returns the string represented by the node.
89+
*
90+
* @param {ASTNode} node
91+
* @returns {string}
92+
*/
93+
function nodeToStringValue(node) {
94+
if (types.isStringLiteral(node)) {
95+
return node.value;
96+
} else if (isTwoPartStringLiteral(node)) {
97+
return node.left.value + node.right.value;
98+
} else {
99+
assert(false);
100+
return undefined;
101+
}
102+
}
103+
72104
/**
73105
* Builds an array by concatenating the results of a map.
74106
*
@@ -94,7 +126,7 @@ function parseComputedDependencies(args) {
94126
for (let i = 0; i < args.length - 1; i++) {
95127
const arg = args[i];
96128

97-
if (types.isStringLiteral(arg)) {
129+
if (types.isStringLiteral(arg) || isTwoPartStringLiteral(arg)) {
98130
keys.push(arg);
99131
} else {
100132
dynamicKeys.push(arg);
@@ -388,9 +420,7 @@ module.exports = {
388420
});
389421
const usedKeys = [...usedKeys1, ...usedKeys2];
390422

391-
const expandedDeclaredKeys = expandKeys(
392-
declaredDependencies.keys.map(node => node.value)
393-
);
423+
const expandedDeclaredKeys = expandKeys(declaredDependencies.keys.map(nodeToStringValue));
394424

395425
const undeclaredKeysBeforeServiceCheck = removeRedundantKeys(
396426
usedKeys

tests/lib/rules/require-computed-property-dependencies.js

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -34,6 +34,12 @@ ruleTester.run('require-computed-property-dependencies', rule, {
3434
return this.get('name');
3535
});
3636
`,
37+
// String concatenation in dependent key:
38+
`
39+
Ember.computed('na' + 'me', function() {
40+
return this.get('name');
41+
});
42+
`,
3743
// Without `Ember.`:
3844
`
3945
computed('name', function() {
@@ -729,5 +735,24 @@ ruleTester.run('require-computed-property-dependencies', rule, {
729735
},
730736
],
731737
},
738+
{
739+
// String concatenation in dependent key:
740+
code: `
741+
Ember.computed('na' + 'me', function() {
742+
return this.undeclared + this.name;
743+
});
744+
`,
745+
output: `
746+
Ember.computed('name', 'undeclared', function() {
747+
return this.undeclared + this.name;
748+
});
749+
`,
750+
errors: [
751+
{
752+
message: 'Use of undeclared dependencies in computed property: undeclared',
753+
type: 'CallExpression',
754+
},
755+
],
756+
},
732757
],
733758
});

0 commit comments

Comments
 (0)