aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2024-12-19 16:30:17 +0000
committerMichael Williamson <mike@zwobble.org>2024-12-19 16:30:17 +0000
commit4f8135071ae6faf7abfbc2f4765101ce9c0bb287 (patch)
tree466ce9540538e5f3a193b0b82fde30796651de0f /src/main/java
parentcbe45599f7b46d7a0674a62d424b9485e7735d45 (diff)
Define methods directly on struct
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedExtendInlineNode.java12
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceStatementNode.java2
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java27
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java34
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java3
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java7
6 files changed, 30 insertions, 55 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExtendInlineNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExtendInlineNode.java
deleted file mode 100644
index b92e2513..00000000
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedExtendInlineNode.java
+++ /dev/null
@@ -1,12 +0,0 @@
-package org.shedlang.compiler.ast.untyped;
-
-import org.shedlang.compiler.sources.Source;
-
-import java.util.List;
-
-public record UntypedExtendInlineNode(
- UntypedTypeLevelExpressionNode extendedType,
- List<UntypedFunctionDefinitionNode> methods,
- Source source
-) implements UntypedNamespaceStatementNode {
-}
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceStatementNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceStatementNode.java
index 4df38b08..8d94d5b8 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceStatementNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceStatementNode.java
@@ -1,4 +1,4 @@
package org.shedlang.compiler.ast.untyped;
-public sealed interface UntypedNamespaceStatementNode extends UntypedNode permits UntypedAssignNode, UntypedEffectDefinitionNode, UntypedExtendInlineNode, UntypedFunctionDefinitionNode, UntypedStructDefinitionNode, UntypedSumTypeDefinitionNode {
+public sealed interface UntypedNamespaceStatementNode extends UntypedNode permits UntypedAssignNode, UntypedEffectDefinitionNode, UntypedFunctionDefinitionNode, UntypedStructDefinitionNode, UntypedSumTypeDefinitionNode {
}
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java
index f4493eb0..af335ee5 100644
--- a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedStructDefinitionNode.java
@@ -15,10 +15,18 @@ public record UntypedStructDefinitionNode(
Optional<List<UntypedTypeLevelParamNode>> typeLevelParams,
List<UntypedStructFieldDefinitionNode> fields,
boolean fieldsArePositional,
+ List<UntypedFunctionDefinitionNode> methods,
Source source
) implements UntypedNamespaceStatementNode, UntypedVariableDeclarationNode {
public static Builder builder() {
- return new Builder("X", Visibility.PRIVATE, Optional.empty(), P.vector(), false);
+ return new Builder(
+ "X",
+ Visibility.PRIVATE,
+ Optional.empty(),
+ P.vector(),
+ false,
+ P.vector()
+ );
}
public record Builder(
@@ -26,7 +34,8 @@ public record UntypedStructDefinitionNode(
Visibility visibility,
Optional<List<UntypedTypeLevelParamNode>> typeLevelParams,
PVector<UntypedStructFieldDefinitionNode> fields,
- boolean fieldsArePositional
+ boolean fieldsArePositional,
+ PVector<UntypedFunctionDefinitionNode> methods
) {
public UntypedStructDefinitionNode build() {
return new UntypedStructDefinitionNode(
@@ -35,6 +44,7 @@ public record UntypedStructDefinitionNode(
this.typeLevelParams,
this.fields,
this.fieldsArePositional,
+ this.methods,
Sources.NULL
);
}
@@ -45,7 +55,8 @@ public record UntypedStructDefinitionNode(
this.visibility,
this.typeLevelParams,
this.fields,
- this.fieldsArePositional
+ this.fieldsArePositional,
+ this.methods
);
}
@@ -55,7 +66,8 @@ public record UntypedStructDefinitionNode(
this.visibility,
Optional.of(typeLevelParams),
this.fields,
- this.fieldsArePositional
+ this.fieldsArePositional,
+ this.methods
);
}
@@ -65,7 +77,8 @@ public record UntypedStructDefinitionNode(
this.visibility,
this.typeLevelParams,
this.fields.plus(field),
- this.fieldsArePositional
+ this.fieldsArePositional,
+ this.methods
);
}
@@ -75,7 +88,9 @@ public record UntypedStructDefinitionNode(
this.visibility,
this.typeLevelParams,
this.fields,
- fieldsArePositional
+ fieldsArePositional,
+ this.methods
+
);
}
}
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index 8d79439e..328a1ec9 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -405,29 +405,6 @@ public class Parser {
);
}
- private static UntypedExtendInlineNode parseExtendInline(
- TokenIterator<TokenType> tokens
- ) {
- var start = tokens.position();
-
- tokens.skip(TokenType.KEYWORD_EXTEND);
- var extendedType = parseTopLevelTypeLevelExpression(tokens);
- tokens.skip(TokenType.SYMBOL_BRACE_OPEN);
-
- var methods = parseMany(
- () -> tokens.isNext(TokenType.SYMBOL_BRACE_CLOSE),
- () -> parseFunctionDefinition(tokens),
- () -> true
- );
-
- tokens.skip(TokenType.SYMBOL_BRACE_CLOSE);
-
- var end = tokens.position();
- var source = start.to(end);
-
- return new UntypedExtendInlineNode(extendedType, methods, source);
- }
-
private static class FieldAccessParser implements OperationParser<
OperatorPrecedence,
UntypedExpressionNode
@@ -781,9 +758,6 @@ public class Parser {
case KEYWORD_EFFECT ->
parseEffectDefinition(tokens);
- case KEYWORD_EXTEND ->
- parseExtendInline(tokens);
-
case KEYWORD_FUN ->
parseFunctionDefinition(tokens);
@@ -1025,6 +999,13 @@ public class Parser {
tokens.skip(TokenType.SYMBOL_PAREN_CLOSE);
tokens.skip(TokenType.SYMBOL_BRACE_OPEN);
+
+ var methods = parseMany(
+ () -> tokens.isNext(TokenType.SYMBOL_BRACE_CLOSE),
+ () -> parseFunctionDefinition(tokens),
+ () -> true
+ );
+
tokens.skip(TokenType.SYMBOL_BRACE_CLOSE);
var end = tokens.position();
@@ -1036,6 +1017,7 @@ public class Parser {
typeLevelParams,
fields,
structHasPositionalFields,
+ methods,
source
);
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
index 6260abbd..2a842d93 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
@@ -98,9 +98,6 @@ class DeclaredVariables {
effectDefinition
));
- case UntypedExtendInlineNode extendInline ->
- variables;
-
case UntypedFunctionDefinitionNode functionDefinition ->
variables.plus(DeclaredVariable.fromNode(
VariableType.CONSTANT,
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index 8d94c303..8cec1f85 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -1447,10 +1447,6 @@ public class TypeChecker {
);
}
- case UntypedExtendInlineNode untypedExtendInline -> {
-
- }
-
case UntypedFunctionDefinitionNode untypedFunctionDefinition -> {
dependencyChecker = dependencyChecker.addDeferredDependencies(
untypedFunctionDefinition.name(),
@@ -1527,9 +1523,6 @@ public class TypeChecker {
case UntypedEffectDefinitionNode effectDefinition ->
typeCheckStepsEffectDefinition(effectDefinition);
- case UntypedExtendInlineNode extendInline ->
- throw new UnsupportedOperationException("TODO");
-
case UntypedFunctionDefinitionNode functionDefinition ->
typeCheckStepsFunctionDefinition(functionDefinition);