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.CallableTable;
|
||||||
import p.studio.compiler.source.tables.IntrinsicReference;
|
import p.studio.compiler.source.tables.IntrinsicReference;
|
||||||
import p.studio.compiler.source.tables.IntrinsicTable;
|
import p.studio.compiler.source.tables.IntrinsicTable;
|
||||||
|
import p.studio.compiler.source.tables.NameTable;
|
||||||
import p.studio.utilities.structures.ReadOnlyList;
|
import p.studio.utilities.structures.ReadOnlyList;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -31,7 +32,6 @@ import java.util.Map;
|
|||||||
import java.util.Set;
|
import java.util.Set;
|
||||||
|
|
||||||
public final class PbsFrontendCompiler {
|
public final class PbsFrontendCompiler {
|
||||||
private final PbsDeclarationSemanticsValidator declarationSemanticsValidator = new PbsDeclarationSemanticsValidator();
|
|
||||||
private final PbsFlowSemanticsValidator flowSemanticsValidator = new PbsFlowSemanticsValidator();
|
private final PbsFlowSemanticsValidator flowSemanticsValidator = new PbsFlowSemanticsValidator();
|
||||||
private final PbsReservedMetadataExtractor reservedMetadataExtractor = new PbsReservedMetadataExtractor();
|
private final PbsReservedMetadataExtractor reservedMetadataExtractor = new PbsReservedMetadataExtractor();
|
||||||
private final PbsHostAdmissionValidator hostAdmissionValidator = new PbsHostAdmissionValidator();
|
private final PbsHostAdmissionValidator hostAdmissionValidator = new PbsHostAdmissionValidator();
|
||||||
@ -57,13 +57,14 @@ public final class PbsFrontendCompiler {
|
|||||||
final DiagnosticSink diagnostics,
|
final DiagnosticSink diagnostics,
|
||||||
final SourceKind sourceKind,
|
final SourceKind sourceKind,
|
||||||
final HostAdmissionContext hostAdmissionContext) {
|
final HostAdmissionContext hostAdmissionContext) {
|
||||||
|
final var nameTable = new NameTable();
|
||||||
final var admissionBaseline = diagnostics.errorCount();
|
final var admissionBaseline = diagnostics.errorCount();
|
||||||
final var tokens = PbsLexer.lex(source, fileId, diagnostics);
|
final var tokens = PbsLexer.lex(source, fileId, diagnostics);
|
||||||
final var parseMode = sourceKind == SourceKind.SDK_INTERFACE
|
final var parseMode = sourceKind == SourceKind.SDK_INTERFACE
|
||||||
? PbsParser.ParseMode.INTERFACE_MODULE
|
? PbsParser.ParseMode.INTERFACE_MODULE
|
||||||
: PbsParser.ParseMode.ORDINARY;
|
: PbsParser.ParseMode.ORDINARY;
|
||||||
final var ast = PbsParser.parse(tokens, fileId, diagnostics, parseMode);
|
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) {
|
if (diagnostics.errorCount() > admissionBaseline) {
|
||||||
return IRBackendFile.empty(fileId);
|
return IRBackendFile.empty(fileId);
|
||||||
}
|
}
|
||||||
@ -91,7 +92,7 @@ public final class PbsFrontendCompiler {
|
|||||||
final DiagnosticSink diagnostics,
|
final DiagnosticSink diagnostics,
|
||||||
final SourceKind sourceKind,
|
final SourceKind sourceKind,
|
||||||
final HostAdmissionContext hostAdmissionContext) {
|
final HostAdmissionContext hostAdmissionContext) {
|
||||||
return compileParsedFile(fileId, ast, diagnostics, sourceKind, "", hostAdmissionContext);
|
return compileParsedFile(fileId, ast, diagnostics, sourceKind, "", hostAdmissionContext, new NameTable());
|
||||||
}
|
}
|
||||||
|
|
||||||
public IRBackendFile compileParsedFile(
|
public IRBackendFile compileParsedFile(
|
||||||
@ -101,8 +102,20 @@ public final class PbsFrontendCompiler {
|
|||||||
final SourceKind sourceKind,
|
final SourceKind sourceKind,
|
||||||
final String moduleKey,
|
final String moduleKey,
|
||||||
final HostAdmissionContext hostAdmissionContext) {
|
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();
|
final var semanticsErrorBaseline = diagnostics.errorCount();
|
||||||
declarationSemanticsValidator.validate(ast, sourceKind, diagnostics);
|
new PbsDeclarationSemanticsValidator(effectiveNameTable).validate(ast, sourceKind, diagnostics);
|
||||||
flowSemanticsValidator.validate(ast, diagnostics);
|
flowSemanticsValidator.validate(ast, diagnostics);
|
||||||
if (diagnostics.errorCount() > semanticsErrorBaseline) {
|
if (diagnostics.errorCount() > semanticsErrorBaseline) {
|
||||||
return IRBackendFile.empty(fileId);
|
return IRBackendFile.empty(fileId);
|
||||||
|
|||||||
@ -22,7 +22,13 @@ public final class PbsModuleVisibilityValidator {
|
|||||||
public void validate(
|
public void validate(
|
||||||
final ReadOnlyList<ModuleUnit> modules,
|
final ReadOnlyList<ModuleUnit> modules,
|
||||||
final DiagnosticSink diagnostics) {
|
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>();
|
final var exportsByModule = new HashMap<ModuleRefKey, ModuleExports>();
|
||||||
|
|
||||||
for (final var module : modules) {
|
for (final var module : modules) {
|
||||||
|
|||||||
@ -28,9 +28,17 @@ public final class PbsDeclarationSemanticsValidator {
|
|||||||
ATTR_BUILTIN_CONST,
|
ATTR_BUILTIN_CONST,
|
||||||
ATTR_INTRINSIC_CALL);
|
ATTR_INTRINSIC_CALL);
|
||||||
|
|
||||||
private final NameTable nameTable = new NameTable();
|
private final NameTable nameTable;
|
||||||
private final PbsConstSemanticsValidator constSemanticsValidator = new PbsConstSemanticsValidator();
|
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) {
|
public void validate(final PbsAst.File ast, final DiagnosticSink diagnostics) {
|
||||||
validate(ast, SourceKind.PROJECT, diagnostics);
|
validate(ast, SourceKind.PROJECT, diagnostics);
|
||||||
}
|
}
|
||||||
|
|||||||
@ -58,6 +58,7 @@ public class PBSFrontendPhaseService implements FrontendPhaseService {
|
|||||||
final DiagnosticSink diagnostics,
|
final DiagnosticSink diagnostics,
|
||||||
final LogAggregator logs,
|
final LogAggregator logs,
|
||||||
final BuildingIssueSink issues) {
|
final BuildingIssueSink issues) {
|
||||||
|
final var nameTable = ctx.nameTable();
|
||||||
final var irBackendAggregator = IRBackend.aggregator();
|
final var irBackendAggregator = IRBackend.aggregator();
|
||||||
final var parsedSourceFiles = new ArrayList<ParsedSourceFile>();
|
final var parsedSourceFiles = new ArrayList<ParsedSourceFile>();
|
||||||
final Map<PbsModuleVisibilityValidator.ModuleCoordinates, MutableModuleUnit> modulesByCoordinates = new LinkedHashMap<>();
|
final Map<PbsModuleVisibilityValidator.ModuleCoordinates, MutableModuleUnit> modulesByCoordinates = new LinkedHashMap<>();
|
||||||
@ -132,7 +133,7 @@ public class PBSFrontendPhaseService implements FrontendPhaseService {
|
|||||||
ReadOnlyList.wrap(moduleUnit.sources),
|
ReadOnlyList.wrap(moduleUnit.sources),
|
||||||
ReadOnlyList.wrap(moduleUnit.barrels)));
|
ReadOnlyList.wrap(moduleUnit.barrels)));
|
||||||
}
|
}
|
||||||
moduleVisibilityValidator.validate(ReadOnlyList.wrap(modules), diagnostics);
|
moduleVisibilityValidator.validate(ReadOnlyList.wrap(modules), nameTable, diagnostics);
|
||||||
markModulesWithLinkingErrors(diagnostics, moduleKeyByFile, failedModuleKeys);
|
markModulesWithLinkingErrors(diagnostics, moduleKeyByFile, failedModuleKeys);
|
||||||
final var moduleDependencyGraph = buildModuleDependencyGraph(parsedSourceFiles);
|
final var moduleDependencyGraph = buildModuleDependencyGraph(parsedSourceFiles);
|
||||||
|
|
||||||
@ -149,7 +150,8 @@ public class PBSFrontendPhaseService implements FrontendPhaseService {
|
|||||||
diagnostics,
|
diagnostics,
|
||||||
parsedSource.sourceKind(),
|
parsedSource.sourceKind(),
|
||||||
parsedSource.moduleKey(),
|
parsedSource.moduleKey(),
|
||||||
ctx.hostAdmissionContext());
|
ctx.hostAdmissionContext(),
|
||||||
|
nameTable);
|
||||||
if (diagnostics.errorCount() > compileErrorBaseline) {
|
if (diagnostics.errorCount() > compileErrorBaseline) {
|
||||||
failedModuleKeys.add(parsedSource.moduleKey());
|
failedModuleKeys.add(parsedSource.moduleKey());
|
||||||
}
|
}
|
||||||
|
|||||||
@ -4,12 +4,14 @@ import p.studio.compiler.models.BuildStack;
|
|||||||
import p.studio.compiler.models.SourceKind;
|
import p.studio.compiler.models.SourceKind;
|
||||||
import p.studio.compiler.source.identifiers.ProjectId;
|
import p.studio.compiler.source.identifiers.ProjectId;
|
||||||
import p.studio.compiler.source.tables.FileTableReader;
|
import p.studio.compiler.source.tables.FileTableReader;
|
||||||
|
import p.studio.compiler.source.tables.NameTable;
|
||||||
import p.studio.compiler.source.tables.ProjectTableReader;
|
import p.studio.compiler.source.tables.ProjectTableReader;
|
||||||
|
|
||||||
public class FrontendPhaseContext {
|
public class FrontendPhaseContext {
|
||||||
public final ProjectTableReader projectTable;
|
public final ProjectTableReader projectTable;
|
||||||
public final FileTableReader fileTable;
|
public final FileTableReader fileTable;
|
||||||
public final BuildStack stack;
|
public final BuildStack stack;
|
||||||
|
private final NameTable nameTable;
|
||||||
private final int stdlibVersion;
|
private final int stdlibVersion;
|
||||||
private final HostAdmissionContext hostAdmissionContext;
|
private final HostAdmissionContext hostAdmissionContext;
|
||||||
|
|
||||||
@ -37,6 +39,7 @@ public class FrontendPhaseContext {
|
|||||||
this.projectTable = projectTable;
|
this.projectTable = projectTable;
|
||||||
this.fileTable = fileTable;
|
this.fileTable = fileTable;
|
||||||
this.stack = stack;
|
this.stack = stack;
|
||||||
|
this.nameTable = new NameTable();
|
||||||
this.stdlibVersion = stdlibVersion;
|
this.stdlibVersion = stdlibVersion;
|
||||||
this.hostAdmissionContext = hostAdmissionContext == null
|
this.hostAdmissionContext = hostAdmissionContext == null
|
||||||
? HostAdmissionContext.permissiveDefault()
|
? HostAdmissionContext.permissiveDefault()
|
||||||
@ -54,4 +57,8 @@ public class FrontendPhaseContext {
|
|||||||
public HostAdmissionContext hostAdmissionContext() {
|
public HostAdmissionContext hostAdmissionContext() {
|
||||||
return hostAdmissionContext;
|
return hostAdmissionContext;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
public NameTable nameTable() {
|
||||||
|
return nameTable;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user