From 213c6a2f76c4b6659e10728a3a8f0da2a0fb1eef Mon Sep 17 00:00:00 2001 From: bQUARKz Date: Fri, 6 Mar 2026 11:23:34 +0000 Subject: [PATCH] implements PR022 --- .../services/PBSFrontendPhaseService.java | 10 +++- .../services/PBSFrontendPhaseServiceTest.java | 46 ++++++++++++++++++- .../compiler/models/ProjectDescriptor.java | 2 + .../p/studio/compiler/models/SourceKind.java | 7 +++ .../source/tables/ProjectTableReader.java | 4 ++ .../messages/FrontendPhaseContext.java | 6 +++ 6 files changed, 72 insertions(+), 3 deletions(-) create mode 100644 prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/models/SourceKind.java 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 index ad0084c9..92c1de3f 100644 --- 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 @@ -6,6 +6,7 @@ import p.studio.compiler.messages.FrontendPhaseContext; import p.studio.compiler.models.IRBackend; import p.studio.compiler.models.ProjectDescriptor; import p.studio.compiler.models.SourceHandle; +import p.studio.compiler.models.SourceKind; import p.studio.compiler.pbs.PbsFrontendCompiler; import p.studio.compiler.pbs.ast.PbsAst; import p.studio.compiler.pbs.lexer.PbsLexer; @@ -48,6 +49,7 @@ public class PBSFrontendPhaseService implements FrontendPhaseService { for (final var pId : ctx.stack.reverseTopologicalOrder) { final var projectDescriptor = ctx.projectTable.get(pId); + final var projectSourceKind = ctx.sourceKind(pId); final var fileIds = ctx.fileTable.getFiles(pId); for (final var fId : fileIds) { @@ -65,7 +67,7 @@ public class PBSFrontendPhaseService implements FrontendPhaseService { final var parseErrorBaseline = diagnostics.errorCount(); final var ast = parseSourceFile(fId, utf8Content, diagnostics); moduleUnit.sources.add(new PbsModuleVisibilityValidator.SourceFile(fId, ast)); - parsedSourceFiles.add(new ParsedSourceFile(fId, ast, moduleKey)); + parsedSourceFiles.add(new ParsedSourceFile(fId, ast, moduleKey, projectSourceKind)); if (diagnostics.errorCount() > parseErrorBaseline) { failedModuleKeys.add(moduleKey); } @@ -114,6 +116,9 @@ public class PBSFrontendPhaseService implements FrontendPhaseService { continue; } final var irBackendFile = frontendCompiler.compileParsedFile(parsedSource.fileId(), parsedSource.ast(), diagnostics); + if (parsedSource.sourceKind() == SourceKind.SDK_INTERFACE) { + continue; + } irBackendAggregator.merge(irBackendFile); } @@ -197,6 +202,7 @@ public class PBSFrontendPhaseService implements FrontendPhaseService { private record ParsedSourceFile( FileId fileId, PbsAst.File ast, - String moduleKey) { + String moduleKey, + SourceKind sourceKind) { } } diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/services/PBSFrontendPhaseServiceTest.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/services/PBSFrontendPhaseServiceTest.java index c7368dc7..aceab3dd 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/services/PBSFrontendPhaseServiceTest.java +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/test/java/p/studio/compiler/services/PBSFrontendPhaseServiceTest.java @@ -7,8 +7,10 @@ import p.studio.compiler.messages.FrontendPhaseContext; import p.studio.compiler.models.BuildStack; import p.studio.compiler.models.ProjectDescriptor; import p.studio.compiler.models.SourceHandle; +import p.studio.compiler.models.SourceKind; import p.studio.compiler.pbs.linking.PbsLinkErrors; import p.studio.compiler.source.diagnostics.DiagnosticSink; +import p.studio.compiler.source.identifiers.ProjectId; import p.studio.compiler.source.tables.FileTable; import p.studio.compiler.source.tables.ProjectTable; import p.studio.compiler.utilities.SourceProviderFactory; @@ -173,8 +175,49 @@ class PBSFrontendPhaseServiceTest { assertEquals(2, irBackend.getFunctions().size()); } + @Test + void shouldSkipIrLoweringForSourcesMarkedAsSdkInterface() throws IOException { + final var projectRoot = tempDir.resolve("project-sdk-interface"); + final var sourceRoot = projectRoot.resolve("src"); + final var modulePath = sourceRoot.resolve("gfx"); + Files.createDirectories(modulePath); + + final var sourceFile = modulePath.resolve("source.pbs"); + final var modBarrel = modulePath.resolve("mod.barrel"); + Files.writeString(sourceFile, "fn draw() -> int { return 1; }"); + Files.writeString(modBarrel, "pub fn draw() -> int;"); + + final var projectTable = new ProjectTable(); + final var fileTable = new FileTable(1); + final var projectId = projectTable.register(ProjectDescriptor.builder() + .rootPath(projectRoot) + .name("gfx-sdk") + .version("1.0.0") + .sourceRoots(ReadOnlyList.wrap(List.of(sourceRoot))) + .sourceKind(SourceKind.SDK_INTERFACE) + .build()); + + registerFile(projectId, projectRoot, sourceFile, fileTable); + registerFile(projectId, projectRoot, modBarrel, fileTable); + + final var ctx = new FrontendPhaseContext( + projectTable, + fileTable, + new BuildStack(ReadOnlyList.wrap(List.of(projectId)))); + final var diagnostics = DiagnosticSink.empty(); + + final var irBackend = new PBSFrontendPhaseService().compile( + ctx, + diagnostics, + LogAggregator.empty(), + BuildingIssueSink.empty()); + + assertTrue(diagnostics.isEmpty()); + assertEquals(0, irBackend.getFunctions().size()); + } + private void registerFile( - final p.studio.compiler.source.identifiers.ProjectId projectId, + final ProjectId projectId, final Path projectRoot, final Path file, final FileTable fileTable) throws IOException { @@ -187,4 +230,5 @@ class PBSFrontendPhaseServiceTest { attributes.lastModifiedTime().toMillis(), SourceProviderFactory.filesystem())); } + } diff --git a/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/models/ProjectDescriptor.java b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/models/ProjectDescriptor.java index c5c05f84..956000b4 100644 --- a/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/models/ProjectDescriptor.java +++ b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/models/ProjectDescriptor.java @@ -13,4 +13,6 @@ public final class ProjectDescriptor { private final String name; // project name private final String version; // project version private final ReadOnlyList sourceRoots; // source roots canon paths for the project + @Builder.Default + private final SourceKind sourceKind = SourceKind.PROJECT; } diff --git a/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/models/SourceKind.java b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/models/SourceKind.java new file mode 100644 index 00000000..42c486d5 --- /dev/null +++ b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/models/SourceKind.java @@ -0,0 +1,7 @@ +package p.studio.compiler.models; + +public enum SourceKind { + PROJECT, + SDK_INTERFACE +} + diff --git a/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/tables/ProjectTableReader.java b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/tables/ProjectTableReader.java index a8f208b0..b4d4e489 100644 --- a/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/tables/ProjectTableReader.java +++ b/prometeu-compiler/prometeu-compiler-core/src/main/java/p/studio/compiler/source/tables/ProjectTableReader.java @@ -1,6 +1,7 @@ package p.studio.compiler.source.tables; import p.studio.compiler.models.ProjectDescriptor; +import p.studio.compiler.models.SourceKind; import p.studio.compiler.source.identifiers.ProjectId; import java.nio.file.Path; @@ -9,4 +10,7 @@ import java.util.Optional; public interface ProjectTableReader extends DenseTableReader { Optional optional(Path pathCanon); Optional optionalId(Path pathCanon); + default SourceKind sourceKind(final ProjectId projectId) { + return get(projectId).getSourceKind(); + } } 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 index b98eab17..e69617b1 100644 --- 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 @@ -1,6 +1,8 @@ package p.studio.compiler.messages; import p.studio.compiler.models.BuildStack; +import p.studio.compiler.models.SourceKind; +import p.studio.compiler.source.identifiers.ProjectId; import p.studio.compiler.source.tables.FileTableReader; import p.studio.compiler.source.tables.ProjectTableReader; @@ -17,4 +19,8 @@ public class FrontendPhaseContext { this.fileTable = fileTable; this.stack = stack; } + + public SourceKind sourceKind(final ProjectId projectId) { + return projectTable.sourceKind(projectId); + } }