@fazelstudio/floe 1.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/LICENSE +21 -0
- package/dist/src/cli/check.d.ts +14 -0
- package/dist/src/cli/check.d.ts.map +1 -0
- package/dist/src/cli/check.js +88 -0
- package/dist/src/cli/check.js.map +1 -0
- package/dist/src/cli/format.d.ts +9 -0
- package/dist/src/cli/format.d.ts.map +1 -0
- package/dist/src/cli/format.js +114 -0
- package/dist/src/cli/format.js.map +1 -0
- package/dist/src/cli/main.d.ts +19 -0
- package/dist/src/cli/main.d.ts.map +1 -0
- package/dist/src/cli/main.js +207 -0
- package/dist/src/cli/main.js.map +1 -0
- package/dist/src/cli/render.d.ts +7 -0
- package/dist/src/cli/render.d.ts.map +1 -0
- package/dist/src/cli/render.js +90 -0
- package/dist/src/cli/render.js.map +1 -0
- package/dist/src/diagnostics.d.ts +32 -0
- package/dist/src/diagnostics.d.ts.map +1 -0
- package/dist/src/diagnostics.js +4 -0
- package/dist/src/diagnostics.js.map +1 -0
- package/dist/src/index.d.ts +40 -0
- package/dist/src/index.d.ts.map +1 -0
- package/dist/src/index.js +64 -0
- package/dist/src/index.js.map +1 -0
- package/dist/src/language/completion.d.ts +6 -0
- package/dist/src/language/completion.d.ts.map +1 -0
- package/dist/src/language/completion.js +363 -0
- package/dist/src/language/completion.js.map +1 -0
- package/dist/src/language/definitions.d.ts +9 -0
- package/dist/src/language/definitions.d.ts.map +1 -0
- package/dist/src/language/definitions.js +70 -0
- package/dist/src/language/definitions.js.map +1 -0
- package/dist/src/language/diagnosticsService.d.ts +14 -0
- package/dist/src/language/diagnosticsService.d.ts.map +1 -0
- package/dist/src/language/diagnosticsService.js +37 -0
- package/dist/src/language/diagnosticsService.js.map +1 -0
- package/dist/src/language/folding.d.ts +8 -0
- package/dist/src/language/folding.d.ts.map +1 -0
- package/dist/src/language/folding.js +58 -0
- package/dist/src/language/folding.js.map +1 -0
- package/dist/src/language/formatting.d.ts +5 -0
- package/dist/src/language/formatting.d.ts.map +1 -0
- package/dist/src/language/formatting.js +274 -0
- package/dist/src/language/formatting.js.map +1 -0
- package/dist/src/language/highlighting.d.ts +9 -0
- package/dist/src/language/highlighting.d.ts.map +1 -0
- package/dist/src/language/highlighting.js +74 -0
- package/dist/src/language/highlighting.js.map +1 -0
- package/dist/src/language/hover.d.ts +6 -0
- package/dist/src/language/hover.d.ts.map +1 -0
- package/dist/src/language/hover.js +197 -0
- package/dist/src/language/hover.js.map +1 -0
- package/dist/src/language/indentation.d.ts +15 -0
- package/dist/src/language/indentation.d.ts.map +1 -0
- package/dist/src/language/indentation.js +97 -0
- package/dist/src/language/indentation.js.map +1 -0
- package/dist/src/language/index.d.ts +54 -0
- package/dist/src/language/index.d.ts.map +1 -0
- package/dist/src/language/index.js +85 -0
- package/dist/src/language/index.js.map +1 -0
- package/dist/src/language/references.d.ts +12 -0
- package/dist/src/language/references.d.ts.map +1 -0
- package/dist/src/language/references.js +35 -0
- package/dist/src/language/references.js.map +1 -0
- package/dist/src/language/rename.d.ts +18 -0
- package/dist/src/language/rename.d.ts.map +1 -0
- package/dist/src/language/rename.js +53 -0
- package/dist/src/language/rename.js.map +1 -0
- package/dist/src/language/semanticModel.d.ts +21 -0
- package/dist/src/language/semanticModel.d.ts.map +1 -0
- package/dist/src/language/semanticModel.js +43 -0
- package/dist/src/language/semanticModel.js.map +1 -0
- package/dist/src/language/symbols.d.ts +9 -0
- package/dist/src/language/symbols.d.ts.map +1 -0
- package/dist/src/language/symbols.js +160 -0
- package/dist/src/language/symbols.js.map +1 -0
- package/dist/src/language/types.d.ts +49 -0
- package/dist/src/language/types.d.ts.map +1 -0
- package/dist/src/language/types.js +2 -0
- package/dist/src/language/types.js.map +1 -0
- package/dist/src/language/utils.d.ts +24 -0
- package/dist/src/language/utils.d.ts.map +1 -0
- package/dist/src/language/utils.js +154 -0
- package/dist/src/language/utils.js.map +1 -0
- package/dist/src/layout/dagre.d.ts +13 -0
- package/dist/src/layout/dagre.d.ts.map +1 -0
- package/dist/src/layout/dagre.js +229 -0
- package/dist/src/layout/dagre.js.map +1 -0
- package/dist/src/layout/index.d.ts +15 -0
- package/dist/src/layout/index.d.ts.map +1 -0
- package/dist/src/layout/index.js +22 -0
- package/dist/src/layout/index.js.map +1 -0
- package/dist/src/layout/simple.d.ts +20 -0
- package/dist/src/layout/simple.d.ts.map +1 -0
- package/dist/src/layout/simple.js +674 -0
- package/dist/src/layout/simple.js.map +1 -0
- package/dist/src/layout/types.d.ts +65 -0
- package/dist/src/layout/types.d.ts.map +1 -0
- package/dist/src/layout/types.js +2 -0
- package/dist/src/layout/types.js.map +1 -0
- package/dist/src/lexer.d.ts +25 -0
- package/dist/src/lexer.d.ts.map +1 -0
- package/dist/src/lexer.js +280 -0
- package/dist/src/lexer.js.map +1 -0
- package/dist/src/lsp/documents.d.ts +24 -0
- package/dist/src/lsp/documents.d.ts.map +1 -0
- package/dist/src/lsp/documents.js +97 -0
- package/dist/src/lsp/documents.js.map +1 -0
- package/dist/src/lsp/server.d.ts +70 -0
- package/dist/src/lsp/server.d.ts.map +1 -0
- package/dist/src/lsp/server.js +623 -0
- package/dist/src/lsp/server.js.map +1 -0
- package/dist/src/lsp/utils.d.ts +47 -0
- package/dist/src/lsp/utils.d.ts.map +1 -0
- package/dist/src/lsp/utils.js +142 -0
- package/dist/src/lsp/utils.js.map +1 -0
- package/dist/src/parser.d.ts +106 -0
- package/dist/src/parser.d.ts.map +1 -0
- package/dist/src/parser.js +1018 -0
- package/dist/src/parser.js.map +1 -0
- package/dist/src/pipeline.d.ts +51 -0
- package/dist/src/pipeline.d.ts.map +1 -0
- package/dist/src/pipeline.js +65 -0
- package/dist/src/pipeline.js.map +1 -0
- package/dist/src/range.d.ts +24 -0
- package/dist/src/range.d.ts.map +1 -0
- package/dist/src/range.js +20 -0
- package/dist/src/range.js.map +1 -0
- package/dist/src/render/index.d.ts +3 -0
- package/dist/src/render/index.d.ts.map +1 -0
- package/dist/src/render/index.js +3 -0
- package/dist/src/render/index.js.map +1 -0
- package/dist/src/render/shapes.d.ts +20 -0
- package/dist/src/render/shapes.d.ts.map +1 -0
- package/dist/src/render/shapes.js +110 -0
- package/dist/src/render/shapes.js.map +1 -0
- package/dist/src/render/svg.d.ts +19 -0
- package/dist/src/render/svg.d.ts.map +1 -0
- package/dist/src/render/svg.js +227 -0
- package/dist/src/render/svg.js.map +1 -0
- package/dist/src/security/url.d.ts +7 -0
- package/dist/src/security/url.d.ts.map +1 -0
- package/dist/src/security/url.js +27 -0
- package/dist/src/security/url.js.map +1 -0
- package/dist/src/types.d.ts +111 -0
- package/dist/src/types.d.ts.map +1 -0
- package/dist/src/types.js +16 -0
- package/dist/src/types.js.map +1 -0
- package/dist/src/validator.d.ts +47 -0
- package/dist/src/validator.d.ts.map +1 -0
- package/dist/src/validator.js +235 -0
- package/dist/src/validator.js.map +1 -0
- package/package.json +90 -0
|
@@ -0,0 +1,197 @@
|
|
|
1
|
+
import { tokenize } from "../lexer.js";
|
|
2
|
+
import { getTokenAtOffset, positionAt } from "./utils.js";
|
|
3
|
+
import { Parser } from "../parser.js";
|
|
4
|
+
import { validate } from "../validator.js";
|
|
5
|
+
function parseFloe(source) {
|
|
6
|
+
const raw = new Parser(source).parse();
|
|
7
|
+
const validated = validate({
|
|
8
|
+
diagram: raw.diagram,
|
|
9
|
+
diagnostics: raw.diagnostics,
|
|
10
|
+
explicitNodes: raw.explicitNodes,
|
|
11
|
+
edges: raw.edges,
|
|
12
|
+
directionDeclarations: raw.directionDeclarations,
|
|
13
|
+
groups: raw.groups,
|
|
14
|
+
annotations: raw.annotations,
|
|
15
|
+
links: raw.links,
|
|
16
|
+
});
|
|
17
|
+
return { diagram: validated.diagram, diagnostics: validated.diagnostics };
|
|
18
|
+
}
|
|
19
|
+
/**
|
|
20
|
+
* Hover — may expose node ID, type, label, incoming/outgoing edges, metadata
|
|
21
|
+
*/
|
|
22
|
+
export function getHover(source, offset) {
|
|
23
|
+
const tokens = tokenize(source);
|
|
24
|
+
const tok = getTokenAtOffset(tokens, offset);
|
|
25
|
+
// Also handle offset at end where token may be before?
|
|
26
|
+
let word = "";
|
|
27
|
+
let targetToken = tok;
|
|
28
|
+
if (!tok) {
|
|
29
|
+
// Try finding token before offset if cursor at word boundary
|
|
30
|
+
// Use word detection fallback
|
|
31
|
+
const ch = source[offset];
|
|
32
|
+
if (ch === undefined || /\s/.test(ch)) {
|
|
33
|
+
// maybe hovering between tokens not on identifier -> no hover
|
|
34
|
+
// Try token before
|
|
35
|
+
for (let i = tokens.length - 1; i >= 0; i--) {
|
|
36
|
+
const t = tokens[i];
|
|
37
|
+
if (t.range.end.offset <= offset && t.type === "IDENT") {
|
|
38
|
+
// only if close proximity? Check line
|
|
39
|
+
const pos = positionAt(source, offset);
|
|
40
|
+
const tPos = t.range.end;
|
|
41
|
+
if (tPos.line === pos.line && offset - t.range.end.offset <= 1) {
|
|
42
|
+
targetToken = t;
|
|
43
|
+
break;
|
|
44
|
+
}
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
if (!targetToken || targetToken.type !== "IDENT")
|
|
48
|
+
return null;
|
|
49
|
+
}
|
|
50
|
+
else {
|
|
51
|
+
return null;
|
|
52
|
+
}
|
|
53
|
+
}
|
|
54
|
+
// Only provide hover for identifiers and keywords? For simplicity focus on IDENT, also GROUP_KW etc?
|
|
55
|
+
if (!targetToken || targetToken.type !== "IDENT") {
|
|
56
|
+
if (targetToken && (targetToken.type === "DIRECTION_KW" || targetToken.type === "GROUP_KW" || targetToken.type === "META_KW" || targetToken.type === "NOTE_KW" || targetToken.type === "LINK_KW")) {
|
|
57
|
+
return {
|
|
58
|
+
contents: [`Keyword \`${targetToken.lexeme}\``],
|
|
59
|
+
range: targetToken.range,
|
|
60
|
+
};
|
|
61
|
+
}
|
|
62
|
+
if (targetToken && targetToken.type === "STRING") {
|
|
63
|
+
return {
|
|
64
|
+
contents: [`Label: "${targetToken.lexeme}"`],
|
|
65
|
+
range: targetToken.range,
|
|
66
|
+
};
|
|
67
|
+
}
|
|
68
|
+
return null;
|
|
69
|
+
}
|
|
70
|
+
word = targetToken.lexeme;
|
|
71
|
+
// Parse diagram for semantic info
|
|
72
|
+
const { diagram } = parseFloe(source);
|
|
73
|
+
// Find node where id == word
|
|
74
|
+
const node = diagram.nodes.find((n) => n.id === word);
|
|
75
|
+
const group = findGroup(diagram.groups, word);
|
|
76
|
+
const incoming = diagram.edges.filter((e) => e.target === word);
|
|
77
|
+
const outgoing = diagram.edges.filter((e) => e.source === word);
|
|
78
|
+
// If it's a node
|
|
79
|
+
if (node) {
|
|
80
|
+
const contents = [];
|
|
81
|
+
contents.push(`**Node \`${node.id}\`**`);
|
|
82
|
+
if (node.type)
|
|
83
|
+
contents.push(`Type: \`${node.type}\``);
|
|
84
|
+
if (node.label)
|
|
85
|
+
contents.push(`Label: "${node.label}"`);
|
|
86
|
+
else
|
|
87
|
+
contents.push(`Label: "${node.id}" (default)`);
|
|
88
|
+
// incoming/outgoing
|
|
89
|
+
if (outgoing.length > 0) {
|
|
90
|
+
contents.push(`Outgoing: ${outgoing.map((e) => `${e.source} ${e.kind === "directed" ? "->" : "--"} ${e.target}${e.label ? ` : ${e.label}` : ""}`).join(", ")}`);
|
|
91
|
+
}
|
|
92
|
+
else {
|
|
93
|
+
contents.push(`Outgoing: (none)`);
|
|
94
|
+
}
|
|
95
|
+
if (incoming.length > 0) {
|
|
96
|
+
contents.push(`Incoming: ${incoming.map((e) => `${e.source} ${e.kind === "directed" ? "->" : "--"} ${e.target}${e.label ? ` : ${e.label}` : ""}`).join(", ")}`);
|
|
97
|
+
}
|
|
98
|
+
else {
|
|
99
|
+
contents.push(`Incoming: (none)`);
|
|
100
|
+
}
|
|
101
|
+
// Metadata: if node belongs to group, show group membership
|
|
102
|
+
const membership = findGroupsContainingNode(diagram.groups, word);
|
|
103
|
+
if (membership.length > 0) {
|
|
104
|
+
contents.push(`Groups: ${membership.map((g) => g.id).join(", ")}`);
|
|
105
|
+
}
|
|
106
|
+
// Diagram-level metadata relevant? Show all diagram metadata
|
|
107
|
+
if (diagram.metadata && Object.keys(diagram.metadata).length > 0) {
|
|
108
|
+
contents.push(`Diagram metadata: ${JSON.stringify(diagram.metadata)}`);
|
|
109
|
+
}
|
|
110
|
+
if (group && group.metadata && Object.keys(group.metadata).length > 0) {
|
|
111
|
+
// shouldn't both node and group same id? but show
|
|
112
|
+
contents.push(`Group metadata: ${JSON.stringify(group.metadata)}`);
|
|
113
|
+
}
|
|
114
|
+
// Annotations for this node
|
|
115
|
+
const anns = diagram.annotations.filter((a) => a.target === word);
|
|
116
|
+
if (anns.length > 0) {
|
|
117
|
+
contents.push(`Annotations: ${anns.map((a) => `"${a.text}"`).join(", ")}`);
|
|
118
|
+
}
|
|
119
|
+
const link = diagram.links.find((l) => l.target === word);
|
|
120
|
+
if (link) {
|
|
121
|
+
contents.push(`Link: ${link.url}`);
|
|
122
|
+
}
|
|
123
|
+
return { contents, range: targetToken.range };
|
|
124
|
+
}
|
|
125
|
+
// If it's a group
|
|
126
|
+
if (group) {
|
|
127
|
+
const contents = [];
|
|
128
|
+
contents.push(`**Group \`${group.id}\`**`);
|
|
129
|
+
if (group.type)
|
|
130
|
+
contents.push(`Type: \`${group.type}\``);
|
|
131
|
+
if (group.label)
|
|
132
|
+
contents.push(`Label: "${group.label}"`);
|
|
133
|
+
if (group.nodeIds.length > 0)
|
|
134
|
+
contents.push(`Members: ${group.nodeIds.join(", ")}`);
|
|
135
|
+
else
|
|
136
|
+
contents.push(`Members: (none direct)`);
|
|
137
|
+
if (group.groups.length > 0)
|
|
138
|
+
contents.push(`Nested groups: ${group.groups.map((g) => g.id).join(", ")}`);
|
|
139
|
+
if (group.metadata && Object.keys(group.metadata).length > 0)
|
|
140
|
+
contents.push(`Metadata: ${JSON.stringify(group.metadata)}`);
|
|
141
|
+
if (group.annotations.length > 0)
|
|
142
|
+
contents.push(`Annotations: ${group.annotations.map((a) => `"${a.text}"`).join(", ")}`);
|
|
143
|
+
if (group.link)
|
|
144
|
+
contents.push(`Link: ${group.link}`);
|
|
145
|
+
// Incoming/outgoing edges for group? maybe count edges where node in group participates?
|
|
146
|
+
// For now show edges where source/target is group id (rare)
|
|
147
|
+
if (incoming.length > 0)
|
|
148
|
+
contents.push(`Incoming edges: ${incoming.length}`);
|
|
149
|
+
if (outgoing.length > 0)
|
|
150
|
+
contents.push(`Outgoing edges: ${outgoing.length}`);
|
|
151
|
+
return { contents, range: targetToken.range };
|
|
152
|
+
}
|
|
153
|
+
// Check if identifier is referenced in edges but not declared as node (implicit)
|
|
154
|
+
if (incoming.length > 0 || outgoing.length > 0) {
|
|
155
|
+
const contents = [];
|
|
156
|
+
contents.push(`**Node \`${word}\`** (implicit)`);
|
|
157
|
+
contents.push(`Outgoing: ${outgoing.map((e) => `${e.source} -> ${e.target}`).join(", ") || "(none)"}`);
|
|
158
|
+
contents.push(`Incoming: ${incoming.map((e) => `${e.source} -> ${e.target}`).join(", ") || "(none)"}`);
|
|
159
|
+
return { contents, range: targetToken.range };
|
|
160
|
+
}
|
|
161
|
+
// Check metadata key hover?
|
|
162
|
+
// If word appears as metadata key, show value
|
|
163
|
+
if (diagram.metadata && diagram.metadata[word] !== undefined) {
|
|
164
|
+
return {
|
|
165
|
+
contents: [`Metadata \`${word}\` = "${diagram.metadata[word]}"`],
|
|
166
|
+
range: targetToken.range,
|
|
167
|
+
};
|
|
168
|
+
}
|
|
169
|
+
// Fallback: generic identifier
|
|
170
|
+
return {
|
|
171
|
+
contents: [`\`${word}\``],
|
|
172
|
+
range: targetToken.range,
|
|
173
|
+
};
|
|
174
|
+
}
|
|
175
|
+
function findGroup(groups, id) {
|
|
176
|
+
for (const g of groups) {
|
|
177
|
+
if (g.id === id)
|
|
178
|
+
return g;
|
|
179
|
+
const child = findGroup(g.groups, id);
|
|
180
|
+
if (child)
|
|
181
|
+
return child;
|
|
182
|
+
}
|
|
183
|
+
return undefined;
|
|
184
|
+
}
|
|
185
|
+
function findGroupsContainingNode(groups, nodeId) {
|
|
186
|
+
const result = [];
|
|
187
|
+
function traverse(arr) {
|
|
188
|
+
for (const g of arr) {
|
|
189
|
+
if (g.nodeIds.includes(nodeId))
|
|
190
|
+
result.push(g);
|
|
191
|
+
traverse(g.groups);
|
|
192
|
+
}
|
|
193
|
+
}
|
|
194
|
+
traverse(groups);
|
|
195
|
+
return result;
|
|
196
|
+
}
|
|
197
|
+
//# sourceMappingURL=hover.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"hover.js","sourceRoot":"","sources":["../../../src/language/hover.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,15 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Indentation — provide indentation helpers for editors.
|
|
3
|
+
* Floe indentation is brace-driven: inside `group { ... }` indent.
|
|
4
|
+
*/
|
|
5
|
+
export declare const DEFAULT_INDENT = " ";
|
|
6
|
+
export declare function getIndentForLine(source: string, lineNumber: number, indentStr?: string): string;
|
|
7
|
+
export declare function getIndentationInfo(source: string, indentStr?: string): string[];
|
|
8
|
+
/** For CodeMirror indentation: function that returns column count */
|
|
9
|
+
export declare function getIndentationColumn(source: string, lineNumber: number, indentStr?: string): number;
|
|
10
|
+
/** Suggest indent edits for entire document formatting (similar to formatting) */
|
|
11
|
+
export declare function getIndentationEdits(source: string, indentStr?: string): Array<{
|
|
12
|
+
line: number;
|
|
13
|
+
indent: string;
|
|
14
|
+
}>;
|
|
15
|
+
//# sourceMappingURL=indentation.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indentation.d.ts","sourceRoot":"","sources":["../../../src/language/indentation.ts"],"names":[],"mappings":"AAEA;;;GAGG;AAEH,eAAO,MAAM,cAAc,OAAO,CAAC;AAEnC,wBAAgB,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,GAAE,MAAuB,GAAG,MAAM,CA2C/G;AAED,wBAAgB,kBAAkB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAuB,GAAG,MAAM,EAAE,CAG/F;AAED,qEAAqE;AACrE,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,UAAU,EAAE,MAAM,EAAE,SAAS,GAAE,MAAuB,GAAG,MAAM,CAEnH;AAuBD,kFAAkF;AAClF,wBAAgB,mBAAmB,CAAC,MAAM,EAAE,MAAM,EAAE,SAAS,GAAE,MAAuB,GAAG,KAAK,CAAC;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,EAAE,MAAM,CAAA;CAAE,CAAC,CAM/H"}
|
|
@@ -0,0 +1,97 @@
|
|
|
1
|
+
import { tokenize } from "../lexer.js";
|
|
2
|
+
/**
|
|
3
|
+
* Indentation — provide indentation helpers for editors.
|
|
4
|
+
* Floe indentation is brace-driven: inside `group { ... }` indent.
|
|
5
|
+
*/
|
|
6
|
+
export const DEFAULT_INDENT = " ";
|
|
7
|
+
export function getIndentForLine(source, lineNumber, indentStr = DEFAULT_INDENT) {
|
|
8
|
+
// Compute indent for given lineNumber (1-indexed) based on balance of braces before that line.
|
|
9
|
+
// Closing brace lines should be dedented.
|
|
10
|
+
const lines = source.split(/\r?\n/);
|
|
11
|
+
let indentLevel = 0;
|
|
12
|
+
for (let i = 1; i < lineNumber; i++) {
|
|
13
|
+
const line = lines[i - 1] ?? "";
|
|
14
|
+
const trimmed = line.trim();
|
|
15
|
+
if (trimmed === "" || trimmed.startsWith("//"))
|
|
16
|
+
continue;
|
|
17
|
+
// Strip comments
|
|
18
|
+
const code = stripComment(trimmed);
|
|
19
|
+
// Count opening and closing braces on line
|
|
20
|
+
// For simplicity, if line is group header with {, increment after
|
|
21
|
+
if (/^\s*group\b.*\{\s*$/.test(code) || code.includes("{")) {
|
|
22
|
+
// Count { and }
|
|
23
|
+
const opens = (code.match(/\{/g) || []).length;
|
|
24
|
+
const closes = (code.match(/\}/g) || []).length;
|
|
25
|
+
indentLevel += opens - closes;
|
|
26
|
+
if (indentLevel < 0)
|
|
27
|
+
indentLevel = 0;
|
|
28
|
+
}
|
|
29
|
+
else if (code.trim() === "}") {
|
|
30
|
+
indentLevel = Math.max(0, indentLevel - 1);
|
|
31
|
+
}
|
|
32
|
+
else {
|
|
33
|
+
// Also handle lines that contain } not at start?
|
|
34
|
+
const opens = (code.match(/\{/g) || []).length;
|
|
35
|
+
const closes = (code.match(/\}/g) || []).length;
|
|
36
|
+
if (closes > opens) {
|
|
37
|
+
// dedent before next line handled via closes? But we already adjust for } lines separately.
|
|
38
|
+
// For generic, adjust indentLevel by net
|
|
39
|
+
indentLevel += opens - closes;
|
|
40
|
+
if (indentLevel < 0)
|
|
41
|
+
indentLevel = 0;
|
|
42
|
+
}
|
|
43
|
+
else {
|
|
44
|
+
indentLevel += opens - closes;
|
|
45
|
+
}
|
|
46
|
+
}
|
|
47
|
+
}
|
|
48
|
+
// If current line is closing brace, dedent
|
|
49
|
+
const curLine = lines[lineNumber - 1] ?? "";
|
|
50
|
+
const curTrim = curLine.trim();
|
|
51
|
+
const curCode = stripComment(curTrim);
|
|
52
|
+
if (curCode.startsWith("}") || curCode === "}") {
|
|
53
|
+
indentLevel = Math.max(0, indentLevel - 1);
|
|
54
|
+
}
|
|
55
|
+
return indentStr.repeat(indentLevel);
|
|
56
|
+
}
|
|
57
|
+
export function getIndentationInfo(source, indentStr = DEFAULT_INDENT) {
|
|
58
|
+
const lines = source.split(/\r?\n/);
|
|
59
|
+
return lines.map((_, idx) => getIndentForLine(source, idx + 1, indentStr));
|
|
60
|
+
}
|
|
61
|
+
/** For CodeMirror indentation: function that returns column count */
|
|
62
|
+
export function getIndentationColumn(source, lineNumber, indentStr = DEFAULT_INDENT) {
|
|
63
|
+
return getIndentForLine(source, lineNumber, indentStr).length;
|
|
64
|
+
}
|
|
65
|
+
function stripComment(line) {
|
|
66
|
+
// naive strip // outside string
|
|
67
|
+
let inString = false;
|
|
68
|
+
let escaped = false;
|
|
69
|
+
for (let i = 0; i < line.length - 1; i++) {
|
|
70
|
+
const ch = line[i];
|
|
71
|
+
if (!inString && ch === '"' && !escaped) {
|
|
72
|
+
inString = true;
|
|
73
|
+
}
|
|
74
|
+
else if (inString) {
|
|
75
|
+
if (ch === "\\" && !escaped)
|
|
76
|
+
escaped = true;
|
|
77
|
+
else if (ch === '"' && !escaped)
|
|
78
|
+
inString = false;
|
|
79
|
+
else
|
|
80
|
+
escaped = false;
|
|
81
|
+
continue;
|
|
82
|
+
}
|
|
83
|
+
if (!inString && ch === "/" && line[i + 1] === "/") {
|
|
84
|
+
return line.slice(0, i).trim();
|
|
85
|
+
}
|
|
86
|
+
}
|
|
87
|
+
return line.trim();
|
|
88
|
+
}
|
|
89
|
+
/** Suggest indent edits for entire document formatting (similar to formatting) */
|
|
90
|
+
export function getIndentationEdits(source, indentStr = DEFAULT_INDENT) {
|
|
91
|
+
const lines = source.split(/\r?\n/);
|
|
92
|
+
return lines.map((_, idx) => ({
|
|
93
|
+
line: idx + 1,
|
|
94
|
+
indent: getIndentForLine(source, idx + 1, indentStr),
|
|
95
|
+
}));
|
|
96
|
+
}
|
|
97
|
+
//# sourceMappingURL=indentation.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"indentation.js","sourceRoot":"","sources":["../../../src/language/indentation.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,54 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Floe Language Services (editor-independent)
|
|
3
|
+
*
|
|
4
|
+
* Architecture:
|
|
5
|
+
* Floe Source -> Parser -> Semantic Model -> Language Services
|
|
6
|
+
* ├── Completion
|
|
7
|
+
* ├── Diagnostics
|
|
8
|
+
* ├── Hover
|
|
9
|
+
* ├── Definitions
|
|
10
|
+
* ├── References
|
|
11
|
+
* ├── Rename
|
|
12
|
+
* └── Formatting
|
|
13
|
+
*
|
|
14
|
+
* This module does not depend on React, CodeMirror, or VS Code.
|
|
15
|
+
*/
|
|
16
|
+
export type { Position, Range } from "../range.js";
|
|
17
|
+
export type { Diagnostic } from "../diagnostics.js";
|
|
18
|
+
export type { FloeDiagram, FloeNode, FloeEdge, FloeGroup } from "../types.js";
|
|
19
|
+
export * from "./types.js";
|
|
20
|
+
export { getHighlightTokens, getHighlightingInfo } from "./highlighting.js";
|
|
21
|
+
export { getCompletions } from "./completion.js";
|
|
22
|
+
export { getDiagnostics, getDiagnosticsWithSource, lint } from "./diagnosticsService.js";
|
|
23
|
+
export { getHover } from "./hover.js";
|
|
24
|
+
export { getSymbols, getFlatSymbols } from "./symbols.js";
|
|
25
|
+
export { getDefinition, getDefinitionForWord } from "./definitions.js";
|
|
26
|
+
export { getReferences, getReferencesForWord } from "./references.js";
|
|
27
|
+
export { rename, renameWord, applyEdits } from "./rename.js";
|
|
28
|
+
export { format, isFormatted } from "./formatting.js";
|
|
29
|
+
export { getIndentForLine, getIndentationInfo, getIndentationColumn, DEFAULT_INDENT } from "./indentation.js";
|
|
30
|
+
export { getFoldingRanges, getFoldingInfo } from "./folding.js";
|
|
31
|
+
export { buildSemanticModel, getSemanticModel } from "./semanticModel.js";
|
|
32
|
+
export type { SemanticModel } from "./semanticModel.js";
|
|
33
|
+
import { type SemanticModel } from "./semanticModel.js";
|
|
34
|
+
/**
|
|
35
|
+
* Unified language service — convenience wrapper for editor integrations.
|
|
36
|
+
* All methods operate on Floe semantic model.
|
|
37
|
+
*/
|
|
38
|
+
export declare class FloeLanguageService {
|
|
39
|
+
getSemanticModel(source: string): SemanticModel;
|
|
40
|
+
getDiagnostics(source: string): import("./index.js").Diagnostic[];
|
|
41
|
+
getCompletions(source: string, offset: number): import("./types.js").CompletionItem[];
|
|
42
|
+
getHover(source: string, offset: number): import("./types.js").HoverInfo | null;
|
|
43
|
+
getSymbols(source: string): import("./types.js").SymbolInformation[];
|
|
44
|
+
getDefinition(source: string, offset: number): import("./types.js").Location | null;
|
|
45
|
+
getReferences(source: string, offset: number): import("./types.js").Location[];
|
|
46
|
+
rename(source: string, offset: number, newName: string): import("./rename.js").RenameResult | import("./rename.js").RenameError;
|
|
47
|
+
format(source: string): string;
|
|
48
|
+
getHighlightTokens(source: string): import("./types.js").HighlightToken[];
|
|
49
|
+
getFoldingRanges(source: string): import("./types.js").FoldingRange[];
|
|
50
|
+
getIndentForLine(source: string, line: number): string;
|
|
51
|
+
}
|
|
52
|
+
/** Singleton convenience */
|
|
53
|
+
export declare const floeLanguageService: FloeLanguageService;
|
|
54
|
+
//# sourceMappingURL=index.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.d.ts","sourceRoot":"","sources":["../../../src/language/index.ts"],"names":[],"mappings":"AAAA;;;;;;;;;;;;;;GAcG;AAEH,YAAY,EAAE,QAAQ,EAAE,KAAK,EAAE,MAAM,aAAa,CAAC;AACnD,YAAY,EAAE,UAAU,EAAE,MAAM,mBAAmB,CAAC;AACpD,YAAY,EAAE,WAAW,EAAE,QAAQ,EAAE,QAAQ,EAAE,SAAS,EAAE,MAAM,aAAa,CAAC;AAE9E,cAAc,YAAY,CAAC;AAE3B,OAAO,EAAE,kBAAkB,EAAE,mBAAmB,EAAE,MAAM,mBAAmB,CAAC;AAC5E,OAAO,EAAE,cAAc,EAAE,MAAM,iBAAiB,CAAC;AACjD,OAAO,EAAE,cAAc,EAAE,wBAAwB,EAAE,IAAI,EAAE,MAAM,yBAAyB,CAAC;AACzF,OAAO,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AACtC,OAAO,EAAE,UAAU,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAC1D,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,kBAAkB,CAAC;AACvE,OAAO,EAAE,aAAa,EAAE,oBAAoB,EAAE,MAAM,iBAAiB,CAAC;AACtE,OAAO,EAAE,MAAM,EAAE,UAAU,EAAE,UAAU,EAAE,MAAM,aAAa,CAAC;AAC7D,OAAO,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,iBAAiB,CAAC;AACtD,OAAO,EAAE,gBAAgB,EAAE,kBAAkB,EAAE,oBAAoB,EAAE,cAAc,EAAE,MAAM,kBAAkB,CAAC;AAC9G,OAAO,EAAE,gBAAgB,EAAE,cAAc,EAAE,MAAM,cAAc,CAAC;AAChE,OAAO,EAAE,kBAAkB,EAAE,gBAAgB,EAAE,MAAM,oBAAoB,CAAC;AAC1E,YAAY,EAAE,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAaxD,OAAO,EAAsB,KAAK,aAAa,EAAE,MAAM,oBAAoB,CAAC;AAE5E;;;GAGG;AACH,qBAAa,mBAAmB;IAC9B,gBAAgB,CAAC,MAAM,EAAE,MAAM,GAAG,aAAa;IAI/C,cAAc,CAAC,MAAM,EAAE,MAAM;IAI7B,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAI7C,QAAQ,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAIvC,UAAU,CAAC,MAAM,EAAE,MAAM;IAIzB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAI5C,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM;IAI5C,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM;IAItD,MAAM,CAAC,MAAM,EAAE,MAAM;IAIrB,kBAAkB,CAAC,MAAM,EAAE,MAAM;IAIjC,gBAAgB,CAAC,MAAM,EAAE,MAAM;IAI/B,gBAAgB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM;CAG9C;AAED,4BAA4B;AAC5B,eAAO,MAAM,mBAAmB,qBAA4B,CAAC"}
|
|
@@ -0,0 +1,85 @@
|
|
|
1
|
+
/**
|
|
2
|
+
* Floe Language Services (editor-independent)
|
|
3
|
+
*
|
|
4
|
+
* Architecture:
|
|
5
|
+
* Floe Source -> Parser -> Semantic Model -> Language Services
|
|
6
|
+
* ├── Completion
|
|
7
|
+
* ├── Diagnostics
|
|
8
|
+
* ├── Hover
|
|
9
|
+
* ├── Definitions
|
|
10
|
+
* ├── References
|
|
11
|
+
* ├── Rename
|
|
12
|
+
* └── Formatting
|
|
13
|
+
*
|
|
14
|
+
* This module does not depend on React, CodeMirror, or VS Code.
|
|
15
|
+
*/
|
|
16
|
+
export * from "./types.js";
|
|
17
|
+
export { getHighlightTokens, getHighlightingInfo } from "./highlighting.js";
|
|
18
|
+
export { getCompletions } from "./completion.js";
|
|
19
|
+
export { getDiagnostics, getDiagnosticsWithSource, lint } from "./diagnosticsService.js";
|
|
20
|
+
export { getHover } from "./hover.js";
|
|
21
|
+
export { getSymbols, getFlatSymbols } from "./symbols.js";
|
|
22
|
+
export { getDefinition, getDefinitionForWord } from "./definitions.js";
|
|
23
|
+
export { getReferences, getReferencesForWord } from "./references.js";
|
|
24
|
+
export { rename, renameWord, applyEdits } from "./rename.js";
|
|
25
|
+
export { format, isFormatted } from "./formatting.js";
|
|
26
|
+
export { getIndentForLine, getIndentationInfo, getIndentationColumn, DEFAULT_INDENT } from "./indentation.js";
|
|
27
|
+
export { getFoldingRanges, getFoldingInfo } from "./folding.js";
|
|
28
|
+
export { buildSemanticModel, getSemanticModel } from "./semanticModel.js";
|
|
29
|
+
import { getCompletions } from "./completion.js";
|
|
30
|
+
import { getDiagnostics } from "./diagnosticsService.js";
|
|
31
|
+
import { getHover } from "./hover.js";
|
|
32
|
+
import { getSymbols } from "./symbols.js";
|
|
33
|
+
import { getDefinition } from "./definitions.js";
|
|
34
|
+
import { getReferences } from "./references.js";
|
|
35
|
+
import { rename } from "./rename.js";
|
|
36
|
+
import { format } from "./formatting.js";
|
|
37
|
+
import { getHighlightTokens } from "./highlighting.js";
|
|
38
|
+
import { getFoldingRanges } from "./folding.js";
|
|
39
|
+
import { getIndentForLine } from "./indentation.js";
|
|
40
|
+
import { buildSemanticModel } from "./semanticModel.js";
|
|
41
|
+
/**
|
|
42
|
+
* Unified language service — convenience wrapper for editor integrations.
|
|
43
|
+
* All methods operate on Floe semantic model.
|
|
44
|
+
*/
|
|
45
|
+
export class FloeLanguageService {
|
|
46
|
+
getSemanticModel(source) {
|
|
47
|
+
return buildSemanticModel(source);
|
|
48
|
+
}
|
|
49
|
+
getDiagnostics(source) {
|
|
50
|
+
return getDiagnostics(source);
|
|
51
|
+
}
|
|
52
|
+
getCompletions(source, offset) {
|
|
53
|
+
return getCompletions(source, offset);
|
|
54
|
+
}
|
|
55
|
+
getHover(source, offset) {
|
|
56
|
+
return getHover(source, offset);
|
|
57
|
+
}
|
|
58
|
+
getSymbols(source) {
|
|
59
|
+
return getSymbols(source);
|
|
60
|
+
}
|
|
61
|
+
getDefinition(source, offset) {
|
|
62
|
+
return getDefinition(source, offset);
|
|
63
|
+
}
|
|
64
|
+
getReferences(source, offset) {
|
|
65
|
+
return getReferences(source, offset);
|
|
66
|
+
}
|
|
67
|
+
rename(source, offset, newName) {
|
|
68
|
+
return rename(source, offset, newName);
|
|
69
|
+
}
|
|
70
|
+
format(source) {
|
|
71
|
+
return format(source);
|
|
72
|
+
}
|
|
73
|
+
getHighlightTokens(source) {
|
|
74
|
+
return getHighlightTokens(source);
|
|
75
|
+
}
|
|
76
|
+
getFoldingRanges(source) {
|
|
77
|
+
return getFoldingRanges(source);
|
|
78
|
+
}
|
|
79
|
+
getIndentForLine(source, line) {
|
|
80
|
+
return getIndentForLine(source, line);
|
|
81
|
+
}
|
|
82
|
+
}
|
|
83
|
+
/** Singleton convenience */
|
|
84
|
+
export const floeLanguageService = new FloeLanguageService();
|
|
85
|
+
//# sourceMappingURL=index.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"index.js","sourceRoot":"","sources":["../../../src/language/index.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,12 @@
|
|
|
1
|
+
import type { Location } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* References — discoverable references for a symbol at offset.
|
|
4
|
+
* Includes declarations, edge sources/targets, annotation/link targets, etc.
|
|
5
|
+
* Strategy: find identifier at offset, then collect all token ranges where lexeme equals that id,
|
|
6
|
+
* using lexer to avoid changing unrelated text (e.g., not inside strings/comments).
|
|
7
|
+
*/
|
|
8
|
+
export declare function getReferences(source: string, offset: number): Location[];
|
|
9
|
+
export declare function getReferencesForWord(source: string, word: string): Location[];
|
|
10
|
+
/** For richer context, also include edges as locations (already covered by token scanning) */
|
|
11
|
+
export declare function getSemanticReferences(source: string, offset: number): Location[];
|
|
12
|
+
//# sourceMappingURL=references.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"references.d.ts","sourceRoot":"","sources":["../../../src/language/references.ts"],"names":[],"mappings":"AAEA,OAAO,KAAK,EAAE,QAAQ,EAAE,MAAM,YAAY,CAAC;AAE3C;;;;;GAKG;AACH,wBAAgB,aAAa,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAMxE;AAED,wBAAgB,oBAAoB,CAAC,MAAM,EAAE,MAAM,EAAE,IAAI,EAAE,MAAM,GAAG,QAAQ,EAAE,CAW7E;AAED,8FAA8F;AAC9F,wBAAgB,qBAAqB,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,GAAG,QAAQ,EAAE,CAIhF"}
|
|
@@ -0,0 +1,35 @@
|
|
|
1
|
+
import { tokenize } from "../lexer.js";
|
|
2
|
+
import { getTokenAtOffset } from "./utils.js";
|
|
3
|
+
/**
|
|
4
|
+
* References — discoverable references for a symbol at offset.
|
|
5
|
+
* Includes declarations, edge sources/targets, annotation/link targets, etc.
|
|
6
|
+
* Strategy: find identifier at offset, then collect all token ranges where lexeme equals that id,
|
|
7
|
+
* using lexer to avoid changing unrelated text (e.g., not inside strings/comments).
|
|
8
|
+
*/
|
|
9
|
+
export function getReferences(source, offset) {
|
|
10
|
+
const tokens = tokenize(source);
|
|
11
|
+
const tok = getTokenAtOffset(tokens, offset);
|
|
12
|
+
if (!tok || tok.type !== "IDENT")
|
|
13
|
+
return [];
|
|
14
|
+
const id = tok.lexeme;
|
|
15
|
+
return getReferencesForWord(source, id);
|
|
16
|
+
}
|
|
17
|
+
export function getReferencesForWord(source, word) {
|
|
18
|
+
const tokens = tokenize(source);
|
|
19
|
+
const refs = [];
|
|
20
|
+
for (const t of tokens) {
|
|
21
|
+
if (t.type === "IDENT" && t.lexeme === word) {
|
|
22
|
+
refs.push({ range: t.range });
|
|
23
|
+
}
|
|
24
|
+
}
|
|
25
|
+
// Deterministic order by offset
|
|
26
|
+
refs.sort((a, b) => a.range.start.offset - b.range.start.offset);
|
|
27
|
+
return refs;
|
|
28
|
+
}
|
|
29
|
+
/** For richer context, also include edges as locations (already covered by token scanning) */
|
|
30
|
+
export function getSemanticReferences(source, offset) {
|
|
31
|
+
const base = getReferences(source, offset);
|
|
32
|
+
// Could also add edge ranges etc., but token scanning already covers.
|
|
33
|
+
return base;
|
|
34
|
+
}
|
|
35
|
+
//# sourceMappingURL=references.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"references.js","sourceRoot":"","sources":["../../../src/language/references.ts"],"names":[],"mappings":"AAAA,OAAO,EAAE,QAAQ,EAAE,MAAM,aAAa,CAAC;AACvC,OAAO,EAAE,gBAAgB,EAAE,MAAM,YAAY,CAAC;AAG9C;;;;;GAKG;AACH,MAAM,UAAU,aAAa,CAAC,MAAc,EAAE,MAAc;IAC1D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,GAAG,GAAG,gBAAgB,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC7C,IAAI,CAAC,GAAG,IAAI,GAAG,CAAC,IAAI,KAAK,OAAO;QAAE,OAAO,EAAE,CAAC;IAC5C,MAAM,EAAE,GAAG,GAAG,CAAC,MAAM,CAAC;IACtB,OAAO,oBAAoB,CAAC,MAAM,EAAE,EAAE,CAAC,CAAC;AAC1C,CAAC;AAED,MAAM,UAAU,oBAAoB,CAAC,MAAc,EAAE,IAAY;IAC/D,MAAM,MAAM,GAAG,QAAQ,CAAC,MAAM,CAAC,CAAC;IAChC,MAAM,IAAI,GAAe,EAAE,CAAC;IAC5B,KAAK,MAAM,CAAC,IAAI,MAAM,EAAE,CAAC;QACvB,IAAI,CAAC,CAAC,IAAI,KAAK,OAAO,IAAI,CAAC,CAAC,MAAM,KAAK,IAAI,EAAE,CAAC;YAC5C,IAAI,CAAC,IAAI,CAAC,EAAE,KAAK,EAAE,CAAC,CAAC,KAAK,EAAE,CAAC,CAAC;QAChC,CAAC;IACH,CAAC;IACD,gCAAgC;IAChC,IAAI,CAAC,IAAI,CAAC,CAAC,CAAC,EAAE,CAAC,EAAE,EAAE,CAAC,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,GAAG,CAAC,CAAC,KAAK,CAAC,KAAK,CAAC,MAAM,CAAC,CAAC;IACjE,OAAO,IAAI,CAAC;AACd,CAAC;AAED,8FAA8F;AAC9F,MAAM,UAAU,qBAAqB,CAAC,MAAc,EAAE,MAAc;IAClE,MAAM,IAAI,GAAG,aAAa,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IAC3C,sEAAsE;IACtE,OAAO,IAAI,CAAC;AACd,CAAC"}
|
|
@@ -0,0 +1,18 @@
|
|
|
1
|
+
import type { TextEdit } from "./types.js";
|
|
2
|
+
/**
|
|
3
|
+
* Rename — update references without changing unrelated text.
|
|
4
|
+
* Produces edits that replace exact identifier occurrences (IDENT tokens) with newName.
|
|
5
|
+
*/
|
|
6
|
+
export interface RenameResult {
|
|
7
|
+
edits: TextEdit[];
|
|
8
|
+
newSource?: string;
|
|
9
|
+
}
|
|
10
|
+
export interface RenameError {
|
|
11
|
+
error: string;
|
|
12
|
+
code?: string;
|
|
13
|
+
}
|
|
14
|
+
export declare function rename(source: string, offset: number, newName: string): RenameResult | RenameError;
|
|
15
|
+
export declare function applyEdits(source: string, edits: TextEdit[]): string;
|
|
16
|
+
/** Convenience: rename word directly without offset, useful for tests */
|
|
17
|
+
export declare function renameWord(source: string, oldWord: string, newName: string): RenameResult | RenameError;
|
|
18
|
+
//# sourceMappingURL=rename.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rename.d.ts","sourceRoot":"","sources":["../../../src/language/rename.ts"],"names":[],"mappings":"AAGA,OAAO,KAAK,EAAE,QAAQ,EAAY,MAAM,YAAY,CAAC;AAGrD;;;GAGG;AAEH,MAAM,WAAW,YAAY;IAC3B,KAAK,EAAE,QAAQ,EAAE,CAAC;IAClB,SAAS,CAAC,EAAE,MAAM,CAAC;CACpB;AAED,MAAM,WAAW,WAAW;IAC1B,KAAK,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;CACf;AAED,wBAAgB,MAAM,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,WAAW,CA2BlG;AAED,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,QAAQ,EAAE,GAAG,MAAM,CAUpE;AAED,yEAAyE;AACzE,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAAG,YAAY,GAAG,WAAW,CASvG"}
|
|
@@ -0,0 +1,53 @@
|
|
|
1
|
+
import { tokenize } from "../lexer.js";
|
|
2
|
+
import { getTokenAtOffset } from "./utils.js";
|
|
3
|
+
import { isValidIdentifier } from "../types.js";
|
|
4
|
+
import { getReferencesForWord } from "./references.js";
|
|
5
|
+
export function rename(source, offset, newName) {
|
|
6
|
+
if (!isValidIdentifier(newName)) {
|
|
7
|
+
return { error: `Invalid identifier '${newName}': must match [A-Za-z_][A-Za-z0-9_-]*`, code: "E002" };
|
|
8
|
+
}
|
|
9
|
+
const tokens = tokenize(source);
|
|
10
|
+
const tok = getTokenAtOffset(tokens, offset);
|
|
11
|
+
if (!tok || tok.type !== "IDENT") {
|
|
12
|
+
return { error: `No identifier found at offset ${offset}` };
|
|
13
|
+
}
|
|
14
|
+
const oldName = tok.lexeme;
|
|
15
|
+
if (oldName === newName) {
|
|
16
|
+
return { edits: [] };
|
|
17
|
+
}
|
|
18
|
+
const refs = getReferencesForWord(source, oldName);
|
|
19
|
+
const edits = refs.map((loc) => ({
|
|
20
|
+
range: loc.range,
|
|
21
|
+
newText: newName,
|
|
22
|
+
}));
|
|
23
|
+
// Sort edits descending by offset so applying sequentially doesn't shift offsets
|
|
24
|
+
// But for API we return them sorted ascending? We'll sort descending for applying helper.
|
|
25
|
+
// For consumption we provide stable order ascending? Provide descending for LSP style? We'll provide ascending but apply reverse.
|
|
26
|
+
// Ensure deterministic
|
|
27
|
+
edits.sort((a, b) => b.range.start.offset - a.range.start.offset);
|
|
28
|
+
return { edits, newSource: applyEdits(source, edits) };
|
|
29
|
+
}
|
|
30
|
+
export function applyEdits(source, edits) {
|
|
31
|
+
// Apply edits in descending offset order to preserve correctness
|
|
32
|
+
const sorted = [...edits].sort((a, b) => b.range.start.offset - a.range.start.offset);
|
|
33
|
+
let out = source;
|
|
34
|
+
for (const e of sorted) {
|
|
35
|
+
const start = e.range.start.offset;
|
|
36
|
+
const end = e.range.end.offset;
|
|
37
|
+
out = out.slice(0, start) + e.newText + out.slice(end);
|
|
38
|
+
}
|
|
39
|
+
return out;
|
|
40
|
+
}
|
|
41
|
+
/** Convenience: rename word directly without offset, useful for tests */
|
|
42
|
+
export function renameWord(source, oldWord, newName) {
|
|
43
|
+
if (!isValidIdentifier(newName)) {
|
|
44
|
+
return { error: `Invalid identifier '${newName}'`, code: "E002" };
|
|
45
|
+
}
|
|
46
|
+
const refs = getReferencesForWord(source, oldWord);
|
|
47
|
+
if (refs.length === 0)
|
|
48
|
+
return { error: `No references found for '${oldWord}'` };
|
|
49
|
+
const edits = refs.map((loc) => ({ range: loc.range, newText: newName }));
|
|
50
|
+
edits.sort((a, b) => b.range.start.offset - a.range.start.offset);
|
|
51
|
+
return { edits, newSource: applyEdits(source, edits) };
|
|
52
|
+
}
|
|
53
|
+
//# sourceMappingURL=rename.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"rename.js","sourceRoot":"","sources":["../../../src/language/rename.ts"],"names":[],"mappings":"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"}
|