Skip to content

Commit 43520db

Browse files
authored
Merge pull request #33 from gitKrystan/fix-blocklevel-bug
HOTFIX block level error message
2 parents 159cb73 + 67e84a0 commit 43520db

File tree

9 files changed

+535
-124
lines changed

9 files changed

+535
-124
lines changed

src/parse.ts

Lines changed: 6 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -181,15 +181,13 @@ function desugarDefaultExportTemplates(preprocessed: string): string {
181181
let blockLevel = 0;
182182

183183
for (let line of lines) {
184-
if (line.includes('{')) {
185-
blockLevel++;
186-
}
187-
188-
if (line.includes('}')) {
189-
blockLevel--;
190-
}
184+
// HACK: This is pretty fragile as it will increment for, e.g., "{" which
185+
// doesn't actually increment the block level IRL
186+
const inc = (line.match(/\{/g) ?? []).length;
187+
blockLevel += inc;
191188

192-
assert('expected non-negative blockLevel', blockLevel > -1);
189+
const dec = (line.match(/\}/g) ?? []).length;
190+
blockLevel -= dec;
193191

194192
const previousLineIsPrettierIgnore =
195193
previousLine && squish(previousLine) === '// prettier-ignore';

tests/cases/gjs/complex.gjs

Lines changed: 49 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,49 @@
1+
import { on } from '@ember/modifier';
2+
import { service } from '@ember/service';
3+
import Component from '@glimmer/component';
4+
5+
import { task } from 'ember-concurrency';
6+
import perform from 'ember-concurrency/helpers/perform';
7+
8+
import Button from 'okapi/components/button';
9+
import Icon from 'okapi/components/icon';
10+
11+
export default class ProjectStatusComponent extends Component {
12+
13+
14+
15+
<template>
16+
<Button
17+
data-test-project-status={{@project.id}}
18+
class='Button--theme-action'
19+
{{on 'click' (perform this.restartProject)}}
20+
>
21+
<Icon @type={{this.iconType}} @id={{this.iconId}} />
22+
{{@project.status}}{{if this.restartProject.isRunning '...'}}
23+
</Button>
24+
</template>
25+
26+
@service server;
27+
28+
private get iconType() {
29+
return 'mini';
30+
}
31+
32+
private get iconId() {
33+
switch (this.args.project.status) {
34+
case 'starting':
35+
case 'stopping':
36+
return 'ellipsis-horizontal-circle';
37+
38+
case 'started':
39+
return 'play-circle';
40+
case 'stopped':
41+
return 'stop-circle';
42+
}
43+
}
44+
45+
restartProject = task({ drop: true },
46+
async () => {
47+
await this.server.restartProject(this.args.project);
48+
});
49+
}

tests/cases/gts/complex.gts

Lines changed: 54 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,54 @@
1+
import { on } from '@ember/modifier';
2+
import { service } from '@ember/service';
3+
import Component from '@glimmer/component';
4+
5+
import { task } from 'ember-concurrency';
6+
import perform from 'ember-concurrency/helpers/perform';
7+
8+
import Button from 'okapi/components/button';
9+
import Icon from 'okapi/components/icon';
10+
import Project, { ProjectStatus } from 'okapi/models/project';
11+
import ServerService from 'okapi/services/server';
12+
13+
export interface ProjectStatusSig {
14+
Args: {
15+
project: Project;
16+
};
17+
}
18+
19+
export default class ProjectStatusComponent extends Component<ProjectStatusSig> {
20+
<template>
21+
<Button
22+
data-test-project-status={{@project.id}}
23+
class='Button--theme-action'
24+
{{on 'click' (perform this.restartProject)}}
25+
>
26+
<Icon @type={{this.iconType}} @id={{this.iconId}} />
27+
{{@project.status}}{{if this.restartProject.isRunning '...'}}
28+
</Button>
29+
</template>
30+
31+
@service private declare server: ServerService;
32+
33+
private get iconType(): 'mini' {
34+
return 'mini';
35+
}
36+
37+
private get iconId(): string {
38+
switch (this.args.project.status) {
39+
case ProjectStatus.Starting:
40+
41+
case ProjectStatus.Stopping:
42+
return 'ellipsis-horizontal-circle';
43+
case ProjectStatus.Started:
44+
return 'play-circle';
45+
case ProjectStatus.Stopped:
46+
return 'stop-circle';
47+
}
48+
}
49+
50+
private restartProject =
51+
task({ drop: true }, async (): Promise<void> => {
52+
await this.server.restartProject(this.args.project);
53+
});
54+
}

tests/unit-tests/__snapshots__/format.test.ts.snap

Lines changed: 106 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,54 @@
11
// Vitest Snapshot v1
22

3+
exports[`format > config > default > it formats ../cases/gjs/complex.gjs 1`] = `
4+
"import { on } from \\"@ember/modifier\\";
5+
import { service } from \\"@ember/service\\";
6+
import Component from \\"@glimmer/component\\";
7+
8+
import { task } from \\"ember-concurrency\\";
9+
import perform from \\"ember-concurrency/helpers/perform\\";
10+
11+
import Button from \\"okapi/components/button\\";
12+
import Icon from \\"okapi/components/icon\\";
13+
14+
export default class ProjectStatusComponent extends Component {
15+
<template>
16+
<Button
17+
data-test-project-status={{@project.id}}
18+
class=\\"Button--theme-action\\"
19+
{{on \\"click\\" (perform this.restartProject)}}
20+
>
21+
<Icon @type={{this.iconType}} @id={{this.iconId}} />
22+
{{@project.status}}{{if this.restartProject.isRunning \\"...\\"}}
23+
</Button>
24+
</template>
25+
26+
@service server;
27+
28+
private get iconType() {
29+
return \\"mini\\";
30+
}
31+
32+
private get iconId() {
33+
switch (this.args.project.status) {
34+
case \\"starting\\":
35+
case \\"stopping\\":
36+
return \\"ellipsis-horizontal-circle\\";
37+
38+
case \\"started\\":
39+
return \\"play-circle\\";
40+
case \\"stopped\\":
41+
return \\"stop-circle\\";
42+
}
43+
}
44+
45+
restartProject = task({ drop: true }, async () => {
46+
await this.server.restartProject(this.args.project);
47+
});
48+
}
49+
"
50+
`;
51+
352
exports[`format > config > default > it formats ../cases/gjs/component-class.gjs 1`] = `
453
"import Component from \\"@glimmer/component\\";
554
@@ -201,6 +250,63 @@ exports[`format > config > default > it formats ../cases/gjs/simple.gjs 1`] = `
201250
"
202251
`;
203252
253+
exports[`format > config > default > it formats ../cases/gts/complex.gts 1`] = `
254+
"import { on } from \\"@ember/modifier\\";
255+
import { service } from \\"@ember/service\\";
256+
import Component from \\"@glimmer/component\\";
257+
258+
import { task } from \\"ember-concurrency\\";
259+
import perform from \\"ember-concurrency/helpers/perform\\";
260+
261+
import Button from \\"okapi/components/button\\";
262+
import Icon from \\"okapi/components/icon\\";
263+
import Project, { ProjectStatus } from \\"okapi/models/project\\";
264+
import ServerService from \\"okapi/services/server\\";
265+
266+
export interface ProjectStatusSig {
267+
Args: {
268+
project: Project;
269+
};
270+
}
271+
272+
export default class ProjectStatusComponent extends Component<ProjectStatusSig> {
273+
<template>
274+
<Button
275+
data-test-project-status={{@project.id}}
276+
class=\\"Button--theme-action\\"
277+
{{on \\"click\\" (perform this.restartProject)}}
278+
>
279+
<Icon @type={{this.iconType}} @id={{this.iconId}} />
280+
{{@project.status}}{{if this.restartProject.isRunning \\"...\\"}}
281+
</Button>
282+
</template>
283+
284+
@service private declare server: ServerService;
285+
286+
private get iconType(): \\"mini\\" {
287+
return \\"mini\\";
288+
}
289+
290+
private get iconId(): string {
291+
switch (this.args.project.status) {
292+
case ProjectStatus.Starting:
293+
294+
case ProjectStatus.Stopping:
295+
return \\"ellipsis-horizontal-circle\\";
296+
case ProjectStatus.Started:
297+
return \\"play-circle\\";
298+
case ProjectStatus.Stopped:
299+
return \\"stop-circle\\";
300+
}
301+
}
302+
303+
private restartProject = task({ drop: true }, async (): Promise<void> => {
304+
await this.server.restartProject(this.args.project);
305+
});
306+
}
307+
"
308+
`;
309+
204310
exports[`format > config > default > it formats ../cases/gts/component-class.gts 1`] = `
205311
"import Component from \\"@glimmer/component\\";
206312

tests/unit-tests/__snapshots__/preprocessed.test.ts.snap

Lines changed: 108 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,55 @@
11
// Vitest Snapshot v1
22

3+
exports[`format > config > with preprocessed code > it formats ../cases/gjs/complex.gjs 1`] = `
4+
"import { on } from \\"@ember/modifier\\";
5+
import { service } from \\"@ember/service\\";
6+
import Component from \\"@glimmer/component\\";
7+
8+
import { task } from \\"ember-concurrency\\";
9+
import perform from \\"ember-concurrency/helpers/perform\\";
10+
11+
import Button from \\"okapi/components/button\\";
12+
import Icon from \\"okapi/components/icon\\";
13+
14+
export default class ProjectStatusComponent extends Component {
15+
[__GLIMMER_TEMPLATE(
16+
\`<Button
17+
data-test-project-status={{@project.id}}
18+
class=\\"Button--theme-action\\"
19+
{{on \\"click\\" (perform this.restartProject)}}
20+
>
21+
<Icon @type={{this.iconType}} @id={{this.iconId}} />
22+
{{@project.status}}{{if this.restartProject.isRunning \\"...\\"}}
23+
</Button>\`,
24+
{ strictMode: true }
25+
)]
26+
27+
@service server;
28+
29+
private get iconType() {
30+
return \\"mini\\";
31+
}
32+
33+
private get iconId() {
34+
switch (this.args.project.status) {
35+
case \\"starting\\":
36+
case \\"stopping\\":
37+
return \\"ellipsis-horizontal-circle\\";
38+
39+
case \\"started\\":
40+
return \\"play-circle\\";
41+
case \\"stopped\\":
42+
return \\"stop-circle\\";
43+
}
44+
}
45+
46+
restartProject = task({ drop: true }, async () => {
47+
await this.server.restartProject(this.args.project);
48+
});
49+
}
50+
"
51+
`;
52+
353
exports[`format > config > with preprocessed code > it formats ../cases/gjs/component-class.gjs 1`] = `
454
"import Component from \\"@glimmer/component\\";
555
@@ -231,6 +281,64 @@ exports[`format > config > with preprocessed code > it formats ../cases/gjs/simp
231281
"
232282
`;
233283
284+
exports[`format > config > with preprocessed code > it formats ../cases/gts/complex.gts 1`] = `
285+
"import { on } from \\"@ember/modifier\\";
286+
import { service } from \\"@ember/service\\";
287+
import Component from \\"@glimmer/component\\";
288+
289+
import { task } from \\"ember-concurrency\\";
290+
import perform from \\"ember-concurrency/helpers/perform\\";
291+
292+
import Button from \\"okapi/components/button\\";
293+
import Icon from \\"okapi/components/icon\\";
294+
import Project, { ProjectStatus } from \\"okapi/models/project\\";
295+
import ServerService from \\"okapi/services/server\\";
296+
297+
export interface ProjectStatusSig {
298+
Args: {
299+
project: Project;
300+
};
301+
}
302+
303+
export default class ProjectStatusComponent extends Component<ProjectStatusSig> {
304+
[__GLIMMER_TEMPLATE(
305+
\`<Button
306+
data-test-project-status={{@project.id}}
307+
class=\\"Button--theme-action\\"
308+
{{on \\"click\\" (perform this.restartProject)}}
309+
>
310+
<Icon @type={{this.iconType}} @id={{this.iconId}} />
311+
{{@project.status}}{{if this.restartProject.isRunning \\"...\\"}}
312+
</Button>\`,
313+
{ strictMode: true }
314+
)]
315+
316+
@service private declare server: ServerService;
317+
318+
private get iconType(): \\"mini\\" {
319+
return \\"mini\\";
320+
}
321+
322+
private get iconId(): string {
323+
switch (this.args.project.status) {
324+
case ProjectStatus.Starting:
325+
326+
case ProjectStatus.Stopping:
327+
return \\"ellipsis-horizontal-circle\\";
328+
case ProjectStatus.Started:
329+
return \\"play-circle\\";
330+
case ProjectStatus.Stopped:
331+
return \\"stop-circle\\";
332+
}
333+
}
334+
335+
private restartProject = task({ drop: true }, async (): Promise<void> => {
336+
await this.server.restartProject(this.args.project);
337+
});
338+
}
339+
"
340+
`;
341+
234342
exports[`format > config > with preprocessed code > it formats ../cases/gts/component-class.gts 1`] = `
235343
"import Component from \\"@glimmer/component\\";
236344

0 commit comments

Comments
 (0)