Skip to content

Commit

Permalink
Fix code action for comments with '|' inside of cross-reference
Browse files Browse the repository at this point in the history
  • Loading branch information
pluralia committed Nov 18, 2021
1 parent 702192a commit d0f7602
Show file tree
Hide file tree
Showing 5 changed files with 18 additions and 12 deletions.
1 change: 1 addition & 0 deletions packages/langium/src/grammar/generated/ast.ts
Original file line number Diff line number Diff line change
Expand Up @@ -151,6 +151,7 @@ export function isCharacterRange(item: unknown): item is CharacterRange {
}

export interface CrossReference extends AbstractElement {
deprecatedSyntax: boolean
terminal: AbstractElement
type: Reference<ParserRule>
}
Expand Down
9 changes: 7 additions & 2 deletions packages/langium/src/grammar/generated/grammar.ts
Original file line number Diff line number Diff line change
Expand Up @@ -2003,8 +2003,13 @@ export const grammar = (): Grammar => loaded || (loaded = loadGrammar(`{
"$type": "Alternatives",
"elements": [
{
"$type": "Keyword",
"value": "|",
"$type": "Assignment",
"feature": "deprecatedSyntax",
"operator": "?=",
"terminal": {
"$type": "Keyword",
"value": "|"
},
"elements": []
},
{
Expand Down
8 changes: 4 additions & 4 deletions packages/langium/src/grammar/langium-grammar-code-actions.ts
Original file line number Diff line number Diff line change
Expand Up @@ -38,9 +38,9 @@ export class LangiumGrammarCodeActionProvider implements CodeActionProvider {
return this.fixHiddenTerminals(diagnostic, document);
case IssueCodes.UseRegexTokens:
return this.fixRegexTokens(diagnostic, document);
case IssueCodes.MakeRuleEntry:
case IssueCodes.EntryRuleTokenSyntax:
return this.addEntryKeyword(diagnostic, document);
case IssueCodes.CrossRefSyntaxFix:
case IssueCodes.CrossRefTokenSyntax:
return this.fixCrossRefSyntax(diagnostic, document);
default:
return undefined;
Expand Down Expand Up @@ -119,15 +119,15 @@ export class LangiumGrammarCodeActionProvider implements CodeActionProvider {

private fixCrossRefSyntax(diagnostic: Diagnostic, document: LangiumDocument): CodeAction {
return {
title: 'Replace \'|\' with \':\'',
title: "Replace '|' with ':'",
kind: CodeActionKind.QuickFix,
diagnostics: [diagnostic],
isPreferred: true,
edit: {
changes: {
[document.textDocument.uri]: [{
range: diagnostic.range,
newText: document.textDocument.getText(diagnostic.range).replace(/\|/, ':')
newText: ':'
}]
}
}
Expand Down
10 changes: 5 additions & 5 deletions packages/langium/src/grammar/langium-grammar-validator.ts
Original file line number Diff line number Diff line change
Expand Up @@ -53,8 +53,8 @@ export namespace IssueCodes {
export const RuleNameUppercase = 'rule-name-uppercase';
export const HiddenGrammarTokens = 'hidden-grammar-tokens';
export const UseRegexTokens = 'use-regex-tokens';
export const MakeRuleEntry = 'entry-rule-token-syntax';
export const CrossRefSyntaxFix = 'cross-ref-syntax-fix';
export const EntryRuleTokenSyntax = 'entry-rule-token-syntax';
export const CrossRefTokenSyntax = 'cross-ref-token-syntax';
}

export class LangiumGrammarValidator {
Expand All @@ -79,7 +79,7 @@ export class LangiumGrammarValidator {
if (entryRules.length === 0) {
const possibleEntryRule = grammar.rules.find(e => ast.isParserRule(e) && !isDataTypeRule(e));
if (possibleEntryRule) {
accept('error', 'The grammar is missing an entry parser rule. This rule can be an entry one.', { node: possibleEntryRule, property: 'name', code: IssueCodes.MakeRuleEntry });
accept('error', 'The grammar is missing an entry parser rule. This rule can be an entry one.', { node: possibleEntryRule, property: 'name', code: IssueCodes.EntryRuleTokenSyntax });
} else {
accept('error', 'This grammar is missing an entry parser rule.', { node: grammar, property: 'name' });
}
Expand Down Expand Up @@ -149,8 +149,8 @@ export class LangiumGrammarValidator {
}

checkCrossReferenceSyntax(crossRef: ast.CrossReference, accept: ValidationAcceptor): void {
if (crossRef.terminal && crossRef.$cstNode?.text.includes('|')) {
accept('error', '\'|\' is depreceted. Please, use \':\' instead.', { node: crossRef, code: IssueCodes.CrossRefSyntaxFix });
if (crossRef.deprecatedSyntax) {
accept('error', "'|' is deprecated. Please, use ':' instead.", { node: crossRef, property: 'deprecatedSyntax', code: IssueCodes.CrossRefTokenSyntax });
}
}

Expand Down
2 changes: 1 addition & 1 deletion packages/langium/src/grammar/langium-grammar.langium
Original file line number Diff line number Diff line change
Expand Up @@ -121,7 +121,7 @@ AssignableAlternatives returns AbstractElement:
AssignableTerminal ({Alternatives.elements+=current} ('|' elements+=AssignableTerminal)+)?;

CrossReference returns AbstractElement:
{CrossReference} '[' type=[ParserRule:ID] (('|' | ':') ^terminal=CrossReferenceableTerminal )? ']';
{CrossReference} '[' type=[ParserRule:ID] ((deprecatedSyntax?='|' | ':') ^terminal=CrossReferenceableTerminal )? ']';

CrossReferenceableTerminal returns AbstractElement:
Keyword | RuleCall;
Expand Down

0 comments on commit d0f7602

Please sign in to comment.