diff --git a/packages/@ember/-internals/metal/lib/computed.ts b/packages/@ember/-internals/metal/lib/computed.ts index f5850f23474..bbbe2af1f6e 100644 --- a/packages/@ember/-internals/metal/lib/computed.ts +++ b/packages/@ember/-internals/metal/lib/computed.ts @@ -323,10 +323,6 @@ export class ComputedProperty extends ComputedDescriptor { ) ); - if (DEBUG) { - ALLOW_CYCLES!.set(tagFor(obj, keyName), true); - } - if (this._hasConfig === false) { assert( `Attempted to use @computed on ${keyName}, but it did not have a getter or a setter. You must either pass a get a function or getter/setter to @computed directly (e.g. \`@computed({ get() { ... } })\`) or apply @computed directly to a getter/setter`, @@ -408,6 +404,10 @@ export class ComputedProperty extends ComputedDescriptor { if (_dependentKeys !== undefined) { updateTag(propertyTag!, getChainTagsForKeys(obj, _dependentKeys, tagMeta, meta)); + + if (DEBUG) { + ALLOW_CYCLES!.set(propertyTag, true); + } } meta.setValueFor(keyName, ret); @@ -483,6 +483,10 @@ export class ComputedProperty extends ComputedDescriptor { if (_dependentKeys !== undefined) { updateTag(propertyTag, getChainTagsForKeys(obj, _dependentKeys, tagMeta, meta)); + + if (DEBUG) { + ALLOW_CYCLES!.set(propertyTag, true); + } } meta.setRevisionFor(keyName, valueForTag(propertyTag)); diff --git a/packages/@ember/-internals/runtime/tests/system/object/computed_test.js b/packages/@ember/-internals/runtime/tests/system/object/computed_test.js index 40078e3fe59..369dcc40261 100644 --- a/packages/@ember/-internals/runtime/tests/system/object/computed_test.js +++ b/packages/@ember/-internals/runtime/tests/system/object/computed_test.js @@ -6,6 +6,7 @@ import { getWithDefault, observer, defineProperty, + notifyPropertyChange, } from '@ember/-internals/metal'; import { oneWay as reads } from '@ember/object/computed'; import { A as EmberArray, isArray } from '../../..'; @@ -540,5 +541,28 @@ moduleFor( assert.ok(true); } + + ['@test computeds can have cycles'](assert) { + class CycleObject { + // eslint-disable-next-line getter-return + @computed('bar') + get foo() {} + + // eslint-disable-next-line getter-return + @computed('foo') + get bar() {} + } + + let obj = new CycleObject(); + + obj.bar; + obj.foo; + + notifyPropertyChange(obj, 'bar'); + + obj.foo; + + assert.ok(true); + } } );