Skip to content

Commit fbbde80

Browse files
NullVoxPopuliclaude
andcommitted
[DRAFT] Remove getDynamicLayout/templateFor from curly component manager
The curly component manager no longer needs getDynamicLayout or templateFor. The resolver already provides templates for named components via getComponentTemplate() in lookupComponentPair(). For root components rendered via runAppend(), the template is now resolved eagerly in RootComponentDefinition's constructor via getComponentTemplate(), so the VM gets compilable directly without needing the dynamicLayout fallback. Changes: - curly.ts: Remove getDynamicLayout, templateFor, WithDynamicLayout, and set dynamicLayout: false in CURLY_CAPABILITIES - root.ts: Eagerly resolve template in RootComponentDefinition constructor via getComponentTemplate(). Keep dynamicLayout: true only for the edge case of template-less components (getDynamicLayout returns null, VM uses default template) Co-Authored-By: Claude Opus 4.6 (1M context) <noreply@anthropic.com>
1 parent c1cc192 commit fbbde80

2 files changed

Lines changed: 21 additions & 35 deletions

File tree

packages/@ember/-internals/glimmer/lib/component-managers/curly.ts

Lines changed: 3 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,4 @@
1-
import {
2-
type default as Owner,
3-
type InternalFactory,
4-
getOwner,
5-
setOwner,
6-
} from '@ember/-internals/owner';
1+
import { type default as Owner, type InternalFactory, setOwner } from '@ember/-internals/owner';
72
import { guidFor } from '@ember/-internals/utils';
83
import { addChildView, setElementView, setViewElement } from '@ember/-internals/views';
94
import type { Nullable } from '@ember/-internals/utility-types';
@@ -13,22 +8,19 @@ import { DEBUG } from '@glimmer/env';
138
import type {
149
Bounds,
1510
CapturedArguments,
16-
CompilableProgram,
1711
Destroyable,
1812
ElementOperations,
1913
Environment,
2014
InternalComponentCapabilities,
2115
PreparedArguments,
2216
VMArguments,
2317
WithCreateInstance,
24-
WithDynamicLayout,
2518
WithDynamicTagName,
2619
} from '@glimmer/interfaces';
2720
import type { Reference } from '@glimmer/reference';
2821
import { childRefFor, createComputeRef, createPrimitiveRef, valueForRef } from '@glimmer/reference';
2922
import { reifyPositional } from '@glimmer/runtime';
3023
import { EMPTY_ARRAY } from '@glimmer/util';
31-
import { unwrapTemplate } from './unwrap-template';
3224
import {
3325
beginTrackFrame,
3426
beginUntrackFrame,
@@ -40,8 +32,6 @@ import {
4032
} from '@glimmer/validator';
4133
import type Component from '../component';
4234
import type { DynamicScope } from '../renderer';
43-
import type RuntimeResolver from '../resolver';
44-
import { getComponentTemplate } from '@glimmer/manager';
4535
import {
4636
createClassNameBindingRef,
4737
createSimpleClassNameBindingRef,
@@ -125,28 +115,8 @@ type ComponentFactory = InternalFactory<
125115
};
126116

127117
export default class CurlyComponentManager
128-
implements
129-
WithCreateInstance<ComponentStateBucket>,
130-
WithDynamicLayout<ComponentStateBucket, RuntimeResolver>,
131-
WithDynamicTagName<ComponentStateBucket>
118+
implements WithCreateInstance<ComponentStateBucket>, WithDynamicTagName<ComponentStateBucket>
132119
{
133-
protected templateFor(component: Component): CompilableProgram | null {
134-
let owner = getOwner(component);
135-
assert('Component is unexpectedly missing an owner', owner);
136-
137-
let factory = getComponentTemplate(component.constructor as object);
138-
139-
if (factory === undefined) {
140-
return null;
141-
}
142-
143-
return unwrapTemplate(factory(owner)).asWrappedLayout();
144-
}
145-
146-
getDynamicLayout(bucket: ComponentStateBucket): CompilableProgram | null {
147-
return this.templateFor(bucket.component);
148-
}
149-
150120
getTagName(state: ComponentStateBucket): Nullable<string> {
151121
let { component, hasWrappedElement } = state;
152122

@@ -523,7 +493,7 @@ function rerenderInstrumentDetails(component: any): any {
523493
}
524494

525495
const CURLY_CAPABILITIES: InternalComponentCapabilities = {
526-
dynamicLayout: true,
496+
dynamicLayout: false,
527497
dynamicTag: true,
528498
prepareArgs: true,
529499
createArgs: true,

packages/@ember/-internals/glimmer/lib/component-managers/root.ts

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,16 +1,19 @@
11
import { getFactoryFor } from '@ember/-internals/container';
2+
import { getOwner } from '@ember/-internals/owner';
23
import { assert } from '@ember/debug';
34
import { _instrumentStart } from '@ember/instrumentation';
45
import { DEBUG } from '@glimmer/env';
56
import type {
7+
CompilableProgram,
68
ComponentDefinition,
79
Environment,
810
InternalComponentCapabilities,
911
Owner,
1012
VMArguments,
1113
} from '@glimmer/interfaces';
1214
import type { Nullable } from '@ember/-internals/utility-types';
13-
import { capabilityFlagsFrom } from '@glimmer/manager';
15+
import { capabilityFlagsFrom, getComponentTemplate } from '@glimmer/manager';
16+
import { unwrapTemplate } from './unwrap-template';
1417
import { CONSTANT_TAG, consumeTag } from '@glimmer/validator';
1518
import type Component from '../component';
1619
import type { DynamicScope } from '../renderer';
@@ -29,6 +32,12 @@ class RootComponentManager extends CurlyComponentManager {
2932
this.component = component;
3033
}
3134

35+
// Only called when compilable is null (component has no template).
36+
// Returns null so the VM uses its default empty template.
37+
getDynamicLayout(): CompilableProgram | null {
38+
return null;
39+
}
40+
3241
create(
3342
_owner: Owner,
3443
_state: unknown,
@@ -102,12 +111,19 @@ export class RootComponentDefinition implements ComponentDefinition {
102111
state: object;
103112
manager: RootComponentManager;
104113
capabilities = capabilityFlagsFrom(ROOT_CAPABILITIES);
105-
compilable = null;
114+
compilable: CompilableProgram | null;
106115

107116
constructor(component: Component) {
108117
this.manager = new RootComponentManager(component);
109118
let factory = getFactoryFor(component);
110119
assert('missing factory for component', factory !== undefined);
111120
this.state = factory;
121+
122+
let owner = getOwner(component);
123+
assert('missing owner for root component', owner);
124+
let templateFactory = getComponentTemplate(component.constructor as object);
125+
this.compilable = templateFactory
126+
? unwrapTemplate(templateFactory(owner)).asWrappedLayout()
127+
: null;
112128
}
113129
}

0 commit comments

Comments
 (0)