From 06c6afc4f8535698b90c7f9c271e65075ea02600 Mon Sep 17 00:00:00 2001 From: Peter van Vliet Date: Thu, 16 Jan 2025 15:51:08 +0100 Subject: [PATCH] #602: final implementation --- packages/build/src/source/segment/Reader.ts | 41 +++++++++---------- .../build/src/source/segment/models/Module.ts | 6 ++- .../src/source/segment/models/Segment.ts | 5 +++ packages/build/src/target/module/Builder.ts | 9 ++-- packages/build/src/target/segment/Builder.ts | 6 ++- 5 files changed, 40 insertions(+), 27 deletions(-) diff --git a/packages/build/src/source/segment/Reader.ts b/packages/build/src/source/segment/Reader.ts index 729ac3fc..aaee04e7 100644 --- a/packages/build/src/source/segment/Reader.ts +++ b/packages/build/src/source/segment/Reader.ts @@ -103,36 +103,22 @@ export default class SegmentReader { for (const [filename, moduleImports] of Object.entries(definition)) { - this.#createModule(segment, filename, moduleImports); + this.#createModule(segment, filename, moduleImports, true); } } - #createModule(segment: Segment, filename: string, moduleImports: Imports): Module + #createModule(segment: Segment, filename: string, moduleImports: Imports, segmented: boolean): void { const moduleFilename = this.#makeModuleFilename(filename); const location = this.#fileHelper.extractPath(moduleFilename); const module = segment.hasModule(moduleFilename) ? segment.getModule(moduleFilename) as Module - : new Module(moduleFilename, location, {}); + : new Module(moduleFilename, location, {}, segmented); module.addImports(moduleImports); segment.setModule(module); - - return module; - } - - #createProcedure(segment: Segment, module: Module, implementation: Implementation): void - { - const procedure = segment.hasProcedure(implementation.fqn) - ? segment.getProcedure(implementation.fqn) as Procedure - : new Procedure(implementation.fqn); - - procedure.addImplementation(implementation); - - module.addMember(implementation); - segment.setProcedure(procedure); } #makeModuleFilename(filename: string): string @@ -171,16 +157,13 @@ export default class SegmentReader this.#createMember(segment, module, model, properties); - trace.shift(); + trace.shift(); // Remove the first entry, as it is the module itself. for (const entry of trace) { const entryImport = { [entry.importKey]: { access: properties.access } }; - const entryProperties = { ...properties, importKey: entry.importKey }; - - const module = this.#createModule(segment, entry.filename, entryImport); - this.#createMember(segment, module, model, entryProperties); + this.#createModule(segment, entry.filename, entryImport, false); } } @@ -247,6 +230,7 @@ export default class SegmentReader const clazz = new Class(properties.id, properties.importKey, properties.fqn, model); module.addMember(clazz); + segment.setClass(clazz); } @@ -261,4 +245,17 @@ export default class SegmentReader this.#createProcedure(segment, module, implementation); } + + #createProcedure(segment: Segment, module: Module, implementation: Implementation): void + { + const procedure = segment.hasProcedure(implementation.fqn) + ? segment.getProcedure(implementation.fqn) as Procedure + : new Procedure(implementation.fqn); + + procedure.addImplementation(implementation); + + module.addMember(implementation); + + segment.setProcedure(procedure); + } } diff --git a/packages/build/src/source/segment/models/Module.ts b/packages/build/src/source/segment/models/Module.ts index 178db486..9d690f53 100644 --- a/packages/build/src/source/segment/models/Module.ts +++ b/packages/build/src/source/segment/models/Module.ts @@ -11,12 +11,14 @@ export default class Module readonly #location: string; readonly #imports: Imports; readonly #members: Member[] = []; + readonly #segmented: boolean; - constructor(filename: string, location: string, imports: Imports) + constructor(filename: string, location: string, imports: Imports, segmented: boolean) { this.#filename = filename; this.#location = location; this.#imports = imports; + this.#segmented = segmented; } get filename() { return this.#filename; } @@ -26,6 +28,8 @@ export default class Module get imports() { return this.#imports; } get members() { return this.#members; } + + get segmented() { return this.#segmented; } hasClasses(): boolean { diff --git a/packages/build/src/source/segment/models/Segment.ts b/packages/build/src/source/segment/models/Segment.ts index 5b34e970..99e0be01 100644 --- a/packages/build/src/source/segment/models/Segment.ts +++ b/packages/build/src/source/segment/models/Segment.ts @@ -33,6 +33,11 @@ export default class Segment return this.#modules.get(filename); } + getSegmentedModules(): Module[] + { + return this.modules.filter(module => module.segmented); + } + setModule(module: Module): void { this.#modules.set(module.filename, module); diff --git a/packages/build/src/target/module/Builder.ts b/packages/build/src/target/module/Builder.ts index 1e782b86..32aca03d 100644 --- a/packages/build/src/target/module/Builder.ts +++ b/packages/build/src/target/module/Builder.ts @@ -33,15 +33,14 @@ export default class Builder async #buildModule(module: Module, resources: ResourcesList, segmentation: Segmentation): Promise { - await this.#buildCommonModule(module, resources, segmentation); - const moduleSegments = segmentation.getSegments(module.filename); if (moduleSegments.length === 0) { // For unsegmented modules we only need to build the common module. + // This will overwrite the original module file. - return; + return this.#buildCommonModule(module, resources, segmentation); } const segmentBuilds = moduleSegments.map(segment => this.#buildSegmentModule(module, resources, segment, segmentation)); @@ -54,6 +53,10 @@ export default class Builder : Promise.resolve(); await Promise.all([...segmentBuilds, remoteBuild]); + + // The segment files will replace the original module file, so we can delete it. + + this.#targetFileManager.delete(module.filename); } async #buildCommonModule(module: Module, resources: ResourcesList, segmentation: Segmentation): Promise diff --git a/packages/build/src/target/segment/Builder.ts b/packages/build/src/target/segment/Builder.ts index e90a5fa1..970e926a 100644 --- a/packages/build/src/target/segment/Builder.ts +++ b/packages/build/src/target/segment/Builder.ts @@ -64,7 +64,11 @@ export default class Builder { const imports = []; - for (const module of segment.modules) + // We only want to include modules that are defined in the segment configuration. + // The other modules contain classes and procedures that are re-exported by at least one segmented module. + // Adding them would cause a duplicate declaration error. + + for (const module of segment.getSegmentedModules()) { const filename = this.#fileHelper.addSubExtension(module.filename, segment.name); const members = this.#createModuleImportMembers(module);