diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/PbsFrontendCompiler.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/PbsFrontendCompiler.java index 3c69cc16..d5f8a0e8 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/PbsFrontendCompiler.java +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/PbsFrontendCompiler.java @@ -20,6 +20,7 @@ import p.studio.compiler.source.tables.CallableSignatureRef; import p.studio.compiler.source.tables.CallableTable; import p.studio.compiler.source.tables.IntrinsicReference; import p.studio.compiler.source.tables.IntrinsicTable; +import p.studio.compiler.source.tables.NameTable; import p.studio.utilities.structures.ReadOnlyList; import java.util.ArrayList; @@ -31,7 +32,6 @@ import java.util.Map; import java.util.Set; public final class PbsFrontendCompiler { - private final PbsDeclarationSemanticsValidator declarationSemanticsValidator = new PbsDeclarationSemanticsValidator(); private final PbsFlowSemanticsValidator flowSemanticsValidator = new PbsFlowSemanticsValidator(); private final PbsReservedMetadataExtractor reservedMetadataExtractor = new PbsReservedMetadataExtractor(); private final PbsHostAdmissionValidator hostAdmissionValidator = new PbsHostAdmissionValidator(); @@ -57,13 +57,14 @@ public final class PbsFrontendCompiler { final DiagnosticSink diagnostics, final SourceKind sourceKind, final HostAdmissionContext hostAdmissionContext) { + final var nameTable = new NameTable(); final var admissionBaseline = diagnostics.errorCount(); final var tokens = PbsLexer.lex(source, fileId, diagnostics); final var parseMode = sourceKind == SourceKind.SDK_INTERFACE ? PbsParser.ParseMode.INTERFACE_MODULE : PbsParser.ParseMode.ORDINARY; final var ast = PbsParser.parse(tokens, fileId, diagnostics, parseMode); - final var irBackendFile = compileParsedFile(fileId, ast, diagnostics, sourceKind, hostAdmissionContext); + final var irBackendFile = compileParsedFile(fileId, ast, diagnostics, sourceKind, "", hostAdmissionContext, nameTable); if (diagnostics.errorCount() > admissionBaseline) { return IRBackendFile.empty(fileId); } @@ -91,7 +92,7 @@ public final class PbsFrontendCompiler { final DiagnosticSink diagnostics, final SourceKind sourceKind, final HostAdmissionContext hostAdmissionContext) { - return compileParsedFile(fileId, ast, diagnostics, sourceKind, "", hostAdmissionContext); + return compileParsedFile(fileId, ast, diagnostics, sourceKind, "", hostAdmissionContext, new NameTable()); } public IRBackendFile compileParsedFile( @@ -101,8 +102,20 @@ public final class PbsFrontendCompiler { final SourceKind sourceKind, final String moduleKey, final HostAdmissionContext hostAdmissionContext) { + return compileParsedFile(fileId, ast, diagnostics, sourceKind, moduleKey, hostAdmissionContext, new NameTable()); + } + + public IRBackendFile compileParsedFile( + final FileId fileId, + final PbsAst.File ast, + final DiagnosticSink diagnostics, + final SourceKind sourceKind, + final String moduleKey, + final HostAdmissionContext hostAdmissionContext, + final NameTable nameTable) { + final var effectiveNameTable = nameTable == null ? new NameTable() : nameTable; final var semanticsErrorBaseline = diagnostics.errorCount(); - declarationSemanticsValidator.validate(ast, sourceKind, diagnostics); + new PbsDeclarationSemanticsValidator(effectiveNameTable).validate(ast, sourceKind, diagnostics); flowSemanticsValidator.validate(ast, diagnostics); if (diagnostics.errorCount() > semanticsErrorBaseline) { return IRBackendFile.empty(fileId); diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/linking/PbsModuleVisibilityValidator.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/linking/PbsModuleVisibilityValidator.java index b3a69ba1..82b0d866 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/linking/PbsModuleVisibilityValidator.java +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/linking/PbsModuleVisibilityValidator.java @@ -22,7 +22,13 @@ public final class PbsModuleVisibilityValidator { public void validate( final ReadOnlyList modules, final DiagnosticSink diagnostics) { - final var nameTable = new NameTable(); + validate(modules, new NameTable(), diagnostics); + } + + public void validate( + final ReadOnlyList modules, + final NameTable nameTable, + final DiagnosticSink diagnostics) { final var exportsByModule = new HashMap(); for (final var module : modules) { diff --git a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/semantics/PbsDeclarationSemanticsValidator.java b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/semantics/PbsDeclarationSemanticsValidator.java index 88e7f39f..1cd93e03 100644 --- a/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/semantics/PbsDeclarationSemanticsValidator.java +++ b/prometeu-compiler/frontends/prometeu-frontend-pbs/src/main/java/p/studio/compiler/pbs/semantics/PbsDeclarationSemanticsValidator.java @@ -28,9 +28,17 @@ public final class PbsDeclarationSemanticsValidator { ATTR_BUILTIN_CONST, ATTR_INTRINSIC_CALL); - private final NameTable nameTable = new NameTable(); + private final NameTable nameTable; private final PbsConstSemanticsValidator constSemanticsValidator = new PbsConstSemanticsValidator(); + public PbsDeclarationSemanticsValidator() { + this(new NameTable()); + } + + public PbsDeclarationSemanticsValidator(final NameTable nameTable) { + this.nameTable = nameTable == null ? new NameTable() : nameTable; + } + public void validate(final PbsAst.File ast, final DiagnosticSink diagnostics) { validate(ast, SourceKind.PROJECT, diagnostics); } 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 c0aee957..5beaed3f 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 @@ -58,6 +58,7 @@ public class PBSFrontendPhaseService implements FrontendPhaseService { final DiagnosticSink diagnostics, final LogAggregator logs, final BuildingIssueSink issues) { + final var nameTable = ctx.nameTable(); final var irBackendAggregator = IRBackend.aggregator(); final var parsedSourceFiles = new ArrayList(); final Map modulesByCoordinates = new LinkedHashMap<>(); @@ -132,7 +133,7 @@ public class PBSFrontendPhaseService implements FrontendPhaseService { ReadOnlyList.wrap(moduleUnit.sources), ReadOnlyList.wrap(moduleUnit.barrels))); } - moduleVisibilityValidator.validate(ReadOnlyList.wrap(modules), diagnostics); + moduleVisibilityValidator.validate(ReadOnlyList.wrap(modules), nameTable, diagnostics); markModulesWithLinkingErrors(diagnostics, moduleKeyByFile, failedModuleKeys); final var moduleDependencyGraph = buildModuleDependencyGraph(parsedSourceFiles); @@ -149,7 +150,8 @@ public class PBSFrontendPhaseService implements FrontendPhaseService { diagnostics, parsedSource.sourceKind(), parsedSource.moduleKey(), - ctx.hostAdmissionContext()); + ctx.hostAdmissionContext(), + nameTable); if (diagnostics.errorCount() > compileErrorBaseline) { failedModuleKeys.add(parsedSource.moduleKey()); } 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 42612633..88c29fc3 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 @@ -4,12 +4,14 @@ 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.NameTable; import p.studio.compiler.source.tables.ProjectTableReader; public class FrontendPhaseContext { public final ProjectTableReader projectTable; public final FileTableReader fileTable; public final BuildStack stack; + private final NameTable nameTable; private final int stdlibVersion; private final HostAdmissionContext hostAdmissionContext; @@ -37,6 +39,7 @@ public class FrontendPhaseContext { this.projectTable = projectTable; this.fileTable = fileTable; this.stack = stack; + this.nameTable = new NameTable(); this.stdlibVersion = stdlibVersion; this.hostAdmissionContext = hostAdmissionContext == null ? HostAdmissionContext.permissiveDefault() @@ -54,4 +57,8 @@ public class FrontendPhaseContext { public HostAdmissionContext hostAdmissionContext() { return hostAdmissionContext; } + + public NameTable nameTable() { + return nameTable; + } }