implements PR-05.0.1

This commit is contained in:
bQUARKz 2026-03-09 06:02:46 +00:00
parent 88c849d3b0
commit 3b5e8e0b24
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
5 changed files with 44 additions and 8 deletions

View File

@ -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);

View File

@ -22,7 +22,13 @@ public final class PbsModuleVisibilityValidator {
public void validate(
final ReadOnlyList<ModuleUnit> modules,
final DiagnosticSink diagnostics) {
final var nameTable = new NameTable();
validate(modules, new NameTable(), diagnostics);
}
public void validate(
final ReadOnlyList<ModuleUnit> modules,
final NameTable nameTable,
final DiagnosticSink diagnostics) {
final var exportsByModule = new HashMap<ModuleRefKey, ModuleExports>();
for (final var module : modules) {

View File

@ -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);
}

View File

@ -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<ParsedSourceFile>();
final Map<PbsModuleVisibilityValidator.ModuleCoordinates, MutableModuleUnit> 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());
}

View File

@ -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;
}
}