From 0d83766cdb08286adf64c54d82ef2a78755f4c1e Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Sun, 22 Mar 2026 10:24:52 +0000 Subject: Create separate sources.serialization package --- .../compiler/patio/protobuf/PatioToProtobuf.java | 4 +- .../sources/protobuf/SourceToProtobuf.java | 127 -------------------- .../sources/serialization/SourceToProtobuf.java | 128 +++++++++++++++++++++ 3 files changed, 130 insertions(+), 129 deletions(-) delete mode 100644 src/main/java/org/shedlang/compiler/sources/protobuf/SourceToProtobuf.java create mode 100644 src/main/java/org/shedlang/compiler/sources/serialization/SourceToProtobuf.java (limited to 'src/main/java') diff --git a/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java b/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java index bc1ca982..55084c16 100644 --- a/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java +++ b/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java @@ -9,8 +9,8 @@ import org.shedlang.compiler.sources.Source; import java.util.Optional; -import static org.shedlang.compiler.sources.protobuf.SourceToProtobuf.deserializeSource; -import static org.shedlang.compiler.sources.protobuf.SourceToProtobuf.serializeSource; +import static org.shedlang.compiler.sources.serialization.SourceToProtobuf.deserializeSource; +import static org.shedlang.compiler.sources.serialization.SourceToProtobuf.serializeSource; public class PatioToProtobuf { // == Compilation unit == diff --git a/src/main/java/org/shedlang/compiler/sources/protobuf/SourceToProtobuf.java b/src/main/java/org/shedlang/compiler/sources/protobuf/SourceToProtobuf.java deleted file mode 100644 index b8a390a0..00000000 --- a/src/main/java/org/shedlang/compiler/sources/protobuf/SourceToProtobuf.java +++ /dev/null @@ -1,127 +0,0 @@ -package org.shedlang.compiler.sources.protobuf; - -import org.shedlang.compiler.sources.*; -import org.zwobble.sourcetext.SourcePosition; -import org.zwobble.sourcetext.SourceRange; -import org.zwobble.sourcetext.SourceText; - -import java.util.Optional; - -public class SourceToProtobuf { - private SourceToProtobuf() { - } - - public static SourcesProtobuf.Source serializeSource( - Source source, - Source parentSource - ) { - return serializeSource(source, Optional.of(parentSource)); - } - - public static SourcesProtobuf.Source serializeSource( - Source source, - Optional parentSource - ) { - var builder = SourcesProtobuf.Source.newBuilder(); - - switch (source) { - case NullSource nullSource -> { - builder.setNullSource( - SourcesProtobuf.NullSource.newBuilder().build() - ); - } - case RuntimeSource runtimeSource -> { - builder.setRuntimeSource( - SourcesProtobuf.RuntimeSource.newBuilder().build() - ); - } - case FileFragmentSource fileFragmentSource -> { - builder.setFileFragmentSource( - serializeFileFragmentSource(fileFragmentSource, parentSource) - ); - } - default -> { - throw new UnsupportedOperationException("Unhandled source: " + source); - } - } - - return builder.build(); - } - - public static Source deserializeSource( - SourcesProtobuf.Source sourceProtobuf, - Source parentSource - ) { - return deserializeSource(sourceProtobuf, Optional.of(parentSource)); - } - - public static Source deserializeSource( - SourcesProtobuf.Source sourceProtobuf, - Optional parentSource - ) { - return switch (sourceProtobuf.getValueCase()) { - case NULL_SOURCE -> - Sources.NULL; - - case RUNTIME_SOURCE -> - Sources.RUNTIME; - - case FILE_FRAGMENT_SOURCE -> - deserializeFileFragmentSource( - sourceProtobuf.getFileFragmentSource(), - parentSource - ); - - case VALUE_NOT_SET -> { - throw new UnsupportedOperationException("TODO"); - } - }; - } - - private static SourcesProtobuf.FileFragmentSource serializeFileFragmentSource( - FileFragmentSource source, - Optional parentSource - ) { - var builder = SourcesProtobuf.FileFragmentSource.newBuilder(); - - var sourceTextName = source.sourceRange().sourceText().name(); - if (!( - parentSource.isPresent() && - parentSource.get() instanceof FileFragmentSource( - SourceRange parentSourceRange) && - parentSourceRange.sourceText().name().equals(sourceTextName) - )) { - builder.setSourceText( - SourcesProtobuf.SourceText.newBuilder() - .setName(sourceTextName) - .setContents(source.sourceRange().sourceText().charSequence().toString()) - .build() - ); - } - - builder.setStartCharacterIndex(source.sourceRange().start().characterIndex()); - builder.setEndCharacterIndex(source.sourceRange().end().characterIndex()); - - return builder.build(); - } - - private static FileFragmentSource deserializeFileFragmentSource( - SourcesProtobuf.FileFragmentSource sourceProtobuf, - Optional parentSource - ) { - SourceText sourceText; - if (sourceProtobuf.hasSourceText()) { - sourceText = SourceText.fromString( - sourceProtobuf.getSourceText().getName(), - sourceProtobuf.getSourceText().getContents() - ); - } else { - // TODO: handle missing parent - sourceText = ((FileFragmentSource) parentSource.orElseThrow()).sourceRange().sourceText(); - } - - var start = new SourcePosition(sourceText, sourceProtobuf.getStartCharacterIndex()); - var end = new SourcePosition(sourceText, sourceProtobuf.getEndCharacterIndex()); - return new FileFragmentSource(new SourceRange(sourceText, start, end)); - } -} diff --git a/src/main/java/org/shedlang/compiler/sources/serialization/SourceToProtobuf.java b/src/main/java/org/shedlang/compiler/sources/serialization/SourceToProtobuf.java new file mode 100644 index 00000000..91a1464c --- /dev/null +++ b/src/main/java/org/shedlang/compiler/sources/serialization/SourceToProtobuf.java @@ -0,0 +1,128 @@ +package org.shedlang.compiler.sources.serialization; + +import org.shedlang.compiler.sources.*; +import org.shedlang.compiler.sources.protobuf.SourcesProtobuf; +import org.zwobble.sourcetext.SourcePosition; +import org.zwobble.sourcetext.SourceRange; +import org.zwobble.sourcetext.SourceText; + +import java.util.Optional; + +public class SourceToProtobuf { + private SourceToProtobuf() { + } + + public static SourcesProtobuf.Source serializeSource( + Source source, + Source parentSource + ) { + return serializeSource(source, Optional.of(parentSource)); + } + + public static SourcesProtobuf.Source serializeSource( + Source source, + Optional parentSource + ) { + var builder = SourcesProtobuf.Source.newBuilder(); + + switch (source) { + case NullSource nullSource -> { + builder.setNullSource( + SourcesProtobuf.NullSource.newBuilder().build() + ); + } + case RuntimeSource runtimeSource -> { + builder.setRuntimeSource( + SourcesProtobuf.RuntimeSource.newBuilder().build() + ); + } + case FileFragmentSource fileFragmentSource -> { + builder.setFileFragmentSource( + serializeFileFragmentSource(fileFragmentSource, parentSource) + ); + } + default -> { + throw new UnsupportedOperationException("Unhandled source: " + source); + } + } + + return builder.build(); + } + + public static Source deserializeSource( + SourcesProtobuf.Source sourceProtobuf, + Source parentSource + ) { + return deserializeSource(sourceProtobuf, Optional.of(parentSource)); + } + + public static Source deserializeSource( + SourcesProtobuf.Source sourceProtobuf, + Optional parentSource + ) { + return switch (sourceProtobuf.getValueCase()) { + case NULL_SOURCE -> + Sources.NULL; + + case RUNTIME_SOURCE -> + Sources.RUNTIME; + + case FILE_FRAGMENT_SOURCE -> + deserializeFileFragmentSource( + sourceProtobuf.getFileFragmentSource(), + parentSource + ); + + case VALUE_NOT_SET -> { + throw new UnsupportedOperationException("TODO"); + } + }; + } + + private static SourcesProtobuf.FileFragmentSource serializeFileFragmentSource( + FileFragmentSource source, + Optional parentSource + ) { + var builder = SourcesProtobuf.FileFragmentSource.newBuilder(); + + var sourceTextName = source.sourceRange().sourceText().name(); + if (!( + parentSource.isPresent() && + parentSource.get() instanceof FileFragmentSource( + SourceRange parentSourceRange) && + parentSourceRange.sourceText().name().equals(sourceTextName) + )) { + builder.setSourceText( + SourcesProtobuf.SourceText.newBuilder() + .setName(sourceTextName) + .setContents(source.sourceRange().sourceText().charSequence().toString()) + .build() + ); + } + + builder.setStartCharacterIndex(source.sourceRange().start().characterIndex()); + builder.setEndCharacterIndex(source.sourceRange().end().characterIndex()); + + return builder.build(); + } + + private static FileFragmentSource deserializeFileFragmentSource( + SourcesProtobuf.FileFragmentSource sourceProtobuf, + Optional parentSource + ) { + SourceText sourceText; + if (sourceProtobuf.hasSourceText()) { + sourceText = SourceText.fromString( + sourceProtobuf.getSourceText().getName(), + sourceProtobuf.getSourceText().getContents() + ); + } else { + // TODO: handle missing parent + sourceText = ((FileFragmentSource) parentSource.orElseThrow()).sourceRange().sourceText(); + } + + var start = new SourcePosition(sourceText, sourceProtobuf.getStartCharacterIndex()); + var end = new SourcePosition(sourceText, sourceProtobuf.getEndCharacterIndex()); + return new FileFragmentSource(new SourceRange(sourceText, start, end)); + } +} -- cgit v1.2.3