Skip to content

Commit

Permalink
Merge pull request #567 from typed-ember/embedded-template-completions
Browse files Browse the repository at this point in the history
  • Loading branch information
dfreeman authored Apr 28, 2023
2 parents 7280fe3 + cd520d2 commit ac451f3
Show file tree
Hide file tree
Showing 3 changed files with 39 additions and 15 deletions.
22 changes: 21 additions & 1 deletion packages/core/__tests__/language-server/completions.test.ts
Original file line number Diff line number Diff line change
Expand Up @@ -57,7 +57,7 @@ describe('Language Server: Completions', () => {
expect(completions).toBeUndefined();
});

test('in a template with syntax errors', () => {
test('in a companion template with syntax errors', () => {
project.setGlintConfig({ environment: 'ember-loose' });

let code = stripIndent`
Expand All @@ -77,6 +77,26 @@ describe('Language Server: Completions', () => {
expect(completions).toBeUndefined();
});

test('in an embedded template with syntax errors', () => {
project.setGlintConfig({ environment: 'ember-template-imports' });

let code = stripIndent`
<template>Hello, {{this.target.}}!</template>
`;

project.write('index.gts', code);

let server = project.startLanguageServer();
let completions = server.getCompletions(project.fileURI('index.gts'), {
line: 0,
character: 31,
});

// Ensure we don't spew all ~900 completions available at the top level
// in module scope in a JS/TS file.
expect(completions).toBeUndefined();
});

test('passing component args', () => {
let code = stripIndent`
import Component, { hbs } from '@glimmerx/component';
Expand Down
8 changes: 7 additions & 1 deletion packages/core/src/common/transform-manager.ts
Original file line number Diff line number Diff line change
Expand Up @@ -80,7 +80,12 @@ export default class TransformManager {
originalFileName: string,
originalStart: number,
originalEnd: number
): { transformedFileName: string; transformedStart: number; transformedEnd: number } {
): {
transformedFileName: string;
transformedStart: number;
transformedEnd: number;
mapping?: MappingTree | undefined;
} {
let transformInfo = this.findTransformInfoForOriginalFile(originalFileName);
if (!transformInfo?.transformedModule) {
return {
Expand All @@ -101,6 +106,7 @@ export default class TransformManager {
transformedFileName,
transformedStart: transformedRange.start,
transformedEnd: transformedRange.end,
mapping: transformedRange.mapping,
};
}

Expand Down
24 changes: 11 additions & 13 deletions packages/core/src/language-server/glint-language-server.ts
Original file line number Diff line number Diff line change
Expand Up @@ -31,6 +31,7 @@ import {
} from './util/protocol.js';
import { GetIRResult } from './messages.cjs';
import type { TsUserConfigLang } from './config-manager.js';
import MappingTree from '../transform/template/mapping-tree.js';

export interface GlintCompletionItem extends CompletionItem {
data: {
Expand Down Expand Up @@ -186,15 +187,13 @@ export default class GlintLanguageServer {
position: Position,
formatting: ts.FormatCodeSettings = {}
): GlintCompletionItem[] | undefined {
let { transformedFileName, transformedOffset } = this.getTransformedOffset(uri, position);
if (!this.isAnalyzableFile(transformedFileName)) return;

let { mapping } = this.transformManager.getOriginalRange(
transformedFileName,
transformedOffset,
transformedOffset
let { transformedFileName, transformedOffset, mapping } = this.getTransformedOffset(
uri,
position
);

if (!this.isAnalyzableFile(transformedFileName)) return;

// If we're in a free-text region of a template, or if there's no mapping and yet
// we're in a template file, then we have no completions to offer.
if (
Expand Down Expand Up @@ -591,17 +590,16 @@ export default class GlintLanguageServer {
private getTransformedOffset(
originalURI: string,
originalPosition: Position
): { transformedFileName: string; transformedOffset: number } {
): { transformedFileName: string; transformedOffset: number; mapping?: MappingTree | undefined } {
let originalFileName = uriToFilePath(originalURI);
let originalFileContents = this.documents.getDocumentContents(originalFileName);
let originalOffset = positionToOffset(originalFileContents, originalPosition);
let { transformedOffset, transformedFileName } = this.transformManager.getTransformedOffset(
originalFileName,
originalOffset
);
let { transformedStart, transformedFileName, mapping } =
this.transformManager.getTransformedRange(originalFileName, originalOffset, originalOffset);

return {
transformedOffset,
mapping,
transformedOffset: transformedStart,
transformedFileName: this.glintConfig.getSynthesizedScriptPathForTS(transformedFileName),
};
}
Expand Down

0 comments on commit ac451f3

Please sign in to comment.