fix: Handle langium data loss warning

It's not an issue to actually lose the data, as we're just taking the last value anyways. But having the warnings clog up the console means we might miss actual warnings.
This commit is contained in:
Sidharth Vinod
2025-04-15 09:48:50 +05:30
parent 3ae87ca06a
commit 9a3498fba8
8 changed files with 36 additions and 41 deletions

View File

@@ -2,13 +2,13 @@ import type { DiagramAST } from '@mermaid-js/parser';
import type { DiagramDB } from '../../diagram-api/types.js';
export function populateCommonDb(ast: DiagramAST, db: DiagramDB) {
if (ast.accDescr) {
db.setAccDescription?.(ast.accDescr);
if (ast.accDescr?.length > 0) {
db.setAccDescription?.(ast.accDescr.pop() ?? '');
}
if (ast.accTitle) {
db.setAccTitle?.(ast.accTitle);
if (ast.accTitle?.length > 0) {
db.setAccTitle?.(ast.accTitle.pop() ?? '');
}
if (ast.title) {
db.setDiagramTitle?.(ast.title);
if (ast.title?.length > 0) {
db.setDiagramTitle?.(ast.title.pop() ?? '');
}
}

View File

@@ -8,7 +8,7 @@ fragment EOL returns string:
;
fragment TitleAndAccessibilities:
((accDescr=ACC_DESCR | accTitle=ACC_TITLE | title=TITLE) EOL)+
((accDescr+=ACC_DESCR | accTitle+=ACC_TITLE | title+=TITLE) EOL)+
;
terminal BOOLEAN returns boolean: 'true' | 'false';

View File

@@ -1,6 +1,5 @@
import type { GrammarAST, Stream, TokenBuilderOptions } from 'langium';
import type { TokenType } from 'chevrotain';
import { DefaultTokenBuilder } from 'langium';
export abstract class AbstractMermaidTokenBuilder extends DefaultTokenBuilder {

View File

@@ -1,6 +1,5 @@
import type { CstNode, GrammarAST, ValueType } from 'langium';
import { DefaultValueConverter } from 'langium';
import { accessibilityDescrRegex, accessibilityTitleRegex, titleRegex } from './matcher.js';
const rulesRegexes: Record<string, RegExp> = {
@@ -31,14 +30,12 @@ export abstract class AbstractMermaidValueConverter extends DefaultValueConverte
): ValueType {
let value: ValueType | undefined = this.runCommonConverter(rule, input, cstNode);
if (value === undefined) {
value = this.runCustomConverter(rule, input, cstNode);
}
if (value === undefined) {
return super.runConverter(rule, input, cstNode);
value ??= this.runCustomConverter(rule, input, cstNode);
if (value !== undefined) {
return value;
}
return value;
return super.runConverter(rule, input, cstNode);
}
private runCommonConverter(

View File

@@ -1,5 +1,4 @@
import { describe, expect, it } from 'vitest';
import { Architecture } from '../src/language/index.js';
import { expectNoErrorsOrAlternatives, architectureParse as parse } from './test-util.js';
@@ -33,7 +32,7 @@ describe('architecture', () => {
expect(result.value.$type).toBe(Architecture);
const { title } = result.value;
expect(title).toBe('sample title');
expect(title).toEqual(['sample title']);
});
it.each([
@@ -48,7 +47,7 @@ describe('architecture', () => {
expect(result.value.$type).toBe(Architecture);
const { title } = result.value;
expect(title).toBe('sample title');
expect(title).toEqual(['sample title']);
});
it('should handle regular architecture + title + accTitle + accDescr', () => {
@@ -62,9 +61,9 @@ describe('architecture', () => {
expect(result.value.$type).toBe(Architecture);
const { title, accTitle, accDescr } = result.value;
expect(title).toBe('sample title');
expect(accTitle).toBe('sample accTitle');
expect(accDescr).toBe('sample accDescr');
expect(title).toEqual(['sample title']);
expect(accTitle).toEqual(['sample accTitle']);
expect(accDescr).toEqual(['sample accDescr']);
});
it('should handle regular architecture + title + accTitle + multi-line accDescr', () => {
@@ -80,9 +79,9 @@ describe('architecture', () => {
expect(result.value.$type).toBe(Architecture);
const { title, accTitle, accDescr } = result.value;
expect(title).toBe('sample title');
expect(accTitle).toBe('sample accTitle');
expect(accDescr).toBe('sample accDescr');
expect(title).toEqual(['sample title']);
expect(accTitle).toEqual(['sample accTitle']);
expect(accDescr).toEqual(['sample accDescr']);
});
});
});

View File

@@ -166,14 +166,14 @@ describe('Parsing CherryPicking Statements', () => {
describe('Parsing with Accessibility Titles and Descriptions', () => {
it('should parse accessibility titles', () => {
const result = parse(`gitGraph\n accTitle: Accessible Graph\n commit\n`);
expect(result.value.accTitle).toBe('Accessible Graph');
expect(result.value.accTitle).toEqual(['Accessible Graph']);
});
it('should parse multiline accessibility descriptions', () => {
const result = parse(
`gitGraph\n accDescr {\n Detailed description\n across multiple lines\n }\n commit\n`
);
expect(result.value.accDescr).toBe('Detailed description\nacross multiple lines');
expect(result.value.accDescr).toEqual(['Detailed description\nacross multiple lines']);
});
});
@@ -189,7 +189,7 @@ describe('Parsing CherryPicking Statements', () => {
merge feature tag:"v1.0"
cherry-pick id:"feat1" tag:"critical fix"
`);
expect(result.value.accTitle).toBe('Complex Example');
expect(result.value.accTitle).toEqual(['Complex Example']);
expect(result.value.statements[0].$type).toBe('Commit');
expect(result.value.statements[1].$type).toBe('Branch');
expect(result.value.statements[2].$type).toBe('Commit');

View File

@@ -49,7 +49,7 @@ describe('pie', () => {
expect(result.value.$type).toBe(Pie);
const { title } = result.value;
expect(title).toBe('sample title');
expect(title).toEqual(['sample title']);
});
it.each([
@@ -69,7 +69,7 @@ describe('pie', () => {
expect(result.value.$type).toBe(Pie);
const { title } = result.value;
expect(title).toBe('sample title');
expect(title).toEqual(['sample title']);
});
});
@@ -85,7 +85,7 @@ describe('pie', () => {
const { showData, title } = result.value;
expect(showData).toBeTruthy();
expect(title).toBe('sample title');
expect(title).toEqual(['sample title']);
});
it.each([
@@ -106,7 +106,7 @@ describe('pie', () => {
const { showData, title } = result.value;
expect(showData).toBeTruthy();
expect(title).toBe('sample title');
expect(title).toEqual(['sample title']);
});
});
});
@@ -166,7 +166,7 @@ describe('pie', () => {
expect(result.value.$type).toBe(Pie);
const { title, sections } = result.value;
expect(title).toBe('sample wow');
expect(title).toEqual(['sample wow']);
expect(sections[0].label).toBe('GitHub');
expect(sections[0].value).toBe(100);
@@ -200,7 +200,7 @@ describe('pie', () => {
expect(result.value.$type).toBe(Pie);
const { accTitle, sections } = result.value;
expect(accTitle).toBe('sample wow');
expect(accTitle).toEqual(['sample wow']);
expect(sections[0].label).toBe('GitHub');
expect(sections[0].value).toBe(100);
@@ -218,7 +218,7 @@ describe('pie', () => {
expect(result.value.$type).toBe(Pie);
const { accDescr, sections } = result.value;
expect(accDescr).toBe('sample wow');
expect(accDescr).toEqual(['sample wow']);
expect(sections[0].label).toBe('GitHub');
expect(sections[0].value).toBe(100);
@@ -238,7 +238,7 @@ describe('pie', () => {
expect(result.value.$type).toBe(Pie);
const { accDescr, sections } = result.value;
expect(accDescr).toBe('sample wow');
expect(accDescr).toEqual(['sample wow']);
expect(sections[0].label).toBe('GitHub');
expect(sections[0].value).toBe(100);

View File

@@ -35,7 +35,7 @@ describe('radar', () => {
expect(result.value.$type).toBe(Radar);
const { title } = result.value;
expect(title).toBe('My Title');
expect(title).toEqual(['My Title']);
});
it.each([
@@ -47,7 +47,7 @@ describe('radar', () => {
expect(result.value.$type).toBe(Radar);
const { accDescr } = result.value;
expect(accDescr).toBe('My Accessible Description');
expect(accDescr).toEqual(['My Accessible Description']);
});
it.each([
@@ -59,7 +59,7 @@ describe('radar', () => {
expect(result.value.$type).toBe(Radar);
const { accTitle } = result.value;
expect(accTitle).toBe('My Accessible Title');
expect(accTitle).toEqual(['My Accessible Title']);
});
it.each([
@@ -75,9 +75,9 @@ describe('radar', () => {
expect(result.value.$type).toBe(Radar);
const { title, accDescr, accTitle } = result.value;
expect(title).toBe('My Title');
expect(accDescr).toBe('My Accessible Description');
expect(accTitle).toBe('My Accessible Title');
expect(title).toEqual(['My Title']);
expect(accDescr).toEqual(['My Accessible Description']);
expect(accTitle).toEqual(['My Accessible Title']);
});
});