aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-10-31 18:49:10 +0000
committerMichael Williamson <mike@zwobble.org>2023-10-31 18:49:10 +0000
commit375a1bfb7fbc08a55bde8866a3f67fc6e460c808 (patch)
treedd89540f93fbc26fc844e4ad17092d8b1a8985ce /src/main/java
parent341a88406bd0b1d83dcfb922ecdc877e30bb1eca (diff)
Parse empty effect definitions
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedEffectDefinitionNode.java14
-rw-r--r--src/main/java/org/shedlang/compiler/ast/untyped/UntypedNamespaceStatementNode.java2
-rw-r--r--src/main/java/org/shedlang/compiler/parser/Parser.java21
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java6
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java10
5 files changed, 52 insertions, 1 deletions
diff --git a/src/main/java/org/shedlang/compiler/ast/untyped/UntypedEffectDefinitionNode.java b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedEffectDefinitionNode.java
new file mode 100644
index 00000000..66dab2a5
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/ast/untyped/UntypedEffectDefinitionNode.java
@@ -0,0 +1,14 @@
+package org.shedlang.compiler.ast.untyped;
+
+import org.shedlang.compiler.sources.Source;
+import org.shedlang.compiler.types.Visibility;
+
+public record UntypedEffectDefinitionNode(
+ String name,
+ Source source
+) implements UntypedNamespaceStatementNode, UntypedVariableDeclarationNode {
+ @Override
+ public Visibility visibility() {
+ return Visibility.PRIVATE;
+ }
+}
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 ac229649..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, UntypedFunctionDefinitionNode, UntypedStructDefinitionNode, UntypedSumTypeDefinitionNode {
+public sealed interface UntypedNamespaceStatementNode extends UntypedNode permits UntypedAssignNode, UntypedEffectDefinitionNode, UntypedFunctionDefinitionNode, UntypedStructDefinitionNode, UntypedSumTypeDefinitionNode {
}
diff --git a/src/main/java/org/shedlang/compiler/parser/Parser.java b/src/main/java/org/shedlang/compiler/parser/Parser.java
index cf01705d..6be82270 100644
--- a/src/main/java/org/shedlang/compiler/parser/Parser.java
+++ b/src/main/java/org/shedlang/compiler/parser/Parser.java
@@ -201,6 +201,24 @@ public class Parser {
}
}
+ private static UntypedEffectDefinitionNode parseEffectDefinition(
+ TokenIterator<TokenType> tokens
+ ) {
+ var start = tokens.position();
+
+ tokens.skip(TokenType.KEYWORD_EFFECT);
+
+ var name = tokens.nextValue(TokenType.IDENTIFIER);
+
+ tokens.skip(TokenType.SYMBOL_BRACE_OPEN);
+ tokens.skip(TokenType.SYMBOL_BRACE_CLOSE);
+
+ var end = tokens.position();
+ var source = start.to(end);
+
+ return new UntypedEffectDefinitionNode(name, source);
+ }
+
private static final Map<TokenType, OperationParser> OPERATION_PARSERS = Stream.of(
new FieldAccessParser(),
new BinaryOperationParser(TokenType.SYMBOL_EQUALS_EQUALS, OperatorPrecedence.EQUALS, UntypedBinaryOperator.EQUALS),
@@ -591,6 +609,9 @@ public class Parser {
static UntypedNamespaceStatementNode parseNamespaceStatement(TokenIterator<TokenType> tokens) {
return switch (tokens.peek().tokenType()) {
+ case KEYWORD_EFFECT ->
+ parseEffectDefinition(tokens);
+
case KEYWORD_FUN ->
parseFunctionDefinition(tokens);
diff --git a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
index 35af5842..5134b490 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/DeclaredVariables.java
@@ -86,6 +86,12 @@ class DeclaredVariables {
case UntypedAssignNode assign ->
forAssign(assign, variables);
+ case UntypedEffectDefinitionNode effectDefinition ->
+ variables.plus(DeclaredVariable.fromNode(
+ VariableType.CONSTANT,
+ effectDefinition
+ ));
+
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 3f430b9e..3dcf8965 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -1040,6 +1040,13 @@ public class TypeChecker {
);
}
+ case UntypedEffectDefinitionNode untypedEffectDefinition -> {
+ dependencyChecker = dependencyChecker.addDeferredDependencies(
+ untypedEffectDefinition.name(),
+ Set.of()
+ );
+ }
+
case UntypedFunctionDefinitionNode untypedFunctionDefinition -> {
dependencyChecker = dependencyChecker.addDeferredDependencies(
untypedFunctionDefinition.name(),
@@ -1116,6 +1123,9 @@ public class TypeChecker {
case UntypedAssignNode assign ->
typeCheckStepsAssign(assign);
+ case UntypedEffectDefinitionNode effectDefinition ->
+ throw new UnsupportedOperationException("TODO");
+
case UntypedFunctionDefinitionNode functionDefinition ->
typeCheckStepsFunctionDefinition(functionDefinition);