diff options
| author | Michael Williamson <mike@zwobble.org> | 2026-03-21 10:29:41 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2026-03-21 10:29:41 +0000 |
| commit | ad38051f707b9301d4553d83e55c54a3dfc3dc1c (patch) | |
| tree | 682f2ae2bc0212f90a2ecd0d0670b8a5e0450a77 /src/main/java | |
| parent | 4597388e4b771585f7be32d9f0995bdbedf04c11 (diff) | |
Add source to Patio protobuf messages
Diffstat (limited to 'src/main/java')
3 files changed, 88 insertions, 12 deletions
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 c95e924a..0dbbc708 100644 --- a/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java +++ b/src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java @@ -1,37 +1,47 @@ package org.shedlang.compiler.patio.protobuf; import org.shedlang.compiler.patio.*; +import org.shedlang.compiler.sources.*; +import org.shedlang.compiler.sources.protobuf.SourcesProtobuf; +import org.zwobble.sourcetext.SourceRange; + +import java.util.Optional; public class PatioToProtobuf { public PatioProtobuf.PatioCompilationUnit compilationUnitToProtobuf( PatioCompilationUnit compilationUnit ) { var builder = PatioProtobuf.PatioCompilationUnit.newBuilder(); + + builder.setSource(sourceToProtobuf(compilationUnit.source(), Optional.empty())); + for (var element : compilationUnit.elements()) { - builder.addElements(compilationUnitElementToProtobuf(element)); + builder.addElements(compilationUnitElementToProtobuf(element, compilationUnit.source())); } + return builder.build(); } private PatioProtobuf.PatioCompilationUnitElement compilationUnitElementToProtobuf( - PatioCompilationUnitElement element + PatioCompilationUnitElement element, + Source parentSource ) { var builder = PatioProtobuf.PatioCompilationUnitElement.newBuilder(); switch (element) { case PatioDataElementImmutableDefinition dataElementImmutableDefinition -> { builder.setDataElementImmutableDefinition( - dataElementImmutableDefinitionToProtobuf(dataElementImmutableDefinition) + dataElementImmutableDefinitionToProtobuf(dataElementImmutableDefinition, parentSource) ); } case PatioDataElementMutableDeclaration dataElementMutableDeclaration -> { builder.setDataElementMutableDeclaration( - dataElementMutableDeclarationToProtobuf(dataElementMutableDeclaration) + dataElementMutableDeclarationToProtobuf(dataElementMutableDeclaration, parentSource) ); } case PatioDataElementMutableDefinition dataElementMutableDefinition -> { builder.setDataElementMutableDefinition( - dataElementMutableDefinitionToProtobuf(dataElementMutableDefinition) + dataElementMutableDefinitionToProtobuf(dataElementMutableDefinition, parentSource) ); } case PatioExceptionTypeDefinition exceptionTypeDefinition -> { @@ -49,26 +59,32 @@ public class PatioToProtobuf { } private PatioProtobuf.PatioDataElementImmutableDefinition dataElementImmutableDefinitionToProtobuf( - PatioDataElementImmutableDefinition element + PatioDataElementImmutableDefinition element, + Source parentSource ) { var builder = PatioProtobuf.PatioDataElementImmutableDefinition.newBuilder(); + builder.setSource(sourceToProtobuf(element.source(), parentSource)); builder.setName(element.name()); builder.setVisibility(visibilityToProtobuf(element.visibility())); return builder.build(); } private PatioProtobuf.PatioDataElementMutableDeclaration dataElementMutableDeclarationToProtobuf( - PatioDataElementMutableDeclaration element + PatioDataElementMutableDeclaration element, + Source parentSource ) { var builder = PatioProtobuf.PatioDataElementMutableDeclaration.newBuilder(); + builder.setSource(sourceToProtobuf(element.source(), parentSource)); builder.setName(element.name()); return builder.build(); } private PatioProtobuf.PatioDataElementMutableDefinition dataElementMutableDefinitionToProtobuf( - PatioDataElementMutableDefinition element + PatioDataElementMutableDefinition element, + Source parentSource ) { var builder = PatioProtobuf.PatioDataElementMutableDefinition.newBuilder(); + builder.setSource(sourceToProtobuf(element.source(), parentSource)); builder.setName(element.name()); builder.setVisibility(visibilityToProtobuf(element.visibility())); return builder.build(); @@ -80,4 +96,66 @@ public class PatioToProtobuf { case PUBLIC -> PatioProtobuf.PatioVisibility.PUBLIC; }; } + + private SourcesProtobuf.Source sourceToProtobuf( + Source source, + Source parentSource + ) { + return sourceToProtobuf(source, Optional.of(parentSource)); + } + + private SourcesProtobuf.Source sourceToProtobuf( + Source source, + Optional<Source> 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( + fileFragmentSourceToProtobuf(fileFragmentSource, parentSource) + ); + } + default -> { + throw new UnsupportedOperationException("Unhandled source: " + source); + } + } + + return builder.build(); + } + + private SourcesProtobuf.FileFragmentSource fileFragmentSourceToProtobuf( + FileFragmentSource source, + Optional<Source> 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) + .build() + ); + } + + builder.setStartCharacterIndex(source.sourceRange().start().characterIndex()); + builder.setEndCharacterIndex(source.sourceRange().end().characterIndex()); + + return builder.build(); + } } diff --git a/src/main/java/org/shedlang/compiler/sources/NullSource.java b/src/main/java/org/shedlang/compiler/sources/NullSource.java index f9e86295..6a66aeea 100644 --- a/src/main/java/org/shedlang/compiler/sources/NullSource.java +++ b/src/main/java/org/shedlang/compiler/sources/NullSource.java @@ -1,8 +1,7 @@ package org.shedlang.compiler.sources; -class NullSource implements Source { +public class NullSource implements Source { private NullSource() { - } static final NullSource INSTANCE = new NullSource(); diff --git a/src/main/java/org/shedlang/compiler/sources/RuntimeSource.java b/src/main/java/org/shedlang/compiler/sources/RuntimeSource.java index 06310478..6bb708f9 100644 --- a/src/main/java/org/shedlang/compiler/sources/RuntimeSource.java +++ b/src/main/java/org/shedlang/compiler/sources/RuntimeSource.java @@ -1,8 +1,7 @@ package org.shedlang.compiler.sources; -class RuntimeSource implements Source { +public class RuntimeSource implements Source { private RuntimeSource() { - } static final RuntimeSource INSTANCE = new RuntimeSource(); |
