@memoarchitect/tools 0.7.2 → 0.8.8
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/README.md +1 -1
- package/corpus/README.md +63 -0
- package/corpus/sysml-v2-release/bnf/SysML-graphical-bnf.kgbnf +2264 -0
- package/package.json +4 -3
- package/packages/tools/lib/analysis/dsm.d.ts +1 -1
- package/packages/tools/lib/analysis/dsm.d.ts.map +1 -1
- package/packages/tools/lib/analysis/dsm.js +1 -1
- package/packages/tools/lib/analysis/dsm.js.map +1 -1
- package/packages/tools/lib/bin/memo.js +25 -0
- package/packages/tools/lib/bin/memo.js.map +1 -1
- package/packages/tools/lib/browser/index.d.ts +2 -0
- package/packages/tools/lib/browser/index.d.ts.map +1 -1
- package/packages/tools/lib/browser/index.js +1 -0
- package/packages/tools/lib/browser/index.js.map +1 -1
- package/packages/tools/lib/commands/dev.d.ts.map +1 -1
- package/packages/tools/lib/commands/dev.js +37 -15
- package/packages/tools/lib/commands/dev.js.map +1 -1
- package/packages/tools/lib/commands/dhf-lint.d.ts +10 -0
- package/packages/tools/lib/commands/dhf-lint.d.ts.map +1 -0
- package/packages/tools/lib/commands/dhf-lint.js +72 -0
- package/packages/tools/lib/commands/dhf-lint.js.map +1 -0
- package/packages/tools/lib/commands/dhf.d.ts.map +1 -1
- package/packages/tools/lib/commands/dhf.js +7 -1
- package/packages/tools/lib/commands/dhf.js.map +1 -1
- package/packages/tools/lib/commands/standards.d.ts +28 -0
- package/packages/tools/lib/commands/standards.d.ts.map +1 -0
- package/packages/tools/lib/commands/standards.js +203 -0
- package/packages/tools/lib/commands/standards.js.map +1 -0
- package/packages/tools/lib/commands/validate.d.ts.map +1 -1
- package/packages/tools/lib/commands/validate.js +13 -2
- package/packages/tools/lib/commands/validate.js.map +1 -1
- package/packages/tools/lib/dhf/document-compiler.d.ts.map +1 -1
- package/packages/tools/lib/dhf/document-compiler.js +13 -8
- package/packages/tools/lib/dhf/document-compiler.js.map +1 -1
- package/packages/tools/lib/dhf/document-registry.d.ts +16 -2
- package/packages/tools/lib/dhf/document-registry.d.ts.map +1 -1
- package/packages/tools/lib/dhf/document-registry.js +74 -23
- package/packages/tools/lib/dhf/document-registry.js.map +1 -1
- package/packages/tools/lib/dhf/index.d.ts +3 -0
- package/packages/tools/lib/dhf/index.d.ts.map +1 -1
- package/packages/tools/lib/dhf/index.js +4 -0
- package/packages/tools/lib/dhf/index.js.map +1 -1
- package/packages/tools/lib/dhf/query-engine.d.ts +12 -1
- package/packages/tools/lib/dhf/query-engine.d.ts.map +1 -1
- package/packages/tools/lib/dhf/query-engine.js +2 -1
- package/packages/tools/lib/dhf/query-engine.js.map +1 -1
- package/packages/tools/lib/dhf/query-executor.d.ts +72 -5
- package/packages/tools/lib/dhf/query-executor.d.ts.map +1 -1
- package/packages/tools/lib/dhf/query-executor.js +471 -81
- package/packages/tools/lib/dhf/query-executor.js.map +1 -1
- package/packages/tools/lib/dhf/script-runner.js +6 -6
- package/packages/tools/lib/dhf/script-runner.js.map +1 -1
- package/packages/tools/lib/dhf/standards-block.d.ts +40 -0
- package/packages/tools/lib/dhf/standards-block.d.ts.map +1 -0
- package/packages/tools/lib/dhf/standards-block.js +223 -0
- package/packages/tools/lib/dhf/standards-block.js.map +1 -0
- package/packages/tools/lib/dhf/standards-library.d.ts +123 -0
- package/packages/tools/lib/dhf/standards-library.d.ts.map +1 -0
- package/packages/tools/lib/dhf/standards-library.js +295 -0
- package/packages/tools/lib/dhf/standards-library.js.map +1 -0
- package/packages/tools/lib/dhf/standards-report.d.ts +189 -0
- package/packages/tools/lib/dhf/standards-report.d.ts.map +1 -0
- package/packages/tools/lib/dhf/standards-report.js +384 -0
- package/packages/tools/lib/dhf/standards-report.js.map +1 -0
- package/packages/tools/lib/dhf/template-lint.d.ts +42 -0
- package/packages/tools/lib/dhf/template-lint.d.ts.map +1 -0
- package/packages/tools/lib/dhf/template-lint.js +421 -0
- package/packages/tools/lib/dhf/template-lint.js.map +1 -0
- package/packages/tools/lib/dhf/template-resolver.d.ts.map +1 -1
- package/packages/tools/lib/dhf/template-resolver.js +17 -5
- package/packages/tools/lib/dhf/template-resolver.js.map +1 -1
- package/packages/tools/lib/importer/cameo-importer.js +2 -2
- package/packages/tools/lib/importer/cameo-importer.js.map +1 -1
- package/packages/tools/lib/importer/ea-importer.d.ts.map +1 -1
- package/packages/tools/lib/importer/ea-importer.js +4 -3
- package/packages/tools/lib/importer/ea-importer.js.map +1 -1
- package/packages/tools/lib/importer/owl-importer.d.ts.map +1 -1
- package/packages/tools/lib/importer/owl-importer.js +2 -3
- package/packages/tools/lib/importer/owl-importer.js.map +1 -1
- package/packages/tools/lib/language/generated/ast.d.ts +1172 -54
- package/packages/tools/lib/language/generated/ast.d.ts.map +1 -1
- package/packages/tools/lib/language/generated/ast.js +967 -39
- package/packages/tools/lib/language/generated/ast.js.map +1 -1
- package/packages/tools/lib/language/generated/grammar.d.ts.map +1 -1
- package/packages/tools/lib/language/generated/grammar.js +3694 -425
- package/packages/tools/lib/language/generated/grammar.js.map +1 -1
- package/packages/tools/lib/model/builder.d.ts.map +1 -1
- package/packages/tools/lib/model/builder.js +730 -48
- package/packages/tools/lib/model/builder.js.map +1 -1
- package/packages/tools/lib/model/kind-registry.d.ts +20 -0
- package/packages/tools/lib/model/kind-registry.d.ts.map +1 -1
- package/packages/tools/lib/model/kind-registry.js +38 -0
- package/packages/tools/lib/model/kind-registry.js.map +1 -1
- package/packages/tools/lib/model/manifest.d.ts +8 -0
- package/packages/tools/lib/model/manifest.d.ts.map +1 -1
- package/packages/tools/lib/model/manifest.js +3 -0
- package/packages/tools/lib/model/manifest.js.map +1 -1
- package/packages/tools/lib/model/naming.d.ts +57 -0
- package/packages/tools/lib/model/naming.d.ts.map +1 -0
- package/packages/tools/lib/model/naming.js +69 -0
- package/packages/tools/lib/model/naming.js.map +1 -0
- package/packages/tools/lib/model/native-project.d.ts +10 -7
- package/packages/tools/lib/model/native-project.d.ts.map +1 -1
- package/packages/tools/lib/model/native-project.js +76 -21
- package/packages/tools/lib/model/native-project.js.map +1 -1
- package/packages/tools/lib/model/ontology-loader.d.ts.map +1 -1
- package/packages/tools/lib/model/ontology-loader.js +3 -0
- package/packages/tools/lib/model/ontology-loader.js.map +1 -1
- package/packages/tools/lib/model/package-manifest.d.ts +4 -0
- package/packages/tools/lib/model/package-manifest.d.ts.map +1 -1
- package/packages/tools/lib/model/package-manifest.js +2 -0
- package/packages/tools/lib/model/package-manifest.js.map +1 -1
- package/packages/tools/lib/model/relationship-legality.d.ts +17 -0
- package/packages/tools/lib/model/relationship-legality.d.ts.map +1 -1
- package/packages/tools/lib/model/relationship-legality.js.map +1 -1
- package/packages/tools/lib/model/relationship-registry.d.ts +77 -0
- package/packages/tools/lib/model/relationship-registry.d.ts.map +1 -1
- package/packages/tools/lib/model/relationship-registry.js +217 -2
- package/packages/tools/lib/model/relationship-registry.js.map +1 -1
- package/packages/tools/lib/model/semantic.d.ts +48 -0
- package/packages/tools/lib/model/semantic.d.ts.map +1 -1
- package/packages/tools/lib/model/semantic.js +3 -0
- package/packages/tools/lib/model/semantic.js.map +1 -1
- package/packages/tools/lib/model/settings-boundary.js +1 -1
- package/packages/tools/lib/model/settings-boundary.js.map +1 -1
- package/packages/tools/lib/model/short-id.d.ts.map +1 -1
- package/packages/tools/lib/model/short-id.js +1 -3
- package/packages/tools/lib/model/short-id.js.map +1 -1
- package/packages/tools/lib/model/view-deriver.d.ts +10 -1
- package/packages/tools/lib/model/view-deriver.d.ts.map +1 -1
- package/packages/tools/lib/model/view-deriver.js +104 -5
- package/packages/tools/lib/model/view-deriver.js.map +1 -1
- package/packages/tools/lib/protocol/messages.d.ts +85 -3
- package/packages/tools/lib/protocol/messages.d.ts.map +1 -1
- package/packages/tools/lib/server/dev-server.d.ts.map +1 -1
- package/packages/tools/lib/server/dev-server.js +161 -5
- package/packages/tools/lib/server/dev-server.js.map +1 -1
- package/packages/tools/lib/server/package-source.d.ts +26 -0
- package/packages/tools/lib/server/package-source.d.ts.map +1 -0
- package/packages/tools/lib/server/package-source.js +81 -0
- package/packages/tools/lib/server/package-source.js.map +1 -0
- package/packages/tools/lib/server/package-writer.d.ts +94 -0
- package/packages/tools/lib/server/package-writer.d.ts.map +1 -0
- package/packages/tools/lib/server/package-writer.js +317 -0
- package/packages/tools/lib/server/package-writer.js.map +1 -0
- package/packages/tools/lib/server/persistor.d.ts +20 -0
- package/packages/tools/lib/server/persistor.d.ts.map +1 -1
- package/packages/tools/lib/server/persistor.js +29 -8
- package/packages/tools/lib/server/persistor.js.map +1 -1
- package/packages/tools/lib/server/relationship-writer.d.ts +13 -1
- package/packages/tools/lib/server/relationship-writer.d.ts.map +1 -1
- package/packages/tools/lib/server/relationship-writer.js +59 -0
- package/packages/tools/lib/server/relationship-writer.js.map +1 -1
- package/packages/tools/lib/server/sysml-notation.d.ts +1 -1
- package/packages/tools/lib/server/sysml-notation.d.ts.map +1 -1
- package/packages/tools/lib/server/sysml-notation.js +17 -0
- package/packages/tools/lib/server/sysml-notation.js.map +1 -1
- package/packages/tools/lib/server/view-layout-store.d.ts.map +1 -1
- package/packages/tools/lib/server/view-layout-store.js +1 -0
- package/packages/tools/lib/server/view-layout-store.js.map +1 -1
- package/packages/tools/lib/validator/behavior-validator.d.ts +1 -1
- package/packages/tools/lib/validator/behavior-validator.js +1 -1
- package/packages/tools/lib/validator/constraint-eval.d.ts +16 -0
- package/packages/tools/lib/validator/constraint-eval.d.ts.map +1 -1
- package/packages/tools/lib/validator/constraint-eval.js +102 -0
- package/packages/tools/lib/validator/constraint-eval.js.map +1 -1
- package/packages/tools/src/grammar/memo-sysml.langium +425 -26
|
@@ -0,0 +1,26 @@
|
|
|
1
|
+
/** One level of body indentation, matching the layout the generator emits. */
|
|
2
|
+
export declare const INDENT = " ";
|
|
3
|
+
/** A package declaration located in one file's source text. */
|
|
4
|
+
export interface LocatedPackage {
|
|
5
|
+
qualifiedName: string;
|
|
6
|
+
name: string;
|
|
7
|
+
/** Offset of the declaration's first character. */
|
|
8
|
+
start: number;
|
|
9
|
+
/** Offset just past the declaration's closing brace. */
|
|
10
|
+
end: number;
|
|
11
|
+
/** Offset just past the body's opening brace. */
|
|
12
|
+
bodyStart: number;
|
|
13
|
+
/** Offset of the body's closing brace. */
|
|
14
|
+
bodyEnd: number;
|
|
15
|
+
}
|
|
16
|
+
/** Every package declared in one file's source, with its qualified name. */
|
|
17
|
+
export declare function locatePackages(source: string): Promise<LocatedPackage[]>;
|
|
18
|
+
/** Insert text as the last member of a package body, indented one level in. */
|
|
19
|
+
export declare function insertIntoBody(source: string, target: LocatedPackage, text: string): string;
|
|
20
|
+
/** Replace a range, re-indenting the replacement to the line it starts on. */
|
|
21
|
+
export declare function spliceIndented(source: string, start: number, end: number, replacement: string): string;
|
|
22
|
+
/** Remove a range together with the blank line it would otherwise leave behind. */
|
|
23
|
+
export declare function removeLine(source: string, start: number, end: number): string;
|
|
24
|
+
/** Strip the common leading whitespace from every line of a block. */
|
|
25
|
+
export declare function dedent(text: string): string;
|
|
26
|
+
//# sourceMappingURL=package-source.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-source.d.ts","sourceRoot":"","sources":["../../src/server/package-source.ts"],"names":[],"mappings":"AAWA,8EAA8E;AAC9E,eAAO,MAAM,MAAM,SAAS,CAAC;AAE7B,+DAA+D;AAC/D,MAAM,WAAW,cAAc;IAC3B,aAAa,EAAE,MAAM,CAAC;IACtB,IAAI,EAAE,MAAM,CAAC;IACb,mDAAmD;IACnD,KAAK,EAAE,MAAM,CAAC;IACd,wDAAwD;IACxD,GAAG,EAAE,MAAM,CAAC;IACZ,iDAAiD;IACjD,SAAS,EAAE,MAAM,CAAC;IAClB,0CAA0C;IAC1C,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,4EAA4E;AAC5E,wBAAsB,cAAc,CAAC,MAAM,EAAE,MAAM,GAAG,OAAO,CAAC,cAAc,EAAE,CAAC,CAyB9E;AAED,+EAA+E;AAC/E,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,MAAM,EAAE,cAAc,EAAE,IAAI,EAAE,MAAM,GAAG,MAAM,CAU3F;AAED,8EAA8E;AAC9E,wBAAgB,cAAc,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,EAAE,WAAW,EAAE,MAAM,GAAG,MAAM,CAMtG;AAED,mFAAmF;AACnF,wBAAgB,UAAU,CAAC,MAAM,EAAE,MAAM,EAAE,KAAK,EAAE,MAAM,EAAE,GAAG,EAAE,MAAM,GAAG,MAAM,CAQ7E;AAED,sEAAsE;AACtE,wBAAgB,MAAM,CAAC,IAAI,EAAE,MAAM,GAAG,MAAM,CAM3C"}
|
|
@@ -0,0 +1,81 @@
|
|
|
1
|
+
// ─── Locating packages in source text ────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Shared by the element persistor and the package writer, because "put this
|
|
4
|
+
// declaration in that package" is one question with one answer whichever of
|
|
5
|
+
// them is asking. A package is found by parsing, never by matching its name in
|
|
6
|
+
// the file text: a comment mentioning the name is not a declaration, and two
|
|
7
|
+
// packages can differ only in their nesting.
|
|
8
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
9
|
+
import { parseText } from '../model/parser-utils.js';
|
|
10
|
+
/** One level of body indentation, matching the layout the generator emits. */
|
|
11
|
+
export const INDENT = ' ';
|
|
12
|
+
/** Every package declared in one file's source, with its qualified name. */
|
|
13
|
+
export async function locatePackages(source) {
|
|
14
|
+
if (!source.trim())
|
|
15
|
+
return [];
|
|
16
|
+
const { document, errors } = await parseText(source);
|
|
17
|
+
if (errors.length > 0)
|
|
18
|
+
return [];
|
|
19
|
+
const found = [];
|
|
20
|
+
const visit = (node, parent) => {
|
|
21
|
+
for (const member of node.members ?? []) {
|
|
22
|
+
if (member.$type !== 'PackageDeclaration')
|
|
23
|
+
continue;
|
|
24
|
+
const qualifiedName = parent ? `${parent}::${member.name}` : member.name;
|
|
25
|
+
const cst = member.$cstNode;
|
|
26
|
+
if (cst) {
|
|
27
|
+
const start = cst.offset;
|
|
28
|
+
const end = cst.offset + cst.length;
|
|
29
|
+
const bodyStart = source.indexOf('{', start);
|
|
30
|
+
const bodyEnd = source.lastIndexOf('}', end - 1);
|
|
31
|
+
if (bodyStart !== -1 && bodyEnd > bodyStart) {
|
|
32
|
+
found.push({ qualifiedName, name: member.name, start, end, bodyStart: bodyStart + 1, bodyEnd });
|
|
33
|
+
}
|
|
34
|
+
}
|
|
35
|
+
visit(member, qualifiedName);
|
|
36
|
+
}
|
|
37
|
+
};
|
|
38
|
+
visit(document.parseResult.value, '');
|
|
39
|
+
return found;
|
|
40
|
+
}
|
|
41
|
+
/** Insert text as the last member of a package body, indented one level in. */
|
|
42
|
+
export function insertIntoBody(source, target, text) {
|
|
43
|
+
const lineStart = source.lastIndexOf('\n', target.start - 1) + 1;
|
|
44
|
+
const lead = source.slice(lineStart, target.start);
|
|
45
|
+
const indent = (/^[ \t]*$/.test(lead) ? lead : '') + INDENT;
|
|
46
|
+
const body = text.replace(/\s+$/, '').split('\n')
|
|
47
|
+
.map(line => (line ? indent + line : line)).join('\n');
|
|
48
|
+
const before = source.slice(0, target.bodyEnd).replace(/[ \t]*$/, '');
|
|
49
|
+
const separator = before.endsWith('\n') ? '' : '\n';
|
|
50
|
+
const closingIndent = indent.slice(0, -INDENT.length);
|
|
51
|
+
return `${before}${separator}${body}\n${closingIndent}${source.slice(target.bodyEnd)}`;
|
|
52
|
+
}
|
|
53
|
+
/** Replace a range, re-indenting the replacement to the line it starts on. */
|
|
54
|
+
export function spliceIndented(source, start, end, replacement) {
|
|
55
|
+
const lineStart = source.lastIndexOf('\n', start - 1) + 1;
|
|
56
|
+
const lead = source.slice(lineStart, start);
|
|
57
|
+
const indent = /^[ \t]*$/.test(lead) ? lead : '';
|
|
58
|
+
const body = replacement.split('\n').map((line, i) => (i === 0 || !line ? line : indent + line)).join('\n');
|
|
59
|
+
return source.slice(0, start) + body + source.slice(end);
|
|
60
|
+
}
|
|
61
|
+
/** Remove a range together with the blank line it would otherwise leave behind. */
|
|
62
|
+
export function removeLine(source, start, end) {
|
|
63
|
+
const lineStart = source.lastIndexOf('\n', start - 1) + 1;
|
|
64
|
+
const leadingIsBlank = /^[ \t]*$/.test(source.slice(lineStart, start));
|
|
65
|
+
const from = leadingIsBlank ? lineStart : start;
|
|
66
|
+
let to = end;
|
|
67
|
+
while (to < source.length && (source[to] === ' ' || source[to] === '\t'))
|
|
68
|
+
to += 1;
|
|
69
|
+
if (source[to] === '\n')
|
|
70
|
+
to += 1;
|
|
71
|
+
return source.slice(0, from) + source.slice(to);
|
|
72
|
+
}
|
|
73
|
+
/** Strip the common leading whitespace from every line of a block. */
|
|
74
|
+
export function dedent(text) {
|
|
75
|
+
const lines = text.split('\n');
|
|
76
|
+
const indents = lines.slice(1).filter(line => line.trim())
|
|
77
|
+
.map(line => line.match(/^[ \t]*/)?.[0].length ?? 0);
|
|
78
|
+
const common = indents.length > 0 ? Math.min(...indents) : 0;
|
|
79
|
+
return lines.map((line, i) => (i === 0 ? line : line.slice(common))).join('\n');
|
|
80
|
+
}
|
|
81
|
+
//# sourceMappingURL=package-source.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-source.js","sourceRoot":"","sources":["../../src/server/package-source.ts"],"names":[],"mappings":"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"}
|
|
@@ -0,0 +1,94 @@
|
|
|
1
|
+
import { type IrIdentityIndex } from '../model/ir-identity.js';
|
|
2
|
+
/**
|
|
3
|
+
* Why a package rename or delete is only a text edit.
|
|
4
|
+
*
|
|
5
|
+
* Said once here so every surface says the same thing, and phrased as what was
|
|
6
|
+
* *not* done: the edit succeeded, and the references it invalidated are the
|
|
7
|
+
* caller's to fix until the linker can do it.
|
|
8
|
+
*/
|
|
9
|
+
export declare const PACKAGE_EDIT_IS_TEXT_ONLY: string;
|
|
10
|
+
export interface PackageWriteResult {
|
|
11
|
+
success: boolean;
|
|
12
|
+
/** Project-relative files this operation wrote. */
|
|
13
|
+
filePaths: string[];
|
|
14
|
+
/** Qualified name of the package the operation produced or acted on. */
|
|
15
|
+
qualifiedName?: string;
|
|
16
|
+
/** Advisory notes about a write that succeeded. */
|
|
17
|
+
warnings?: {
|
|
18
|
+
code: 'package-edit-is-text-only';
|
|
19
|
+
message: string;
|
|
20
|
+
}[];
|
|
21
|
+
error?: string;
|
|
22
|
+
/** Set when the failure was a stale element identity, so callers can say so. */
|
|
23
|
+
stale?: boolean;
|
|
24
|
+
}
|
|
25
|
+
/**
|
|
26
|
+
* Declare a new package.
|
|
27
|
+
*
|
|
28
|
+
* With a parent, the package is nested inside that declaration; without one it
|
|
29
|
+
* is appended at the file's top level. Nesting rather than minting a new file
|
|
30
|
+
* keeps the edit to a single range in a file the caller already named — the
|
|
31
|
+
* catalog's namespace-to-directory mirroring is a project layout decision, not
|
|
32
|
+
* something a right-click in a tree should quietly make.
|
|
33
|
+
*/
|
|
34
|
+
export declare function createPackage(cwd: string, request: {
|
|
35
|
+
file: string;
|
|
36
|
+
parent?: string;
|
|
37
|
+
name: string;
|
|
38
|
+
}): Promise<PackageWriteResult>;
|
|
39
|
+
/**
|
|
40
|
+
* Rename a package in place.
|
|
41
|
+
*
|
|
42
|
+
* Only the declared name token is replaced; members keep their positions, so
|
|
43
|
+
* the operation cannot reorder or reformat a file around them.
|
|
44
|
+
*/
|
|
45
|
+
export declare function renamePackage(cwd: string, request: {
|
|
46
|
+
file: string;
|
|
47
|
+
qualifiedName: string;
|
|
48
|
+
name: string;
|
|
49
|
+
}): Promise<PackageWriteResult>;
|
|
50
|
+
/**
|
|
51
|
+
* Re-parent a package: move its whole declaration under another package.
|
|
52
|
+
*
|
|
53
|
+
* The declaration is moved verbatim, so everything it declares moves with it —
|
|
54
|
+
* which is what makes this one operation rather than a move per member. Moving
|
|
55
|
+
* a package into itself or into its own descendant is refused: the result would
|
|
56
|
+
* be a namespace that contains the thing containing it.
|
|
57
|
+
*/
|
|
58
|
+
export declare function movePackage(cwd: string, request: {
|
|
59
|
+
file: string;
|
|
60
|
+
qualifiedName: string;
|
|
61
|
+
/** Absent means the file's top level. */
|
|
62
|
+
targetParent?: string;
|
|
63
|
+
targetFile: string;
|
|
64
|
+
}): Promise<PackageWriteResult>;
|
|
65
|
+
/**
|
|
66
|
+
* Remove a package declaration, keeping everything it declares.
|
|
67
|
+
*
|
|
68
|
+
* The members are lifted into the enclosing scope rather than deleted: emptying
|
|
69
|
+
* a container is a containment change, and silently deleting a subtree of the
|
|
70
|
+
* model because someone removed a folder would be the most expensive possible
|
|
71
|
+
* reading of that gesture.
|
|
72
|
+
*/
|
|
73
|
+
export declare function deletePackage(cwd: string, request: {
|
|
74
|
+
file: string;
|
|
75
|
+
qualifiedName: string;
|
|
76
|
+
}): Promise<PackageWriteResult>;
|
|
77
|
+
/**
|
|
78
|
+
* Move one element's declaration into another package.
|
|
79
|
+
*
|
|
80
|
+
* The declaration text is moved verbatim — this is a containment change, not a
|
|
81
|
+
* rewrite, so nothing the user authored inside the declaration is regenerated.
|
|
82
|
+
* The element is addressed by IR identity, exactly as an update is, so a move
|
|
83
|
+
* made against a stale revision fails loudly instead of cutting whatever now
|
|
84
|
+
* occupies that position.
|
|
85
|
+
*/
|
|
86
|
+
export declare function moveElementToPackage(cwd: string, request: {
|
|
87
|
+
elementId: string;
|
|
88
|
+
irIdentity: string;
|
|
89
|
+
sourceFile: string;
|
|
90
|
+
targetFile: string;
|
|
91
|
+
/** Absent means the file's top level. */
|
|
92
|
+
targetPackage?: string;
|
|
93
|
+
}, index: IrIdentityIndex): Promise<PackageWriteResult>;
|
|
94
|
+
//# sourceMappingURL=package-writer.d.ts.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-writer.d.ts","sourceRoot":"","sources":["../../src/server/package-writer.ts"],"names":[],"mappings":"AA0BA,OAAO,EAIH,KAAK,eAAe,EACvB,MAAM,yBAAyB,CAAC;AAMjC;;;;;;GAMG;AACH,eAAO,MAAM,yBAAyB,QAGA,CAAC;AAEvC,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,mDAAmD;IACnD,SAAS,EAAE,MAAM,EAAE,CAAC;IACpB,wEAAwE;IACxE,aAAa,CAAC,EAAE,MAAM,CAAC;IACvB,mDAAmD;IACnD,QAAQ,CAAC,EAAE;QAAE,IAAI,EAAE,2BAA2B,CAAC;QAAC,OAAO,EAAE,MAAM,CAAA;KAAE,EAAE,CAAC;IACpE,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,gFAAgF;IAChF,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAKD;;;;;;;;GAQG;AACH,wBAAsB,aAAa,CAC/B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,MAAM,CAAC,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GACzD,OAAO,CAAC,kBAAkB,CAAC,CA8B7B;AAED;;;;;GAKG;AACH,wBAAsB,aAAa,CAC/B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAC;IAAC,IAAI,EAAE,MAAM,CAAA;CAAE,GAC/D,OAAO,CAAC,kBAAkB,CAAC,CAqC7B;AAED;;;;;;;GAOG;AACH,wBAAsB,WAAW,CAC7B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IACL,IAAI,EAAE,MAAM,CAAC;IACb,aAAa,EAAE,MAAM,CAAC;IACtB,yCAAyC;IACzC,YAAY,CAAC,EAAE,MAAM,CAAC;IACtB,UAAU,EAAE,MAAM,CAAC;CACtB,GACF,OAAO,CAAC,kBAAkB,CAAC,CA2D7B;AAED;;;;;;;GAOG;AACH,wBAAsB,aAAa,CAC/B,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IAAE,IAAI,EAAE,MAAM,CAAC;IAAC,aAAa,EAAE,MAAM,CAAA;CAAE,GACjD,OAAO,CAAC,kBAAkB,CAAC,CA8B7B;AAED;;;;;;;;GAQG;AACH,wBAAsB,oBAAoB,CACtC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE;IACL,SAAS,EAAE,MAAM,CAAC;IAClB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,UAAU,EAAE,MAAM,CAAC;IACnB,yCAAyC;IACzC,aAAa,CAAC,EAAE,MAAM,CAAC;CAC1B,EACD,KAAK,EAAE,eAAe,GACvB,OAAO,CAAC,kBAAkB,CAAC,CAyD7B"}
|
|
@@ -0,0 +1,317 @@
|
|
|
1
|
+
// ─── Package write-back ──────────────────────────────────────────────────────
|
|
2
|
+
//
|
|
3
|
+
// Containment in MEMO is package membership. A container in an Architect
|
|
4
|
+
// explorer is therefore a SysML `package` declaration in project source, and
|
|
5
|
+
// creating, renaming, deleting or moving into one is a source edit — not a
|
|
6
|
+
// directory on disk, and not an attribute on a placeholder element.
|
|
7
|
+
//
|
|
8
|
+
// Every operation here follows the same discipline as ./persistor.ts: locate
|
|
9
|
+
// the declaration by parsing (never by matching its name in the file text),
|
|
10
|
+
// splice one range, parse the result before it reaches disk, and write
|
|
11
|
+
// atomically. A package is addressed by its **qualified name** rather than by
|
|
12
|
+
// an IR identity because the IR does not ingest package declarations — it walks
|
|
13
|
+
// through them — so there is no identity to quote. A qualified name is a real
|
|
14
|
+
// address for the same reason the model uses it: two packages cannot share one.
|
|
15
|
+
//
|
|
16
|
+
// What these operations deliberately do NOT do is update references. Renaming
|
|
17
|
+
// or deleting a package changes the qualified name of everything it declares,
|
|
18
|
+
// and rewriting every reference needs workspace-wide name resolution — the
|
|
19
|
+
// linker, which does not exist yet. The caller is told so, in the same words
|
|
20
|
+
// the element rename uses, rather than being handed a broken model presented as
|
|
21
|
+
// a successful edit.
|
|
22
|
+
// ─────────────────────────────────────────────────────────────────────────────
|
|
23
|
+
import { existsSync, readFileSync } from 'node:fs';
|
|
24
|
+
import { resolve } from 'node:path';
|
|
25
|
+
import { parseText } from '../model/parser-utils.js';
|
|
26
|
+
import { requireIrIdentity, resolveDeclarationByIdentity, StaleIrIdentityError, } from '../model/ir-identity.js';
|
|
27
|
+
import { commitSource } from './persistor.js';
|
|
28
|
+
import { dedent, insertIntoBody, locatePackages, removeLine, spliceIndented, } from './package-source.js';
|
|
29
|
+
/**
|
|
30
|
+
* Why a package rename or delete is only a text edit.
|
|
31
|
+
*
|
|
32
|
+
* Said once here so every surface says the same thing, and phrased as what was
|
|
33
|
+
* *not* done: the edit succeeded, and the references it invalidated are the
|
|
34
|
+
* caller's to fix until the linker can do it.
|
|
35
|
+
*/
|
|
36
|
+
export const PACKAGE_EDIT_IS_TEXT_ONLY = 'This edits the package declaration only. MEMO cannot yet update qualified names that refer to it or to '
|
|
37
|
+
+ 'anything it declares — that needs cross-file name resolution — so those references will not resolve '
|
|
38
|
+
+ 'until you update them by hand.';
|
|
39
|
+
/** Names MEMO will write into source. Anything else is refused, not escaped. */
|
|
40
|
+
const PACKAGE_NAME = /^[A-Za-z_][A-Za-z0-9_]*$/;
|
|
41
|
+
/**
|
|
42
|
+
* Declare a new package.
|
|
43
|
+
*
|
|
44
|
+
* With a parent, the package is nested inside that declaration; without one it
|
|
45
|
+
* is appended at the file's top level. Nesting rather than minting a new file
|
|
46
|
+
* keeps the edit to a single range in a file the caller already named — the
|
|
47
|
+
* catalog's namespace-to-directory mirroring is a project layout decision, not
|
|
48
|
+
* something a right-click in a tree should quietly make.
|
|
49
|
+
*/
|
|
50
|
+
export async function createPackage(cwd, request) {
|
|
51
|
+
const { file, parent, name } = request;
|
|
52
|
+
if (!PACKAGE_NAME.test(name)) {
|
|
53
|
+
return { success: false, filePaths: [], error: `"${name}" is not a valid package name.` };
|
|
54
|
+
}
|
|
55
|
+
const qualifiedName = parent ? `${parent}::${name}` : name;
|
|
56
|
+
const absolute = resolve(cwd, file);
|
|
57
|
+
const source = existsSync(absolute) ? readFileSync(absolute, 'utf8') : '';
|
|
58
|
+
const existing = await locatePackages(source);
|
|
59
|
+
if (existing.some(pkg => pkg.qualifiedName === qualifiedName)) {
|
|
60
|
+
return { success: false, filePaths: [], error: `Package "${qualifiedName}" already exists in ${file}.` };
|
|
61
|
+
}
|
|
62
|
+
let updated;
|
|
63
|
+
if (parent) {
|
|
64
|
+
const target = existing.find(pkg => pkg.qualifiedName === parent);
|
|
65
|
+
if (!target) {
|
|
66
|
+
return { success: false, filePaths: [], error: `${file} does not declare package "${parent}".` };
|
|
67
|
+
}
|
|
68
|
+
updated = insertIntoBody(source, target, `package ${name} {\n}\n`);
|
|
69
|
+
}
|
|
70
|
+
else {
|
|
71
|
+
const separator = source && !source.endsWith('\n\n') ? (source.endsWith('\n') ? '\n' : '\n\n') : '';
|
|
72
|
+
updated = `${source}${separator}package ${name} {\n}\n`;
|
|
73
|
+
}
|
|
74
|
+
const committed = await commitSource(absolute, file, updated);
|
|
75
|
+
if (!committed.success)
|
|
76
|
+
return { success: false, filePaths: [], error: committed.error };
|
|
77
|
+
return { success: true, filePaths: [file], qualifiedName };
|
|
78
|
+
}
|
|
79
|
+
/**
|
|
80
|
+
* Rename a package in place.
|
|
81
|
+
*
|
|
82
|
+
* Only the declared name token is replaced; members keep their positions, so
|
|
83
|
+
* the operation cannot reorder or reformat a file around them.
|
|
84
|
+
*/
|
|
85
|
+
export async function renamePackage(cwd, request) {
|
|
86
|
+
const { file, qualifiedName, name } = request;
|
|
87
|
+
if (!PACKAGE_NAME.test(name)) {
|
|
88
|
+
return { success: false, filePaths: [], error: `"${name}" is not a valid package name.` };
|
|
89
|
+
}
|
|
90
|
+
const absolute = resolve(cwd, file);
|
|
91
|
+
if (!existsSync(absolute))
|
|
92
|
+
return { success: false, filePaths: [], error: `${file} does not exist.` };
|
|
93
|
+
const source = readFileSync(absolute, 'utf8');
|
|
94
|
+
const packages = await locatePackages(source);
|
|
95
|
+
const target = packages.find(pkg => pkg.qualifiedName === qualifiedName);
|
|
96
|
+
if (!target) {
|
|
97
|
+
return { success: false, filePaths: [], error: `${file} does not declare package "${qualifiedName}".` };
|
|
98
|
+
}
|
|
99
|
+
if (target.name === name)
|
|
100
|
+
return { success: true, filePaths: [], qualifiedName };
|
|
101
|
+
const parent = parentOf(qualifiedName);
|
|
102
|
+
const renamed = parent ? `${parent}::${name}` : name;
|
|
103
|
+
if (packages.some(pkg => pkg.qualifiedName === renamed)) {
|
|
104
|
+
return { success: false, filePaths: [], error: `Package "${renamed}" already exists in ${file}.` };
|
|
105
|
+
}
|
|
106
|
+
const header = source.slice(target.start, target.bodyStart);
|
|
107
|
+
const match = header.match(new RegExp(`(\\bpackage\\s+)(${escapeRegExp(target.name)})\\b`));
|
|
108
|
+
if (!match || match.index === undefined) {
|
|
109
|
+
return { success: false, filePaths: [], error: `Could not find the declared name of "${qualifiedName}".` };
|
|
110
|
+
}
|
|
111
|
+
const nameStart = target.start + match.index + match[1].length;
|
|
112
|
+
const updated = source.slice(0, nameStart) + name + source.slice(nameStart + target.name.length);
|
|
113
|
+
const committed = await commitSource(absolute, file, updated);
|
|
114
|
+
if (!committed.success)
|
|
115
|
+
return { success: false, filePaths: [], error: committed.error };
|
|
116
|
+
return {
|
|
117
|
+
success: true, filePaths: [file], qualifiedName: renamed,
|
|
118
|
+
warnings: [{ code: 'package-edit-is-text-only', message: PACKAGE_EDIT_IS_TEXT_ONLY }],
|
|
119
|
+
};
|
|
120
|
+
}
|
|
121
|
+
/**
|
|
122
|
+
* Re-parent a package: move its whole declaration under another package.
|
|
123
|
+
*
|
|
124
|
+
* The declaration is moved verbatim, so everything it declares moves with it —
|
|
125
|
+
* which is what makes this one operation rather than a move per member. Moving
|
|
126
|
+
* a package into itself or into its own descendant is refused: the result would
|
|
127
|
+
* be a namespace that contains the thing containing it.
|
|
128
|
+
*/
|
|
129
|
+
export async function movePackage(cwd, request) {
|
|
130
|
+
const { file, qualifiedName, targetParent, targetFile } = request;
|
|
131
|
+
if (targetParent === qualifiedName || targetParent?.startsWith(`${qualifiedName}::`)) {
|
|
132
|
+
return {
|
|
133
|
+
success: false, filePaths: [],
|
|
134
|
+
error: `"${qualifiedName}" cannot be moved into itself or into a package it declares.`,
|
|
135
|
+
};
|
|
136
|
+
}
|
|
137
|
+
if (targetParent === parentOf(qualifiedName))
|
|
138
|
+
return { success: true, filePaths: [], qualifiedName };
|
|
139
|
+
const absolute = resolve(cwd, file);
|
|
140
|
+
const targetAbsolute = resolve(cwd, targetFile);
|
|
141
|
+
if (!existsSync(absolute))
|
|
142
|
+
return { success: false, filePaths: [], error: `${file} does not exist.` };
|
|
143
|
+
if (!existsSync(targetAbsolute))
|
|
144
|
+
return { success: false, filePaths: [], error: `${targetFile} does not exist.` };
|
|
145
|
+
const source = readFileSync(absolute, 'utf8');
|
|
146
|
+
const target = (await locatePackages(source)).find(pkg => pkg.qualifiedName === qualifiedName);
|
|
147
|
+
if (!target) {
|
|
148
|
+
return { success: false, filePaths: [], error: `${file} does not declare package "${qualifiedName}".` };
|
|
149
|
+
}
|
|
150
|
+
const moved = `${target.name.split('::').pop()}`;
|
|
151
|
+
const renamed = targetParent ? `${targetParent}::${moved}` : moved;
|
|
152
|
+
const declaration = dedent(source.slice(target.start, target.end).replace(/\s+$/, ''));
|
|
153
|
+
const withoutPackage = removeLine(source, target.start, target.end);
|
|
154
|
+
const sameFile = absolute === targetAbsolute;
|
|
155
|
+
const targetSource = sameFile ? withoutPackage : readFileSync(targetAbsolute, 'utf8');
|
|
156
|
+
let updatedTarget;
|
|
157
|
+
if (targetParent) {
|
|
158
|
+
const parent = (await locatePackages(targetSource)).find(pkg => pkg.qualifiedName === targetParent);
|
|
159
|
+
if (!parent) {
|
|
160
|
+
return { success: false, filePaths: [], error: `${targetFile} does not declare package "${targetParent}".` };
|
|
161
|
+
}
|
|
162
|
+
updatedTarget = insertIntoBody(targetSource, parent, `${declaration}\n`);
|
|
163
|
+
}
|
|
164
|
+
else {
|
|
165
|
+
const separator = targetSource.endsWith('\n') ? '' : '\n';
|
|
166
|
+
updatedTarget = `${targetSource}${separator}${declaration}\n`;
|
|
167
|
+
}
|
|
168
|
+
const warnings = [{ code: 'package-edit-is-text-only', message: PACKAGE_EDIT_IS_TEXT_ONLY }];
|
|
169
|
+
if (sameFile) {
|
|
170
|
+
const committed = await commitSource(absolute, file, updatedTarget);
|
|
171
|
+
if (!committed.success)
|
|
172
|
+
return { success: false, filePaths: [], error: committed.error };
|
|
173
|
+
return { success: true, filePaths: [file], qualifiedName: renamed, warnings };
|
|
174
|
+
}
|
|
175
|
+
const committedTarget = await commitSource(targetAbsolute, targetFile, updatedTarget);
|
|
176
|
+
if (!committedTarget.success)
|
|
177
|
+
return { success: false, filePaths: [], error: committedTarget.error };
|
|
178
|
+
const committedSource = await commitSource(absolute, file, withoutPackage);
|
|
179
|
+
if (!committedSource.success) {
|
|
180
|
+
return {
|
|
181
|
+
success: false, filePaths: [targetFile],
|
|
182
|
+
error: `${committedSource.error} "${qualifiedName}" is now declared in both ${file} and ${targetFile}; `
|
|
183
|
+
+ 'remove the one you do not want.',
|
|
184
|
+
};
|
|
185
|
+
}
|
|
186
|
+
return { success: true, filePaths: [targetFile, file], qualifiedName: renamed, warnings };
|
|
187
|
+
}
|
|
188
|
+
/**
|
|
189
|
+
* Remove a package declaration, keeping everything it declares.
|
|
190
|
+
*
|
|
191
|
+
* The members are lifted into the enclosing scope rather than deleted: emptying
|
|
192
|
+
* a container is a containment change, and silently deleting a subtree of the
|
|
193
|
+
* model because someone removed a folder would be the most expensive possible
|
|
194
|
+
* reading of that gesture.
|
|
195
|
+
*/
|
|
196
|
+
export async function deletePackage(cwd, request) {
|
|
197
|
+
const { file, qualifiedName } = request;
|
|
198
|
+
const absolute = resolve(cwd, file);
|
|
199
|
+
if (!existsSync(absolute))
|
|
200
|
+
return { success: false, filePaths: [], error: `${file} does not exist.` };
|
|
201
|
+
const source = readFileSync(absolute, 'utf8');
|
|
202
|
+
const target = (await locatePackages(source)).find(pkg => pkg.qualifiedName === qualifiedName);
|
|
203
|
+
if (!target) {
|
|
204
|
+
return { success: false, filePaths: [], error: `${file} does not declare package "${qualifiedName}".` };
|
|
205
|
+
}
|
|
206
|
+
if (!parentOf(qualifiedName)) {
|
|
207
|
+
return {
|
|
208
|
+
success: false, filePaths: [],
|
|
209
|
+
error: `"${qualifiedName}" is a top-level package; removing it would leave its members with no `
|
|
210
|
+
+ 'namespace. Move or delete its contents first.',
|
|
211
|
+
};
|
|
212
|
+
}
|
|
213
|
+
const body = source.slice(target.bodyStart, target.bodyEnd);
|
|
214
|
+
const lifted = dedent(body.replace(/^\n/, '').replace(/\s+$/, ''));
|
|
215
|
+
const updated = lifted
|
|
216
|
+
? spliceIndented(source, target.start, target.end, lifted)
|
|
217
|
+
: removeLine(source, target.start, target.end);
|
|
218
|
+
const committed = await commitSource(absolute, file, updated);
|
|
219
|
+
if (!committed.success)
|
|
220
|
+
return { success: false, filePaths: [], error: committed.error };
|
|
221
|
+
return {
|
|
222
|
+
success: true, filePaths: [file], qualifiedName,
|
|
223
|
+
...(lifted ? { warnings: [{ code: 'package-edit-is-text-only', message: PACKAGE_EDIT_IS_TEXT_ONLY }] } : {}),
|
|
224
|
+
};
|
|
225
|
+
}
|
|
226
|
+
/**
|
|
227
|
+
* Move one element's declaration into another package.
|
|
228
|
+
*
|
|
229
|
+
* The declaration text is moved verbatim — this is a containment change, not a
|
|
230
|
+
* rewrite, so nothing the user authored inside the declaration is regenerated.
|
|
231
|
+
* The element is addressed by IR identity, exactly as an update is, so a move
|
|
232
|
+
* made against a stale revision fails loudly instead of cutting whatever now
|
|
233
|
+
* occupies that position.
|
|
234
|
+
*/
|
|
235
|
+
export async function moveElementToPackage(cwd, request, index) {
|
|
236
|
+
const { elementId, irIdentity, sourceFile, targetFile, targetPackage } = request;
|
|
237
|
+
const sourceAbsolute = resolve(cwd, sourceFile);
|
|
238
|
+
const targetAbsolute = resolve(cwd, targetFile);
|
|
239
|
+
if (!existsSync(sourceAbsolute))
|
|
240
|
+
return { success: false, filePaths: [], error: `${sourceFile} does not exist.` };
|
|
241
|
+
if (!existsSync(targetAbsolute))
|
|
242
|
+
return { success: false, filePaths: [], error: `${targetFile} does not exist.` };
|
|
243
|
+
const source = readFileSync(sourceAbsolute, 'utf8');
|
|
244
|
+
let located;
|
|
245
|
+
try {
|
|
246
|
+
located = await locateByIdentity(source, index, irIdentity, elementId);
|
|
247
|
+
}
|
|
248
|
+
catch (e) {
|
|
249
|
+
if (e instanceof StaleIrIdentityError)
|
|
250
|
+
return { success: false, filePaths: [], stale: true, error: e.message };
|
|
251
|
+
return { success: false, filePaths: [], error: String(e) };
|
|
252
|
+
}
|
|
253
|
+
const declaration = dedent(source.slice(located.start, located.end).replace(/\s+$/, ''));
|
|
254
|
+
const withoutElement = removeLine(source, located.start, located.end);
|
|
255
|
+
// A move within one file is one edit to one string. Splitting it into a
|
|
256
|
+
// remove and an insert against the original offsets would place the second
|
|
257
|
+
// splice using positions the first one invalidated.
|
|
258
|
+
const sameFile = sourceAbsolute === targetAbsolute;
|
|
259
|
+
const targetSource = sameFile ? withoutElement : readFileSync(targetAbsolute, 'utf8');
|
|
260
|
+
let updatedTarget;
|
|
261
|
+
if (targetPackage) {
|
|
262
|
+
const target = (await locatePackages(targetSource)).find(pkg => pkg.qualifiedName === targetPackage);
|
|
263
|
+
if (!target) {
|
|
264
|
+
return { success: false, filePaths: [], error: `${targetFile} does not declare package "${targetPackage}".` };
|
|
265
|
+
}
|
|
266
|
+
updatedTarget = insertIntoBody(targetSource, target, `${declaration}\n`);
|
|
267
|
+
}
|
|
268
|
+
else {
|
|
269
|
+
const separator = targetSource.endsWith('\n') ? '' : '\n';
|
|
270
|
+
updatedTarget = `${targetSource}${separator}${declaration}\n`;
|
|
271
|
+
}
|
|
272
|
+
if (sameFile) {
|
|
273
|
+
const committed = await commitSource(targetAbsolute, targetFile, updatedTarget);
|
|
274
|
+
if (!committed.success)
|
|
275
|
+
return { success: false, filePaths: [], error: committed.error };
|
|
276
|
+
return { success: true, filePaths: [targetFile], qualifiedName: targetPackage };
|
|
277
|
+
}
|
|
278
|
+
// Across files, the destination is written first: if it fails, the source
|
|
279
|
+
// file still holds the only copy of the declaration. The reverse order can
|
|
280
|
+
// lose it outright.
|
|
281
|
+
const committedTarget = await commitSource(targetAbsolute, targetFile, updatedTarget);
|
|
282
|
+
if (!committedTarget.success)
|
|
283
|
+
return { success: false, filePaths: [], error: committedTarget.error };
|
|
284
|
+
const committedSource = await commitSource(sourceAbsolute, sourceFile, withoutElement);
|
|
285
|
+
if (!committedSource.success) {
|
|
286
|
+
return {
|
|
287
|
+
success: false, filePaths: [targetFile],
|
|
288
|
+
error: `${committedSource.error} "${elementId}" is now declared in both ${sourceFile} and ${targetFile}; `
|
|
289
|
+
+ 'remove the one you do not want.',
|
|
290
|
+
};
|
|
291
|
+
}
|
|
292
|
+
return { success: true, filePaths: [targetFile, sourceFile], qualifiedName: targetPackage };
|
|
293
|
+
}
|
|
294
|
+
// ─── Source location ─────────────────────────────────────────────────────────
|
|
295
|
+
/** Source range of the declaration an IR identity names, in this file's text. */
|
|
296
|
+
async function locateByIdentity(source, index, identityId, elementId) {
|
|
297
|
+
const record = requireIrIdentity(index, identityId, elementId);
|
|
298
|
+
const { document, errors } = await parseText(source);
|
|
299
|
+
if (errors.length > 0) {
|
|
300
|
+
throw new StaleIrIdentityError(identityId, `its file no longer parses (${errors[0].message})`);
|
|
301
|
+
}
|
|
302
|
+
const node = resolveDeclarationByIdentity(document.parseResult.value, record.identity);
|
|
303
|
+
const cst = node.$cstNode;
|
|
304
|
+
if (!cst)
|
|
305
|
+
throw new StaleIrIdentityError(identityId, 'the resolved declaration has no source range');
|
|
306
|
+
return { start: cst.offset, end: cst.offset + cst.length };
|
|
307
|
+
}
|
|
308
|
+
// ─── Text editing ────────────────────────────────────────────────────────────
|
|
309
|
+
/** Qualified name of the declaring package, or undefined at the top level. */
|
|
310
|
+
function parentOf(qualifiedName) {
|
|
311
|
+
const separator = qualifiedName.lastIndexOf('::');
|
|
312
|
+
return separator === -1 ? undefined : qualifiedName.slice(0, separator);
|
|
313
|
+
}
|
|
314
|
+
function escapeRegExp(value) {
|
|
315
|
+
return value.replace(/[.*+?^${}()|[\]\\]/g, '\\$&');
|
|
316
|
+
}
|
|
317
|
+
//# sourceMappingURL=package-writer.js.map
|
|
@@ -0,0 +1 @@
|
|
|
1
|
+
{"version":3,"file":"package-writer.js","sourceRoot":"","sources":["../../src/server/package-writer.ts"],"names":[],"mappings":"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"}
|
|
@@ -11,6 +11,15 @@ export interface ElementWriteRequest {
|
|
|
11
11
|
attributes?: Record<string, string>;
|
|
12
12
|
/** Project-relative source file. */
|
|
13
13
|
file?: string;
|
|
14
|
+
/**
|
|
15
|
+
* Qualified name of the package that should declare this element.
|
|
16
|
+
*
|
|
17
|
+
* Creation only — a package change on an existing declaration is a move,
|
|
18
|
+
* which is ./package-writer.ts's job because it has to cut the declaration
|
|
19
|
+
* out of where it currently is. Absent means the file's last package, which
|
|
20
|
+
* is what a request that does not care about placement gets.
|
|
21
|
+
*/
|
|
22
|
+
package?: string;
|
|
14
23
|
/**
|
|
15
24
|
* IR identity of the declaration being edited.
|
|
16
25
|
*
|
|
@@ -64,4 +73,15 @@ export declare const RENAME_IS_TEXT_ONLY: string;
|
|
|
64
73
|
* degraded to a name match.
|
|
65
74
|
*/
|
|
66
75
|
export declare function saveElementToFile(cwd: string, element: ElementWriteRequest, index?: IrIdentityIndex): Promise<ElementWriteResult>;
|
|
76
|
+
/**
|
|
77
|
+
* Parse-before-commit, then write atomically.
|
|
78
|
+
*
|
|
79
|
+
* Source that does not parse never reaches disk. The editor model (§1.1) says a
|
|
80
|
+
* *user* may save anything; it does not say a machine-generated splice may
|
|
81
|
+
* corrupt a file the user did not touch.
|
|
82
|
+
*/
|
|
83
|
+
export declare function commitSource(absolutePath: string, relativePath: string, updated: string): Promise<{
|
|
84
|
+
success: boolean;
|
|
85
|
+
error?: string;
|
|
86
|
+
}>;
|
|
67
87
|
//# sourceMappingURL=persistor.d.ts.map
|
|
@@ -1 +1 @@
|
|
|
1
|
-
{"version":3,"file":"persistor.d.ts","sourceRoot":"","sources":["../../src/server/persistor.ts"],"names":[],"mappings":"AA4BA,OAAO,EAIH,KAAK,eAAe,EACvB,MAAM,yBAAyB,CAAC;
|
|
1
|
+
{"version":3,"file":"persistor.d.ts","sourceRoot":"","sources":["../../src/server/persistor.ts"],"names":[],"mappings":"AA4BA,OAAO,EAIH,KAAK,eAAe,EACvB,MAAM,yBAAyB,CAAC;AAGjC,8DAA8D;AAC9D,eAAO,MAAM,oBAAoB,gCAAgC,CAAC;AAElE,MAAM,WAAW,mBAAmB;IAChC,EAAE,EAAE,MAAM,CAAC;IACX,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,IAAI,CAAC,EAAE,MAAM,CAAC;IACd,SAAS,CAAC,EAAE,MAAM,CAAC;IACnB,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,GAAG,CAAC,EAAE,MAAM,CAAC;IACb,UAAU,CAAC,EAAE,MAAM,CAAC,MAAM,EAAE,MAAM,CAAC,CAAC;IACpC,oCAAoC;IACpC,IAAI,CAAC,EAAE,MAAM,CAAC;IACd;;;;;;;OAOG;IACH,OAAO,CAAC,EAAE,MAAM,CAAC;IACjB;;;;;OAKG;IACH,UAAU,CAAC,EAAE,MAAM,CAAC;IACpB;;;;;;;;OAQG;IACH,WAAW,CAAC,EAAE,MAAM,CAAC;CACxB;AAED,mDAAmD;AACnD,MAAM,WAAW,mBAAmB;IAChC,IAAI,EAAE,qBAAqB,CAAC;IAC5B,OAAO,EAAE,MAAM,CAAC;CACnB;AAED,MAAM,WAAW,kBAAkB;IAC/B,OAAO,EAAE,OAAO,CAAC;IACjB,QAAQ,EAAE,MAAM,CAAC;IACjB,mEAAmE;IACnE,QAAQ,CAAC,EAAE,OAAO,CAAC;IACnB,QAAQ,CAAC,EAAE,mBAAmB,EAAE,CAAC;IACjC,KAAK,CAAC,EAAE,MAAM,CAAC;IACf,wEAAwE;IACxE,KAAK,CAAC,EAAE,OAAO,CAAC;CACnB;AAED;;;;;;;;;GASG;AACH,eAAO,MAAM,mBAAmB,QAGI,CAAC;AAErC;;;;;;;GAOG;AACH,wBAAsB,iBAAiB,CACnC,GAAG,EAAE,MAAM,EACX,OAAO,EAAE,mBAAmB,EAC5B,KAAK,CAAC,EAAE,eAAe,GACxB,OAAO,CAAC,kBAAkB,CAAC,CAyE7B;AAED;;;;;;GAMG;AACH,wBAAsB,YAAY,CAC9B,YAAY,EAAE,MAAM,EAAE,YAAY,EAAE,MAAM,EAAE,OAAO,EAAE,MAAM,GAC5D,OAAO,CAAC;IAAE,OAAO,EAAE,OAAO,CAAC;IAAC,KAAK,CAAC,EAAE,MAAM,CAAA;CAAE,CAAC,CAc/C"}
|