implements PR-05.0.1
This commit is contained in:
parent
88c849d3b0
commit
3b5e8e0b24
@ -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);
|
||||
|
||||
@ -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) {
|
||||
|
||||
@ -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);
|
||||
}
|
||||
|
||||
@ -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());
|
||||
}
|
||||
|
||||
@ -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;
|
||||
}
|
||||
}
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user