Support ObjectExpression in static path evaluation (#4746)
This commit is contained in:
committed by
Henry Zhu
parent
d9dd32860a
commit
6bc10b5573
@@ -10,7 +10,7 @@ describe("evaluation", function () {
|
||||
visitor[type] = function (path) {
|
||||
let evaluate = path.evaluate();
|
||||
assert.equal(evaluate.confident, !notConfident);
|
||||
assert.equal(evaluate.value, value);
|
||||
assert.deepEqual(evaluate.value, value);
|
||||
};
|
||||
|
||||
traverse(parse(code, {
|
||||
@@ -63,4 +63,7 @@ describe("evaluation", function () {
|
||||
addTest("'abc' === 'xyz' || (1 === 1 && config.flag)", "LogicalExpression", undefined, true);
|
||||
addTest("'abc' === 'xyz' || (1 === 1 && 'four' === 'four')", "LogicalExpression", true);
|
||||
addTest("'abc' === 'abc' && (1 === 1 && 'four' === 'four')", "LogicalExpression", true);
|
||||
addTest("({})", "ObjectExpression", {});
|
||||
addTest("({a: '1'})", "ObjectExpression", {a: "1"});
|
||||
addTest("({['a' + 'b']: 10 * 20, 'z': [1, 2, 3]})", "ObjectExpression", {ab: 200, z: [1, 2, 3]});
|
||||
});
|
||||
|
||||
@@ -231,7 +231,34 @@ export function evaluate(): { confident: boolean; value: any } {
|
||||
}
|
||||
|
||||
if (path.isObjectExpression()) {
|
||||
// todo
|
||||
let obj = {};
|
||||
let props: Array<NodePath> = path.get("properties");
|
||||
for (let prop of props) {
|
||||
if (prop.isObjectMethod() || prop.isSpreadProperty()) {
|
||||
return deopt(prop);
|
||||
}
|
||||
const keyPath = prop.get("key");
|
||||
let key = keyPath;
|
||||
if (prop.node.computed) {
|
||||
key = key.evaluate();
|
||||
if (!key.confident) {
|
||||
return deopt(keyPath);
|
||||
}
|
||||
key = key.value;
|
||||
} else if (key.isIdentifier()) {
|
||||
key = key.node.name;
|
||||
} else {
|
||||
key = key.node.value;
|
||||
}
|
||||
const valuePath = prop.get("value");
|
||||
let value = valuePath.evaluate();
|
||||
if (!value.confident) {
|
||||
return deopt(valuePath);
|
||||
}
|
||||
value = value.value;
|
||||
obj[key] = value;
|
||||
}
|
||||
return obj;
|
||||
}
|
||||
|
||||
if (path.isLogicalExpression()) {
|
||||
|
||||
Reference in New Issue
Block a user