added contract update into asset workspace

This commit is contained in:
bQUARKz 2026-03-16 15:03:25 +00:00
parent bf4dc17469
commit b88a4e3c62
Signed by: bquarkz
SSH Key Fingerprint: SHA256:Z7dgqoglWwoK6j6u4QC87OveEq74WOhFN+gitsxtkf8
120 changed files with 1177 additions and 1211 deletions

View File

@ -9,12 +9,7 @@ import p.studio.compiler.source.identifiers.HostBindingId;
import p.studio.compiler.source.tables.HostBindingTable; import p.studio.compiler.source.tables.HostBindingTable;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import java.util.HashMap; import java.util.*;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Locale;
import java.util.Set;
import java.util.regex.Pattern; import java.util.regex.Pattern;
public final class PbsHostAdmissionValidator { public final class PbsHostAdmissionValidator {

View File

@ -6,12 +6,7 @@ import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.semantics.PbsBuiltinLayoutResolver; import p.studio.compiler.pbs.semantics.PbsBuiltinLayoutResolver;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayList; import java.util.*;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Map;
import java.util.Optional;
import java.util.OptionalLong;
import java.util.stream.Collectors; import java.util.stream.Collectors;
public final class PbsReservedMetadataExtractor { public final class PbsReservedMetadataExtractor {

View File

@ -5,17 +5,17 @@ import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.semantics.PbsSemanticsErrors; import p.studio.compiler.pbs.semantics.PbsSemanticsErrors;
import p.studio.compiler.source.diagnostics.DiagnosticPhase; import p.studio.compiler.source.diagnostics.DiagnosticPhase;
import p.studio.compiler.source.diagnostics.DiagnosticSink; import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.NameId;
import p.studio.compiler.source.identifiers.ModuleId; import p.studio.compiler.source.identifiers.ModuleId;
import p.studio.compiler.source.identifiers.NameId;
import p.studio.compiler.source.tables.IntrinsicTable; import p.studio.compiler.source.tables.IntrinsicTable;
import p.studio.compiler.source.tables.NameTable; import p.studio.compiler.source.tables.NameTable;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import static p.studio.compiler.pbs.lowering.PbsExecutableLoweringModels.*;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
import static p.studio.compiler.pbs.lowering.PbsExecutableLoweringModels.*;
final class PbsExecutableBodyLowerer { final class PbsExecutableBodyLowerer {
private final PbsExecutableCallsiteEmitter callsiteEmitter = new PbsExecutableCallsiteEmitter(); private final PbsExecutableCallsiteEmitter callsiteEmitter = new PbsExecutableCallsiteEmitter();
private final PbsExecutableStackAnalyzer stackAnalyzer = new PbsExecutableStackAnalyzer(); private final PbsExecutableStackAnalyzer stackAnalyzer = new PbsExecutableStackAnalyzer();

View File

@ -4,20 +4,16 @@ import p.studio.compiler.pbs.PbsFrontendCompiler;
import p.studio.compiler.pbs.ast.PbsAst; import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.source.identifiers.CallableId; import p.studio.compiler.source.identifiers.CallableId;
import p.studio.compiler.source.identifiers.ModuleId; import p.studio.compiler.source.identifiers.ModuleId;
import p.studio.compiler.source.tables.CallableShapeTable; import p.studio.compiler.source.tables.*;
import p.studio.compiler.source.tables.CallableSignatureRef;
import p.studio.compiler.source.tables.CallableTable;
import p.studio.compiler.source.tables.NameTable;
import p.studio.compiler.source.tables.TypeSurfaceTable;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import static p.studio.compiler.pbs.lowering.PbsExecutableLoweringModels.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import static p.studio.compiler.pbs.lowering.PbsExecutableLoweringModels.*;
final class PbsExecutableCallableRegistryFactory { final class PbsExecutableCallableRegistryFactory {
private final PbsCallableShapeSurfaceService callableShapeSurfaceService = new PbsCallableShapeSurfaceService(); private final PbsCallableShapeSurfaceService callableShapeSurfaceService = new PbsCallableShapeSurfaceService();

View File

@ -9,13 +9,13 @@ import p.studio.compiler.source.identifiers.NameId;
import p.studio.compiler.source.tables.NameTable; import p.studio.compiler.source.tables.NameTable;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import static p.studio.compiler.pbs.lowering.PbsExecutableLoweringModels.*;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
import static p.studio.compiler.pbs.lowering.PbsExecutableLoweringModels.*;
final class PbsExecutableMetadataIndexFactory { final class PbsExecutableMetadataIndexFactory {
PbsExecutableMetadataIndex create( PbsExecutableMetadataIndex create(

View File

@ -3,11 +3,7 @@ package p.studio.compiler.pbs.lowering;
import p.studio.compiler.models.IRBackendExecutableFunction; import p.studio.compiler.models.IRBackendExecutableFunction;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayDeque; import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.Map;
final class PbsExecutableStackAnalyzer { final class PbsExecutableStackAnalyzer {

View File

@ -1,7 +1,6 @@
package p.studio.compiler.pbs.parser; package p.studio.compiler.pbs.parser;
import p.studio.compiler.pbs.ast.PbsAst; import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.lexer.PbsToken;
import p.studio.compiler.pbs.lexer.PbsTokenKind; import p.studio.compiler.pbs.lexer.PbsTokenKind;
import p.studio.compiler.source.Span; import p.studio.compiler.source.Span;

View File

@ -5,13 +5,7 @@ import p.studio.compiler.source.Span;
import p.studio.compiler.source.diagnostics.DiagnosticSink; import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Optional;
import java.util.Set;
public final class PbsBuiltinLayoutResolver { public final class PbsBuiltinLayoutResolver {
private static final Set<String> BUILTIN_SCALAR_TYPES = Set.of("int", "float", "bool", "str"); private static final Set<String> BUILTIN_SCALAR_TYPES = Set.of("int", "float", "bool", "str");

View File

@ -1,18 +1,12 @@
package p.studio.compiler.pbs.semantics; package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst; import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.source.Span;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import p.studio.compiler.source.Span;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import java.util.ArrayList; import java.util.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.PriorityQueue;
import java.util.Set;
final class PbsConstSemanticsValidator { final class PbsConstSemanticsValidator {
private final PbsFlowTypeOps typeOps = new PbsFlowTypeOps(); private final PbsFlowTypeOps typeOps = new PbsFlowTypeOps();

View File

@ -7,12 +7,7 @@ import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.tables.NameTable; 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.*;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
public final class PbsDeclarationSemanticsValidator { public final class PbsDeclarationSemanticsValidator {
private static final String ATTR_HOST = "Host"; private static final String ATTR_HOST = "Host";

View File

@ -1,12 +1,8 @@
package p.studio.compiler.pbs.semantics; package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst; import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.*;
import p.studio.compiler.source.diagnostics.Diagnostics; import p.studio.compiler.source.diagnostics.Diagnostics;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprUse;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Scope;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
final class PbsFlowAssignmentAnalyzer { final class PbsFlowAssignmentAnalyzer {
@FunctionalInterface @FunctionalInterface

View File

@ -1,11 +1,11 @@
package p.studio.compiler.pbs.semantics; package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst; import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.utilities.structures.ReadOnlyList;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Scope; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Scope;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.utilities.structures.ReadOnlyList;
final class PbsFlowBodyAnalyzer { final class PbsFlowBodyAnalyzer {
private final PbsFlowTypeOps typeOps = new PbsFlowTypeOps(); private final PbsFlowTypeOps typeOps = new PbsFlowTypeOps();

View File

@ -1,9 +1,9 @@
package p.studio.compiler.pbs.semantics; package p.studio.compiler.pbs.semantics;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Scope; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Scope;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
final class PbsFlowBodyContext { final class PbsFlowBodyContext {
private final Scope scope; private final Scope scope;

View File

@ -1,11 +1,11 @@
package p.studio.compiler.pbs.semantics; package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst; import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.source.diagnostics.Diagnostics;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprResult; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprResult;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprUse; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprUse;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import p.studio.compiler.source.diagnostics.Diagnostics;
final class PbsFlowBranchExpressionAnalyzer { final class PbsFlowBranchExpressionAnalyzer {
@FunctionalInterface @FunctionalInterface

View File

@ -1,8 +1,8 @@
package p.studio.compiler.pbs.semantics; package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst; import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.utilities.structures.ReadOnlyList;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import p.studio.utilities.structures.ReadOnlyList;
final class PbsFlowCallableBodyAnalyzer { final class PbsFlowCallableBodyAnalyzer {
@FunctionalInterface @FunctionalInterface

View File

@ -1,15 +1,10 @@
package p.studio.compiler.pbs.semantics; package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst; import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.*;
import p.studio.compiler.source.Span; import p.studio.compiler.source.Span;
import p.studio.compiler.source.diagnostics.DiagnosticSink; import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.diagnostics.Diagnostics; import p.studio.compiler.source.diagnostics.Diagnostics;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.CallableSymbol;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprResult;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprUse;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TupleField;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import java.util.ArrayList; import java.util.ArrayList;

View File

@ -1,9 +1,9 @@
package p.studio.compiler.pbs.semantics; package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst; import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.source.diagnostics.Diagnostics;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model;
import p.studio.compiler.source.diagnostics.Diagnostics;
import java.util.HashSet; import java.util.HashSet;

View File

@ -1,11 +1,11 @@
package p.studio.compiler.pbs.semantics; package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst; import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.diagnostics.Diagnostics;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprResult; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprResult;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.diagnostics.Diagnostics;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;

View File

@ -1,12 +1,8 @@
package p.studio.compiler.pbs.semantics; package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst; import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.*;
import p.studio.compiler.source.diagnostics.DiagnosticSink; import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprResult;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprUse;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Scope;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
final class PbsFlowExpressionAnalyzer { final class PbsFlowExpressionAnalyzer {
@FunctionalInterface @FunctionalInterface

View File

@ -1,10 +1,10 @@
package p.studio.compiler.pbs.semantics; package p.studio.compiler.pbs.semantics;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprUse; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprUse;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Scope; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Scope;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import p.studio.compiler.source.diagnostics.DiagnosticSink;
final class PbsFlowExpressionContext { final class PbsFlowExpressionContext {
private final Scope scope; private final Scope scope;

View File

@ -1,13 +1,9 @@
package p.studio.compiler.pbs.semantics; package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst; import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.*;
import p.studio.compiler.source.Span; import p.studio.compiler.source.Span;
import p.studio.compiler.source.diagnostics.Diagnostics; import p.studio.compiler.source.diagnostics.Diagnostics;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprUse;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Model;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Scope;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
final class PbsFlowStatementAnalyzer { final class PbsFlowStatementAnalyzer {
@FunctionalInterface @FunctionalInterface

View File

@ -1,11 +1,11 @@
package p.studio.compiler.pbs.semantics; package p.studio.compiler.pbs.semantics;
import p.studio.compiler.pbs.ast.PbsAst; import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.source.diagnostics.Diagnostics;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprResult; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.ExprResult;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.Kind;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TupleField; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TupleField;
import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView; import p.studio.compiler.pbs.semantics.PbsFlowSemanticSupport.TypeView;
import p.studio.compiler.source.diagnostics.Diagnostics;
import java.util.ArrayList; import java.util.ArrayList;

View File

@ -1,20 +1,20 @@
package p.studio.compiler.pbs.stdlib; package p.studio.compiler.pbs.stdlib;
import p.studio.compiler.models.SourceHandle;
import p.studio.compiler.pbs.ast.PbsAst; import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.lexer.PbsLexer; import p.studio.compiler.pbs.lexer.PbsLexer;
import p.studio.compiler.pbs.linking.PbsModuleVisibilityValidator; import p.studio.compiler.pbs.linking.PbsModuleVisibilityValidator;
import p.studio.compiler.pbs.parser.PbsBarrelParser; import p.studio.compiler.pbs.parser.PbsBarrelParser;
import p.studio.compiler.pbs.parser.PbsParser; import p.studio.compiler.pbs.parser.PbsParser;
import p.studio.compiler.source.tables.FileTable;
import p.studio.compiler.source.diagnostics.DiagnosticSink; import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.FileId; import p.studio.compiler.source.identifiers.FileId;
import p.studio.compiler.source.identifiers.ProjectId; import p.studio.compiler.source.identifiers.ProjectId;
import p.studio.compiler.models.SourceHandle; import p.studio.compiler.source.tables.FileTable;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayList;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList;
public final class InterfaceModuleLoader { public final class InterfaceModuleLoader {
public InterfaceModuleLoader() { public InterfaceModuleLoader() {

View File

@ -14,13 +14,7 @@ import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.ModuleId; import p.studio.compiler.source.identifiers.ModuleId;
import p.studio.utilities.logs.LogAggregator; import p.studio.utilities.logs.LogAggregator;
import java.util.ArrayDeque; import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashSet;
import java.util.Map;
import java.util.Set;
@Slf4j @Slf4j
public class PBSFrontendPhaseService implements FrontendPhaseService { public class PBSFrontendPhaseService implements FrontendPhaseService {

View File

@ -2,20 +2,14 @@ package p.studio.compiler.services;
import p.studio.compiler.models.IRReservedMetadata; import p.studio.compiler.models.IRReservedMetadata;
import p.studio.compiler.pbs.PbsFrontendCompiler; import p.studio.compiler.pbs.PbsFrontendCompiler;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.PbsReservedMetadataExtractor; import p.studio.compiler.pbs.PbsReservedMetadataExtractor;
import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.source.identifiers.FileId; import p.studio.compiler.source.identifiers.FileId;
import p.studio.compiler.source.identifiers.ModuleId; import p.studio.compiler.source.identifiers.ModuleId;
import p.studio.compiler.source.tables.ModuleTable; import p.studio.compiler.source.tables.ModuleTable;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayDeque; import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Map;
import java.util.Set;
final class PbsImportedSemanticContextService { final class PbsImportedSemanticContextService {
private final PbsReservedMetadataExtractor reservedMetadataExtractor; private final PbsReservedMetadataExtractor reservedMetadataExtractor;

View File

@ -27,13 +27,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayDeque; import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.Map;
import java.util.Set;
final class PbsModuleAssemblyService { final class PbsModuleAssemblyService {
private final StdlibEnvironmentResolver stdlibEnvironmentResolver; private final StdlibEnvironmentResolver stdlibEnvironmentResolver;

View File

@ -4,11 +4,7 @@ import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;
import p.studio.compiler.messages.BuildingIssueSink; import p.studio.compiler.messages.BuildingIssueSink;
import p.studio.compiler.messages.FrontendPhaseContext; import p.studio.compiler.messages.FrontendPhaseContext;
import p.studio.compiler.models.BuildStack; import p.studio.compiler.models.*;
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.ast.PbsAst; import p.studio.compiler.pbs.ast.PbsAst;
import p.studio.compiler.pbs.lexer.PbsLexer; import p.studio.compiler.pbs.lexer.PbsLexer;
import p.studio.compiler.pbs.linking.PbsLinkErrors; import p.studio.compiler.pbs.linking.PbsLinkErrors;
@ -37,11 +33,7 @@ import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.function.Predicate; import java.util.function.Predicate;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
class PbsGateUSdkInterfaceConformanceTest { class PbsGateUSdkInterfaceConformanceTest {

View File

@ -28,10 +28,7 @@ import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
class PbsGateUStdlibCompileTest { class PbsGateUStdlibCompileTest {

View File

@ -6,9 +6,7 @@ import p.studio.compiler.pbs.lexer.PbsLexer;
import p.studio.compiler.source.diagnostics.DiagnosticSink; import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.FileId; import p.studio.compiler.source.identifiers.FileId;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertTrue;
class PbsBarrelParserTest { class PbsBarrelParserTest {

View File

@ -6,10 +6,7 @@ import p.studio.compiler.pbs.lexer.PbsLexer;
import p.studio.compiler.source.diagnostics.DiagnosticSink; import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.FileId; import p.studio.compiler.source.identifiers.FileId;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
class PbsExprParserTest { class PbsExprParserTest {

View File

@ -6,9 +6,7 @@ import p.studio.compiler.pbs.lexer.PbsLexer;
import p.studio.compiler.source.diagnostics.DiagnosticSink; import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.FileId; import p.studio.compiler.source.identifiers.FileId;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertTrue;
class PbsParserStatementsTest { class PbsParserStatementsTest {

View File

@ -8,10 +8,7 @@ import p.studio.compiler.source.identifiers.FileId;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertInstanceOf;
import static org.junit.jupiter.api.Assertions.assertNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
class PbsParserTest { class PbsParserTest {

View File

@ -5,9 +5,7 @@ import p.studio.compiler.pbs.PbsFrontendCompiler;
import p.studio.compiler.source.diagnostics.DiagnosticSink; import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.FileId; import p.studio.compiler.source.identifiers.FileId;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
class PbsSemanticsControlFlowTest { class PbsSemanticsControlFlowTest {

View File

@ -5,9 +5,7 @@ import p.studio.compiler.pbs.PbsFrontendCompiler;
import p.studio.compiler.source.diagnostics.DiagnosticSink; import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.FileId; import p.studio.compiler.source.identifiers.FileId;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
class PbsSemanticsDeclarationsTest { class PbsSemanticsDeclarationsTest {

View File

@ -5,9 +5,7 @@ import p.studio.compiler.pbs.PbsFrontendCompiler;
import p.studio.compiler.source.diagnostics.DiagnosticSink; import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.FileId; import p.studio.compiler.source.identifiers.FileId;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
class PbsSemanticsFallthroughTest { class PbsSemanticsFallthroughTest {

View File

@ -9,9 +9,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.file.Path; import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
class InterfaceModuleLoaderTest { class InterfaceModuleLoaderTest {

View File

@ -9,12 +9,12 @@ import p.studio.compiler.models.ProjectDescriptor;
import p.studio.compiler.models.SourceHandle; import p.studio.compiler.models.SourceHandle;
import p.studio.compiler.models.SourceKind; import p.studio.compiler.models.SourceKind;
import p.studio.compiler.pbs.PbsHostAdmissionErrors; import p.studio.compiler.pbs.PbsHostAdmissionErrors;
import p.studio.compiler.pbs.linking.PbsLinkErrors;
import p.studio.compiler.pbs.semantics.PbsSemanticsErrors;
import p.studio.compiler.pbs.stdlib.InterfaceModuleLoader; import p.studio.compiler.pbs.stdlib.InterfaceModuleLoader;
import p.studio.compiler.pbs.stdlib.StdlibEnvironment; import p.studio.compiler.pbs.stdlib.StdlibEnvironment;
import p.studio.compiler.pbs.stdlib.StdlibEnvironmentResolver; import p.studio.compiler.pbs.stdlib.StdlibEnvironmentResolver;
import p.studio.compiler.pbs.stdlib.StdlibModuleSource; import p.studio.compiler.pbs.stdlib.StdlibModuleSource;
import p.studio.compiler.pbs.linking.PbsLinkErrors;
import p.studio.compiler.pbs.semantics.PbsSemanticsErrors;
import p.studio.compiler.source.diagnostics.DiagnosticSink; import p.studio.compiler.source.diagnostics.DiagnosticSink;
import p.studio.compiler.source.identifiers.ProjectId; import p.studio.compiler.source.identifiers.ProjectId;
import p.studio.compiler.source.tables.FileTable; import p.studio.compiler.source.tables.FileTable;
@ -29,12 +29,9 @@ import java.nio.file.Path;
import java.nio.file.attribute.BasicFileAttributes; import java.nio.file.attribute.BasicFileAttributes;
import java.util.HashMap; import java.util.HashMap;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.Optional; import java.util.Optional;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
class PBSFrontendPhaseServiceTest { class PBSFrontendPhaseServiceTest {

View File

@ -6,8 +6,8 @@ import java.io.ByteArrayOutputStream;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.LinkedHashSet;
import java.util.LinkedHashMap; import java.util.LinkedHashMap;
import java.util.LinkedHashSet;
import java.util.Objects; import java.util.Objects;
public class BytecodeEmitter { public class BytecodeEmitter {

View File

@ -1,7 +1,6 @@
package p.studio.compiler.backend.irvm; package p.studio.compiler.backend.irvm;
import p.studio.compiler.backend.bytecode.BytecodeEmitter; import p.studio.compiler.backend.bytecode.BytecodeEmitter;
import p.studio.compiler.backend.bytecode.BytecodeModule;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayList; import java.util.ArrayList;

View File

@ -3,12 +3,7 @@ package p.studio.compiler.backend.irvm;
import p.studio.compiler.backend.bytecode.BytecodeEmitter; import p.studio.compiler.backend.bytecode.BytecodeEmitter;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayDeque; import java.util.*;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Objects;
public class OptimizeIRVMService { public class OptimizeIRVMService {
private final IRVMValidator validator; private final IRVMValidator validator;

View File

@ -6,10 +6,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
class BytecodeEmitterTest { class BytecodeEmitterTest {

View File

@ -6,9 +6,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertThrows;
class BytecodeLinkPrecheckServiceTest { class BytecodeLinkPrecheckServiceTest {

View File

@ -6,9 +6,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
class BytecodeModuleTest { class BytecodeModuleTest {

View File

@ -6,9 +6,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
class BytecodePreloadVerifierServiceTest { class BytecodePreloadVerifierServiceTest {

View File

@ -6,18 +6,10 @@ import java.io.IOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList; import java.util.*;
import java.util.Arrays;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Locale;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
class IRVMIntrinsicRegistryParityTest { class IRVMIntrinsicRegistryParityTest {
private static final String VM_ARCH_INTRINSICS_PATH = "docs/vm-arch/INTRINSICS.csv"; private static final String VM_ARCH_INTRINSICS_PATH = "docs/vm-arch/INTRINSICS.csv";

View File

@ -8,9 +8,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.util.Map; import java.util.Map;
import java.util.Set; import java.util.Set;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow;
import static org.junit.jupiter.api.Assertions.assertThrows;
class IRVMValidatorTest { class IRVMValidatorTest {
private final IRVMValidator validator = new IRVMValidator(); private final IRVMValidator validator = new IRVMValidator();

View File

@ -12,9 +12,7 @@ import p.studio.compiler.source.tables.IntrinsicReference;
import p.studio.compiler.source.tables.ModuleReference; import p.studio.compiler.source.tables.ModuleReference;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
class LowerToIRVMServiceTest { class LowerToIRVMServiceTest {

View File

@ -2,8 +2,8 @@ package p.studio.compiler.backend.irvm;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import p.studio.compiler.backend.bytecode.BytecodeEmitter; import p.studio.compiler.backend.bytecode.BytecodeEmitter;
import p.studio.compiler.backend.bytecode.BytecodePreloadVerifierService;
import p.studio.compiler.backend.bytecode.BytecodeModule; import p.studio.compiler.backend.bytecode.BytecodeModule;
import p.studio.compiler.backend.bytecode.BytecodePreloadVerifierService;
import p.studio.compiler.models.IRBackend; import p.studio.compiler.models.IRBackend;
import p.studio.compiler.models.IRBackendExecutableFunction; import p.studio.compiler.models.IRBackendExecutableFunction;
import p.studio.compiler.source.Span; import p.studio.compiler.source.Span;
@ -16,12 +16,10 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayDeque; import java.util.ArrayDeque;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.HashMap; import java.util.HashMap;
import java.util.LinkedHashMap;
import java.util.List; import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
class OptimizeIRVMEquivalenceHarnessTest { class OptimizeIRVMEquivalenceHarnessTest {

View File

@ -9,11 +9,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
class OptimizeIRVMServiceTest { class OptimizeIRVMServiceTest {

View File

@ -23,14 +23,9 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.ByteBuffer; import java.nio.ByteBuffer;
import java.nio.ByteOrder; import java.nio.ByteOrder;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map;
import java.util.Set; import java.util.Set;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.assertThrows;
class BackendGateIIntegrationTest { class BackendGateIIntegrationTest {
private final RuntimeCompatibilityAdapter compatibilityAdapter = RuntimeCompatibilityAdapters.createDefault(); private final RuntimeCompatibilityAdapter compatibilityAdapter = RuntimeCompatibilityAdapters.createDefault();

View File

@ -9,9 +9,7 @@ import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.assertDoesNotThrow; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
class MainProjectPipelineIntegrationTest { class MainProjectPipelineIntegrationTest {

View File

@ -10,9 +10,7 @@ import java.util.List;
import java.util.Optional; import java.util.Optional;
import java.util.regex.Pattern; import java.util.regex.Pattern;
import static org.junit.jupiter.api.Assertions.assertFalse; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertTrue;
import static org.junit.jupiter.api.Assertions.fail;
class BackendConformanceMatrixSpecTest { class BackendConformanceMatrixSpecTest {
private static final String MATRIX_RELATIVE_PATH = private static final String MATRIX_RELATIVE_PATH =

View File

@ -1,15 +1,7 @@
package p.studio.compiler.workspaces; package p.studio.compiler.workspaces;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import p.studio.compiler.workspaces.stages.EmitBytecodePipelineStage; import p.studio.compiler.workspaces.stages.*;
import p.studio.compiler.workspaces.stages.FrontendPhasePipelineStage;
import p.studio.compiler.workspaces.stages.LinkBytecodePipelineStage;
import p.studio.compiler.workspaces.stages.LoadSourcesPipelineStage;
import p.studio.compiler.workspaces.stages.LowerToIRVMPipelineStage;
import p.studio.compiler.workspaces.stages.OptimizeIRVMPipelineStage;
import p.studio.compiler.workspaces.stages.ResolveDepsPipelineStage;
import p.studio.compiler.workspaces.stages.VerifyBytecodePipelineStage;
import p.studio.compiler.workspaces.stages.WriteBytecodeArtifactPipelineStage;
import java.lang.reflect.Field; import java.lang.reflect.Field;
import java.util.List; import java.util.List;

View File

@ -2,11 +2,7 @@ package p.studio.compiler.workspaces.stages;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import p.studio.compiler.backend.bytecode.BytecodeEmitter; import p.studio.compiler.backend.bytecode.BytecodeEmitter;
import p.studio.compiler.backend.irvm.IRVMFunction; import p.studio.compiler.backend.irvm.*;
import p.studio.compiler.backend.irvm.IRVMInstruction;
import p.studio.compiler.backend.irvm.IRVMModule;
import p.studio.compiler.backend.irvm.IRVMOp;
import p.studio.compiler.backend.irvm.IRVMProgram;
import p.studio.compiler.messages.BuilderPipelineConfig; import p.studio.compiler.messages.BuilderPipelineConfig;
import p.studio.compiler.models.BuilderPipelineContext; import p.studio.compiler.models.BuilderPipelineContext;
import p.studio.compiler.models.IRBackend; import p.studio.compiler.models.IRBackend;
@ -17,9 +13,7 @@ import p.studio.compiler.source.identifiers.FileId;
import p.studio.utilities.logs.LogAggregator; import p.studio.utilities.logs.LogAggregator;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertTrue;
class BackendSafetyGateSUTest { class BackendSafetyGateSUTest {

View File

@ -8,10 +8,7 @@ import p.studio.compiler.models.BuilderPipelineContext;
import p.studio.utilities.logs.LogAggregator; import p.studio.utilities.logs.LogAggregator;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
class EmitBytecodePipelineStageTest { class EmitBytecodePipelineStageTest {

View File

@ -11,10 +11,7 @@ import p.studio.compiler.source.identifiers.FileId;
import p.studio.utilities.logs.LogAggregator; import p.studio.utilities.logs.LogAggregator;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
class LowerToIRVMPipelineStageTest { class LowerToIRVMPipelineStageTest {

View File

@ -1,20 +1,13 @@
package p.studio.compiler.workspaces.stages; package p.studio.compiler.workspaces.stages;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import p.studio.compiler.backend.irvm.IRVMFunction; import p.studio.compiler.backend.irvm.*;
import p.studio.compiler.backend.irvm.IRVMInstruction;
import p.studio.compiler.backend.irvm.IRVMModule;
import p.studio.compiler.backend.irvm.IRVMOp;
import p.studio.compiler.backend.irvm.IRVMProgram;
import p.studio.compiler.messages.BuilderPipelineConfig; import p.studio.compiler.messages.BuilderPipelineConfig;
import p.studio.compiler.models.BuilderPipelineContext; import p.studio.compiler.models.BuilderPipelineContext;
import p.studio.utilities.logs.LogAggregator; import p.studio.utilities.logs.LogAggregator;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertNotNull;
import static org.junit.jupiter.api.Assertions.assertTrue;
class OptimizeIRVMPipelineStageTest { class OptimizeIRVMPipelineStageTest {

View File

@ -11,10 +11,7 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import static org.junit.jupiter.api.Assertions.assertArrayEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
class WriteBytecodeArtifactPipelineStageTest { class WriteBytecodeArtifactPipelineStageTest {

View File

@ -3,11 +3,7 @@ package p.studio.compiler.source.diagnostics;
import p.studio.compiler.source.Span; import p.studio.compiler.source.Span;
import p.studio.utilities.structures.ReadOnlyCollection; import p.studio.utilities.structures.ReadOnlyCollection;
import java.util.ArrayList; import java.util.*;
import java.util.Collection;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public class DiagnosticSink implements ReadOnlyCollection<Diagnostic> { public class DiagnosticSink implements ReadOnlyCollection<Diagnostic> {
private final ArrayList<Diagnostic> diagnostics = new ArrayList<>(); private final ArrayList<Diagnostic> diagnostics = new ArrayList<>();

View File

@ -3,9 +3,6 @@ package p.studio.compiler.source.identifiers;
import lombok.EqualsAndHashCode; import lombok.EqualsAndHashCode;
import lombok.Getter; import lombok.Getter;
import java.util.Optional;
import java.util.function.Supplier;
@Getter @Getter
@EqualsAndHashCode(onlyExplicitlyIncluded = true) @EqualsAndHashCode(onlyExplicitlyIncluded = true)
public abstract class SourceIdentifier { public abstract class SourceIdentifier {

View File

@ -2,9 +2,7 @@ package p.studio.compiler.source.tables;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertNotEquals;
import static org.junit.jupiter.api.Assertions.assertThrows;
class HostBindingTableTest { class HostBindingTableTest {

View File

@ -2,9 +2,7 @@ package p.studio.compiler.source.tables;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
class IntrinsicTableTest { class IntrinsicTableTest {

View File

@ -12,7 +12,8 @@ import p.studio.utilities.structures.ReadOnlyList;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.List; import java.util.List;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.assertFalse;
import static org.junit.jupiter.api.Assertions.assertTrue;
class ValidatePhaseTest { class ValidatePhaseTest {

View File

@ -5,12 +5,7 @@ import lombok.Getter;
import p.studio.compiler.source.identifiers.CallableId; import p.studio.compiler.source.identifiers.CallableId;
import p.studio.compiler.source.identifiers.IntrinsicId; import p.studio.compiler.source.identifiers.IntrinsicId;
import p.studio.compiler.source.identifiers.ModuleId; import p.studio.compiler.source.identifiers.ModuleId;
import p.studio.compiler.source.tables.CallableSignatureRef; import p.studio.compiler.source.tables.*;
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.ModuleReference;
import p.studio.compiler.source.tables.ModuleTable;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import java.util.ArrayList; import java.util.ArrayList;

View File

@ -11,9 +11,7 @@ import p.studio.compiler.source.tables.IntrinsicReference;
import p.studio.compiler.source.tables.ModuleReference; import p.studio.compiler.source.tables.ModuleReference;
import p.studio.utilities.structures.ReadOnlyList; import p.studio.utilities.structures.ReadOnlyList;
import static org.junit.jupiter.api.Assertions.assertEquals; import static org.junit.jupiter.api.Assertions.*;
import static org.junit.jupiter.api.Assertions.assertThrows;
import static org.junit.jupiter.api.Assertions.assertTrue;
class IRBackendExecutableContractTest { class IRBackendExecutableContractTest {

View File

@ -1,11 +1,6 @@
package p.studio.utilities.structures; package p.studio.utilities.structures;
import java.util.ArrayList; import java.util.*;
import java.util.Collection;
import java.util.Comparator;
import java.util.List;
import java.util.ListIterator;
import java.util.Objects;
import java.util.stream.Stream; import java.util.stream.Stream;
public interface ReadOnlyList<T> extends ReadOnlyCollection<T> { public interface ReadOnlyList<T> extends ReadOnlyCollection<T> {

View File

@ -18,4 +18,6 @@ public interface PackerWorkspaceService {
MoveAssetResult moveAsset(MoveAssetRequest request); MoveAssetResult moveAsset(MoveAssetRequest request);
DeleteAssetResult deleteAsset(DeleteAssetRequest request); DeleteAssetResult deleteAsset(DeleteAssetRequest request);
UpdateAssetContractResponse updateAssetContract(UpdateAssetContractRequest request);
} }

View File

@ -1,6 +1,7 @@
package p.packer.dtos; package p.packer.dtos;
import p.packer.messages.assets.OutputCodecCatalog; import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.List; import java.util.List;
@ -9,7 +10,7 @@ import java.util.Objects;
public record PackerAssetDetailsDTO( public record PackerAssetDetailsDTO(
PackerAssetSummaryDTO summary, PackerAssetSummaryDTO summary,
String outputFormat, OutputFormatCatalog outputFormat,
OutputCodecCatalog outputCodec, OutputCodecCatalog outputCodec,
List<OutputCodecCatalog> availableOutputCodecs, List<OutputCodecCatalog> availableOutputCodecs,
Map<OutputCodecCatalog, List<PackerCodecConfigurationFieldDTO>> codecConfigurationFieldsByCodec, Map<OutputCodecCatalog, List<PackerCodecConfigurationFieldDTO>> codecConfigurationFieldsByCodec,
@ -18,7 +19,7 @@ public record PackerAssetDetailsDTO(
public PackerAssetDetailsDTO { public PackerAssetDetailsDTO {
Objects.requireNonNull(summary, "summary"); Objects.requireNonNull(summary, "summary");
outputFormat = Objects.requireNonNullElse(outputFormat, "unknown").trim(); outputFormat = Objects.requireNonNullElse(outputFormat, OutputFormatCatalog.UNKNOWN);
outputCodec = Objects.requireNonNullElse(outputCodec, OutputCodecCatalog.UNKNOWN); outputCodec = Objects.requireNonNullElse(outputCodec, OutputCodecCatalog.UNKNOWN);
availableOutputCodecs = List.copyOf(Objects.requireNonNull(availableOutputCodecs, "availableOutputCodecs")); availableOutputCodecs = List.copyOf(Objects.requireNonNull(availableOutputCodecs, "availableOutputCodecs"));
codecConfigurationFieldsByCodec = Map.copyOf(Objects.requireNonNull(codecConfigurationFieldsByCodec, "codecConfigurationFieldsByCodec")); codecConfigurationFieldsByCodec = Map.copyOf(Objects.requireNonNull(codecConfigurationFieldsByCodec, "codecConfigurationFieldsByCodec"));

View File

@ -0,0 +1,21 @@
package p.packer.messages;
import p.packer.messages.assets.OutputCodecCatalog;
import java.util.Map;
import java.util.Objects;
public record UpdateAssetContractRequest(
PackerProjectContext project,
AssetReference assetReference,
boolean preloadEnabled,
OutputCodecCatalog outputCodec,
Map<String, String> codecFieldValues) {
public UpdateAssetContractRequest {
Objects.requireNonNull(project, "project");
Objects.requireNonNull(assetReference, "assetReference");
outputCodec = Objects.requireNonNullElse(outputCodec, OutputCodecCatalog.UNKNOWN);
codecFieldValues = Map.copyOf(Objects.requireNonNullElse(codecFieldValues, Map.of()));
}
}

View File

@ -0,0 +1,4 @@
package p.packer.messages;
public record UpdateAssetContractResponse(boolean success, String errorMessage) {
}

View File

@ -1,7 +1,9 @@
package p.packer.models; package p.packer.models;
import org.apache.commons.lang3.StringUtils;
import p.packer.messages.assets.AssetFamilyCatalog; import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.assets.OutputCodecCatalog; import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@ -13,7 +15,7 @@ public record PackerAssetDeclaration(
String name, String name,
AssetFamilyCatalog assetFamily, AssetFamilyCatalog assetFamily,
Map<String, List<String>> inputsByRole, Map<String, List<String>> inputsByRole,
String outputFormat, OutputFormatCatalog outputFormat,
OutputCodecCatalog outputCodec, OutputCodecCatalog outputCodec,
boolean preloadEnabled) { boolean preloadEnabled) {
@ -25,9 +27,9 @@ public record PackerAssetDeclaration(
name = Objects.requireNonNull(name, "name").trim(); name = Objects.requireNonNull(name, "name").trim();
assetFamily = Objects.requireNonNull(assetFamily, "assetFamily"); assetFamily = Objects.requireNonNull(assetFamily, "assetFamily");
inputsByRole = Map.copyOf(Objects.requireNonNull(inputsByRole, "inputsByRole")); inputsByRole = Map.copyOf(Objects.requireNonNull(inputsByRole, "inputsByRole"));
outputFormat = Objects.requireNonNull(outputFormat, "outputFormat").trim(); outputFormat = Objects.requireNonNull(outputFormat, "outputFormat");
outputCodec = Objects.requireNonNull(outputCodec, "outputCodec"); outputCodec = Objects.requireNonNull(outputCodec, "outputCodec");
if (assetUuid.isBlank() || name.isBlank() || outputFormat.isBlank()) { if (StringUtils.isBlank(assetUuid) || StringUtils.isBlank(name)) {
throw new IllegalArgumentException("declaration fields must not be blank"); throw new IllegalArgumentException("declaration fields must not be blank");
} }
} }

View File

@ -1,6 +1,7 @@
package p.packer.models; package p.packer.models;
import p.packer.messages.assets.OutputCodecCatalog; import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.List; import java.util.List;
@ -9,7 +10,7 @@ import java.util.Objects;
public record PackerAssetDetails( public record PackerAssetDetails(
PackerAssetSummary summary, PackerAssetSummary summary,
String outputFormat, OutputFormatCatalog outputFormat,
OutputCodecCatalog outputCodec, OutputCodecCatalog outputCodec,
List<OutputCodecCatalog> availableOutputCodecs, List<OutputCodecCatalog> availableOutputCodecs,
Map<OutputCodecCatalog, List<PackerCodecConfigurationField>> codecConfigurationFieldsByCodec, Map<OutputCodecCatalog, List<PackerCodecConfigurationField>> codecConfigurationFieldsByCodec,
@ -18,7 +19,7 @@ public record PackerAssetDetails(
public PackerAssetDetails { public PackerAssetDetails {
Objects.requireNonNull(summary, "summary"); Objects.requireNonNull(summary, "summary");
outputFormat = Objects.requireNonNullElse(outputFormat, "unknown").trim(); outputFormat = Objects.requireNonNullElse(outputFormat, OutputFormatCatalog.UNKNOWN);
outputCodec = Objects.requireNonNullElse(outputCodec, OutputCodecCatalog.UNKNOWN); outputCodec = Objects.requireNonNullElse(outputCodec, OutputCodecCatalog.UNKNOWN);
availableOutputCodecs = List.copyOf(Objects.requireNonNull(availableOutputCodecs, "availableOutputCodecs")); availableOutputCodecs = List.copyOf(Objects.requireNonNull(availableOutputCodecs, "availableOutputCodecs"));
codecConfigurationFieldsByCodec = Map.copyOf(Objects.requireNonNull(codecConfigurationFieldsByCodec, "codecConfigurationFieldsByCodec")); codecConfigurationFieldsByCodec = Map.copyOf(Objects.requireNonNull(codecConfigurationFieldsByCodec, "codecConfigurationFieldsByCodec"));

View File

@ -1,7 +1,7 @@
package p.packer.models; package p.packer.models;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.AssetReference; import p.packer.messages.AssetReference;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.assets.PackerAssetState; import p.packer.messages.assets.PackerAssetState;
import p.packer.messages.assets.PackerBuildParticipation; import p.packer.messages.assets.PackerBuildParticipation;

View File

@ -10,11 +10,7 @@ import p.packer.models.PackerRegistryState;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList; import java.util.*;
import java.util.Comparator;
import java.util.HashSet;
import java.util.List;
import java.util.Set;
public final class FileSystemPackerRegistryRepository implements PackerRegistryRepository { public final class FileSystemPackerRegistryRepository implements PackerRegistryRepository {
private static final ObjectMapper MAPPER = new ObjectMapper(); private static final ObjectMapper MAPPER = new ObjectMapper();

View File

@ -1,46 +1,17 @@
package p.packer.services; package p.packer.services;
import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import p.packer.messages.PackerOperationStatus; import com.fasterxml.jackson.databind.node.ObjectNode;
import p.packer.messages.PackerProjectContext; import p.packer.PackerWorkspaceService;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.AssetReference;
import p.packer.messages.GetAssetActionsRequest;
import p.packer.messages.GetAssetActionsResult;
import p.packer.messages.MoveAssetRequest;
import p.packer.messages.MoveAssetResult;
import p.packer.messages.assets.OutputFormatCatalog;
import p.packer.messages.assets.PackerAssetState;
import p.packer.messages.assets.PackerBuildParticipation;
import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.diagnostics.PackerDiagnosticSeverity;
import p.packer.events.PackerEventKind; import p.packer.events.PackerEventKind;
import p.packer.events.PackerEventSink; import p.packer.events.PackerEventSink;
import p.packer.events.PackerProgress; import p.packer.events.PackerProgress;
import p.packer.messages.CreateAssetRequest; import p.packer.messages.*;
import p.packer.messages.CreateAssetResult; import p.packer.messages.assets.*;
import p.packer.messages.DeleteAssetRequest; import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.DeleteAssetResult; import p.packer.messages.diagnostics.PackerDiagnosticSeverity;
import p.packer.messages.GetAssetDetailsRequest; import p.packer.models.*;
import p.packer.messages.GetAssetDetailsResult;
import p.packer.messages.InitWorkspaceRequest;
import p.packer.messages.InitWorkspaceResult;
import p.packer.messages.ListAssetsRequest;
import p.packer.messages.ListAssetsResult;
import p.packer.messages.RegisterAssetRequest;
import p.packer.messages.RegisterAssetResult;
import p.packer.PackerWorkspaceService;
import p.packer.models.PackerAssetDeclarationParseResult;
import p.packer.models.PackerDeleteAssetEvaluation;
import p.packer.models.PackerAssetIdentity;
import p.packer.models.PackerMoveAssetEvaluation;
import p.packer.models.PackerRegisterAssetEvaluation;
import p.packer.models.PackerAssetSummary;
import p.packer.models.PackerDiagnostic;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerRegistryState;
import p.packer.models.PackerRuntimeAsset;
import p.packer.models.PackerRuntimeSnapshot;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
@ -115,7 +86,7 @@ public final class FileSystemPackerWorkspaceService implements PackerWorkspaceSe
events.emit( events.emit(
PackerEventKind.ASSET_DISCOVERED, PackerEventKind.ASSET_DISCOVERED,
"Discovered asset: " + summary.identity().assetName(), "Discovered asset: " + summary.identity().assetName(),
new PackerProgress(total == 0 ? 1.0d : (index + 1) / (double) total, false), new PackerProgress((index + 1) / (double) total, false),
List.of(summary.identity().assetName())); List.of(summary.identity().assetName()));
} }
@ -405,9 +376,9 @@ public final class FileSystemPackerWorkspaceService implements PackerWorkspaceSe
sourceRoot, sourceRoot,
targetRoot, targetRoot,
targetManifestPath)); targetManifestPath));
final AssetReference canonicalReference = updatedEntry.isPresent() final AssetReference canonicalReference = updatedEntry
? AssetReference.forAssetId(updatedEntry.get().assetId()) .map(packerRegistryEntry -> AssetReference.forAssetId(packerRegistryEntry.assetId()))
: AssetReference.forRelativeAssetRoot(targetRelativeRoot); .orElseGet(() -> AssetReference.forRelativeAssetRoot(targetRelativeRoot));
final MoveAssetResult result = new MoveAssetResult( final MoveAssetResult result = new MoveAssetResult(
PackerOperationStatus.SUCCESS, PackerOperationStatus.SUCCESS,
"Asset moved: " + sourceRelativeRoot + " -> " + targetRelativeRoot, "Asset moved: " + sourceRelativeRoot + " -> " + targetRelativeRoot,
@ -603,4 +574,111 @@ public final class FileSystemPackerWorkspaceService implements PackerWorkspaceSe
.toList(); .toList();
return registry.withAssets(updatedEntries, registry.nextAssetId()); return registry.withAssets(updatedEntries, registry.nextAssetId());
} }
@Override
public UpdateAssetContractResponse updateAssetContract(final UpdateAssetContractRequest request) {
final UpdateAssetContractRequest safeRequest = Objects.requireNonNull(request, "request");
final PackerProjectContext project = safeRequest.project();
return writeCoordinator.execute(project, () -> updateAssetContractInWriteLane(safeRequest));
}
private UpdateAssetContractResponse updateAssetContractInWriteLane(UpdateAssetContractRequest request) {
final PackerProjectContext project = request.project();
workspaceFoundation.initWorkspace(new InitWorkspaceRequest(project));
final PackerRuntimeSnapshot snapshot = runtimeRegistry.getOrLoad(project).snapshot();
final PackerDeleteAssetEvaluation evaluation = actionReadService.evaluateDelete(snapshot, project, request.assetReference());
if (!evaluation.canDelete()) {
return new UpdateAssetContractResponse(
false,
Objects.requireNonNullElse(evaluation.reason(), "Asset contract cannot be updated."));
}
if (request.outputCodec() == OutputCodecCatalog.UNKNOWN) {
return new UpdateAssetContractResponse(false, "Output codec is required.");
}
final Path assetRoot = evaluation.resolved().assetRoot();
final Path manifestPath = assetRoot.resolve("asset.json");
if (!Files.isRegularFile(manifestPath)) {
return new UpdateAssetContractResponse(false, "asset.json was not found for the requested asset root.");
}
final ObjectNode manifest;
try {
final JsonNode rawManifest = MAPPER.readTree(manifestPath.toFile());
if (!(rawManifest instanceof ObjectNode objectNode)) {
return new UpdateAssetContractResponse(false, "asset.json must contain a JSON object at the root.");
}
manifest = objectNode;
} catch (IOException exception) {
return new UpdateAssetContractResponse(false, "Unable to read asset manifest: " + exception.getMessage());
}
final OutputFormatCatalog outputFormat = resolveManifestOutputFormat(manifest);
if (outputFormat == OutputFormatCatalog.UNKNOWN) {
return new UpdateAssetContractResponse(false, "Output format is missing or invalid in asset.json.");
}
if (!outputFormat.supports(request.outputCodec())) {
return new UpdateAssetContractResponse(false, "Output codec is not supported for the selected output format.");
}
try {
patchManifestContract(manifest, request);
MAPPER.writerWithDefaultPrettyPrinter().writeValue(manifestPath.toFile(), manifest);
runtimeRegistry.update(project, (currentSnapshot, generation) -> runtimePatchService.afterUpdateAssetContract(
currentSnapshot,
generation,
assetRoot,
manifestPath,
evaluation.resolved().registryEntry()));
return new UpdateAssetContractResponse(true, null);
} catch (IOException exception) {
return new UpdateAssetContractResponse(false, "Unable to update asset contract: " + exception.getMessage());
} catch (RuntimeException exception) {
return new UpdateAssetContractResponse(false, "Unable to update runtime snapshot: " + exception.getMessage());
}
}
private OutputFormatCatalog resolveManifestOutputFormat(ObjectNode manifest) {
final JsonNode outputNode = manifest.get("output");
if (!(outputNode instanceof ObjectNode outputObject)) {
return OutputFormatCatalog.UNKNOWN;
}
final JsonNode formatNode = outputObject.get("format");
if (formatNode == null || !formatNode.isTextual()) {
return OutputFormatCatalog.UNKNOWN;
}
return OutputFormatCatalog.fromManifestValue(formatNode.asText());
}
private void patchManifestContract(ObjectNode manifest, UpdateAssetContractRequest request) {
final ObjectNode preloadNode = mutableObject(manifest, "preload");
preloadNode.put("enabled", request.preloadEnabled());
final ObjectNode outputNode = mutableObject(manifest, "output");
outputNode.put("codec", request.outputCodec().manifestValue());
final ObjectNode codecConfigurationNode = mutableObject(outputNode, "codec_configuration");
codecConfigurationNode.removeAll();
final String selectedCodecPrefix = request.outputCodec().name() + ":";
request.codecFieldValues().forEach((fieldKey, fieldValue) -> {
if (fieldKey == null || fieldKey.isBlank() || !fieldKey.startsWith(selectedCodecPrefix)) {
return;
}
final String normalizedFieldKey = fieldKey.substring(selectedCodecPrefix.length()).trim();
if (normalizedFieldKey.isBlank()) {
return;
}
codecConfigurationNode.put(normalizedFieldKey, Objects.requireNonNullElse(fieldValue, ""));
});
}
private ObjectNode mutableObject(ObjectNode parent, String fieldName) {
final JsonNode current = parent.get(fieldName);
if (current instanceof ObjectNode objectNode) {
return objectNode;
}
final ObjectNode created = MAPPER.createObjectNode();
parent.set(fieldName, created);
return created;
}
} }

View File

@ -1,24 +1,10 @@
package p.packer.services; package p.packer.services;
import p.packer.messages.AssetReference; import p.packer.messages.*;
import p.packer.messages.GetAssetActionsRequest;
import p.packer.messages.GetAssetActionsResult;
import p.packer.messages.PackerOperationStatus;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.assets.AssetAction; import p.packer.messages.assets.AssetAction;
import p.packer.messages.diagnostics.PackerDiagnosticCategory; import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.diagnostics.PackerDiagnosticSeverity; import p.packer.messages.diagnostics.PackerDiagnosticSeverity;
import p.packer.models.PackerAssetActionAvailability; import p.packer.models.*;
import p.packer.models.PackerAssetDeclaration;
import p.packer.models.PackerAssetDeclarationParseResult;
import p.packer.models.PackerDeleteAssetEvaluation;
import p.packer.models.PackerDiagnostic;
import p.packer.models.PackerMoveAssetEvaluation;
import p.packer.models.PackerRegisterAssetEvaluation;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerResolvedAssetReference;
import p.packer.models.PackerRuntimeAsset;
import p.packer.models.PackerRuntimeSnapshot;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList; import java.util.ArrayList;

View File

@ -4,6 +4,7 @@ import com.fasterxml.jackson.databind.JsonNode;
import com.fasterxml.jackson.databind.ObjectMapper; import com.fasterxml.jackson.databind.ObjectMapper;
import p.packer.messages.assets.AssetFamilyCatalog; import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.assets.OutputCodecCatalog; import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import p.packer.messages.diagnostics.PackerDiagnosticCategory; import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.diagnostics.PackerDiagnosticSeverity; import p.packer.messages.diagnostics.PackerDiagnosticSeverity;
import p.packer.models.PackerAssetDeclaration; import p.packer.models.PackerAssetDeclaration;
@ -12,11 +13,7 @@ import p.packer.models.PackerDiagnostic;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList; import java.util.*;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
public final class PackerAssetDeclarationParser { public final class PackerAssetDeclarationParser {
private static final ObjectMapper MAPPER = new ObjectMapper(); private static final ObjectMapper MAPPER = new ObjectMapper();
@ -43,7 +40,7 @@ public final class PackerAssetDeclarationParser {
final String name = requiredText(root, "name", diagnostics, manifestPath); final String name = requiredText(root, "name", diagnostics, manifestPath);
final AssetFamilyCatalog assetFamily = requiredAssetFamily(root, diagnostics, manifestPath); final AssetFamilyCatalog assetFamily = requiredAssetFamily(root, diagnostics, manifestPath);
final Map<String, List<String>> inputsByRole = requiredInputs(root.path("inputs"), diagnostics, manifestPath); final Map<String, List<String>> inputsByRole = requiredInputs(root.path("inputs"), diagnostics, manifestPath);
final String outputFormat = requiredText(root.path("output"), "format", diagnostics, manifestPath); final OutputFormatCatalog outputFormat = requiredOutputFormat(root.path("output"), diagnostics, manifestPath);
final OutputCodecCatalog outputCodec = requiredOutputCodec(root.path("output"), diagnostics, manifestPath); final OutputCodecCatalog outputCodec = requiredOutputCodec(root.path("output"), diagnostics, manifestPath);
final Boolean preloadEnabled = requiredBoolean(root.path("preload"), "enabled", diagnostics, manifestPath); final Boolean preloadEnabled = requiredBoolean(root.path("preload"), "enabled", diagnostics, manifestPath);
@ -118,6 +115,24 @@ public final class PackerAssetDeclarationParser {
return field.booleanValue(); return field.booleanValue();
} }
private OutputFormatCatalog requiredOutputFormat(JsonNode node, List<PackerDiagnostic> diagnostics, Path manifestPath) {
final String fmtValue = requiredText(node, "format", diagnostics, manifestPath);
if (fmtValue == null) {
return null;
}
final OutputFormatCatalog outputFormat = OutputFormatCatalog.fromManifestValue(fmtValue);
if (outputFormat == OutputFormatCatalog.UNKNOWN) {
diagnostics.add(new PackerDiagnostic(
PackerDiagnosticSeverity.ERROR,
PackerDiagnosticCategory.STRUCTURAL,
"Field 'output' must have a valid value.",
manifestPath,
true));
return null;
}
return outputFormat;
}
private OutputCodecCatalog requiredOutputCodec(JsonNode node, List<PackerDiagnostic> diagnostics, Path manifestPath) { private OutputCodecCatalog requiredOutputCodec(JsonNode node, List<PackerDiagnostic> diagnostics, Path manifestPath) {
final String codecValue = requiredText(node, "codec", diagnostics, manifestPath); final String codecValue = requiredText(node, "codec", diagnostics, manifestPath);
if (codecValue == null) { if (codecValue == null) {
@ -128,7 +143,7 @@ public final class PackerAssetDeclarationParser {
diagnostics.add(new PackerDiagnostic( diagnostics.add(new PackerDiagnostic(
PackerDiagnosticSeverity.ERROR, PackerDiagnosticSeverity.ERROR,
PackerDiagnosticCategory.STRUCTURAL, PackerDiagnosticCategory.STRUCTURAL,
"Field 'codec' must be one of: NONE.", "Field 'codec' must have a valid value.",
manifestPath, manifestPath,
true)); true));
return null; return null;

View File

@ -1,34 +1,13 @@
package p.packer.services; package p.packer.services;
import p.packer.messages.PackerOperationStatus; import p.packer.messages.*;
import p.packer.messages.PackerProjectContext; import p.packer.messages.assets.*;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.AssetReference;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.PackerAssetState;
import p.packer.messages.assets.PackerBuildParticipation;
import p.packer.messages.diagnostics.PackerDiagnosticCategory; import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.diagnostics.PackerDiagnosticSeverity; import p.packer.messages.diagnostics.PackerDiagnosticSeverity;
import p.packer.messages.GetAssetDetailsRequest; import p.packer.models.*;
import p.packer.messages.GetAssetDetailsResult;
import p.packer.models.PackerAssetDeclaration;
import p.packer.models.PackerAssetDeclarationParseResult;
import p.packer.models.PackerAssetDetails;
import p.packer.models.PackerAssetIdentity;
import p.packer.models.PackerAssetSummary;
import p.packer.models.PackerDiagnostic;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerResolvedAssetReference;
import p.packer.models.PackerRuntimeAsset;
import p.packer.models.PackerRuntimeSnapshot;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList; import java.util.*;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
public final class PackerAssetDetailsService { public final class PackerAssetDetailsService {
private final PackerRuntimeRegistry runtimeRegistry; private final PackerRuntimeRegistry runtimeRegistry;
@ -126,7 +105,7 @@ public final class PackerAssetDetailsService {
true); true);
final PackerAssetDetails details = new PackerAssetDetails( final PackerAssetDetails details = new PackerAssetDetails(
summary, summary,
"unknown", OutputFormatCatalog.UNKNOWN,
OutputCodecCatalog.UNKNOWN, OutputCodecCatalog.UNKNOWN,
List.of(OutputCodecCatalog.NONE), List.of(OutputCodecCatalog.NONE),
Map.of(OutputCodecCatalog.NONE, List.of()), Map.of(OutputCodecCatalog.NONE, List.of()),

View File

@ -4,11 +4,7 @@ import p.packer.messages.AssetReference;
import p.packer.messages.PackerProjectContext; import p.packer.messages.PackerProjectContext;
import p.packer.messages.diagnostics.PackerDiagnosticCategory; import p.packer.messages.diagnostics.PackerDiagnosticCategory;
import p.packer.messages.diagnostics.PackerDiagnosticSeverity; import p.packer.messages.diagnostics.PackerDiagnosticSeverity;
import p.packer.models.PackerDiagnostic; import p.packer.models.*;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerResolvedAssetReference;
import p.packer.models.PackerRuntimeAsset;
import p.packer.models.PackerRuntimeSnapshot;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.List; import java.util.List;

View File

@ -1,10 +1,10 @@
package p.packer.services; package p.packer.services;
import p.packer.messages.PackerProjectContext;
import p.packer.events.PackerEvent; import p.packer.events.PackerEvent;
import p.packer.events.PackerEventKind; import p.packer.events.PackerEventKind;
import p.packer.events.PackerEventSink; import p.packer.events.PackerEventSink;
import p.packer.events.PackerProgress; import p.packer.events.PackerProgress;
import p.packer.messages.PackerProjectContext;
import java.time.Instant; import java.time.Instant;
import java.util.List; import java.util.List;

View File

@ -3,18 +3,14 @@ package p.packer.services;
import p.packer.messages.assets.OutputCodecCatalog; import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog; import p.packer.messages.assets.OutputFormatCatalog;
import p.packer.models.PackerCodecConfigurationField; import p.packer.models.PackerCodecConfigurationField;
import java.util.LinkedHashSet;
import java.util.List; import java.util.*;
import java.util.Locale;
import java.util.Map;
import java.util.Objects;
import java.util.Set;
final class PackerOutputContractCatalog { final class PackerOutputContractCatalog {
private PackerOutputContractCatalog() { private PackerOutputContractCatalog() {
} }
static OutputContractDefinition definitionFor(String outputFormat, OutputCodecCatalog selectedCodec) { static OutputContractDefinition definitionFor(OutputFormatCatalog outputFormat, OutputCodecCatalog selectedCodec) {
final List<OutputCodecCatalog> availableCodecs = availableCodecsFor(outputFormat, selectedCodec); final List<OutputCodecCatalog> availableCodecs = availableCodecsFor(outputFormat, selectedCodec);
return new OutputContractDefinition( return new OutputContractDefinition(
availableCodecs, availableCodecs,
@ -25,13 +21,12 @@ final class PackerOutputContractCatalog {
java.util.LinkedHashMap::new))); java.util.LinkedHashMap::new)));
} }
static List<OutputCodecCatalog> availableCodecsFor(String outputFormat, OutputCodecCatalog selectedCodec) { static List<OutputCodecCatalog> availableCodecsFor(OutputFormatCatalog outputFormat, OutputCodecCatalog selectedCodec) {
final Set<OutputCodecCatalog> codecs = new LinkedHashSet<>(); final Set<OutputCodecCatalog> codecs = new LinkedHashSet<>();
final OutputFormatCatalog formatCatalog = OutputFormatCatalog.fromManifestValue(outputFormat); if (outputFormat != OutputFormatCatalog.UNKNOWN) {
if (formatCatalog != OutputFormatCatalog.UNKNOWN) { codecs.addAll(outputFormat.availableCodecs());
codecs.addAll(formatCatalog.availableCodecs());
} else { } else {
final String normalizedFormat = Objects.requireNonNullElse(outputFormat, "").trim().toUpperCase(Locale.ROOT); final String normalizedFormat = outputFormat.manifestValue().trim().toUpperCase(Locale.ROOT);
if (normalizedFormat.startsWith("TILES/") if (normalizedFormat.startsWith("TILES/")
|| normalizedFormat.startsWith("PALETTE/") || normalizedFormat.startsWith("PALETTE/")
|| normalizedFormat.startsWith("SOUND/") || normalizedFormat.startsWith("SOUND/")
@ -51,7 +46,7 @@ final class PackerOutputContractCatalog {
return List.copyOf(codecs); return List.copyOf(codecs);
} }
private static List<PackerCodecConfigurationField> fieldsFor(String outputFormat, OutputCodecCatalog codec) { private static List<PackerCodecConfigurationField> fieldsFor(OutputFormatCatalog outputFormat, OutputCodecCatalog codec) {
return List.of(); return List.of();
} }

View File

@ -5,15 +5,7 @@ import p.packer.messages.PackerProjectContext;
import java.io.Closeable; import java.io.Closeable;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.Objects; import java.util.Objects;
import java.util.concurrent.Callable; import java.util.concurrent.*;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
import java.util.concurrent.ThreadPoolExecutor;
import java.util.concurrent.TimeUnit;
import java.util.concurrent.atomic.AtomicInteger; import java.util.concurrent.atomic.AtomicInteger;
public final class PackerProjectWriteCoordinator implements Closeable { public final class PackerProjectWriteCoordinator implements Closeable {

View File

@ -1,18 +1,8 @@
package p.packer.services; package p.packer.services;
import p.packer.dtos.PackerAssetDetailsDTO; import p.packer.dtos.*;
import p.packer.dtos.PackerAssetActionAvailabilityDTO;
import p.packer.dtos.PackerAssetIdentityDTO;
import p.packer.dtos.PackerAssetSummaryDTO;
import p.packer.dtos.PackerCodecConfigurationFieldDTO;
import p.packer.dtos.PackerDiagnosticDTO;
import p.packer.messages.assets.OutputCodecCatalog; import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.models.PackerAssetActionAvailability; import p.packer.models.*;
import p.packer.models.PackerAssetDetails;
import p.packer.models.PackerAssetIdentity;
import p.packer.models.PackerAssetSummary;
import p.packer.models.PackerCodecConfigurationField;
import p.packer.models.PackerDiagnostic;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;

View File

@ -1,7 +1,7 @@
package p.packer.services; package p.packer.services;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.InitWorkspaceRequest; import p.packer.messages.InitWorkspaceRequest;
import p.packer.messages.PackerProjectContext;
import p.packer.models.PackerRegistryEntry; import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerRegistryState; import p.packer.models.PackerRegistryState;
import p.packer.models.PackerRuntimeAsset; import p.packer.models.PackerRuntimeAsset;
@ -10,12 +10,7 @@ import p.packer.models.PackerRuntimeSnapshot;
import java.io.IOException; import java.io.IOException;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList; import java.util.*;
import java.util.Comparator;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.stream.Collectors; import java.util.stream.Collectors;
import java.util.stream.Stream; import java.util.stream.Stream;

View File

@ -1,17 +1,9 @@
package p.packer.services; package p.packer.services;
import p.packer.models.PackerAssetDeclarationParseResult; import p.packer.models.*;
import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerRegistryState;
import p.packer.models.PackerRuntimeAsset;
import p.packer.models.PackerRuntimeSnapshot;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList; import java.util.*;
import java.util.Comparator;
import java.util.List;
import java.util.Objects;
import java.util.Optional;
public final class PackerRuntimePatchService { public final class PackerRuntimePatchService {
private final PackerAssetDeclarationParser declarationParser; private final PackerAssetDeclarationParser declarationParser;
@ -81,7 +73,7 @@ public final class PackerRuntimePatchService {
PackerRuntimeSnapshot snapshot, PackerRuntimeSnapshot snapshot,
long generation, long generation,
PackerRegistryState updatedRegistry, PackerRegistryState updatedRegistry,
java.util.Optional<PackerRegistryEntry> updatedRegistryEntry, Optional<PackerRegistryEntry> updatedRegistryEntry,
Path sourceRoot, Path sourceRoot,
Path targetRoot, Path targetRoot,
Path targetManifestPath) { Path targetManifestPath) {
@ -106,4 +98,36 @@ public final class PackerRuntimePatchService {
updatedAssets.sort(Comparator.comparing(asset -> asset.assetRoot().toString(), String.CASE_INSENSITIVE_ORDER)); updatedAssets.sort(Comparator.comparing(asset -> asset.assetRoot().toString(), String.CASE_INSENSITIVE_ORDER));
return new PackerRuntimeSnapshot(generation, updatedRegistry, updatedAssets); return new PackerRuntimeSnapshot(generation, updatedRegistry, updatedAssets);
} }
public PackerRuntimeSnapshot afterUpdateAssetContract(
PackerRuntimeSnapshot snapshot,
long generation,
Path assetRoot,
Path manifestPath,
Optional<PackerRegistryEntry> registryEntry) {
final PackerAssetDeclarationParseResult parsed = declarationParser.parse(manifestPath);
final List<PackerRuntimeAsset> updatedAssets = new ArrayList<>();
boolean patched = false;
for (PackerRuntimeAsset asset : snapshot.assets()) {
if (asset.assetRoot().equals(assetRoot.toAbsolutePath().normalize())) {
updatedAssets.add(new PackerRuntimeAsset(
asset.assetRoot(),
asset.manifestPath(),
asset.registryEntry(),
parsed));
patched = true;
} else {
updatedAssets.add(asset);
}
}
if (!patched) {
updatedAssets.add(new PackerRuntimeAsset(
assetRoot,
manifestPath,
registryEntry,
parsed));
updatedAssets.sort(Comparator.comparing(asset -> asset.assetRoot().toString(), String.CASE_INSENSITIVE_ORDER));
}
return new PackerRuntimeSnapshot(generation, snapshot.registry(), updatedAssets);
}
} }

View File

@ -4,12 +4,12 @@ import p.packer.messages.PackerProjectContext;
import p.packer.models.PackerRuntimeSnapshot; import p.packer.models.PackerRuntimeSnapshot;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.function.BiFunction;
import java.util.Objects; import java.util.Objects;
import java.util.Optional; import java.util.Optional;
import java.util.concurrent.ConcurrentHashMap; import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap; import java.util.concurrent.ConcurrentMap;
import java.util.concurrent.atomic.AtomicLong; import java.util.concurrent.atomic.AtomicLong;
import java.util.function.BiFunction;
public final class PackerRuntimeRegistry { public final class PackerRuntimeRegistry {
private final PackerRuntimeSnapshotLoader loader; private final PackerRuntimeSnapshotLoader loader;

View File

@ -1,9 +1,9 @@
package p.packer.services; package p.packer.services;
import p.packer.messages.PackerOperationStatus;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.InitWorkspaceRequest; import p.packer.messages.InitWorkspaceRequest;
import p.packer.messages.InitWorkspaceResult; import p.packer.messages.InitWorkspaceResult;
import p.packer.messages.PackerOperationStatus;
import p.packer.messages.PackerProjectContext;
import p.packer.models.PackerRegistryEntry; import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerRegistryState; import p.packer.models.PackerRegistryState;

View File

@ -1,29 +1,12 @@
package p.packer.services; package p.packer.services;
import com.fasterxml.jackson.databind.ObjectMapper;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;
import p.packer.messages.PackerOperationStatus;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import p.packer.messages.AssetReference;
import p.packer.messages.assets.PackerBuildParticipation;
import p.packer.messages.assets.PackerAssetState;
import p.packer.events.PackerEvent; import p.packer.events.PackerEvent;
import p.packer.events.PackerEventKind; import p.packer.events.PackerEventKind;
import p.packer.messages.CreateAssetRequest; import p.packer.messages.*;
import p.packer.messages.CreateAssetResult; import p.packer.messages.assets.*;
import p.packer.messages.DeleteAssetRequest;
import p.packer.messages.DeleteAssetResult;
import p.packer.messages.GetAssetActionsRequest;
import p.packer.messages.GetAssetDetailsRequest;
import p.packer.messages.ListAssetsRequest;
import p.packer.messages.MoveAssetRequest;
import p.packer.messages.MoveAssetResult;
import p.packer.messages.RegisterAssetRequest;
import p.packer.messages.RegisterAssetResult;
import p.packer.messages.assets.AssetAction;
import p.packer.testing.PackerFixtureLocator; import p.packer.testing.PackerFixtureLocator;
import java.nio.file.Files; import java.nio.file.Files;
@ -31,6 +14,7 @@ import java.nio.file.Path;
import java.util.Comparator; import java.util.Comparator;
import java.util.HashSet; import java.util.HashSet;
import java.util.List; import java.util.List;
import java.util.Map;
import java.util.concurrent.CopyOnWriteArrayList; import java.util.concurrent.CopyOnWriteArrayList;
import java.util.concurrent.Executors; import java.util.concurrent.Executors;
import java.util.concurrent.Future; import java.util.concurrent.Future;
@ -38,6 +22,8 @@ import java.util.concurrent.Future;
import static org.junit.jupiter.api.Assertions.*; import static org.junit.jupiter.api.Assertions.*;
final class FileSystemPackerWorkspaceServiceTest { final class FileSystemPackerWorkspaceServiceTest {
private static final ObjectMapper MAPPER = new ObjectMapper();
@TempDir @TempDir
Path tempDir; Path tempDir;
@ -193,6 +179,77 @@ final class FileSystemPackerWorkspaceServiceTest {
assertEquals(2, loader.loadCount()); assertEquals(2, loader.loadCount());
} }
@Test
void updatesAssetContractManifestAndReturnsSuccess() throws Exception {
final Path projectRoot = copyFixture("workspaces/managed-basic", tempDir.resolve("update-contract-success"));
final FileSystemPackerWorkspaceService service = service();
final var result = service.updateAssetContract(new UpdateAssetContractRequest(
project(projectRoot),
AssetReference.forAssetId(1),
false,
OutputCodecCatalog.NONE,
Map.of(
"NONE:packMode", "tight",
"NONE:palette", "mono")));
assertTrue(result.success());
assertNull(result.errorMessage());
final Path manifestPath = projectRoot.resolve("assets/ui/atlas/asset.json");
final var manifest = MAPPER.readTree(manifestPath.toFile());
assertFalse(manifest.path("preload").path("enabled").asBoolean(true));
assertEquals("NONE", manifest.path("output").path("codec").asText());
assertEquals("tight", manifest.path("output").path("codec_configuration").path("packMode").asText());
assertEquals("mono", manifest.path("output").path("codec_configuration").path("palette").asText());
}
@Test
void updateAssetContractPatchesLoadedSnapshotWithoutWholeProjectReload() throws Exception {
final Path projectRoot = copyFixture("workspaces/managed-basic", tempDir.resolve("update-contract-no-reload"));
final CountingLoader loader = countingLoader();
final FileSystemPackerWorkspaceService service = service(ignored -> { }, loader);
service.listAssets(new ListAssetsRequest(project(projectRoot)));
assertEquals(1, loader.loadCount());
final var updateResult = service.updateAssetContract(new UpdateAssetContractRequest(
project(projectRoot),
AssetReference.forAssetId(1),
false,
OutputCodecCatalog.NONE,
Map.of("NONE:packMode", "tight")));
assertTrue(updateResult.success());
assertEquals(1, loader.loadCount());
final var detailsResult = service.getAssetDetails(new GetAssetDetailsRequest(
project(projectRoot),
AssetReference.forAssetId(1)));
assertEquals(PackerOperationStatus.SUCCESS, detailsResult.status());
assertFalse(detailsResult.details().summary().preloadEnabled());
assertEquals(OutputCodecCatalog.NONE, detailsResult.details().outputCodec());
assertEquals(1, loader.loadCount());
}
@Test
void returnsFailureWhenAssetManifestIsMissingOnContractUpdate() throws Exception {
final Path projectRoot = copyFixture("workspaces/managed-basic", tempDir.resolve("update-contract-missing-manifest"));
Files.delete(projectRoot.resolve("assets/ui/atlas/asset.json"));
final FileSystemPackerWorkspaceService service = service();
final var result = service.updateAssetContract(new UpdateAssetContractRequest(
project(projectRoot),
AssetReference.forAssetId(1),
true,
OutputCodecCatalog.NONE,
Map.of()));
assertFalse(result.success());
assertNotNull(result.errorMessage());
assertTrue(result.errorMessage().contains("asset.json was not found"));
}
@Test @Test
void exposesRegisterActionForValidUnregisteredAsset() throws Exception { void exposesRegisterActionForValidUnregisteredAsset() throws Exception {
final Path projectRoot = copyFixture("workspaces/orphan-valid", tempDir.resolve("orphan-actions")); final Path projectRoot = copyFixture("workspaces/orphan-valid", tempDir.resolve("orphan-actions"));

View File

@ -28,7 +28,7 @@ final class PackerAssetDeclarationParserTest {
assertEquals("fixture-uuid-1", result.declaration().assetUuid()); assertEquals("fixture-uuid-1", result.declaration().assetUuid());
assertEquals("ui_atlas", result.declaration().name()); assertEquals("ui_atlas", result.declaration().name());
assertEquals(AssetFamilyCatalog.IMAGE_BANK, result.declaration().assetFamily()); assertEquals(AssetFamilyCatalog.IMAGE_BANK, result.declaration().assetFamily());
assertEquals("TILES/indexed_v1", result.declaration().outputFormat()); assertEquals("TILES/indexed_v1", result.declaration().outputFormat().displayName());
assertEquals(OutputCodecCatalog.NONE, result.declaration().outputCodec()); assertEquals(OutputCodecCatalog.NONE, result.declaration().outputCodec());
assertTrue(result.declaration().preloadEnabled()); assertTrue(result.declaration().preloadEnabled());
} }

View File

@ -2,13 +2,13 @@ package p.packer.services;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;
import p.packer.messages.AssetReference;
import p.packer.messages.GetAssetDetailsRequest;
import p.packer.messages.PackerOperationStatus; import p.packer.messages.PackerOperationStatus;
import p.packer.messages.PackerProjectContext; import p.packer.messages.PackerProjectContext;
import p.packer.messages.AssetReference;
import p.packer.messages.assets.PackerBuildParticipation;
import p.packer.messages.assets.OutputCodecCatalog; import p.packer.messages.assets.OutputCodecCatalog;
import p.packer.messages.assets.PackerAssetState; import p.packer.messages.assets.PackerAssetState;
import p.packer.messages.GetAssetDetailsRequest; import p.packer.messages.assets.PackerBuildParticipation;
import p.packer.testing.PackerFixtureLocator; import p.packer.testing.PackerFixtureLocator;
import java.nio.file.Files; import java.nio.file.Files;
@ -34,7 +34,7 @@ final class PackerAssetDetailsServiceTest {
assertEquals(PackerBuildParticipation.INCLUDED, result.details().summary().buildParticipation()); assertEquals(PackerBuildParticipation.INCLUDED, result.details().summary().buildParticipation());
assertEquals("fixture-uuid-1", result.details().summary().identity().assetUuid()); assertEquals("fixture-uuid-1", result.details().summary().identity().assetUuid());
assertEquals("ui_atlas", result.details().summary().identity().assetName()); assertEquals("ui_atlas", result.details().summary().identity().assetName());
assertEquals("TILES/indexed_v1", result.details().outputFormat()); assertEquals("TILES/indexed_v1", result.details().outputFormat().displayName());
assertEquals(List.of(OutputCodecCatalog.NONE), result.details().availableOutputCodecs()); assertEquals(List.of(OutputCodecCatalog.NONE), result.details().availableOutputCodecs());
assertEquals(List.of(), result.details().codecConfigurationFieldsByCodec().get(OutputCodecCatalog.NONE)); assertEquals(List.of(), result.details().codecConfigurationFieldsByCodec().get(OutputCodecCatalog.NONE));
assertTrue(result.diagnostics().isEmpty()); assertTrue(result.diagnostics().isEmpty());

View File

@ -2,8 +2,8 @@ package p.packer.services;
import org.junit.jupiter.api.Test; import org.junit.jupiter.api.Test;
import org.junit.jupiter.api.io.TempDir; import org.junit.jupiter.api.io.TempDir;
import p.packer.messages.PackerProjectContext;
import p.packer.messages.InitWorkspaceRequest; import p.packer.messages.InitWorkspaceRequest;
import p.packer.messages.PackerProjectContext;
import p.packer.models.PackerRegistryEntry; import p.packer.models.PackerRegistryEntry;
import p.packer.models.PackerRegistryState; import p.packer.models.PackerRegistryState;

View File

@ -55,4 +55,10 @@ public final class StudioFormSession<T> {
resetDraft(); resetDraft();
mode = StudioFormMode.READ_ONLY; mode = StudioFormMode.READ_ONLY;
} }
public T apply() {
source = draft;
mode = StudioFormMode.READ_ONLY;
return source;
}
} }

View File

@ -15,11 +15,11 @@ import p.studio.controls.lifecycle.StudioControlLifecycle;
import p.studio.controls.lifecycle.StudioControlLifecycleSupport; import p.studio.controls.lifecycle.StudioControlLifecycleSupport;
import p.studio.events.*; import p.studio.events.*;
import p.studio.projects.ProjectReference; import p.studio.projects.ProjectReference;
import p.studio.utilities.events.EventSubscription;
import p.studio.utilities.i18n.I18n;
import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshFailedEvent; import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshFailedEvent;
import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshStartedEvent; import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshStartedEvent;
import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshedEvent; import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshedEvent;
import p.studio.utilities.events.EventSubscription;
import p.studio.utilities.i18n.I18n;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;

View File

@ -5,12 +5,7 @@ import java.io.UncheckedIOException;
import java.nio.charset.StandardCharsets; import java.nio.charset.StandardCharsets;
import java.nio.file.Files; import java.nio.file.Files;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.ArrayList; import java.util.*;
import java.util.Comparator;
import java.util.LinkedHashSet;
import java.util.List;
import java.util.Objects;
import java.util.Set;
public final class KnownProjectsService { public final class KnownProjectsService {
private final Path storageFile; private final Path storageFile;

View File

@ -15,20 +15,12 @@ import javafx.stage.Modality;
import javafx.stage.Stage; import javafx.stage.Stage;
import javafx.stage.Window; import javafx.stage.Window;
import p.studio.Container; import p.studio.Container;
import p.studio.projects.ProjectCatalogService; import p.studio.projects.*;
import p.studio.projects.ProjectCreationRequest;
import p.studio.projects.ProjectLanguageCatalogService;
import p.studio.projects.ProjectLanguageTemplate;
import p.studio.projects.ProjectReference;
import p.studio.utilities.i18n.I18n; import p.studio.utilities.i18n.I18n;
import java.io.File; import java.io.File;
import java.nio.file.Path; import java.nio.file.Path;
import java.util.LinkedHashMap; import java.util.*;
import java.util.List;
import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.concurrent.atomic.AtomicReference; import java.util.concurrent.atomic.AtomicReference;
public final class NewProjectWizard { public final class NewProjectWizard {

View File

@ -7,12 +7,8 @@ import javafx.scene.control.Button;
import javafx.scene.control.Label; import javafx.scene.control.Label;
import javafx.scene.control.ListCell; import javafx.scene.control.ListCell;
import javafx.scene.control.ListView; import javafx.scene.control.ListView;
import javafx.scene.layout.BorderPane;
import javafx.scene.layout.HBox;
import javafx.scene.layout.Priority;
import javafx.scene.layout.StackPane;
import javafx.scene.layout.VBox;
import javafx.scene.input.MouseButton; import javafx.scene.input.MouseButton;
import javafx.scene.layout.*;
import javafx.stage.FileChooser; import javafx.stage.FileChooser;
import p.studio.Container; import p.studio.Container;
import p.studio.projects.KnownProjectsService; import p.studio.projects.KnownProjectsService;

View File

@ -6,13 +6,7 @@ import javafx.stage.Stage;
import javafx.stage.StageStyle; import javafx.stage.StageStyle;
import p.packer.messages.InitWorkspaceRequest; import p.packer.messages.InitWorkspaceRequest;
import p.studio.Container; import p.studio.Container;
import p.studio.events.StudioProjectLoadingCompletedEvent; import p.studio.events.*;
import p.studio.events.StudioProjectLoadingFailedEvent;
import p.studio.events.StudioProjectLoadingPhase;
import p.studio.events.StudioProjectLoadingProgressEvent;
import p.studio.events.StudioProjectLoadingStartedEvent;
import p.studio.events.StudioProjectCreatedEvent;
import p.studio.events.StudioProjectOpenedEvent;
import p.studio.projects.KnownProjectsService; import p.studio.projects.KnownProjectsService;
import p.studio.projects.ProjectCatalogService; import p.studio.projects.ProjectCatalogService;
import p.studio.projects.ProjectReference; import p.studio.projects.ProjectReference;

View File

@ -5,6 +5,7 @@ import p.studio.events.StudioPackerOperationEvent;
import p.studio.events.StudioWorkspaceEventBus; import p.studio.events.StudioWorkspaceEventBus;
import p.studio.utilities.i18n.I18n; import p.studio.utilities.i18n.I18n;
import p.studio.utilities.logspane.LogsPane; import p.studio.utilities.logspane.LogsPane;
import p.studio.workspaces.assets.messages.events.StudioAssetLogEvent;
import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshFailedEvent; import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshFailedEvent;
import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshStartedEvent; import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshStartedEvent;
import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshedEvent; import p.studio.workspaces.assets.messages.events.StudioAssetsWorkspaceRefreshedEvent;
@ -29,6 +30,9 @@ public final class AssetLogsPane extends LogsPane implements StudioEventAware {
@Override @Override
public void registerEventSubscriptions() { public void registerEventSubscriptions() {
eventBindings.listen(workspaceBus, StudioAssetLogEvent.class).handle(event -> {
appendLine("[" + event.source() + "] " + event.message());
});
eventBindings.listen(workspaceBus, StudioAssetsWorkspaceRefreshStartedEvent.class).handle(event -> { eventBindings.listen(workspaceBus, StudioAssetsWorkspaceRefreshStartedEvent.class).handle(event -> {
appendLine("[refresh] Asset scan started."); appendLine("[refresh] Asset scan started.");
}); });

View File

@ -60,7 +60,7 @@ public final class AssetDetailsControl extends VBox implements StudioEventAware
this.projectReference = Objects.requireNonNull(projectReference, "projectReference"); this.projectReference = Objects.requireNonNull(projectReference, "projectReference");
this.workspaceBus = Objects.requireNonNull(workspaceBus, "workspaceBus"); this.workspaceBus = Objects.requireNonNull(workspaceBus, "workspaceBus");
this.summaryControl = new AssetDetailsSummaryControl(projectReference, workspaceBus); this.summaryControl = new AssetDetailsSummaryControl(projectReference, workspaceBus);
this.contractControl = new AssetDetailsContractControl(workspaceBus); this.contractControl = new AssetDetailsContractControl(projectReference, workspaceBus);
this.actionsSection = createActionsSection(); this.actionsSection = createActionsSection();
getStyleClass().add("assets-workspace-pane"); getStyleClass().add("assets-workspace-pane");

View File

@ -9,6 +9,7 @@ import javafx.scene.layout.Priority;
import javafx.scene.layout.VBox; import javafx.scene.layout.VBox;
import p.packer.messages.assets.AssetAction; import p.packer.messages.assets.AssetAction;
import p.packer.messages.assets.AssetFamilyCatalog; import p.packer.messages.assets.AssetFamilyCatalog;
import p.packer.messages.assets.OutputFormatCatalog;
import p.studio.Container; import p.studio.Container;
import p.studio.projects.ProjectReference; import p.studio.projects.ProjectReference;
import p.studio.utilities.i18n.I18n; import p.studio.utilities.i18n.I18n;
@ -44,6 +45,13 @@ public final class AssetDetailsUiSupport {
return createKeyValueRow(key, valueLabel); return createKeyValueRow(key, valueLabel);
} }
public static Node createKeyValueRow(String key, OutputFormatCatalog outputFormat) {
final Label valueLabel = new Label(outputFormat.displayName());
valueLabel.getStyleClass().add("assets-details-value");
valueLabel.setWrapText(true);
return createKeyValueRow(key, valueLabel);
}
public static Node createKeyValueRow(String key, Node valueNode) { public static Node createKeyValueRow(String key, Node valueNode) {
final HBox row = new HBox(12); final HBox row = new HBox(12);
row.setAlignment(Pos.TOP_LEFT); row.setAlignment(Pos.TOP_LEFT);

Some files were not shown because too many files have changed in this diff Show More