Skip to content

Commit 358fd94

Browse files
authored
Merge pull request #61 from typed-ember/globals-completion
2 parents 143a4da + 0f1eb6d commit 358fd94

File tree

4 files changed

+49
-8
lines changed

4 files changed

+49
-8
lines changed

packages/core/__tests__/language-server/completions.test.ts

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -143,6 +143,33 @@ describe('Language Server: Completions', () => {
143143
expect(details.detail).toEqual('(parameter) letter: string');
144144
});
145145

146+
test('globals', () => {
147+
let code = stripIndent`
148+
import Component, { hbs } from '@glint/environment-glimmerx/component';
149+
150+
export default class MyComponent extends Component {
151+
static template = hbs\`
152+
{{deb}}
153+
\`;
154+
}
155+
`;
156+
157+
project.write('index.ts', code);
158+
159+
let server = project.startLanguageServer();
160+
let completions = server.getCompletions(project.fileURI('index.ts'), {
161+
line: 4,
162+
character: 9,
163+
});
164+
165+
let completion = completions?.find((completion) => completion.label === 'debugger');
166+
167+
expect(completion).toMatchObject({
168+
kind: CompletionItemKind.Field,
169+
label: 'debugger',
170+
});
171+
});
172+
146173
test('referencing module-scope identifiers', async () => {
147174
let code = stripIndent`
148175
import Component, { hbs } from '@glint/environment-glimmerx/component';

packages/transform/__tests__/offset-mapping.test.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ describe('Source-to-source offset mapping', () => {
142142
describe('path segments', () => {
143143
test('simple path', () => {
144144
let module = rewriteCompanionTemplate({ contents: '{{foo.bar}}' });
145-
expectTokenMapping(module, 'foo', { transformedToken: '"foo"' });
145+
expectTokenMapping(module, 'foo');
146146
expectTokenMapping(module, 'bar');
147147
});
148148

@@ -168,7 +168,7 @@ describe('Source-to-source offset mapping', () => {
168168

169169
test('simple out-of-scope paths', () => {
170170
let module = rewriteInlineTemplate({ contents: '{{foo.bar}}' });
171-
expectTokenMapping(module, 'foo', { transformedToken: '"foo"' });
171+
expectTokenMapping(module, 'foo');
172172
expectTokenMapping(module, 'bar');
173173
});
174174

@@ -263,12 +263,12 @@ describe('Source-to-source offset mapping', () => {
263263
`,
264264
});
265265

266-
expectTokenMapping(module, 'each', { occurrence: 0, transformedToken: '"each"' });
266+
expectTokenMapping(module, 'each', { occurrence: 0 });
267267
expectTokenMapping(module, 'this');
268268
expectTokenMapping(module, 'items');
269269
expectTokenMapping(module, 'num', { occurrence: 0 });
270270
expectTokenMapping(module, 'num', { occurrence: 1 });
271-
expectTokenMapping(module, 'each', { occurrence: 1, transformedToken: '"each"' });
271+
expectTokenMapping(module, 'each', { occurrence: 1 });
272272
});
273273

274274
test('angle bracket params', () => {

packages/transform/src/scope-stack.ts

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,20 @@ export default class ScopeStack {
2828
return this.top.has(identifier);
2929
}
3030

31+
public hasMatchingBinding(prefix: string): boolean {
32+
if (this.hasBinding(prefix)) {
33+
return true;
34+
}
35+
36+
for (let identifier of this.top) {
37+
if (identifier.startsWith(prefix)) {
38+
return true;
39+
}
40+
}
41+
42+
return false;
43+
}
44+
3145
private get top(): Set<string> {
3246
return this.stack[0];
3347
}

packages/transform/src/template-to-typescript.ts

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -278,12 +278,12 @@ export function templateToTypescript(
278278
}
279279

280280
function emitIdentifierReference(name: string, hbsOffset: number, hbsLength?: number): void {
281-
if (scope.hasBinding(name)) {
281+
if (scope.hasMatchingBinding(name)) {
282282
emit.identifier(name, hbsOffset, hbsLength);
283283
} else {
284-
emit.text('χ.Globals[');
285-
emit.identifier(JSON.stringify(name), hbsOffset, hbsLength ?? name.length);
286-
emit.text(']');
284+
emit.text('χ.Globals["');
285+
emit.identifier(JSON.stringify(name).slice(1, -1), hbsOffset, hbsLength ?? name.length);
286+
emit.text('"]');
287287
}
288288
}
289289

0 commit comments

Comments
 (0)