Skip to content

Commit 177df97

Browse files
committed
[INTERNAL] ASTUtils: Enable ObjectPattern and ArrayPattern as VariableDeclaration Id
1 parent 460a961 commit 177df97

File tree

3 files changed

+57
-11
lines changed

3 files changed

+57
-11
lines changed

lib/lbt/utils/ASTUtils.js

Lines changed: 9 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -47,18 +47,17 @@ function isNamedObject(node, objectPath, length) {
4747
}
4848

4949
function isIdentifier(node, name) {
50-
if ( node.type != Syntax.Identifier ) {
51-
return false;
52-
}
53-
if ( typeof name == "string" ) {
50+
if ( node.type === Syntax.Identifier && typeof name == "string" ) {
5451
return name === node.name;
52+
} else if ( node.type === Syntax.Identifier && Array.isArray(name) ) {
53+
return name.find((name) => name === node.name || name === "*") !== undefined;
54+
} else if ( node.type === Syntax.ObjectPattern ) {
55+
return node.properties.filter((childnode) => isIdentifier(childnode.key, name)).length > 0;
56+
} else if ( node.type === Syntax.ArrayPattern ) {
57+
return node.elements.filter((childnode) => isIdentifier(childnode, name)).length > 0;
58+
} else {
59+
return false;
5560
}
56-
for (let i = 0; i < name.length; i++) {
57-
if ( name[i] === node.name || name[i] === "*" ) {
58-
return true;
59-
}
60-
}
61-
return false;
6261
}
6362

6463
function getPropertyKey(property) {

test/fixtures/lbt/modules/es6-syntax.js

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -83,6 +83,16 @@ sap.ui.define([
8383
// TODO: This is not detected as conditional dependency
8484
// m1 ?? sap.ui.require(['conditional/module11']);
8585

86+
// ObjectPattern as Id
87+
const {module1, module2} = {
88+
module1: sap.ui.require(['conditional/module1'], function(){}),
89+
module2: sap.ui.require(['conditional/module1'], function(){})
90+
};
8691

92+
// ArrayPattern as Id
93+
const [module1a, module2b] = [
94+
sap.ui.require(['conditional/module1'], function(){}),
95+
sap.ui.require(['conditional/module1'], function(){})
96+
];
8797

8898
});

test/lib/lbt/utils/ASTUtils.js

Lines changed: 38 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,7 @@ test("isBoolean", (t) => {
4040
t.false(ASTUtils.isBoolean(falseLiteral, true), "is a literal and value does not matches");
4141
});
4242

43-
test("isIdentifier", (t) => {
43+
test("isIdentifier (identifier)", (t) => {
4444
const literal = parseJS("'testValue47'").body[0].expression;
4545

4646
t.false(ASTUtils.isIdentifier(literal), "A literal is not an identifier");
@@ -58,6 +58,36 @@ test("isIdentifier", (t) => {
5858
t.false(ASTUtils.isIdentifier(identifier, [], "value does not match"));
5959
});
6060

61+
test("isIdentifier (object pattern)", (t) => {
62+
const identifier = parseJS("const { a, b } = { a: 'x', b: 'y' }").body[0].declarations[0].id;
63+
64+
t.true(ASTUtils.isIdentifier(identifier, ["*"], "asterisk matches any string"));
65+
t.true(ASTUtils.isIdentifier(identifier, ["a"], "value matches"));
66+
t.true(ASTUtils.isIdentifier(identifier, "a"), "value matches");
67+
t.true(ASTUtils.isIdentifier(identifier, ["b"], "value matches"));
68+
t.true(ASTUtils.isIdentifier(identifier, "b"), "value matches");
69+
70+
t.false(ASTUtils.isIdentifier(identifier, ""), "value does not match");
71+
t.false(ASTUtils.isIdentifier(identifier, "*"), "value does not match");
72+
t.false(ASTUtils.isIdentifier(identifier, "c"), "value does not match");
73+
t.false(ASTUtils.isIdentifier(identifier, [], "value does not match"));
74+
});
75+
76+
test("isIdentifier (arry pattern)", (t) => {
77+
const identifier = parseJS("const [ a, b ] = [ 'x', 'y' ]").body[0].declarations[0].id;
78+
79+
t.true(ASTUtils.isIdentifier(identifier, ["*"], "asterisk matches any string"));
80+
t.true(ASTUtils.isIdentifier(identifier, ["a"], "value matches"));
81+
t.true(ASTUtils.isIdentifier(identifier, "a"), "value matches");
82+
t.true(ASTUtils.isIdentifier(identifier, ["b"], "value matches"));
83+
t.true(ASTUtils.isIdentifier(identifier, "b"), "value matches");
84+
85+
t.false(ASTUtils.isIdentifier(identifier, ""), "value does not match");
86+
t.false(ASTUtils.isIdentifier(identifier, "*"), "value does not match");
87+
t.false(ASTUtils.isIdentifier(identifier, "c"), "value does not match");
88+
t.false(ASTUtils.isIdentifier(identifier, [], "value does not match"));
89+
});
90+
6191

6292
test("isNamedObject", (t) => {
6393
const identifier = parseJS("testValue47").body[0].expression;
@@ -136,6 +166,13 @@ test("getPropertyKey (spread element)", (t) => {
136166
"spread elements in object expressions should be ignored");
137167
});
138168

169+
test("getPropertyKey (object pattern)", (t) => {
170+
const propertiesWithObjectPattern =
171+
parseJS("const { a, b } = { a: 'x', b: 'y' }").body[0].declarations[0].init.properties;
172+
t.is(ASTUtils.getPropertyKey(propertiesWithObjectPattern[0]), "a",
173+
"object pattern in variable declaration");
174+
});
175+
139176
test("findOwnProperty", (t) => {
140177
const literal = cleanse(parseJS("'x'").body[0].expression);
141178
const identifier = cleanse(parseJS("a").body[0].expression);

0 commit comments

Comments
 (0)