dot-language-support 1.7.0 → 2.0.3

This diff represents the content of publicly available package versions that have been released to one of the supported registries. The information contained in this diff is provided for informational purposes only and reflects changes between package versions as they appear in their respective public registries.
Files changed (110) hide show
  1. package/.github/workflows/CD.yml +3 -3
  2. package/.github/workflows/CI.yml +2 -2
  3. package/README.md +5 -4
  4. package/jest.config.mjs +19 -0
  5. package/lib/{binder.d.ts → cjs/binder.d.ts} +1 -1
  6. package/lib/{binder.js → cjs/binder.js} +34 -34
  7. package/lib/{checker.d.ts → cjs/checker.d.ts} +1 -1
  8. package/lib/{checker.js → cjs/checker.js} +28 -28
  9. package/lib/{core.d.ts → cjs/core.d.ts} +0 -0
  10. package/lib/{core.js → cjs/core.js} +0 -0
  11. package/lib/{error.d.ts → cjs/error.d.ts} +1 -1
  12. package/lib/{error.js → cjs/error.js} +0 -0
  13. package/lib/cjs/index.d.ts +5 -0
  14. package/lib/{index.js → cjs/index.js} +5 -5
  15. package/lib/{parser.d.ts → cjs/parser.d.ts} +1 -1
  16. package/lib/{parser.js → cjs/parser.js} +11 -11
  17. package/lib/{scanner.d.ts → cjs/scanner.d.ts} +1 -1
  18. package/lib/{scanner.js → cjs/scanner.js} +67 -67
  19. package/lib/{service → cjs/service}/codeAction.d.ts +2 -2
  20. package/lib/{service → cjs/service}/codeAction.js +34 -34
  21. package/lib/cjs/service/colorProvider.d.ts +5 -0
  22. package/lib/{service → cjs/service}/colorProvider.js +7 -12
  23. package/lib/{service → cjs/service}/command/ChangeAllOtherEdgeOpsAndFixGraphCommand.d.ts +3 -3
  24. package/lib/{service → cjs/service}/command/ChangeAllOtherEdgeOpsAndFixGraphCommand.js +6 -6
  25. package/lib/{service → cjs/service}/command/ChangeEdgeOpCommand.d.ts +3 -3
  26. package/lib/{service → cjs/service}/command/ChangeEdgeOpCommand.js +3 -3
  27. package/lib/{service → cjs/service}/command/ConsolidateDescendantsCommand.d.ts +3 -3
  28. package/lib/{service → cjs/service}/command/ConsolidateDescendantsCommand.js +7 -7
  29. package/lib/{service → cjs/service}/command/RemoveSemicolons.d.ts +3 -3
  30. package/lib/{service → cjs/service}/command/RemoveSemicolons.js +4 -4
  31. package/lib/{service → cjs/service}/command/common.d.ts +2 -2
  32. package/lib/{service → cjs/service}/command/common.js +6 -6
  33. package/lib/{service → cjs/service}/completion.d.ts +2 -2
  34. package/lib/{service → cjs/service}/completion.js +25 -25
  35. package/lib/{service → cjs/service}/hover.d.ts +2 -2
  36. package/lib/{service → cjs/service}/hover.js +38 -38
  37. package/lib/{service → cjs/service}/languageFacts.d.ts +0 -0
  38. package/lib/{service → cjs/service}/languageFacts.js +0 -0
  39. package/lib/{service → cjs/service}/reference.d.ts +2 -2
  40. package/lib/{service → cjs/service}/reference.js +9 -9
  41. package/lib/{service → cjs/service}/rename.d.ts +2 -2
  42. package/lib/{service → cjs/service}/rename.js +11 -11
  43. package/lib/{service → cjs/service}/service.d.ts +2 -2
  44. package/lib/cjs/service/service.js +39 -0
  45. package/lib/{service → cjs/service}/util.d.ts +2 -2
  46. package/lib/{service → cjs/service}/util.js +5 -5
  47. package/lib/{service → cjs/service}/validation.d.ts +2 -2
  48. package/lib/{service → cjs/service}/validation.js +3 -3
  49. package/lib/cjs/tester.d.ts +1 -0
  50. package/lib/cjs/tester.js +23 -0
  51. package/lib/{types.d.ts → cjs/types.d.ts} +0 -0
  52. package/lib/{types.js → cjs/types.js} +0 -0
  53. package/lib/{visitor.d.ts → cjs/visitor.d.ts} +1 -1
  54. package/lib/{visitor.js → cjs/visitor.js} +17 -17
  55. package/lib/esm/binder.d.ts +2 -0
  56. package/lib/esm/binder.js +296 -0
  57. package/lib/esm/checker.d.ts +14 -0
  58. package/lib/esm/checker.js +169 -0
  59. package/lib/esm/core.d.ts +1 -0
  60. package/lib/esm/core.js +10 -0
  61. package/lib/esm/error.d.ts +3 -0
  62. package/lib/esm/error.js +10 -0
  63. package/lib/esm/index.d.ts +5 -0
  64. package/lib/esm/index.js +6 -0
  65. package/lib/esm/parser.d.ts +84 -0
  66. package/lib/esm/parser.js +700 -0
  67. package/lib/esm/scanner.d.ts +52 -0
  68. package/lib/esm/scanner.js +581 -0
  69. package/lib/esm/service/codeAction.d.ts +12 -0
  70. package/lib/esm/service/codeAction.js +208 -0
  71. package/lib/esm/service/colorProvider.d.ts +5 -0
  72. package/lib/esm/service/colorProvider.js +64 -0
  73. package/lib/esm/service/command/ChangeAllOtherEdgeOpsAndFixGraphCommand.d.ts +10 -0
  74. package/lib/esm/service/command/ChangeAllOtherEdgeOpsAndFixGraphCommand.js +38 -0
  75. package/lib/esm/service/command/ChangeEdgeOpCommand.d.ts +10 -0
  76. package/lib/esm/service/command/ChangeEdgeOpCommand.js +32 -0
  77. package/lib/esm/service/command/ConsolidateDescendantsCommand.d.ts +10 -0
  78. package/lib/esm/service/command/ConsolidateDescendantsCommand.js +83 -0
  79. package/lib/esm/service/command/RemoveSemicolons.d.ts +10 -0
  80. package/lib/esm/service/command/RemoveSemicolons.js +37 -0
  81. package/lib/esm/service/command/common.d.ts +31 -0
  82. package/lib/esm/service/command/common.js +22 -0
  83. package/lib/esm/service/completion.d.ts +4 -0
  84. package/lib/esm/service/completion.js +137 -0
  85. package/lib/esm/service/hover.d.ts +4 -0
  86. package/lib/esm/service/hover.js +119 -0
  87. package/lib/esm/service/languageFacts.d.ts +683 -0
  88. package/lib/esm/service/languageFacts.js +997 -0
  89. package/lib/esm/service/reference.d.ts +5 -0
  90. package/lib/esm/service/reference.js +66 -0
  91. package/lib/esm/service/rename.d.ts +4 -0
  92. package/lib/esm/service/rename.js +45 -0
  93. package/lib/esm/service/service.d.ts +28 -0
  94. package/lib/esm/service/service.js +35 -0
  95. package/lib/esm/service/util.d.ts +11 -0
  96. package/lib/esm/service/util.js +44 -0
  97. package/lib/esm/service/validation.d.ts +4 -0
  98. package/lib/esm/service/validation.js +20 -0
  99. package/lib/esm/tester.d.ts +1 -0
  100. package/lib/esm/tester.js +21 -0
  101. package/lib/esm/types.d.ts +396 -0
  102. package/lib/esm/types.js +71 -0
  103. package/lib/esm/visitor.d.ts +2 -0
  104. package/lib/esm/visitor.js +74 -0
  105. package/package.json +14 -12
  106. package/lib/index.d.ts +0 -5
  107. package/lib/service/colorProvider.d.ts +0 -6
  108. package/lib/service/polyfill.d.ts +0 -16
  109. package/lib/service/polyfill.js +0 -3
  110. package/lib/service/service.js +0 -39
@@ -0,0 +1,208 @@
1
+ import { SyntaxKind, forEachChild, isIdentifierNode, } from "../index.js";
2
+ import { assertNever, getStart } from "./util.js";
3
+ import { getAllowedEdgeOperation, findAllEdges, findNodeAtOffset, isEdgeStatement, isNodeId, getIdentifierText, isAttrStatement, edgeStatementHasAttributes, nodeContainsErrors, } from "../checker.js";
4
+ import * as ChangeEdgeOpCommand from "./command/ChangeEdgeOpCommand.js";
5
+ import * as ChangeAllOtherEdgeOpsAndFixGraphCommand from "./command/ChangeAllOtherEdgeOpsAndFixGraphCommand.js";
6
+ import * as ConsolidateDescendantsCommand from "./command/ConsolidateDescendantsCommand.js";
7
+ import * as RemoveSemicolonsCommand from "./command/RemoveSemicolons.js";
8
+ import { getOppositeKind, getOppositeEdgeOp, getAllowedOp } from "./command/common.js";
9
+ export function getCodeActions(doc, sourceFile, range, _context) {
10
+ let actions = getActionsFromDiagnostics(doc, sourceFile, range);
11
+ const general = getGeneralRefactorings(doc, sourceFile, range);
12
+ if (general) {
13
+ if (!actions)
14
+ actions = general;
15
+ else
16
+ actions.push.apply(actions, general);
17
+ }
18
+ return actions;
19
+ }
20
+ function getActionsFromDiagnostics(doc, file, range) {
21
+ const ds = file.diagnostics;
22
+ if (!ds || ds.length === 0)
23
+ return undefined;
24
+ const rangeStartOffset = doc.offsetAt(range.start);
25
+ const rangeEndOffset = doc.offsetAt(range.end);
26
+ const res = [];
27
+ for (const d of ds) {
28
+ if (isInRange(rangeStartOffset, rangeEndOffset, d.start, d.end)) {
29
+ const commands = getCommandsForDiagnostic(doc, file, d);
30
+ if (commands && commands.length > 0)
31
+ res.push.apply(res, commands);
32
+ }
33
+ }
34
+ return res.length === 0 ? undefined : res;
35
+ }
36
+ function getGeneralRefactorings(doc, file, range) {
37
+ if (!file.graph)
38
+ return undefined;
39
+ const g = file.graph;
40
+ const kw = g.keyword;
41
+ const rangeStartOffset = doc.offsetAt(range.start);
42
+ const rangeEndOffset = doc.offsetAt(range.end);
43
+ const keywordStart = getStart(file, kw);
44
+ const res = [];
45
+ if (isInRange(rangeStartOffset, rangeEndOffset, keywordStart, kw.end)) {
46
+ if (!subtreeContainsErrors(g)) {
47
+ const oppositeGraphType = getOppositeKind(kw.kind);
48
+ const convertGraph = convertGraphTypeCommand(file, g, oppositeGraphType);
49
+ res.push(convertGraph);
50
+ }
51
+ }
52
+ if (rangeStartOffset === rangeEndOffset) {
53
+ const candidates = [];
54
+ let clickedNode = findNodeAtOffset(g, rangeStartOffset);
55
+ if (clickedNode && !!clickedNode.parent) {
56
+ if (clickedNode.kind === SyntaxKind.SemicolonToken) {
57
+ res.push(RemoveSemicolonsCommand.create());
58
+ }
59
+ if (isIdentifierNode(clickedNode)) {
60
+ clickedNode = clickedNode.parent;
61
+ }
62
+ const clickedEdgeStatement = clickedNode.parent;
63
+ if (clickedEdgeStatement && !subtreeContainsErrors(clickedEdgeStatement)) {
64
+ if (isEdgeStatement(clickedEdgeStatement)
65
+ && clickedEdgeStatement.rhs.length === 1
66
+ && isNodeId(clickedEdgeStatement.source)
67
+ && !edgeStatementHasAttributes(clickedEdgeStatement)) {
68
+ candidates.push(clickedEdgeStatement);
69
+ const source = clickedEdgeStatement.source;
70
+ const sourceText = getIdentifierText(source.id);
71
+ const graphParent = clickedEdgeStatement.parent;
72
+ if (graphParent) {
73
+ let hasVisitedStatement = false;
74
+ let hasVisitedNodeModifier = false;
75
+ forEachChild(graphParent, statement => {
76
+ if (statement === clickedEdgeStatement) {
77
+ hasVisitedStatement = true;
78
+ return undefined;
79
+ }
80
+ if (hasVisitedNodeModifier) {
81
+ return;
82
+ }
83
+ else if (hasVisitedStatement) {
84
+ if (isAttrStatement(statement)
85
+ || subtreeContainsErrors(statement)) {
86
+ hasVisitedNodeModifier = true;
87
+ return true;
88
+ }
89
+ }
90
+ if (hasVisitedStatement) {
91
+ if (isEdgeStatement(statement)
92
+ && statement.rhs.length === 1
93
+ && !edgeStatementHasAttributes(statement)) {
94
+ const statementSource = statement.source;
95
+ if (isNodeId(statementSource)) {
96
+ const lowerSourceText = getIdentifierText(statementSource.id);
97
+ if (sourceText === lowerSourceText) {
98
+ candidates.push(statement);
99
+ }
100
+ }
101
+ }
102
+ }
103
+ return undefined;
104
+ });
105
+ }
106
+ }
107
+ if (candidates.length > 1) {
108
+ const action = ConsolidateDescendantsCommand.create(candidates, true);
109
+ res.push(action);
110
+ }
111
+ }
112
+ }
113
+ }
114
+ return res.length === 0 ? undefined : res;
115
+ ;
116
+ }
117
+ function getCommandsForDiagnostic(doc, file, d) {
118
+ switch (d.code.source) {
119
+ case 1: return getScannerErrorCommand(doc, file, d, d.code);
120
+ case 2: return getParserErrorCommand(doc, file, d, d.code);
121
+ case 4: return getCheckerErrorCommand(doc, file, d, d.code);
122
+ default: return assertNever(d.code);
123
+ }
124
+ }
125
+ function getScannerErrorCommand(_doc, _file, d, code) {
126
+ console.assert(d.code.source === 1);
127
+ console.assert(code.source === 1);
128
+ return undefined;
129
+ }
130
+ function getParserErrorCommand(_doc, _file, d, code) {
131
+ console.assert(d.code.source === 2);
132
+ console.assert(code.source === 2);
133
+ return undefined;
134
+ }
135
+ function getCheckerErrorCommand(_doc, file, d, code) {
136
+ console.assert(d.code.source === 4);
137
+ console.assert(code.source === 4);
138
+ switch (code.sub) {
139
+ case 0: {
140
+ const graph = file.graph;
141
+ if (!graph)
142
+ return undefined;
143
+ const allowedOp = getAllowedEdgeOperation(graph);
144
+ const wrongOp = getOppositeEdgeOp(allowedOp);
145
+ const kwk = graph.keyword.kind;
146
+ const fixSingleEdge = ChangeEdgeOpCommand.create(d.start, d.end, allowedOp, wrongOp);
147
+ const fixAll = convertGraphTypeCommand(file, graph, kwk);
148
+ const convertToThisWrongType = convertGraphTypeCommand(file, graph, getOppositeKind(kwk));
149
+ return [
150
+ fixSingleEdge,
151
+ fixAll,
152
+ convertToThisWrongType,
153
+ ];
154
+ }
155
+ }
156
+ }
157
+ function convertGraphTypeCommand(file, graph, changeToGraphType) {
158
+ const changeToEdgeOp = getAllowedOp(changeToGraphType);
159
+ const allEdges = findAllEdges(graph);
160
+ const edgeOffsets = allEdges
161
+ .filter(e => e.operation.kind !== changeToEdgeOp)
162
+ .map(e => ({
163
+ start: getStart(file, e.operation),
164
+ end: e.operation.end
165
+ }));
166
+ const graphTypeOffset = {
167
+ start: getStart(file, graph.keyword),
168
+ end: graph.keyword.end
169
+ };
170
+ return ChangeAllOtherEdgeOpsAndFixGraphCommand.create(edgeOffsets, changeToEdgeOp, graphTypeOffset, graph.keyword.kind, changeToGraphType);
171
+ }
172
+ function isInRange(rangeStartOffset, rangeEndOffset, startOffset, endOffset) {
173
+ if (rangeStartOffset === rangeEndOffset)
174
+ return startOffset <= rangeStartOffset && rangeEndOffset <= endOffset;
175
+ if (rangeStartOffset === startOffset && rangeEndOffset === endOffset)
176
+ return true;
177
+ return false;
178
+ }
179
+ const commandHandlers = {
180
+ ["DOT.changeEdgeOp"]: ChangeEdgeOpCommand.execute,
181
+ ["DOT.convertGraphType"]: ChangeAllOtherEdgeOpsAndFixGraphCommand.execute,
182
+ ["DOT.consolidateDescendants"]: ConsolidateDescendantsCommand.execute,
183
+ ["DOT.removeSemicolons"]: RemoveSemicolonsCommand.execute,
184
+ };
185
+ export function getAvailableCommands() {
186
+ return Object.keys(commandHandlers);
187
+ }
188
+ export function executeCommand(doc, sourceFile, cmd) {
189
+ const handler = commandHandlers[cmd.command];
190
+ return handler === undefined
191
+ ? undefined
192
+ : handler(doc, sourceFile, cmd);
193
+ }
194
+ function subtreeContainsErrors(node) {
195
+ if (nodeContainsErrors(node))
196
+ return true;
197
+ let hasError = false;
198
+ forEachChild(node, child => {
199
+ if (nodeContainsErrors(child)) {
200
+ hasError = true;
201
+ }
202
+ if (!hasError) {
203
+ hasError = subtreeContainsErrors(child);
204
+ }
205
+ });
206
+ return hasError;
207
+ }
208
+ //# sourceMappingURL=codeAction.js.map
@@ -0,0 +1,5 @@
1
+ import type { ColorInformation, ColorPresentation, Range, Color } from "vscode-languageserver-types";
2
+ import { SourceFile } from "../types.js";
3
+ import { DocumentLike } from "../index.js";
4
+ export declare function getDocumentColors(doc: DocumentLike, sourceFile: SourceFile): ColorInformation[] | undefined;
5
+ export declare function getColorRepresentations(_doc: DocumentLike, _sourceFile: SourceFile, color: Color, range: Range): ColorPresentation[] | undefined;
@@ -0,0 +1,64 @@
1
+ import { syntaxNodeToRange } from "./util.js";
2
+ import * as languageFacts from "./languageFacts.js";
3
+ const colorMap = languageFacts.colors;
4
+ export function getDocumentColors(doc, sourceFile) {
5
+ const cs = sourceFile.colors;
6
+ return cs
7
+ ? colorTableToColorInformation(doc, sourceFile, cs)
8
+ : undefined;
9
+ }
10
+ export function getColorRepresentations(_doc, _sourceFile, color, range) {
11
+ return !color || !range
12
+ ? undefined
13
+ : [{ label: '"' + getColorStringFromColor(color) + '"', }];
14
+ }
15
+ function colorTableToColorInformation(doc, sf, colors) {
16
+ if (!colors || colors.size === 0)
17
+ return [];
18
+ const res = [];
19
+ for (const [name, value] of colors) {
20
+ if (!name || !value)
21
+ continue;
22
+ const color = getColorFromName(name);
23
+ if (color) {
24
+ res.push({
25
+ range: syntaxNodeToRange(doc, sf, value.node),
26
+ color,
27
+ });
28
+ }
29
+ }
30
+ return res;
31
+ }
32
+ function getColorFromName(name) {
33
+ if (name.charAt(0) === "#")
34
+ return getHexCodeColor(name);
35
+ const colorAlias = colorMap[name.toLowerCase()];
36
+ return colorAlias
37
+ ? getHexCodeColor(colorAlias)
38
+ : undefined;
39
+ }
40
+ function getHexCodeColor(colorCode) {
41
+ const hexCode = colorCode.charAt(0) === "#"
42
+ ? colorCode.substring(1)
43
+ : colorCode;
44
+ const colorInt = parseInt(hexCode, 16);
45
+ return {
46
+ red: (colorInt >> 16 & 0xff) / 255.0,
47
+ green: (colorInt >> 8 & 0xff) / 255.0,
48
+ blue: (colorInt & 0xff) / 255.0,
49
+ alpha: hexCode.length === 8 ? (colorInt >> 24 & 0xff) / 255.0 : 1.0,
50
+ };
51
+ }
52
+ function getColorStringFromColor(c) {
53
+ const red = (c.red * 255) | 0;
54
+ const green = (c.green * 255) | 0;
55
+ const blue = (c.blue * 255) | 0;
56
+ return "#" + numberToPaddedString(red) + numberToPaddedString(green) + numberToPaddedString(blue);
57
+ }
58
+ function numberToPaddedString(n) {
59
+ const s = n.toString(16);
60
+ return (s.length === 1
61
+ ? "0" + s
62
+ : s).toLowerCase();
63
+ }
64
+ //# sourceMappingURL=colorProvider.js.map
@@ -0,0 +1,10 @@
1
+ import * as lst from "vscode-languageserver-types";
2
+ import { CommandIds } from "../codeAction.js";
3
+ import { GraphTypeStr, Offset, EdgeOpStr, ExecutableCommand, EdgeType, GraphType } from "./common.js";
4
+ import { DocumentLike, SourceFile, CommandApplication } from "../../index.js";
5
+ export interface ChangeAllOtherEdgeOpsAndFixGraphCommand extends lst.Command {
6
+ command: CommandIds.ConvertGraphType;
7
+ arguments: [Offset[], EdgeOpStr, Offset, GraphTypeStr];
8
+ }
9
+ export declare function create(edgeOffsets: Offset[], changeEdgesTo: EdgeType, graphOffset: Offset, changeFromGraph: GraphType, changeGraphTo: GraphType): ChangeAllOtherEdgeOpsAndFixGraphCommand;
10
+ export declare function execute(doc: DocumentLike, _sourceFile: SourceFile, cmd: ExecutableCommand): CommandApplication | undefined;
@@ -0,0 +1,38 @@
1
+ import { createChangeToEdit, getEdgeStr, getGraphKeywordStr } from "./common.js";
2
+ export function create(edgeOffsets, changeEdgesTo, graphOffset, changeFromGraph, changeGraphTo) {
3
+ const toGraph = getGraphKeywordStr(changeGraphTo);
4
+ const title = changeGraphTo === changeFromGraph
5
+ ? `Fix all edges to match ${toGraph}`
6
+ : `Convert ${getGraphKeywordStr(changeFromGraph)} to ${toGraph}`;
7
+ const edgeStr = getEdgeStr(changeEdgesTo);
8
+ return {
9
+ title,
10
+ command: "DOT.convertGraphType",
11
+ arguments: [edgeOffsets, edgeStr, graphOffset, toGraph],
12
+ };
13
+ }
14
+ export function execute(doc, _sourceFile, cmd) {
15
+ if (!isChangeAllOtherEdgeOpsAndFixGraphCommand(cmd))
16
+ return undefined;
17
+ const [edgeOffsets, changeEdgeTo, graphOffset, changeGraphTo] = cmd.arguments;
18
+ const edits = edgeOffsets.map(o => {
19
+ const startPos = doc.positionAt(o.start);
20
+ const endPos = doc.positionAt(o.end);
21
+ return createChangeToEdit(startPos, endPos, changeEdgeTo);
22
+ });
23
+ const graphStart = doc.positionAt(graphOffset.start);
24
+ const graphEnd = doc.positionAt(graphOffset.end);
25
+ edits.push(createChangeToEdit(graphStart, graphEnd, changeGraphTo));
26
+ return {
27
+ label: `Convert graph to "${changeGraphTo}"`,
28
+ edit: {
29
+ changes: {
30
+ [doc.uri]: edits,
31
+ }
32
+ }
33
+ };
34
+ }
35
+ function isChangeAllOtherEdgeOpsAndFixGraphCommand(cmd) {
36
+ return cmd.command === "DOT.convertGraphType" && !!cmd.arguments && cmd.arguments.length === 4;
37
+ }
38
+ //# sourceMappingURL=ChangeAllOtherEdgeOpsAndFixGraphCommand.js.map
@@ -0,0 +1,10 @@
1
+ import * as lst from "vscode-languageserver-types";
2
+ import { CommandIds } from "../codeAction.js";
3
+ import { EdgeOpStr, ExecutableCommand, EdgeType } from "./common.js";
4
+ import { DocumentLike, SourceFile, CommandApplication } from "../../index.js";
5
+ export interface ChangeEdgeOpCommand extends lst.Command {
6
+ command: CommandIds.ChangeEdgeOp;
7
+ arguments: [number, number, EdgeOpStr];
8
+ }
9
+ export declare function create(startOffset: number, endOffset: number, changeTo: EdgeType, changeFrom: EdgeType): ChangeEdgeOpCommand;
10
+ export declare function execute(doc: DocumentLike, _sourceFile: SourceFile, cmd: ExecutableCommand): CommandApplication | undefined;
@@ -0,0 +1,32 @@
1
+ import * as lst from "vscode-languageserver-types";
2
+ import { getEdgeStr } from "./common.js";
3
+ export function create(startOffset, endOffset, changeTo, changeFrom) {
4
+ const from = getEdgeStr(changeFrom);
5
+ const to = getEdgeStr(changeTo);
6
+ return {
7
+ title: `Change "${from}" to "${to}".`,
8
+ command: "DOT.changeEdgeOp",
9
+ arguments: [startOffset, endOffset, to],
10
+ };
11
+ }
12
+ export function execute(doc, _sourceFile, cmd) {
13
+ if (!isChangeEdgeOpCommand(cmd))
14
+ return undefined;
15
+ const [startOffset, endOffset, changeTo] = cmd.arguments;
16
+ const startPos = doc.positionAt(startOffset);
17
+ const endPos = doc.positionAt(endOffset);
18
+ return {
19
+ label: `Change of invalid edge to "${changeTo}"'"`,
20
+ edit: {
21
+ changes: {
22
+ [doc.uri]: [
23
+ lst.TextEdit.replace(lst.Range.create(startPos, endPos), changeTo),
24
+ ],
25
+ }
26
+ }
27
+ };
28
+ }
29
+ function isChangeEdgeOpCommand(cmd) {
30
+ return cmd.command === "DOT.changeEdgeOp" && !!cmd.arguments && cmd.arguments.length === 3;
31
+ }
32
+ //# sourceMappingURL=ChangeEdgeOpCommand.js.map
@@ -0,0 +1,10 @@
1
+ import * as lst from "vscode-languageserver-types";
2
+ import { CommandIds } from "../codeAction.js";
3
+ import { ExecutableCommand } from "./common.js";
4
+ import { DocumentLike, SourceFile, CommandApplication, EdgeStatement } from "../../index.js";
5
+ export interface ConsolidateDescendantsCommand extends lst.Command {
6
+ command: CommandIds.ConsolidateDescendants;
7
+ arguments: number[];
8
+ }
9
+ export declare function create(statements: EdgeStatement[], below: boolean): ConsolidateDescendantsCommand;
10
+ export declare function execute(doc: DocumentLike, sourceFile: SourceFile, cmd: ExecutableCommand): CommandApplication | undefined;
@@ -0,0 +1,83 @@
1
+ import { getIdentifierText, findNodeAtOffset } from "../../checker.js";
2
+ import { getStart } from "../util.js";
3
+ export function create(statements, below) {
4
+ const first = statements[0];
5
+ const from = getIdentifierText(first.source.id);
6
+ const title = below
7
+ ? `Convert edges below from "${from}" to subgraph`
8
+ : `Convert edges from "${from}" to subgraph`;
9
+ return {
10
+ title,
11
+ command: "DOT.consolidateDescendants",
12
+ arguments: statements.map(s => s.pos),
13
+ };
14
+ }
15
+ export function execute(doc, sourceFile, cmd) {
16
+ if (!isConsolidateDescendantsCommand(cmd))
17
+ return undefined;
18
+ const g = sourceFile.graph;
19
+ if (!g)
20
+ return undefined;
21
+ const candidateIndexes = cmd.arguments;
22
+ const candidates = candidateIndexes.map(i => findNodeAtOffset(g, i).parent.parent);
23
+ const first = candidates.shift();
24
+ const from = getIdentifierText(first.source.id);
25
+ const edits = [];
26
+ const firstRight = first.rhs[0];
27
+ const firstRightTargetStart = getStart(sourceFile, firstRight.target);
28
+ const firstRightTargetEnd = firstRight.target.end;
29
+ const contents = [
30
+ sourceFile.content.substring(firstRightTargetStart, firstRightTargetEnd)
31
+ ];
32
+ for (const descendant of candidates) {
33
+ const rightItem = descendant.rhs[0];
34
+ const rightItemTarget = rightItem.target;
35
+ const rightItemTargetStart = rightItemTarget.pos;
36
+ const rightItemTargetEnd = rightItem.target.end;
37
+ const rightItemContent = sourceFile.content.substring(rightItemTargetStart, rightItemTargetEnd);
38
+ edits.push({
39
+ newText: "",
40
+ range: {
41
+ start: doc.positionAt(descendant.pos),
42
+ end: doc.positionAt(rightItemTargetStart),
43
+ }
44
+ });
45
+ edits.push({
46
+ newText: "",
47
+ range: {
48
+ start: doc.positionAt(rightItemTargetStart),
49
+ end: doc.positionAt(rightItemTargetEnd),
50
+ }
51
+ });
52
+ if (descendant.terminator !== undefined) {
53
+ edits.push({
54
+ newText: "",
55
+ range: {
56
+ start: doc.positionAt(getStart(sourceFile, descendant.terminator)),
57
+ end: doc.positionAt(descendant.terminator.end),
58
+ }
59
+ });
60
+ }
61
+ contents.push(rightItemContent);
62
+ }
63
+ const toInsert = `{ ${contents.map(s => s.trim()).join(" ")} }`;
64
+ edits.push({
65
+ newText: toInsert,
66
+ range: {
67
+ start: doc.positionAt(firstRightTargetStart),
68
+ end: doc.positionAt(firstRightTargetEnd),
69
+ }
70
+ });
71
+ return {
72
+ label: `Convert edges from "${from}" to subgraph.`,
73
+ edit: {
74
+ changes: {
75
+ [doc.uri]: edits,
76
+ }
77
+ }
78
+ };
79
+ }
80
+ function isConsolidateDescendantsCommand(cmd) {
81
+ return cmd.command === "DOT.consolidateDescendants" && !!cmd.arguments && cmd.arguments.length > 1;
82
+ }
83
+ //# sourceMappingURL=ConsolidateDescendantsCommand.js.map
@@ -0,0 +1,10 @@
1
+ import * as lst from "vscode-languageserver-types";
2
+ import { CommandIds } from "../codeAction.js";
3
+ import { ExecutableCommand } from "./common.js";
4
+ import { DocumentLike, SourceFile, CommandApplication } from "../../index.js";
5
+ export interface RemoveSemicolonsCommand extends lst.Command {
6
+ command: CommandIds.RemoveSemicolons;
7
+ arguments: undefined;
8
+ }
9
+ export declare function create(): RemoveSemicolonsCommand;
10
+ export declare function execute(doc: DocumentLike, sourceFile: SourceFile, cmd: ExecutableCommand): CommandApplication | undefined;
@@ -0,0 +1,37 @@
1
+ import { createChangeToEdit } from "./common.js";
2
+ import { findOptionalSemicolons } from "../../checker.js";
3
+ export function create() {
4
+ return {
5
+ title: "Remove optional semicolons",
6
+ command: "DOT.removeSemicolons",
7
+ arguments: undefined,
8
+ };
9
+ }
10
+ export function execute(doc, sourceFile, cmd) {
11
+ if (!isRemoveSemicolonsCommand(cmd))
12
+ return undefined;
13
+ const g = sourceFile.graph;
14
+ if (!g)
15
+ return undefined;
16
+ const semicolons = findOptionalSemicolons(g);
17
+ const edits = semicolons.map(s => {
18
+ const end = s.end;
19
+ const start = end - 1;
20
+ return createChangeToEdit(doc.positionAt(start), doc.positionAt(end), "");
21
+ });
22
+ return {
23
+ label: `Remove optional semicolons`,
24
+ edit: {
25
+ changes: {
26
+ [doc.uri]: edits,
27
+ }
28
+ }
29
+ };
30
+ }
31
+ function isRemoveSemicolonsCommand(cmd) {
32
+ return cmd.command === "DOT.removeSemicolons"
33
+ && (!cmd.arguments
34
+ || cmd.arguments.length === 0
35
+ || cmd.arguments.every(e => e === undefined));
36
+ }
37
+ //# sourceMappingURL=RemoveSemicolons.js.map
@@ -0,0 +1,31 @@
1
+ import { TextEdit, type Position } from "vscode-languageserver-types";
2
+ import { SyntaxKind } from "../../index.js";
3
+ import { CommandIds } from "../codeAction.js";
4
+ export declare function createChangeToEdit(start: Position, end: Position, changeTo: string): TextEdit;
5
+ export interface Offset {
6
+ start: number;
7
+ end: number;
8
+ }
9
+ export declare type ExecutableCommand = {
10
+ command: CommandIds;
11
+ arguments?: any[];
12
+ };
13
+ export declare type EdgeOpStr = "--" | "->";
14
+ export declare function getEdgeStr(op: SyntaxKind.UndirectedEdgeOp): "--";
15
+ export declare function getEdgeStr(op: SyntaxKind.DirectedEdgeOp): "->";
16
+ export declare function getEdgeStr(op: SyntaxKind.DirectedEdgeOp | SyntaxKind.UndirectedEdgeOp): "->" | "--";
17
+ export declare type GraphTypeStr = "graph" | "digraph";
18
+ export declare function getGraphKeywordStr(g: SyntaxKind.GraphKeyword): "graph";
19
+ export declare function getGraphKeywordStr(g: SyntaxKind.DigraphKeyword): "digraph";
20
+ export declare function getGraphKeywordStr(g: GraphType): "digraph" | "graph";
21
+ export declare type GraphType = SyntaxKind.DigraphKeyword | SyntaxKind.GraphKeyword;
22
+ export declare function getOppositeKind(g: SyntaxKind.DigraphKeyword): SyntaxKind.GraphKeyword;
23
+ export declare function getOppositeKind(g: SyntaxKind.GraphKeyword): SyntaxKind.DigraphKeyword;
24
+ export declare function getOppositeKind(g: GraphType): GraphType;
25
+ export declare type EdgeType = SyntaxKind.DirectedEdgeOp | SyntaxKind.UndirectedEdgeOp;
26
+ export declare function getOppositeEdgeOp(g: SyntaxKind.DirectedEdgeOp): SyntaxKind.UndirectedEdgeOp;
27
+ export declare function getOppositeEdgeOp(g: SyntaxKind.UndirectedEdgeOp): SyntaxKind.DirectedEdgeOp;
28
+ export declare function getOppositeEdgeOp(g: EdgeType): EdgeType;
29
+ export declare function getAllowedOp(g: SyntaxKind.GraphKeyword): SyntaxKind.UndirectedEdgeOp;
30
+ export declare function getAllowedOp(g: SyntaxKind.DigraphKeyword): SyntaxKind.DirectedEdgeOp;
31
+ export declare function getAllowedOp(g: GraphType): EdgeType;
@@ -0,0 +1,22 @@
1
+ import { TextEdit, Range } from "vscode-languageserver-types";
2
+ import { SyntaxKind } from "../../index.js";
3
+ export function createChangeToEdit(start, end, changeTo) {
4
+ return TextEdit.replace(Range.create(start, end), changeTo);
5
+ }
6
+ ;
7
+ export function getEdgeStr(op) {
8
+ return op === SyntaxKind.DirectedEdgeOp ? "->" : "--";
9
+ }
10
+ export function getGraphKeywordStr(g) {
11
+ return g === SyntaxKind.DigraphKeyword ? "digraph" : "graph";
12
+ }
13
+ export function getOppositeKind(g) {
14
+ return g === SyntaxKind.DigraphKeyword ? SyntaxKind.GraphKeyword : SyntaxKind.DigraphKeyword;
15
+ }
16
+ export function getOppositeEdgeOp(g) {
17
+ return g === SyntaxKind.DirectedEdgeOp ? SyntaxKind.UndirectedEdgeOp : SyntaxKind.DirectedEdgeOp;
18
+ }
19
+ export function getAllowedOp(g) {
20
+ return g === SyntaxKind.DigraphKeyword ? SyntaxKind.DirectedEdgeOp : SyntaxKind.UndirectedEdgeOp;
21
+ }
22
+ //# sourceMappingURL=common.js.map
@@ -0,0 +1,4 @@
1
+ import * as lst from "vscode-languageserver-types";
2
+ import { SourceFile } from "../types.js";
3
+ import { DocumentLike } from "../index.js";
4
+ export declare function getCompletions(doc: DocumentLike, sourceFile: SourceFile, position: lst.Position): lst.CompletionItem[];