From 396d27c7377d87cff82098251a3c40d3e585f42c Mon Sep 17 00:00:00 2001 From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> Date: Sun, 6 Apr 2025 22:32:45 -0400 Subject: [PATCH 1/9] Hover on does not work --- .../__tests__/language-server/hover.test.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test-packages/package-test-core/__tests__/language-server/hover.test.ts b/test-packages/package-test-core/__tests__/language-server/hover.test.ts index c1eeda5a8..d7cf9cefc 100644 --- a/test-packages/package-test-core/__tests__/language-server/hover.test.ts +++ b/test-packages/package-test-core/__tests__/language-server/hover.test.ts @@ -130,6 +130,25 @@ describe('Language Server: Hover (ts plugin)', () => { `); }); + describe('MathML', () => { + test('empty ', async () => { + const [offset, content] = extractCursor(stripIndent` + + + `); + + const doc = await prepareDocument( + 'ts-template-imports-app/src/ephemeral.gts', + 'glimmer-ts', + content, + ); + + expect(await performHoverRequest(doc, offset)).toMatchInlineSnapshot(); + }); + }); + describe.skip('JS in a TS project', () => { test('with allowJs: true', async () => { const [offset, content] = extractCursor(stripIndent` From 774db6eb36cc0f023dbcccf6773ec6cc37dd980f Mon Sep 17 00:00:00 2001 From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> Date: Mon, 7 Apr 2025 00:43:17 -0400 Subject: [PATCH 2/9] Fix --- .../template/template-to-typescript.ts | 17 +++++++++-------- 1 file changed, 9 insertions(+), 8 deletions(-) diff --git a/packages/core/src/transform/template/template-to-typescript.ts b/packages/core/src/transform/template/template-to-typescript.ts index 8b6781e51..b6e5c3bd8 100644 --- a/packages/core/src/transform/template/template-to-typescript.ts +++ b/packages/core/src/transform/template/template-to-typescript.ts @@ -4,7 +4,6 @@ import { EmbeddingSyntax, mapTemplateContents, RewriteResult } from './map-templ import ScopeStack from './scope-stack.js'; import { GlintEmitMetadata, GlintSpecialForm } from '@glint/core/config-types'; import { TextContent } from './glimmer-ast-mapping-tree.js'; -import { Directive } from './transformed-module.js'; import { DirectiveKind } from './transformed-module.js'; const SPLATTRIBUTES = '...attributes'; @@ -60,7 +59,7 @@ export function templateToTypescript( return mapTemplateContents(originalTemplate, { embeddingSyntax }, (ast, mapper) => { let { rangeForNode } = mapper; let scope = new ScopeStack([]); - let inHtmlContext: 'svg' | 'math' | 'default' = 'default'; + let contextStack = ['default']; emitTemplateBoilerplate(() => { for (let statement of ast?.body ?? []) { @@ -186,11 +185,11 @@ export function templateToTypescript( // Push to the directives array on the record mapper.directive(node, 'nocheck'); } else if (kind === 'in-svg') { - inHtmlContext = 'svg'; + contextStack.push('svg'); } else if (kind === 'in-mathml') { - inHtmlContext = 'math'; + contextStack.push('math'); } else if (kind === 'out-svg' || kind === 'out-mathml') { - inHtmlContext = 'default'; + contextStack.pop(); } else { // Push an error on the record mapper.error(`Unknown directive @glint-${kind}`, location); @@ -886,17 +885,19 @@ export function templateToTypescript( const directivesWeakMap = assignDirectivesToElementOpenTagPieces(node); if (node.tag === 'svg') { - inHtmlContext = 'svg'; + contextStack.push('svg'); } if (node.tag === 'math') { - inHtmlContext = 'math'; + contextStack.push('math'); } mapper.text('{'); mapper.newline(); mapper.indent(); + let inHtmlContext = contextStack.at(-1); + if (inHtmlContext === 'default') { mapper.text('const __glintY__ = __glintDSL__.emitElement("'); } else if (inHtmlContext === 'svg') { @@ -921,7 +922,7 @@ export function templateToTypescript( } if (node.tag === 'svg' || node.tag === 'math') { - inHtmlContext = 'default'; + contextStack.pop(); } mapper.dedent(); From 50a23e8bc7a43d83dfe71521f6f307b6340a9637 Mon Sep 17 00:00:00 2001 From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> Date: Mon, 7 Apr 2025 00:49:24 -0400 Subject: [PATCH 3/9] TS --- .github/workflows/ci.yml | 21 ++++++++++--------- .../ts-template-imports-app/src/math-ml.gts | 16 ++++++++++++++ 2 files changed, 27 insertions(+), 10 deletions(-) create mode 100644 test-packages/ts-template-imports-app/src/math-ml.gts diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 48bcc9664..a5094a2c3 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -32,16 +32,17 @@ jobs: - run: pnpm lint - uses: wyvox/action-setup-pnpm@v3 - # type-tests: - # name: "Type Tests" - # runs-on: ubuntu-latest - # steps: - # - uses: actions/checkout@v4 - # - uses: pnpm/action-setup@v2 - # - uses: actions/setup-node@v4 - # with: - # cache: pnpm - # - run: pnpm reset + type-tests: + name: "Type Tests" + runs-on: ubuntu-latest + steps: + - uses: actions/checkout@v4 + - uses: pnpm/action-setup@v2 + - uses: actions/setup-node@v4 + with: + cache: pnpm + - run: pnpm reset + - run: pnpm --filter './test-packages/ts-template-imports-app' test:typecheck # - run: "pnpm --filter '*' run test:typecheck" # - run: "pnpm --filter '*' run test:tsc" diff --git a/test-packages/ts-template-imports-app/src/math-ml.gts b/test-packages/ts-template-imports-app/src/math-ml.gts new file mode 100644 index 000000000..7c1175a2f --- /dev/null +++ b/test-packages/ts-template-imports-app/src/math-ml.gts @@ -0,0 +1,16 @@ + From 72d8ca886c567b3629d62e5f37324469f7868964 Mon Sep 17 00:00:00 2001 From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> Date: Mon, 7 Apr 2025 00:55:54 -0400 Subject: [PATCH 4/9] fix --- test-packages/ts-template-imports-app/src/Greeting.gts | 2 +- .../src/GreetingAutoImportTest.gts | 1 + .../ts-template-imports-app/src/Playground.gts | 4 ++-- test-packages/ts-template-imports-app/src/normal.ts | 10 ---------- 4 files changed, 4 insertions(+), 13 deletions(-) delete mode 100644 test-packages/ts-template-imports-app/src/normal.ts diff --git a/test-packages/ts-template-imports-app/src/Greeting.gts b/test-packages/ts-template-imports-app/src/Greeting.gts index 0fbbf1152..ef0d6a34a 100644 --- a/test-packages/ts-template-imports-app/src/Greeting.gts +++ b/test-packages/ts-template-imports-app/src/Greeting.gts @@ -1,5 +1,5 @@ import Component from '@glimmer/component'; -import { TOC } from '@ember/component/template-only'; +import type { TOC } from '@ember/component/template-only'; export interface GreetingSignature { Args: { target: string }; diff --git a/test-packages/ts-template-imports-app/src/GreetingAutoImportTest.gts b/test-packages/ts-template-imports-app/src/GreetingAutoImportTest.gts index 15e01abec..1b8870944 100644 --- a/test-packages/ts-template-imports-app/src/GreetingAutoImportTest.gts +++ b/test-packages/ts-template-imports-app/src/GreetingAutoImportTest.gts @@ -1,3 +1,4 @@ // This test used for testing auto-imports +// @ts-expect-error let C = Greeting; diff --git a/test-packages/ts-template-imports-app/src/Playground.gts b/test-packages/ts-template-imports-app/src/Playground.gts index 5c24d91eb..39aa27ad3 100644 --- a/test-packages/ts-template-imports-app/src/Playground.gts +++ b/test-packages/ts-template-imports-app/src/Playground.gts @@ -1,7 +1,7 @@ import Component from '@glimmer/component'; -import { TOC } from '@ember/component/template-only'; +import type { TOC } from '@ember/component/template-only'; import { hash } from '@ember/helper'; -import { ComponentLike, ModifierLike, HelperLike } from '@glint/template'; +import type { ComponentLike, ModifierLike, HelperLike } from '@glint/template'; const lib = { MaybeComponent: undefined as TOC<{ Args: { arg: string } }> | undefined diff --git a/test-packages/ts-template-imports-app/src/normal.ts b/test-packages/ts-template-imports-app/src/normal.ts deleted file mode 100644 index 8add40d79..000000000 --- a/test-packages/ts-template-imports-app/src/normal.ts +++ /dev/null @@ -1,10 +0,0 @@ -import Component from '@glimmer/component'; -import { TOC } from '@ember/component/template-only'; -import { Other } from './other'; - -export class Foo {} - -let b: C; -f; -f; -let a: O; From f1cb801dbe78c21d9b433fa789a14345bef151a4 Mon Sep 17 00:00:00 2001 From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> Date: Mon, 7 Apr 2025 01:01:37 -0400 Subject: [PATCH 5/9] fix --- test-packages/ts-template-imports-app/src/NoTemplate.gts | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) diff --git a/test-packages/ts-template-imports-app/src/NoTemplate.gts b/test-packages/ts-template-imports-app/src/NoTemplate.gts index e2352cbcb..f5cfa5dd8 100644 --- a/test-packages/ts-template-imports-app/src/NoTemplate.gts +++ b/test-packages/ts-template-imports-app/src/NoTemplate.gts @@ -1,8 +1,8 @@ /*NoTemplate*/ import Component from '@glimmer/component'; -import { TOC } from '@ember/component/template-only'; +import type { TOC } from '@ember/component/template-only'; import { Other } from './other'; export class Foo {} -let o: Other \ No newline at end of file +let o: Other From f9139509ca9ee387be5d9beae1817c2b0be69d69 Mon Sep 17 00:00:00 2001 From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> Date: Mon, 7 Apr 2025 01:02:14 -0400 Subject: [PATCH 6/9] Remove extraneous test --- .../__tests__/language-server/hover.test.ts | 19 ------------------- 1 file changed, 19 deletions(-) diff --git a/test-packages/package-test-core/__tests__/language-server/hover.test.ts b/test-packages/package-test-core/__tests__/language-server/hover.test.ts index d7cf9cefc..c1eeda5a8 100644 --- a/test-packages/package-test-core/__tests__/language-server/hover.test.ts +++ b/test-packages/package-test-core/__tests__/language-server/hover.test.ts @@ -130,25 +130,6 @@ describe('Language Server: Hover (ts plugin)', () => { `); }); - describe('MathML', () => { - test('empty ', async () => { - const [offset, content] = extractCursor(stripIndent` - - - `); - - const doc = await prepareDocument( - 'ts-template-imports-app/src/ephemeral.gts', - 'glimmer-ts', - content, - ); - - expect(await performHoverRequest(doc, offset)).toMatchInlineSnapshot(); - }); - }); - describe.skip('JS in a TS project', () => { test('with allowJs: true', async () => { const [offset, content] = extractCursor(stripIndent` From cf80f1f17838bc3a7a98608461989e6a71ca38d3 Mon Sep 17 00:00:00 2001 From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> Date: Mon, 7 Apr 2025 01:02:51 -0400 Subject: [PATCH 7/9] Demonstrate failing test (revert this commit) --- .../template/template-to-typescript.ts | 17 ++++++++--------- 1 file changed, 8 insertions(+), 9 deletions(-) diff --git a/packages/core/src/transform/template/template-to-typescript.ts b/packages/core/src/transform/template/template-to-typescript.ts index b6e5c3bd8..8b6781e51 100644 --- a/packages/core/src/transform/template/template-to-typescript.ts +++ b/packages/core/src/transform/template/template-to-typescript.ts @@ -4,6 +4,7 @@ import { EmbeddingSyntax, mapTemplateContents, RewriteResult } from './map-templ import ScopeStack from './scope-stack.js'; import { GlintEmitMetadata, GlintSpecialForm } from '@glint/core/config-types'; import { TextContent } from './glimmer-ast-mapping-tree.js'; +import { Directive } from './transformed-module.js'; import { DirectiveKind } from './transformed-module.js'; const SPLATTRIBUTES = '...attributes'; @@ -59,7 +60,7 @@ export function templateToTypescript( return mapTemplateContents(originalTemplate, { embeddingSyntax }, (ast, mapper) => { let { rangeForNode } = mapper; let scope = new ScopeStack([]); - let contextStack = ['default']; + let inHtmlContext: 'svg' | 'math' | 'default' = 'default'; emitTemplateBoilerplate(() => { for (let statement of ast?.body ?? []) { @@ -185,11 +186,11 @@ export function templateToTypescript( // Push to the directives array on the record mapper.directive(node, 'nocheck'); } else if (kind === 'in-svg') { - contextStack.push('svg'); + inHtmlContext = 'svg'; } else if (kind === 'in-mathml') { - contextStack.push('math'); + inHtmlContext = 'math'; } else if (kind === 'out-svg' || kind === 'out-mathml') { - contextStack.pop(); + inHtmlContext = 'default'; } else { // Push an error on the record mapper.error(`Unknown directive @glint-${kind}`, location); @@ -885,19 +886,17 @@ export function templateToTypescript( const directivesWeakMap = assignDirectivesToElementOpenTagPieces(node); if (node.tag === 'svg') { - contextStack.push('svg'); + inHtmlContext = 'svg'; } if (node.tag === 'math') { - contextStack.push('math'); + inHtmlContext = 'math'; } mapper.text('{'); mapper.newline(); mapper.indent(); - let inHtmlContext = contextStack.at(-1); - if (inHtmlContext === 'default') { mapper.text('const __glintY__ = __glintDSL__.emitElement("'); } else if (inHtmlContext === 'svg') { @@ -922,7 +921,7 @@ export function templateToTypescript( } if (node.tag === 'svg' || node.tag === 'math') { - contextStack.pop(); + inHtmlContext = 'default'; } mapper.dedent(); From 51c093d0f983de6765e17b9311b318a442131b1a Mon Sep 17 00:00:00 2001 From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> Date: Mon, 7 Apr 2025 01:05:56 -0400 Subject: [PATCH 8/9] Revert "Remove extraneous test" This reverts commit f9139509ca9ee387be5d9beae1817c2b0be69d69. --- .../__tests__/language-server/hover.test.ts | 19 +++++++++++++++++++ 1 file changed, 19 insertions(+) diff --git a/test-packages/package-test-core/__tests__/language-server/hover.test.ts b/test-packages/package-test-core/__tests__/language-server/hover.test.ts index c1eeda5a8..d7cf9cefc 100644 --- a/test-packages/package-test-core/__tests__/language-server/hover.test.ts +++ b/test-packages/package-test-core/__tests__/language-server/hover.test.ts @@ -130,6 +130,25 @@ describe('Language Server: Hover (ts plugin)', () => { `); }); + describe('MathML', () => { + test('empty ', async () => { + const [offset, content] = extractCursor(stripIndent` + + + `); + + const doc = await prepareDocument( + 'ts-template-imports-app/src/ephemeral.gts', + 'glimmer-ts', + content, + ); + + expect(await performHoverRequest(doc, offset)).toMatchInlineSnapshot(); + }); + }); + describe.skip('JS in a TS project', () => { test('with allowJs: true', async () => { const [offset, content] = extractCursor(stripIndent` From 3837e80e7d1d62f9e899c503a12ac13f4d5a7588 Mon Sep 17 00:00:00 2001 From: NullVoxPopuli <199018+NullVoxPopuli@users.noreply.github.com> Date: Mon, 7 Apr 2025 01:09:21 -0400 Subject: [PATCH 9/9] Add diagnostics test to try to replicate what I'm seeing locally --- .../language-server/diagnostics.test.ts | 33 +++++++++++++++++++ .../ts-template-imports-app/package.json | 1 + .../ts-template-imports-app/src/math-ml.gts | 2 +- 3 files changed, 35 insertions(+), 1 deletion(-) diff --git a/test-packages/package-test-core/__tests__/language-server/diagnostics.test.ts b/test-packages/package-test-core/__tests__/language-server/diagnostics.test.ts index aba4ddbff..c7c5d7c66 100644 --- a/test-packages/package-test-core/__tests__/language-server/diagnostics.test.ts +++ b/test-packages/package-test-core/__tests__/language-server/diagnostics.test.ts @@ -636,4 +636,37 @@ describe('Language Server: Diagnostics (ts plugin)', () => { ] `); }); + + test('MathML context is retained and popped', async () => { + let componentA = stripIndent` + export const MathMLExample = x + + + + + a + + + 2 + + + 3 + + b + + + + + x + + `; + + const diagnostics = await requestDiagnostics( + 'ts-template-imports-app/src/ephemeral-index.gts', + 'glimmer-ts', + componentA, + ); + + expect(diagnostics).toMatchInlineSnapshot(`[]`); + }); }); diff --git a/test-packages/ts-template-imports-app/package.json b/test-packages/ts-template-imports-app/package.json index d5aa9057d..05b1b701a 100644 --- a/test-packages/ts-template-imports-app/package.json +++ b/test-packages/ts-template-imports-app/package.json @@ -30,6 +30,7 @@ "@glint/environment-ember-loose": "workspace:*", "@glint/environment-ember-template-imports": "workspace:*", "@glint/template": "workspace:*", + "@glint/tsserver-plugin": "workspace:*", "@glint/core": "workspace:*", "@types/rsvp": "^4.0.9", "@glint/tsserver-plugin": "workspace:*", diff --git a/test-packages/ts-template-imports-app/src/math-ml.gts b/test-packages/ts-template-imports-app/src/math-ml.gts index 7c1175a2f..28e3b88e5 100644 --- a/test-packages/ts-template-imports-app/src/math-ml.gts +++ b/test-packages/ts-template-imports-app/src/math-ml.gts @@ -1,4 +1,4 @@ -