Skip to content

Commit 8dc030b

Browse files
Merge pull request #227 from ember-tooling/copilot/add-failing-test-for-parser
Add regression test for GTS transform with backtick comments
2 parents 9a97f41 + b21478a commit 8dc030b

2 files changed

Lines changed: 24 additions & 2 deletions

File tree

src/parser/transforms.js

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -278,6 +278,11 @@ export const replaceRange = function replaceRange(s, start, end, substitute) {
278278
return s.slice(0, start) + substitute + s.slice(end);
279279
};
280280

281+
function maskTemplateContentForLint(content) {
282+
// Preserve line endings and UTF-16 length, but remove template syntax from the JS placeholder.
283+
return content.replace(/[^\r\n]/g, ' ');
284+
}
285+
281286
const processor = new Preprocessor();
282287

283288
class EmberParserError extends Error {
@@ -332,7 +337,7 @@ export function transformForLint(code, fileName) {
332337
// Build placeholder JS inline (same format as ember-estree's toPlaceholderJS)
333338
let jsCode = code;
334339
for (const tplInfo of [...result].reverse()) {
335-
const content = tplInfo.contents.replace(/`/g, '\\`').replace(/\$/g, '\\$');
340+
const content = maskTemplateContentForLint(tplInfo.contents);
336341
const start = tplInfo.range.startUtf16Codepoint;
337342
const end = tplInfo.range.endUtf16Codepoint;
338343
const tplLength = end - start;

tests/parser.test.js

Lines changed: 18 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,7 @@
11
import { beforeAll, describe, expect, it } from 'vitest';
22
import { parseForESLint } from '../src/parser/gjs-gts-parser.js';
33
import { replaceExtensions } from '../src/parser/ts-patch.js';
4-
import { traverse } from '../src/parser/transforms.js';
4+
import { transformForLint, traverse } from '../src/parser/transforms.js';
55
import { SourceCode } from 'eslint';
66
import { visitorKeys as tsVisitors } from '@typescript-eslint/visitor-keys';
77
import { visitorKeys as glimmerVisitorKeys } from '@glimmer/syntax';
@@ -2384,6 +2384,23 @@ export const NotFound = <template>
23842384
}
23852385
});
23862386

2387+
it('transforms class templates with backtick-only comments for linting', () => {
2388+
const code = [
2389+
"import Component from '@glimmer/component';",
2390+
'',
2391+
'export default class MyComponent extends Component {',
2392+
' <template>',
2393+
' {{! `asd` `qwe` `zxc` `undefined` `asd` }}',
2394+
' {{! `@foo` }}',
2395+
' </template>',
2396+
'}',
2397+
].join('\n');
2398+
2399+
const { output } = transformForLint(code, 'example.gts');
2400+
2401+
expect(output).toHaveLength(code.length);
2402+
});
2403+
23872404
it('svg elements are not added to global scope', () => {
23882405
result = parseForESLint(
23892406
`<template>

0 commit comments

Comments
 (0)