Skip to content

Commit

Permalink
feat: named slots context autocomplete
Browse files Browse the repository at this point in the history
feat: improve yield context resolution performance

feat: improve yield context resolution performance

improve named slots context autocomplete

failing test

update samples

fix slot name
  • Loading branch information
lifeart committed Apr 21, 2022
1 parent 5f3e91d commit 1fae3cd
Show file tree
Hide file tree
Showing 4 changed files with 56 additions and 7 deletions.
6 changes: 4 additions & 2 deletions src/builtin-addons/core/template-completion-provider.ts
Original file line number Diff line number Diff line change
Expand Up @@ -68,6 +68,7 @@ const mListRoutes = memoize(listRoutes, { length: 1, maxAge: 60000 });
type ScopedValuesMetadata = {
componentName: string;
index: number;
slotName: string;
};

/**
Expand Down Expand Up @@ -395,7 +396,7 @@ export default class TemplateCompletionProvider {

const [slotName, index, key] = yieldScope.split(':');

if (slotName === 'default' && `${data.index}` === index) {
if (slotName === data.slotName && `${data.index}` === index) {
const label = key.length ? `${value.label}.${key}` : `${value.label}`;
const item: CompletionItem = { ...value, label };

Expand All @@ -412,7 +413,7 @@ export default class TemplateCompletionProvider {
return [...scopedValues, ...extras];
}
getScopedValues(focusPath: ASTPath, withMeta = false): CompletionItem[] {
const scopedValues = getLocalScope(focusPath).map(({ name, node, path, componentName, index }) => {
const scopedValues = getLocalScope(focusPath).map(({ name, node, path, componentName, slotName, index }) => {
const key =
node.type === 'ElementNode'
? (node as ASTv1.ElementNode).tag
Expand All @@ -428,6 +429,7 @@ export default class TemplateCompletionProvider {
if (withMeta) {
result.data = {
componentName,
slotName,
index,
};
}
Expand Down
25 changes: 24 additions & 1 deletion src/glimmer-utils.ts
Original file line number Diff line number Diff line change
Expand Up @@ -111,11 +111,34 @@ class BlockParamDefinition {
}
get componentName() {
if (this.node.type === 'ElementNode') {
return normalizeToClassicComponent((this.node as ASTv1.ElementNode).tag);
const tagName = (this.node as ASTv1.ElementNode).tag;

if (tagName.startsWith(':')) {
const parentNode = this.path.parent as ASTv1.ElementNode;

if (parentNode && parentNode.type === 'ElementNode') {
return normalizeToClassicComponent(parentNode.tag);
}

return '(unknown)';
}

return normalizeToClassicComponent(tagName);
}

return '(unknown)';
}
get slotName() {
const node = this.node as ASTv1.ElementNode;

if (node.type === 'ElementNode') {
if (node.tag.startsWith(':')) {
return node.tag.replace(':', '');
}
}

return 'default';
}
get index(): number {
const node = this.path.node;

Expand Down
6 changes: 2 additions & 4 deletions src/utils/usages-api.ts
Original file line number Diff line number Diff line change
Expand Up @@ -150,13 +150,11 @@ async function extractTokens() {
const tokens = extractTokensFromTemplate(ast);
let yieldMeta = {};

if (kind === 'component') {
if (kind === 'component' && content.includes('{{yield')) {
try {
yieldMeta = extractYeildMetadata(ast);
} catch (e) {
yieldMeta = {
error: e.toString(),
};
yieldMeta = {};
}
}

Expand Down
26 changes: 26 additions & 0 deletions test/integration-test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -803,6 +803,32 @@ describe('integration', function () {
});

describe('Able to provide autocomplete information for local scoped params', () => {
it('support named slots context autocomplete', async () => {
const result = await getResult(
CompletionRequest.method,
connection,
{
app: {
components: {
'my-component.hbs': `{{yield (hash Foo=(component "my-component") Bar=(component "super-puper")) to="body"}}`,
'foo.hbs': ['<MyComponent>', '<:body as |b|>', '<b', '</:body>', '</MyComponent>'].join('\n'),
},
},
$meta: {
waitForTemplateTokensToBeCollected: true,
},
},
'app/components/foo.hbs',
{ line: 2, character: 2 }
);

expect(
result.response
.map((e) => e.label)
.sort()
.join(',')
).toBe('b,b.Bar,b.Foo');
});
it('support tag blocks and yiled context', async () => {
const result = await getResult(
CompletionRequest.method,
Expand Down

0 comments on commit 1fae3cd

Please # to comment.