aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2026-03-21 10:29:41 +0000
committerMichael Williamson <mike@zwobble.org>2026-03-21 10:29:41 +0000
commitad38051f707b9301d4553d83e55c54a3dfc3dc1c (patch)
tree682f2ae2bc0212f90a2ecd0d0670b8a5e0450a77 /src/main/java
parent4597388e4b771585f7be32d9f0995bdbedf04c11 (diff)
Add source to Patio protobuf messages
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/patio/protobuf/PatioToProtobuf.java94
-rw-r--r--src/main/java/org/shedlang/compiler/sources/NullSource.java3
-rw-r--r--src/main/java/org/shedlang/compiler/sources/RuntimeSource.java3
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();