diff options
| author | Michael Williamson <mike@zwobble.org> | 2023-10-31 18:49:10 +0000 |
|---|---|---|
| committer | Michael Williamson <mike@zwobble.org> | 2023-10-31 18:49:10 +0000 |
| commit | 375a1bfb7fbc08a55bde8866a3f67fc6e460c808 (patch) | |
| tree | dd89540f93fbc26fc844e4ad17092d8b1a8985ce /src/main/java | |
| parent | 341a88406bd0b1d83dcfb922ecdc877e30bb1eca (diff) | |
Parse empty effect definitions
Diffstat (limited to 'src/main/java')
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); |
