dot-language-support 2.3.0 → 3.0.0
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.
- package/dist/index.d.ts +497 -0
- package/dist/index.js +3853 -0
- package/package.json +10 -11
- package/.github/dependabot.yml +0 -15
- package/.github/workflows/CD.yml +0 -37
- package/.github/workflows/CI.yml +0 -28
- package/.github/workflows/auto-merge.yaml +0 -26
- package/CITATION.cff +0 -14
- package/biome.json +0 -48
- package/lib/cjs/binder.d.ts +0 -2
- package/lib/cjs/binder.js +0 -297
- package/lib/cjs/checker.d.ts +0 -15
- package/lib/cjs/checker.js +0 -228
- package/lib/cjs/core.d.ts +0 -1
- package/lib/cjs/core.js +0 -13
- package/lib/cjs/error.d.ts +0 -3
- package/lib/cjs/error.js +0 -12
- package/lib/cjs/index.d.ts +0 -5
- package/lib/cjs/index.js +0 -22
- package/lib/cjs/parser.d.ts +0 -27
- package/lib/cjs/parser.js +0 -664
- package/lib/cjs/scanner.d.ts +0 -41
- package/lib/cjs/scanner.js +0 -578
- package/lib/cjs/service/codeAction.d.ts +0 -12
- package/lib/cjs/service/codeAction.js +0 -245
- package/lib/cjs/service/colorProvider.d.ts +0 -5
- package/lib/cjs/service/colorProvider.js +0 -91
- package/lib/cjs/service/command/ChangeAllOtherEdgeOpsAndFixGraphCommand.d.ts +0 -10
- package/lib/cjs/service/command/ChangeAllOtherEdgeOpsAndFixGraphCommand.js +0 -42
- package/lib/cjs/service/command/ChangeEdgeOpCommand.d.ts +0 -10
- package/lib/cjs/service/command/ChangeEdgeOpCommand.js +0 -67
- package/lib/cjs/service/command/ConsolidateDescendantsCommand.d.ts +0 -10
- package/lib/cjs/service/command/ConsolidateDescendantsCommand.js +0 -87
- package/lib/cjs/service/command/RemoveSemicolons.d.ts +0 -10
- package/lib/cjs/service/command/RemoveSemicolons.js +0 -39
- package/lib/cjs/service/command/common.d.ts +0 -31
- package/lib/cjs/service/command/common.js +0 -33
- package/lib/cjs/service/completion.d.ts +0 -4
- package/lib/cjs/service/completion.js +0 -173
- package/lib/cjs/service/hover.d.ts +0 -4
- package/lib/cjs/service/hover.js +0 -142
- package/lib/cjs/service/languageFacts.d.ts +0 -683
- package/lib/cjs/service/languageFacts.js +0 -996
- package/lib/cjs/service/reference.d.ts +0 -5
- package/lib/cjs/service/reference.js +0 -67
- package/lib/cjs/service/rename.d.ts +0 -4
- package/lib/cjs/service/rename.js +0 -51
- package/lib/cjs/service/service.d.ts +0 -28
- package/lib/cjs/service/service.js +0 -38
- package/lib/cjs/service/util.d.ts +0 -11
- package/lib/cjs/service/util.js +0 -49
- package/lib/cjs/service/validation.d.ts +0 -4
- package/lib/cjs/service/validation.js +0 -23
- package/lib/cjs/tester.d.ts +0 -1
- package/lib/cjs/tester.js +0 -23
- package/lib/cjs/types.d.ts +0 -397
- package/lib/cjs/types.js +0 -74
- package/lib/cjs/visitor.d.ts +0 -2
- package/lib/cjs/visitor.js +0 -76
- package/lib/esm/binder.d.ts +0 -2
- package/lib/esm/binder.js +0 -294
- package/lib/esm/checker.d.ts +0 -15
- package/lib/esm/checker.js +0 -212
- package/lib/esm/core.d.ts +0 -1
- package/lib/esm/core.js +0 -10
- package/lib/esm/error.d.ts +0 -3
- package/lib/esm/error.js +0 -8
- package/lib/esm/index.d.ts +0 -5
- package/lib/esm/index.js +0 -6
- package/lib/esm/parser.d.ts +0 -27
- package/lib/esm/parser.js +0 -714
- package/lib/esm/scanner.d.ts +0 -41
- package/lib/esm/scanner.js +0 -581
- package/lib/esm/service/codeAction.d.ts +0 -12
- package/lib/esm/service/codeAction.js +0 -207
- package/lib/esm/service/colorProvider.d.ts +0 -5
- package/lib/esm/service/colorProvider.js +0 -54
- package/lib/esm/service/command/ChangeAllOtherEdgeOpsAndFixGraphCommand.d.ts +0 -10
- package/lib/esm/service/command/ChangeAllOtherEdgeOpsAndFixGraphCommand.js +0 -38
- package/lib/esm/service/command/ChangeEdgeOpCommand.d.ts +0 -10
- package/lib/esm/service/command/ChangeEdgeOpCommand.js +0 -30
- package/lib/esm/service/command/ConsolidateDescendantsCommand.d.ts +0 -10
- package/lib/esm/service/command/ConsolidateDescendantsCommand.js +0 -83
- package/lib/esm/service/command/RemoveSemicolons.d.ts +0 -10
- package/lib/esm/service/command/RemoveSemicolons.js +0 -35
- package/lib/esm/service/command/common.d.ts +0 -31
- package/lib/esm/service/command/common.js +0 -25
- package/lib/esm/service/completion.d.ts +0 -4
- package/lib/esm/service/completion.js +0 -137
- package/lib/esm/service/hover.d.ts +0 -4
- package/lib/esm/service/hover.js +0 -135
- package/lib/esm/service/languageFacts.d.ts +0 -683
- package/lib/esm/service/languageFacts.js +0 -993
- package/lib/esm/service/reference.d.ts +0 -5
- package/lib/esm/service/reference.js +0 -63
- package/lib/esm/service/rename.d.ts +0 -4
- package/lib/esm/service/rename.js +0 -48
- package/lib/esm/service/service.d.ts +0 -28
- package/lib/esm/service/service.js +0 -35
- package/lib/esm/service/util.d.ts +0 -11
- package/lib/esm/service/util.js +0 -42
- package/lib/esm/service/validation.d.ts +0 -4
- package/lib/esm/service/validation.js +0 -20
- package/lib/esm/tester.d.ts +0 -1
- package/lib/esm/tester.js +0 -21
- package/lib/esm/types.d.ts +0 -397
- package/lib/esm/types.js +0 -71
- package/lib/esm/visitor.d.ts +0 -2
- package/lib/esm/visitor.js +0 -73
package/lib/esm/binder.js
DELETED
|
@@ -1,294 +0,0 @@
|
|
|
1
|
-
import { getIdentifierText, nodeContainsErrors } from "./checker.js";
|
|
2
|
-
import { isIdentifierNode } from "./parser.js";
|
|
3
|
-
import { SyntaxKind, } from "./types.js";
|
|
4
|
-
const binder = createBinder();
|
|
5
|
-
export function bindSourceFile(file) {
|
|
6
|
-
binder.bind(file);
|
|
7
|
-
}
|
|
8
|
-
function createBinder() {
|
|
9
|
-
let parent;
|
|
10
|
-
let symbolTable;
|
|
11
|
-
let colorTable;
|
|
12
|
-
let graphContext = 0;
|
|
13
|
-
function bind(node) {
|
|
14
|
-
if (!node)
|
|
15
|
-
return;
|
|
16
|
-
const saveParent = parent;
|
|
17
|
-
const saveContext = graphContext;
|
|
18
|
-
node.parent = saveParent;
|
|
19
|
-
node.graphContext = saveContext;
|
|
20
|
-
parent = node;
|
|
21
|
-
innerBind(node);
|
|
22
|
-
parent = saveParent;
|
|
23
|
-
graphContext = saveContext;
|
|
24
|
-
}
|
|
25
|
-
function innerBind(node) {
|
|
26
|
-
switch (node.kind) {
|
|
27
|
-
case SyntaxKind.DirectedGraph:
|
|
28
|
-
case SyntaxKind.UndirectedGraph:
|
|
29
|
-
return bindGraph(node);
|
|
30
|
-
case SyntaxKind.AttributeStatement:
|
|
31
|
-
return bindAttributeStatement(node);
|
|
32
|
-
case SyntaxKind.EdgeStatement:
|
|
33
|
-
return bindEdgeStatement(node);
|
|
34
|
-
case SyntaxKind.NodeStatement:
|
|
35
|
-
return bindNodeStatement(node);
|
|
36
|
-
case SyntaxKind.SubGraph:
|
|
37
|
-
return bindSubGraph(node);
|
|
38
|
-
case SyntaxKind.SubGraphStatement:
|
|
39
|
-
return bindSubGraphStatement(node);
|
|
40
|
-
case SyntaxKind.IdEqualsIdStatement:
|
|
41
|
-
return bindIdEqualsIdStatement(node);
|
|
42
|
-
case SyntaxKind.QuotedTextIdentifier:
|
|
43
|
-
return bindQuotedTextIdentifier(node);
|
|
44
|
-
case SyntaxKind.EdgeRhs:
|
|
45
|
-
return bindEdgeRhs(node);
|
|
46
|
-
case SyntaxKind.AttributeContainer:
|
|
47
|
-
return bindAttributeContainer(node);
|
|
48
|
-
case SyntaxKind.Assignment:
|
|
49
|
-
return bindAssignment(node);
|
|
50
|
-
case SyntaxKind.NormalPortDeclaration:
|
|
51
|
-
return bindNormalPortDeclaration(node);
|
|
52
|
-
case SyntaxKind.CompassPortDeclaration:
|
|
53
|
-
return bindCompassPortDeclaration(node);
|
|
54
|
-
case SyntaxKind.NodeId:
|
|
55
|
-
return bindNodeId(node);
|
|
56
|
-
default:
|
|
57
|
-
if (node.kind >= SyntaxKind.FirstNode)
|
|
58
|
-
throw "TODO";
|
|
59
|
-
}
|
|
60
|
-
}
|
|
61
|
-
function bindGraph(node) {
|
|
62
|
-
if (node.strict) {
|
|
63
|
-
graphContext |= 2;
|
|
64
|
-
}
|
|
65
|
-
switch (node.kind) {
|
|
66
|
-
case SyntaxKind.DirectedGraph:
|
|
67
|
-
graphContext |= 4;
|
|
68
|
-
break;
|
|
69
|
-
case SyntaxKind.UndirectedGraph:
|
|
70
|
-
graphContext |= 8;
|
|
71
|
-
break;
|
|
72
|
-
}
|
|
73
|
-
if (node.id) {
|
|
74
|
-
ensureGlobalSymbol(node.id);
|
|
75
|
-
bind(node.id);
|
|
76
|
-
}
|
|
77
|
-
if (node.strict)
|
|
78
|
-
bind(node.strict);
|
|
79
|
-
bindChildren(node.statements);
|
|
80
|
-
}
|
|
81
|
-
function bindAttributeStatement(node) {
|
|
82
|
-
bind(node.subject);
|
|
83
|
-
bindChildren(node.attributes);
|
|
84
|
-
if (node.terminator)
|
|
85
|
-
bind(node.terminator);
|
|
86
|
-
}
|
|
87
|
-
function bindEdgeStatement(node) {
|
|
88
|
-
bindChildren(node.attributes);
|
|
89
|
-
bindChildren(node.rhs);
|
|
90
|
-
bind(node.source);
|
|
91
|
-
if (node.terminator)
|
|
92
|
-
bind(node.terminator);
|
|
93
|
-
}
|
|
94
|
-
function bindNodeStatement(node) {
|
|
95
|
-
bind(node.id);
|
|
96
|
-
bindChildren(node.attributes);
|
|
97
|
-
if (node.terminator)
|
|
98
|
-
bind(node.terminator);
|
|
99
|
-
}
|
|
100
|
-
function bindSubGraph(node) {
|
|
101
|
-
if (node.id) {
|
|
102
|
-
bind(node.id);
|
|
103
|
-
}
|
|
104
|
-
bindChildren(node.statements);
|
|
105
|
-
}
|
|
106
|
-
function bindSubGraphStatement(node) {
|
|
107
|
-
bind(node.subgraph);
|
|
108
|
-
if (node.terminator)
|
|
109
|
-
bind(node.terminator);
|
|
110
|
-
}
|
|
111
|
-
function bindIdEqualsIdStatement(node) {
|
|
112
|
-
bind(node.leftId);
|
|
113
|
-
bind(node.rightId);
|
|
114
|
-
if (node.rightId && !nodeContainsErrors(node.rightId)) {
|
|
115
|
-
if (isAttributeName("color", node.leftId)) {
|
|
116
|
-
ensureGlobalColor(node.rightId);
|
|
117
|
-
}
|
|
118
|
-
else if (isAttributeName("fillcolor", node.leftId)) {
|
|
119
|
-
ensureGlobalColor(node.rightId);
|
|
120
|
-
}
|
|
121
|
-
else if (isAttributeName("bgcolor", node.leftId)) {
|
|
122
|
-
ensureGlobalColor(node.rightId);
|
|
123
|
-
}
|
|
124
|
-
else if (isAttributeName("fontcolor", node.leftId)) {
|
|
125
|
-
ensureGlobalColor(node.rightId);
|
|
126
|
-
}
|
|
127
|
-
}
|
|
128
|
-
if (node.terminator)
|
|
129
|
-
bind(node.terminator);
|
|
130
|
-
}
|
|
131
|
-
function bindQuotedTextIdentifier(node) {
|
|
132
|
-
bindChildren(node.values);
|
|
133
|
-
node.concatenation = node.values.map(v => v.text).join("");
|
|
134
|
-
}
|
|
135
|
-
function bindEdgeRhs(node) {
|
|
136
|
-
bind(node.operation);
|
|
137
|
-
bind(node.target);
|
|
138
|
-
}
|
|
139
|
-
function bindAttributeContainer(node) {
|
|
140
|
-
bind(node.openBracket);
|
|
141
|
-
bindChildren(node.assignments);
|
|
142
|
-
bind(node.closeBracket);
|
|
143
|
-
}
|
|
144
|
-
function bindAssignment(node) {
|
|
145
|
-
const attrContainer = node.parent;
|
|
146
|
-
console.assert(!!attrContainer);
|
|
147
|
-
const superParentStatement = attrContainer.parent;
|
|
148
|
-
console.assert(!!superParentStatement);
|
|
149
|
-
bind(node.leftId);
|
|
150
|
-
let carrierIdentifier;
|
|
151
|
-
switch (superParentStatement.kind) {
|
|
152
|
-
case SyntaxKind.NodeStatement:
|
|
153
|
-
carrierIdentifier = superParentStatement.id.id;
|
|
154
|
-
break;
|
|
155
|
-
case SyntaxKind.EdgeStatement:
|
|
156
|
-
break;
|
|
157
|
-
case SyntaxKind.SubGraphStatement:
|
|
158
|
-
break;
|
|
159
|
-
case SyntaxKind.AttributeStatement:
|
|
160
|
-
break;
|
|
161
|
-
}
|
|
162
|
-
if (carrierIdentifier)
|
|
163
|
-
ensureMemberSymbol(node.leftId, carrierIdentifier);
|
|
164
|
-
bind(node.rightId);
|
|
165
|
-
if (node.rightId && !nodeContainsErrors(node.rightId)) {
|
|
166
|
-
if (isAttributeName("color", node.leftId)) {
|
|
167
|
-
ensureGlobalColor(node.rightId);
|
|
168
|
-
}
|
|
169
|
-
}
|
|
170
|
-
if (node.terminator)
|
|
171
|
-
bind(node.terminator);
|
|
172
|
-
}
|
|
173
|
-
function bindNormalPortDeclaration(node) {
|
|
174
|
-
bind(node.colon);
|
|
175
|
-
ensureGlobalSymbol(node.id);
|
|
176
|
-
bind(node.id);
|
|
177
|
-
if (node.compassPt)
|
|
178
|
-
bind(node.compassPt);
|
|
179
|
-
}
|
|
180
|
-
function bindCompassPortDeclaration(node) {
|
|
181
|
-
bind(node.colon);
|
|
182
|
-
if (node.compassPt)
|
|
183
|
-
bind(node.compassPt);
|
|
184
|
-
}
|
|
185
|
-
function bindNodeId(node) {
|
|
186
|
-
ensureGlobalSymbol(node.id);
|
|
187
|
-
bind(node.id);
|
|
188
|
-
if (node.port)
|
|
189
|
-
bind(node.port);
|
|
190
|
-
}
|
|
191
|
-
function bindChildren(nodes) {
|
|
192
|
-
for (const n of nodes)
|
|
193
|
-
bind(n);
|
|
194
|
-
}
|
|
195
|
-
function createSymbolTable() {
|
|
196
|
-
return new Map();
|
|
197
|
-
}
|
|
198
|
-
function createColorTable() {
|
|
199
|
-
return new Map();
|
|
200
|
-
}
|
|
201
|
-
function ensureMemberSymbol(node, carrier) {
|
|
202
|
-
if (node && carrier && isIdentifierNode(node)) {
|
|
203
|
-
const name = getIdentifierText(node);
|
|
204
|
-
if (name === undefined)
|
|
205
|
-
return;
|
|
206
|
-
const carrierSymbol = carrier.symbol;
|
|
207
|
-
if (carrierSymbol === undefined)
|
|
208
|
-
throw "carrierSymbol is undefined";
|
|
209
|
-
let symbols = carrierSymbol.members;
|
|
210
|
-
if (symbols === undefined)
|
|
211
|
-
carrierSymbol.members = symbols = createSymbolTable();
|
|
212
|
-
ensureSymbolOnTable(name, node, symbols);
|
|
213
|
-
return;
|
|
214
|
-
}
|
|
215
|
-
console.warn("ensureSymbol called on non-identifier node");
|
|
216
|
-
debugger;
|
|
217
|
-
}
|
|
218
|
-
function ensureGlobalSymbol(node) {
|
|
219
|
-
if (node && isIdentifierNode(node)) {
|
|
220
|
-
const symbols = symbolTable;
|
|
221
|
-
const name = getIdentifierText(node);
|
|
222
|
-
if (name === undefined)
|
|
223
|
-
return;
|
|
224
|
-
if (symbols === undefined)
|
|
225
|
-
throw "symbolTable is undefined";
|
|
226
|
-
ensureSymbolOnTable(name, node, symbols);
|
|
227
|
-
return;
|
|
228
|
-
}
|
|
229
|
-
console.warn("ensureSymbol called on non-identifier node");
|
|
230
|
-
debugger;
|
|
231
|
-
}
|
|
232
|
-
function ensureSymbolOnTable(name, node, symbols) {
|
|
233
|
-
if (!name)
|
|
234
|
-
return;
|
|
235
|
-
let sym = symbols.get(name);
|
|
236
|
-
if (sym === undefined) {
|
|
237
|
-
sym = createSymbol(name, node);
|
|
238
|
-
symbols.set(name, sym);
|
|
239
|
-
}
|
|
240
|
-
else {
|
|
241
|
-
if (!sym.references)
|
|
242
|
-
sym.references = [node];
|
|
243
|
-
else
|
|
244
|
-
sym.references.push(node);
|
|
245
|
-
}
|
|
246
|
-
node.symbol = sym;
|
|
247
|
-
}
|
|
248
|
-
function ensureGlobalColor(node) {
|
|
249
|
-
if (node && isIdentifierNode(node)) {
|
|
250
|
-
const colors = colorTable;
|
|
251
|
-
const name = getIdentifierText(node);
|
|
252
|
-
if (name === undefined)
|
|
253
|
-
return;
|
|
254
|
-
if (colors === undefined)
|
|
255
|
-
throw "symbolTable is undefined";
|
|
256
|
-
const color = createColor(node);
|
|
257
|
-
colors.set(name, color);
|
|
258
|
-
return;
|
|
259
|
-
}
|
|
260
|
-
console.warn("ensureSymbol called on non-identifier node");
|
|
261
|
-
debugger;
|
|
262
|
-
}
|
|
263
|
-
function createSymbol(name, node) {
|
|
264
|
-
if (!name)
|
|
265
|
-
throw "name is falsy";
|
|
266
|
-
if (!node)
|
|
267
|
-
throw "node is undefined or null";
|
|
268
|
-
return {
|
|
269
|
-
name,
|
|
270
|
-
firstMention: node,
|
|
271
|
-
references: undefined,
|
|
272
|
-
};
|
|
273
|
-
}
|
|
274
|
-
function createColor(node) {
|
|
275
|
-
return {
|
|
276
|
-
node,
|
|
277
|
-
};
|
|
278
|
-
}
|
|
279
|
-
function isAttributeName(name, id) {
|
|
280
|
-
return id ? getIdentifierText(id).trim().toLowerCase() === name : false;
|
|
281
|
-
}
|
|
282
|
-
return {
|
|
283
|
-
bind: file => {
|
|
284
|
-
symbolTable = createSymbolTable();
|
|
285
|
-
colorTable = createColorTable();
|
|
286
|
-
const { graph } = file;
|
|
287
|
-
if (graph)
|
|
288
|
-
bind(graph);
|
|
289
|
-
file.symbols = symbolTable;
|
|
290
|
-
file.colors = colorTable;
|
|
291
|
-
},
|
|
292
|
-
};
|
|
293
|
-
}
|
|
294
|
-
//# sourceMappingURL=binder.js.map
|
package/lib/esm/checker.d.ts
DELETED
|
@@ -1,15 +0,0 @@
|
|
|
1
|
-
import { type AttributeStatement, type EdgeRhs, type EdgeStatement, type Graph, type Identifier, type NodeId, type SourceFile, type Statement, type StatementOf, type SubGraphStatement, SyntaxKind, type SyntaxNode, type Token } from "./types.js";
|
|
2
|
-
export declare function checkSourceFile(file: SourceFile): void;
|
|
3
|
-
export declare function findNodeAtOffset(root: SyntaxNode, offset: number, inclusiveEnd?: boolean): SyntaxNode | undefined;
|
|
4
|
-
export declare function getAllowedEdgeOperation(graph: Graph): SyntaxKind.DirectedEdgeOp | SyntaxKind.UndirectedEdgeOp;
|
|
5
|
-
export declare function findAllEdges(node: SyntaxNode): EdgeRhs[];
|
|
6
|
-
export declare function findOptionalSemicolons(node: SyntaxNode): Token<SyntaxKind.SemicolonToken>[];
|
|
7
|
-
export declare function findAllStatements<T extends Statement["kind"]>(node: SyntaxNode, kind?: T): StatementOf<T>[];
|
|
8
|
-
export declare function isAttrStatement(node: SyntaxNode): node is AttributeStatement;
|
|
9
|
-
export declare function isEdgeStatement(node: SyntaxNode): node is EdgeStatement;
|
|
10
|
-
export declare function isSubGraphStatement(node: SyntaxNode): node is SubGraphStatement;
|
|
11
|
-
export declare function isGraph(node: SyntaxNode): node is Graph;
|
|
12
|
-
export declare function isNodeId(node: SyntaxNode): node is NodeId;
|
|
13
|
-
export declare function edgeStatementHasAttributes(es: EdgeStatement): boolean;
|
|
14
|
-
export declare function getIdentifierText(n: Identifier): string;
|
|
15
|
-
export declare function nodeContainsErrors(node: SyntaxNode): boolean;
|
package/lib/esm/checker.js
DELETED
|
@@ -1,212 +0,0 @@
|
|
|
1
|
-
import { shapes as validShapes } from "./service/languageFacts.js";
|
|
2
|
-
import { assertNever, getStart } from "./service/util.js";
|
|
3
|
-
import { DiagnosticCategory, SyntaxKind, } from "./types.js";
|
|
4
|
-
import { forEachChild } from "./visitor.js";
|
|
5
|
-
export function checkSourceFile(file) {
|
|
6
|
-
const g = file.graph;
|
|
7
|
-
if (g) {
|
|
8
|
-
const messages = checkGraphSemantics(file, g);
|
|
9
|
-
if (messages) {
|
|
10
|
-
file.diagnostics.push.apply(file.diagnostics, messages);
|
|
11
|
-
}
|
|
12
|
-
}
|
|
13
|
-
}
|
|
14
|
-
function getNarrowerNode(offset, prev, toCheck) {
|
|
15
|
-
const prevRange = prev.end - prev.pos;
|
|
16
|
-
if (toCheck.pos <= offset && offset <= toCheck.end) {
|
|
17
|
-
const nrange = toCheck.end - toCheck.pos;
|
|
18
|
-
if (nrange < prevRange) {
|
|
19
|
-
return toCheck;
|
|
20
|
-
}
|
|
21
|
-
}
|
|
22
|
-
return prev;
|
|
23
|
-
}
|
|
24
|
-
function rangeContainsOffset(range, offset, inclusiveEnd) {
|
|
25
|
-
return inclusiveEnd
|
|
26
|
-
? range.pos <= offset && offset <= range.end
|
|
27
|
-
: range.pos <= offset && offset < range.end;
|
|
28
|
-
}
|
|
29
|
-
export function findNodeAtOffset(root, offset, inclusiveEnd = false) {
|
|
30
|
-
if (root.pos === offset && root.pos === root.end)
|
|
31
|
-
return root;
|
|
32
|
-
if (rangeContainsOffset(root, offset, inclusiveEnd)) {
|
|
33
|
-
const narrowerChild = forEachChild(root, child => findNodeAtOffset(child, offset, inclusiveEnd));
|
|
34
|
-
return narrowerChild ? narrowerChild : root;
|
|
35
|
-
}
|
|
36
|
-
return undefined;
|
|
37
|
-
}
|
|
38
|
-
export function getAllowedEdgeOperation(graph) {
|
|
39
|
-
return graph.kind === SyntaxKind.DirectedGraph
|
|
40
|
-
? SyntaxKind.DirectedEdgeOp
|
|
41
|
-
: SyntaxKind.UndirectedEdgeOp;
|
|
42
|
-
}
|
|
43
|
-
function checkGraphSemantics(file, root) {
|
|
44
|
-
const expectedEdgeOp = getAllowedEdgeOperation(root);
|
|
45
|
-
const invalidEdgeRhses = findEdgeErrors(expectedEdgeOp, root);
|
|
46
|
-
const invalidShapes = checkShapeLabelValues(root);
|
|
47
|
-
const invalidEdgeDiagnostics = invalidEdgeRhses === undefined || invalidEdgeRhses.length === 0
|
|
48
|
-
? []
|
|
49
|
-
: createEdgeViolationDiagnostics(file, expectedEdgeOp, invalidEdgeRhses);
|
|
50
|
-
return [...invalidEdgeDiagnostics, ...invalidShapes];
|
|
51
|
-
}
|
|
52
|
-
function forEachAssignmentTransitive(root, cb) {
|
|
53
|
-
forEachChild(root, child => {
|
|
54
|
-
if (child.kind === SyntaxKind.Assignment) {
|
|
55
|
-
cb(child);
|
|
56
|
-
return;
|
|
57
|
-
}
|
|
58
|
-
forEachChild(child, c => forEachAssignmentTransitive(c, cb));
|
|
59
|
-
});
|
|
60
|
-
}
|
|
61
|
-
function checkShapeLabelValues(root) {
|
|
62
|
-
const invalidShapes = [];
|
|
63
|
-
forEachAssignmentTransitive(root, assignment => {
|
|
64
|
-
const { leftId, rightId } = assignment;
|
|
65
|
-
if (leftId.kind !== SyntaxKind.TextIdentifier ||
|
|
66
|
-
rightId.kind !== SyntaxKind.TextIdentifier) {
|
|
67
|
-
return;
|
|
68
|
-
}
|
|
69
|
-
const leftText = leftId.text.trim();
|
|
70
|
-
if (leftText.toLocaleLowerCase() !== "shape") {
|
|
71
|
-
return;
|
|
72
|
-
}
|
|
73
|
-
const rightText = rightId.text.trim();
|
|
74
|
-
const shapeCandidate = rightText.toLowerCase();
|
|
75
|
-
if (validShapes.includes(shapeCandidate)) {
|
|
76
|
-
return;
|
|
77
|
-
}
|
|
78
|
-
invalidShapes.push({
|
|
79
|
-
category: DiagnosticCategory.Warning,
|
|
80
|
-
code: createCheckerError(1),
|
|
81
|
-
message: `Unknown shape "${rightText}".`,
|
|
82
|
-
start: rightId.pos,
|
|
83
|
-
end: rightId.end,
|
|
84
|
-
});
|
|
85
|
-
});
|
|
86
|
-
return invalidShapes;
|
|
87
|
-
}
|
|
88
|
-
export function findAllEdges(node) {
|
|
89
|
-
const allEdges = [];
|
|
90
|
-
forEachChild(node, child => {
|
|
91
|
-
if (isEdgeStatement(child)) {
|
|
92
|
-
if (child.rhs && child.rhs.length > 0) {
|
|
93
|
-
for (const edgeRhs of child.rhs)
|
|
94
|
-
allEdges.push(edgeRhs);
|
|
95
|
-
}
|
|
96
|
-
}
|
|
97
|
-
const childEdges = findAllEdges(child);
|
|
98
|
-
if (childEdges && childEdges.length > 0)
|
|
99
|
-
allEdges.push.apply(allEdges, childEdges);
|
|
100
|
-
});
|
|
101
|
-
return allEdges;
|
|
102
|
-
}
|
|
103
|
-
export function findOptionalSemicolons(node) {
|
|
104
|
-
const statements = findAllStatements(node);
|
|
105
|
-
const terminators = statements.map(p => p.terminator);
|
|
106
|
-
return terminators.filter(t => !!t);
|
|
107
|
-
}
|
|
108
|
-
function isStatement(node) {
|
|
109
|
-
return (node.kind === SyntaxKind.SubGraphStatement ||
|
|
110
|
-
node.kind === SyntaxKind.EdgeStatement ||
|
|
111
|
-
node.kind === SyntaxKind.NodeStatement ||
|
|
112
|
-
node.kind === SyntaxKind.IdEqualsIdStatement ||
|
|
113
|
-
node.kind === SyntaxKind.AttributeStatement);
|
|
114
|
-
}
|
|
115
|
-
export function findAllStatements(node, kind) {
|
|
116
|
-
const allStatements = [];
|
|
117
|
-
forEachChild(node, child => {
|
|
118
|
-
if ((kind === undefined && isStatement(child)) || child.kind === kind) {
|
|
119
|
-
allStatements.push(child);
|
|
120
|
-
}
|
|
121
|
-
const childStatements = findAllStatements(child, kind);
|
|
122
|
-
if (childStatements && childStatements.length > 0)
|
|
123
|
-
allStatements.push.apply(allStatements, childStatements);
|
|
124
|
-
});
|
|
125
|
-
return allStatements;
|
|
126
|
-
}
|
|
127
|
-
function findEdgeErrors(expectedEdgeOp, node) {
|
|
128
|
-
const edges = findAllEdges(node);
|
|
129
|
-
const wrongEdges = edges && edges.length > 0
|
|
130
|
-
? edges.filter(e => e.operation.kind !== expectedEdgeOp)
|
|
131
|
-
: undefined;
|
|
132
|
-
if (wrongEdges && wrongEdges.length > 0) {
|
|
133
|
-
for (const edge of wrongEdges) {
|
|
134
|
-
edge.operation.flags |= 2;
|
|
135
|
-
}
|
|
136
|
-
return wrongEdges;
|
|
137
|
-
}
|
|
138
|
-
return undefined;
|
|
139
|
-
}
|
|
140
|
-
function createEdgeViolationDiagnostics(file, expectedEdgeOp, violators) {
|
|
141
|
-
const op = expectedEdgeOp === SyntaxKind.UndirectedEdgeOp ? "--" : "->";
|
|
142
|
-
const graphType = expectedEdgeOp === SyntaxKind.UndirectedEdgeOp ? "undirected" : "directed";
|
|
143
|
-
const message = `Invalid edge operation, use "${op}" in ${graphType} graph`;
|
|
144
|
-
const code = createCheckerError(0);
|
|
145
|
-
const category = DiagnosticCategory.Error;
|
|
146
|
-
for (const edge of violators) {
|
|
147
|
-
edge.operation.flags |= 2;
|
|
148
|
-
}
|
|
149
|
-
return violators.map(edge => {
|
|
150
|
-
const start = getStart(file, edge.operation);
|
|
151
|
-
const end = edge.operation.end;
|
|
152
|
-
return {
|
|
153
|
-
message,
|
|
154
|
-
code,
|
|
155
|
-
category,
|
|
156
|
-
start,
|
|
157
|
-
end,
|
|
158
|
-
};
|
|
159
|
-
});
|
|
160
|
-
}
|
|
161
|
-
function getInvalidEdgeRhs(allowedOp, edges) {
|
|
162
|
-
const res = [];
|
|
163
|
-
for (const e of edges) {
|
|
164
|
-
if (e.operation.kind !== allowedOp)
|
|
165
|
-
res.push(e);
|
|
166
|
-
}
|
|
167
|
-
return res;
|
|
168
|
-
}
|
|
169
|
-
export function isAttrStatement(node) {
|
|
170
|
-
return node.kind === SyntaxKind.AttributeStatement;
|
|
171
|
-
}
|
|
172
|
-
export function isEdgeStatement(node) {
|
|
173
|
-
return node.kind === SyntaxKind.EdgeStatement;
|
|
174
|
-
}
|
|
175
|
-
export function isSubGraphStatement(node) {
|
|
176
|
-
return node.kind === SyntaxKind.SubGraphStatement;
|
|
177
|
-
}
|
|
178
|
-
export function isGraph(node) {
|
|
179
|
-
return node.kind === SyntaxKind.DirectedGraph || node.kind === SyntaxKind.UndirectedGraph;
|
|
180
|
-
}
|
|
181
|
-
export function isNodeId(node) {
|
|
182
|
-
return node.kind === SyntaxKind.NodeId;
|
|
183
|
-
}
|
|
184
|
-
export function edgeStatementHasAttributes(es) {
|
|
185
|
-
return (es.attributes &&
|
|
186
|
-
es.attributes.length > 0 &&
|
|
187
|
-
es.attributes.some(a => a.assignments && a.assignments.length > 0));
|
|
188
|
-
}
|
|
189
|
-
export function getIdentifierText(n) {
|
|
190
|
-
switch (n.kind) {
|
|
191
|
-
case SyntaxKind.HtmlIdentifier:
|
|
192
|
-
return n.htmlContent;
|
|
193
|
-
case SyntaxKind.TextIdentifier:
|
|
194
|
-
return n.text;
|
|
195
|
-
case SyntaxKind.NumericIdentifier:
|
|
196
|
-
return n.text;
|
|
197
|
-
case SyntaxKind.QuotedTextIdentifier:
|
|
198
|
-
return n.concatenation;
|
|
199
|
-
default:
|
|
200
|
-
return assertNever(n);
|
|
201
|
-
}
|
|
202
|
-
}
|
|
203
|
-
function createCheckerError(sub) {
|
|
204
|
-
return {
|
|
205
|
-
source: 4,
|
|
206
|
-
sub,
|
|
207
|
-
};
|
|
208
|
-
}
|
|
209
|
-
export function nodeContainsErrors(node) {
|
|
210
|
-
return (node.flags & 2) === 2;
|
|
211
|
-
}
|
|
212
|
-
//# sourceMappingURL=checker.js.map
|
package/lib/esm/core.d.ts
DELETED
|
@@ -1 +0,0 @@
|
|
|
1
|
-
export declare function createMapFromTemplate<T>(template: Record<string, T>): Map<string, T>;
|
package/lib/esm/core.js
DELETED
package/lib/esm/error.d.ts
DELETED
package/lib/esm/error.js
DELETED
|
@@ -1,8 +0,0 @@
|
|
|
1
|
-
export const diagnosicSource = "DOT";
|
|
2
|
-
const errorCodeLength = 4;
|
|
3
|
-
const subErrorCodeLength = errorCodeLength - 1;
|
|
4
|
-
export function formatError(error) {
|
|
5
|
-
const subCode = (error.sub | 0).toString().padStart(subErrorCodeLength, "0");
|
|
6
|
-
return diagnosicSource + error.source + subCode;
|
|
7
|
-
}
|
|
8
|
-
//# sourceMappingURL=error.js.map
|
package/lib/esm/index.d.ts
DELETED
package/lib/esm/index.js
DELETED
package/lib/esm/parser.d.ts
DELETED
|
@@ -1,27 +0,0 @@
|
|
|
1
|
-
import { type Scanner } from "./scanner.js";
|
|
2
|
-
import { type DiagnosticMessage, type Identifier, type SourceFile, SyntaxKind, type SyntaxNode } from "./types";
|
|
3
|
-
export declare enum ParsingContext {
|
|
4
|
-
None = 0,
|
|
5
|
-
StatementList = 1,
|
|
6
|
-
AttributeContainerList = 2,
|
|
7
|
-
AssignmentList = 3,
|
|
8
|
-
EdgeRhsList = 4,
|
|
9
|
-
QuotedTextIdentifierConcatenation = 5,
|
|
10
|
-
Count = 6
|
|
11
|
-
}
|
|
12
|
-
export declare class Parser {
|
|
13
|
-
#private;
|
|
14
|
-
currentToken: SyntaxKind;
|
|
15
|
-
nodeCount: number;
|
|
16
|
-
identifiers: Set<string>;
|
|
17
|
-
identifierCount: number;
|
|
18
|
-
sourceText: string;
|
|
19
|
-
scanner: Scanner;
|
|
20
|
-
currentNodeHasError: boolean;
|
|
21
|
-
currentContext: ParsingContext;
|
|
22
|
-
diagnostics: DiagnosticMessage[];
|
|
23
|
-
constructor();
|
|
24
|
-
parse(sourceText: string): SourceFile;
|
|
25
|
-
}
|
|
26
|
-
export declare function isIdentifier(kind: SyntaxKind): kind is SyntaxKind.HtmlIdentifier | SyntaxKind.TextIdentifier | SyntaxKind.QuotedTextIdentifier | SyntaxKind.NumericIdentifier;
|
|
27
|
-
export declare function isIdentifierNode(node: SyntaxNode): node is Identifier;
|