diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/build.gradle.kts b/prometeu-compiler/frontends/prometeu-frontend-pbs/build.gradle.kts index 7b46f191..8b52aea5 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/build.gradle.kts +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/build.gradle.kts @@ -5,5 +5,6 @@ plugins { dependencies { implementation(project(":prometeu-infra")) + implementation(project(":prometeu-compiler:prometeu-frontend-api")) implementation(project(":prometeu-compiler:prometeu-compiler-core")) } \ No newline at end of file diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/services/PBSFrontendPhaseService.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/services/PBSFrontendPhaseService.java new file mode 100644 index 00000000..2ab05f6e --- /dev/null +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/services/PBSFrontendPhaseService.java @@ -0,0 +1,25 @@ +package p.studio.compiler.services; + +import lombok.extern.slf4j.Slf4j; +import p.studio.compiler.messages.BuildingIssueSink; +import p.studio.compiler.messages.FrontendPhaseContext; +import p.studio.compiler.models.IRBackend; +import p.studio.utilities.logs.LogAggregator; + +@Slf4j +public class PBSFrontendPhaseService implements FrontendPhaseService { + @Override + public IRBackend compile(final FrontendPhaseContext ctx, final LogAggregator logs, final BuildingIssueSink issues) { + for (final var pId : ctx.stack.reverseTopologicalOrder) { + for (final var fId : ctx.fileTable.getFiles(pId)) { + final var sourceHandle = ctx.fileTable.get(fId); + sourceHandle.readUtf8().ifPresentOrElse( + utf8Content -> logs.using(log).info("File content: %s".formatted(utf8Content)), + () -> issues.report(builder -> builder + .error(true) + .message("Failed to read file content: %s".formatted(sourceHandle.toString())))); + } + } + return new IRBackend(); + } +} diff --git a/prometeu-compiler/prometeu-build-pipeline/build.gradle.kts b/prometeu-compiler/prometeu-build-pipeline/build.gradle.kts index e723a039..393bd0e4 100644 --- a/prometeu-compiler/prometeu-build-pipeline/build.gradle.kts +++ b/prometeu-compiler/prometeu-build-pipeline/build.gradle.kts @@ -6,4 +6,6 @@ dependencies { api(project(":prometeu-infra")) implementation(project(":prometeu-compiler:prometeu-deps")) implementation(project(":prometeu-compiler:prometeu-compiler-core")) + implementation(project(":prometeu-compiler:prometeu-frontend-api")) + implementation(project(":prometeu-compiler:prometeu-frontend-registry")) } \ No newline at end of file diff --git a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/models/BuilderPipelineContext.java b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/models/BuilderPipelineContext.java index 28f3b04a..b9ebc302 100644 --- a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/models/BuilderPipelineContext.java +++ b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/models/BuilderPipelineContext.java @@ -14,6 +14,7 @@ public class BuilderPipelineContext { public ResolvedWorkspace resolvedWorkspace; public FileTable fileTable; + public IRBackend irBackend; private BuilderPipelineContext( final BuilderPipelineConfig config, diff --git a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/FrontendPhasePipelineStage.java b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/FrontendPhasePipelineStage.java index 2836ba70..2a1d5303 100644 --- a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/FrontendPhasePipelineStage.java +++ b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/FrontendPhasePipelineStage.java @@ -1,7 +1,9 @@ package p.studio.compiler.workspaces.stages; import lombok.extern.slf4j.Slf4j; +import p.studio.compiler.FrontendRegistryService; import p.studio.compiler.messages.BuildingIssueSink; +import p.studio.compiler.messages.FrontendPhaseContext; import p.studio.compiler.models.BuilderPipelineContext; import p.studio.compiler.workspaces.PipelineStage; import p.studio.utilities.logs.LogAggregator; @@ -9,7 +11,20 @@ import p.studio.utilities.logs.LogAggregator; @Slf4j public class FrontendPhasePipelineStage implements PipelineStage { @Override - public BuildingIssueSink run(BuilderPipelineContext ctx, LogAggregator logs) { - return BuildingIssueSink.empty(); + public BuildingIssueSink run(final BuilderPipelineContext ctx, final LogAggregator logs) { + final var frontedSpec = ctx.resolvedWorkspace.frontendSpec(); + final var service = FrontendRegistryService.getFrontendPhaseService(frontedSpec.getLanguageId()); + if (service.isEmpty()) { + return BuildingIssueSink.empty() + .report(builder -> builder + .error(true) + .message("[BUILD]: unable to find a service for frontend phase: " + frontedSpec.getLanguageId())); + } + final var projectTable = ctx.resolvedWorkspace.graph().projectTable(); + final var fileTable = ctx.fileTable; + final var frontendPhaseContext = new FrontendPhaseContext(projectTable, fileTable, ctx.resolvedWorkspace.stack()); + final var issues = BuildingIssueSink.empty(); + ctx.irBackend = service.get().compile(frontendPhaseContext, logs, issues); + return issues; } } diff --git a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/LoadSourcesPipelineStage.java b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/LoadSourcesPipelineStage.java index b5583fac..b2c7e197 100644 --- a/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/LoadSourcesPipelineStage.java +++ b/prometeu-compiler/prometeu-build-pipeline/src/main/java/p/studio/compiler/workspaces/stages/LoadSourcesPipelineStage.java @@ -82,7 +82,6 @@ public class LoadSourcesPipelineStage implements PipelineStage { // register in dense tables final var relativePath = pd.getRootPath().relativize(canonPath); final var sourceHandle = new SourceHandle(pId, relativePath, canonPath, size, lastModified, ctx.sourceProviderFactory); - logs.using(log).debug("Registering: " + sourceHandle); ctx.fileTable.register(sourceHandle); } } diff --git a/prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/models/BuildStack.java b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/models/BuildStack.java similarity index 100% rename from prometeu-compiler/prometeu-deps/src/main/java/p/studio/compiler/models/BuildStack.java rename to prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/models/BuildStack.java diff --git a/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/models/SourceHandle.java b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/models/SourceHandle.java index 61efe3c2..c11b7796 100644 --- a/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/models/SourceHandle.java +++ b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/models/SourceHandle.java @@ -12,6 +12,7 @@ import java.nio.file.Path; import java.time.Instant; import java.time.LocalDateTime; import java.time.ZoneId; +import java.util.Optional; @EqualsAndHashCode(onlyExplicitlyIncluded = true) public class SourceHandle { @@ -46,12 +47,16 @@ public class SourceHandle { this.provider = factory.create(canonPath); } - public byte[] readBytes() throws IOException { - return provider.read(); + public Optional readBytes() { + try { + return Optional.ofNullable(provider.read()); + } catch (IOException e) { + return Optional.empty(); + } } - public String readUtf8() throws IOException { - return new String(readBytes(), StandardCharsets.UTF_8); + public Optional readUtf8() { + return readBytes().map(bytes -> new String(bytes, StandardCharsets.UTF_8)); } @Override diff --git a/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/messages/FrontendPhaseContext.java b/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/messages/FrontendPhaseContext.java new file mode 100644 index 00000000..b98eab17 --- /dev/null +++ b/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/messages/FrontendPhaseContext.java @@ -0,0 +1,20 @@ +package p.studio.compiler.messages; + +import p.studio.compiler.models.BuildStack; +import p.studio.compiler.source.tables.FileTableReader; +import p.studio.compiler.source.tables.ProjectTableReader; + +public class FrontendPhaseContext { + public final ProjectTableReader projectTable; + public final FileTableReader fileTable; + public final BuildStack stack; + + public FrontendPhaseContext( + final ProjectTableReader projectTable, + final FileTableReader fileTable, + final BuildStack stack) { + this.projectTable = projectTable; + this.fileTable = fileTable; + this.stack = stack; + } +} diff --git a/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/messages/FrontendPhaseRequest.java b/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/messages/FrontendPhaseRequest.java deleted file mode 100644 index 47397c1b..00000000 --- a/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/messages/FrontendPhaseRequest.java +++ /dev/null @@ -1,9 +0,0 @@ -package p.studio.compiler.messages; - -import p.studio.compiler.source.tables.FileTableReader; -import p.studio.compiler.source.tables.ProjectTableReader; - -public record FrontendPhaseRequest( - ProjectTableReader projectTable, - FileTableReader fileTable) { -} diff --git a/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRBackend.java b/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRBackend.java new file mode 100644 index 00000000..599c0362 --- /dev/null +++ b/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/models/IRBackend.java @@ -0,0 +1,4 @@ +package p.studio.compiler.models; + +public class IRBackend { +} diff --git a/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/services/FrontendPhaseService.java b/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/services/FrontendPhaseService.java new file mode 100644 index 00000000..88943f3a --- /dev/null +++ b/prometeu-compiler/prometeu-frontend-api/src/main/java/p/studio/compiler/services/FrontendPhaseService.java @@ -0,0 +1,10 @@ +package p.studio.compiler.services; + +import p.studio.compiler.messages.BuildingIssueSink; +import p.studio.compiler.messages.FrontendPhaseContext; +import p.studio.compiler.models.IRBackend; +import p.studio.utilities.logs.LogAggregator; + +public interface FrontendPhaseService { + IRBackend compile(FrontendPhaseContext request, LogAggregator logs, BuildingIssueSink empty); +} diff --git a/prometeu-compiler/prometeu-frontend-registry/build.gradle.kts b/prometeu-compiler/prometeu-frontend-registry/build.gradle.kts index f4af920a..7eff67cf 100644 --- a/prometeu-compiler/prometeu-frontend-registry/build.gradle.kts +++ b/prometeu-compiler/prometeu-frontend-registry/build.gradle.kts @@ -6,5 +6,7 @@ dependencies { implementation(project(":prometeu-infra")) implementation(project(":prometeu-compiler:prometeu-compiler-core")) + implementation(project(":prometeu-compiler:prometeu-frontend-api")) + implementation(project(":prometeu-compiler:frontends:prometeu-frontend-pbs")) } \ No newline at end of file diff --git a/prometeu-compiler/prometeu-frontend-registry/src/main/java/p/studio/compiler/FrontendRegistryService.java b/prometeu-compiler/prometeu-frontend-registry/src/main/java/p/studio/compiler/FrontendRegistryService.java index 513e99c4..ee926f91 100644 --- a/prometeu-compiler/prometeu-frontend-registry/src/main/java/p/studio/compiler/FrontendRegistryService.java +++ b/prometeu-compiler/prometeu-frontend-registry/src/main/java/p/studio/compiler/FrontendRegistryService.java @@ -1,31 +1,31 @@ package p.studio.compiler; import p.studio.compiler.models.FrontendSpec; +import p.studio.compiler.services.FrontendPhaseService; +import p.studio.compiler.services.PBSFrontendPhaseService; import java.util.HashMap; import java.util.Map; import java.util.Optional; public class FrontendRegistryService { - private static final FrontendSpec[] FRONTEND_SPECS = { - PBSDefinitions.PBS, - }; - - private static final Map FRONTENDS = new HashMap<>(); + private static final Map FRONTEND_SPECS = new HashMap<>(); + private static final Map FRONTEND_PHASE_SERVICES = new HashMap<>(); static { - for (final var frontendSpec : FRONTEND_SPECS) { - FRONTENDS.put(frontendSpec.getLanguageId(), frontendSpec); - } - if (FRONTENDS.size() != FRONTEND_SPECS.length) - throw new IllegalStateException("Duplicate frontend specs found"); + FRONTEND_SPECS.put(PBSDefinitions.PBS.getLanguageId(), PBSDefinitions.PBS); + FRONTEND_PHASE_SERVICES.put(PBSDefinitions.PBS.getLanguageId(), new PBSFrontendPhaseService()); } public static FrontendSpec getDefaultFrontendSpec() { - return FRONTENDS.get(PBSDefinitions.PBS.getLanguageId()); + return FRONTEND_SPECS.get(PBSDefinitions.PBS.getLanguageId()); } public static Optional getFrontendSpec(final String languageId) { - return Optional.ofNullable(FRONTENDS.get(languageId)); + return Optional.ofNullable(FRONTEND_SPECS.get(languageId)); + } + + public static Optional getFrontendPhaseService(final String languageId) { + return Optional.ofNullable(FRONTEND_PHASE_SERVICES.get(languageId)); } } \ No newline at end of file diff --git a/test-projects/main/src/module-a/mod.barrel b/test-projects/main/src/module-a/mod.barrel index e69de29b..eaed690d 100644 --- a/test-projects/main/src/module-a/mod.barrel +++ b/test-projects/main/src/module-a/mod.barrel @@ -0,0 +1 @@ +module-a.barrel: content \ No newline at end of file diff --git a/test-projects/main/src/module-a/source-1.pbs b/test-projects/main/src/module-a/source-1.pbs index e69de29b..fde78521 100644 --- a/test-projects/main/src/module-a/source-1.pbs +++ b/test-projects/main/src/module-a/source-1.pbs @@ -0,0 +1 @@ +source-1.pbs content \ No newline at end of file diff --git a/test-projects/main/src/module-a/source-2.pbs b/test-projects/main/src/module-a/source-2.pbs index e69de29b..0c9c3dc4 100644 --- a/test-projects/main/src/module-a/source-2.pbs +++ b/test-projects/main/src/module-a/source-2.pbs @@ -0,0 +1 @@ +source-2.pbs content \ No newline at end of file diff --git a/test-projects/main/src/module-a/source-3.pbs b/test-projects/main/src/module-a/source-3.pbs index e69de29b..324efdbc 100644 --- a/test-projects/main/src/module-a/source-3.pbs +++ b/test-projects/main/src/module-a/source-3.pbs @@ -0,0 +1 @@ +source-3.pbs content \ No newline at end of file