Skip to content

Commit 9bfd88b

Browse files
authored
FIX @W-19772057@ Fixed oversight in selector code (#365)
1 parent 6f9fa2c commit 9bfd88b

File tree

3 files changed

+48
-8
lines changed

3 files changed

+48
-8
lines changed

packages/code-analyzer-core/package.json

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
{
22
"name": "@salesforce/code-analyzer-core",
33
"description": "Core Package for the Salesforce Code Analyzer",
4-
"version": "0.37.0",
4+
"version": "0.38.0-SNAPSHOT",
55
"author": "The Salesforce Code Analyzer Team",
66
"license": "BSD-3-Clause",
77
"homepage": "https://developer.salesforce.com/docs/platform/salesforce-code-analyzer/overview",
@@ -72,4 +72,4 @@
7272
"!src/index.ts"
7373
]
7474
}
75-
}
75+
}

packages/code-analyzer-core/src/selectors.ts

Lines changed: 8 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -24,8 +24,10 @@ export function toSelector(selectorString: string): Selector {
2424
return toComplexSelector(left, right, op);
2525
}
2626
} else {
27-
const lastComma: number = selectorString.lastIndexOf(',');
28-
const lastColon: number = selectorString.lastIndexOf(':');
27+
// If there's a close-paren in the string, only look for operators after it.
28+
const lastCloseParen: number = Math.max(selectorString.lastIndexOf(')'), 0);
29+
const lastComma: number = selectorString.slice(lastCloseParen).lastIndexOf(',');
30+
const lastColon: number = selectorString.slice(lastCloseParen).lastIndexOf(':');
2931

3032
// BASE CASE: The selector contains no commas or colons.
3133
if (lastComma === -1 && lastColon === -1) {
@@ -37,12 +39,12 @@ export function toSelector(selectorString: string): Selector {
3739
} else if (lastComma !== -1) {
3840
// Commas resolve before colons, so that "x,a:b" and "a:b,x" both resolve equivalently the combination of
3941
// "x" and "a:b".
40-
const left: string = selectorString.slice(0, lastComma);
41-
const right: string = selectorString.slice(lastComma + 1);
42+
const left: string = selectorString.slice(0, lastComma + lastCloseParen);
43+
const right: string = selectorString.slice(lastComma + lastCloseParen + 1);
4244
return toComplexSelector(left, right, ',');
4345
} else {
44-
const left: string = selectorString.slice(0, lastColon);
45-
const right: string = selectorString.slice(lastColon + 1);
46+
const left: string = selectorString.slice(0, lastColon + lastCloseParen);
47+
const right: string = selectorString.slice(lastColon + lastCloseParen + 1);
4648
return toComplexSelector(left, right, ':');
4749
}
4850
}

packages/code-analyzer-core/test/rule-selection.test.ts

Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -211,6 +211,44 @@ describe('Tests for selecting rules', () => {
211211
expect(ruleNamesFor(selection, 'stubEngine3')).toEqual(stubEngine3Rules);
212212
});
213213

214+
it.each([
215+
{
216+
selector: '(2,3):stubEngine1',
217+
engines: ['stubEngine1'],
218+
stubEngine1Rules: ['stub1RuleB', 'stub1RuleC', 'stub1RuleE'],
219+
stubEngine2Rules: [],
220+
stubEngine3Rules: []
221+
},
222+
{
223+
selector: 'stubEngine1:(2,3)',
224+
engines: ['stubEngine1'],
225+
stubEngine1Rules: ['stub1RuleB', 'stub1RuleC', 'stub1RuleE'],
226+
stubEngine2Rules: [],
227+
stubEngine3Rules: []
228+
},
229+
{
230+
selector: '(stubEngine1:2),3',
231+
engines: ['stubEngine1', 'stubEngine2', 'stubEngine3'],
232+
stubEngine1Rules: ['stub1RuleB', 'stub1RuleC', 'stub1RuleE'],
233+
stubEngine2Rules: ['stub2RuleA'],
234+
stubEngine3Rules: ['stub3RuleA']
235+
},
236+
{
237+
selector: '3,(stubEngine1:2)',
238+
engines: ['stubEngine1', 'stubEngine2', 'stubEngine3'],
239+
stubEngine1Rules: ['stub1RuleB', 'stub1RuleC', 'stub1RuleE'],
240+
stubEngine2Rules: ['stub2RuleA'],
241+
stubEngine3Rules: ['stub3RuleA']
242+
}
243+
])('Operations within parentheses resolve before operations outside them. Case: $selector', async ({selector, engines, stubEngine1Rules, stubEngine2Rules, stubEngine3Rules}) => {
244+
const selection: RuleSelection = await codeAnalyzer.selectRules([selector]);
245+
246+
expect(selection.getEngineNames()).toEqual(engines);
247+
expect(ruleNamesFor(selection, 'stubEngine1')).toEqual(stubEngine1Rules);
248+
expect(ruleNamesFor(selection, 'stubEngine2')).toEqual(stubEngine2Rules);
249+
expect(ruleNamesFor(selection, 'stubEngine3')).toEqual(stubEngine3Rules);
250+
})
251+
214252
it.each([
215253
{
216254
case: 'colons are used and multiple selectors are provided',

0 commit comments

Comments
 (0)