diff --git a/packages/uni-template-compiler/__tests__/compiler-extra.spec.js b/packages/uni-template-compiler/__tests__/compiler-extra.spec.js index 3cee2701ba60c753a38839e25320f6e31ca7a954..c06045891f31136fcbf4b3c108fd7e498fbf60b2 100644 --- a/packages/uni-template-compiler/__tests__/compiler-extra.spec.js +++ b/packages/uni-template-compiler/__tests__/compiler-extra.spec.js @@ -702,5 +702,10 @@ describe('mp:compiler-extra', () => { '{{item.m0}}', 'with(this){var l0=__map(list,function(item,index){var $orig=__get_orig(item);var m0=item.length?getValue(item):null;return{$orig:$orig,m0:m0}});$mp.data=Object.assign({},{$root:{l0:l0}})}' ) + assertCodegen( + '{{getValue(item)}}', + '{{item.m0}}', + 'with(this){var l0=__map(list,function(item,index){var $orig=__get_orig(item);var m0=item.length>0?getValue(item):null;return{$orig:$orig,m0:m0}});$mp.data=Object.assign({},{$root:{l0:l0}})}' + ) }) }) diff --git a/packages/uni-template-compiler/lib/script/traverse/member-expr.js b/packages/uni-template-compiler/lib/script/traverse/member-expr.js index c8a42dd7fd33b20f2af9035d28868c092a9438c9..f24b487ceb7135e3e5cef21633c1b90a0dbc7b6e 100644 --- a/packages/uni-template-compiler/lib/script/traverse/member-expr.js +++ b/packages/uni-template-compiler/lib/script/traverse/member-expr.js @@ -2,7 +2,9 @@ const t = require('@babel/types') const traverse = require('@babel/traverse').default const { - VAR_ROOT + VAR_ROOT, + IDENTIFIER_METHOD, + IDENTIFIER_FILTER } = require('../../constants') function isMatch (name, forItem, forIndex) { @@ -42,15 +44,29 @@ function findTest (path, state) { let tests while (path.parentPath && path.key !== 'body') { if (path.key === 'consequent' || path.key === 'alternate') { - let test = t.arrayExpression([t.clone(path.container.test)]) + const testOrig = path.container.test + let test = t.arrayExpression([t.cloneDeep(testOrig)]) traverse(test, { noScope: true, - MemberExpression (path_) { + MemberExpression (memberExpressionPath) { const names = state.scoped.map(scoped => scoped.forItem) - const node = path_.node + const node = memberExpressionPath.node const objectName = node.object.name - if (objectName === VAR_ROOT || (names.includes(objectName) && path.scope.hasOwnBinding(node.property.name))) { - path_.replaceWith(node.property) + const property = node.property + const propertyName = property.name + if (objectName === VAR_ROOT || (names.includes(objectName) && (propertyName === IDENTIFIER_METHOD || propertyName === IDENTIFIER_FILTER))) { + let property + traverse(testOrig, { + noScope: true, + Identifier (identifierPath) { + const node = identifierPath.node + if (node.name === propertyName) { + property = node + identifierPath.stop() + } + } + }) + memberExpressionPath.replaceWith(property) } } })