From dcfcdb2b408f05ab6b5d5ca8713c10af4ff80495 Mon Sep 17 00:00:00 2001 From: Michael Williamson Date: Wed, 25 Oct 2023 22:14:56 +0100 Subject: Clarify declaration vs definition --- .../org/shedlang/compiler/typechecker/TypeChecker.java | 10 +++++----- .../compiler/typechecker/TypeCheckerContext.java | 8 ++++---- .../org/shedlang/compiler/typechecker/Variable.java | 2 +- ...DeclareTypeOfVariableDeclaredInOuterScopeError.java | 17 +++++++++++++++++ .../CannotDefineVariableDeclaredInOuterScopeError.java | 17 ----------------- .../errors/VariableAlreadyHasTypeError.java | 17 +++++++++++++++++ .../errors/VariableIsAlreadyDefinedError.java | 17 ----------------- .../compiler/typechecker/TypeCheckerContextTests.java | 18 +++++++++--------- 8 files changed, 53 insertions(+), 53 deletions(-) create mode 100644 src/main/java/org/shedlang/compiler/typechecker/errors/CannotDeclareTypeOfVariableDeclaredInOuterScopeError.java delete mode 100644 src/main/java/org/shedlang/compiler/typechecker/errors/CannotDefineVariableDeclaredInOuterScopeError.java create mode 100644 src/main/java/org/shedlang/compiler/typechecker/errors/VariableAlreadyHasTypeError.java delete mode 100644 src/main/java/org/shedlang/compiler/typechecker/errors/VariableIsAlreadyDefinedError.java (limited to 'src') diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java index 1c763bba..fe1f41a9 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java @@ -563,7 +563,7 @@ public class TypeChecker { var typedSignature = typeCheckFunctionSignature(untyped.signature(), context); return context - .define(untyped.name(), typedSignature.type(), untyped.source()) + .declareVariableType(untyped.name(), typedSignature.type(), untyped.source()) .addLexicalState(untyped.name(), typedSignature); } @@ -983,7 +983,7 @@ public class TypeChecker { context = context.addLexicalState(untyped.name(), type); - return context.define(untyped.name(), Types.metaType(type), untyped.source()); + return context.declareVariableType(untyped.name(), Types.metaType(type), untyped.source()); } @Override @@ -1038,7 +1038,7 @@ public class TypeChecker { context = context.addLexicalState(untyped.name(), type); - return context.define(untyped.name(), Types.metaType(type), untyped.source()); + return context.declareVariableType(untyped.name(), Types.metaType(type), untyped.source()); } @Override @@ -1253,7 +1253,7 @@ public class TypeChecker { } case UntypedTargetNode.Val val -> { - context = context.define( + context = context.declareVariableType( val.name(), expressionType, target.source() @@ -1263,7 +1263,7 @@ public class TypeChecker { } case UntypedTargetNode.Var var -> { - context = context.define( + context = context.declareVariableType( var.name(), expressionType, target.source() diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java index d98579a1..030586b1 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java +++ b/src/main/java/org/shedlang/compiler/typechecker/TypeCheckerContext.java @@ -286,7 +286,7 @@ public class TypeCheckerContext { return clazz.cast(state); } - public TypeCheckerContext define( + public TypeCheckerContext declareVariableType( String name, Type type, Source source @@ -297,12 +297,12 @@ public class TypeCheckerContext { throw new UnknownVariableError(name, source); } - if (variable.isDefined()) { - throw new VariableIsAlreadyDefinedError(name, source); + if (variable.hasType()) { + throw new VariableAlreadyHasTypeError(name, source); } if (!this.boundVariables().contains(name)) { - throw new CannotDefineVariableDeclaredInOuterScopeError(name, source); + throw new CannotDeclareTypeOfVariableDeclaredInOuterScopeError(name, source); } return this.updateLexicalContext( diff --git a/src/main/java/org/shedlang/compiler/typechecker/Variable.java b/src/main/java/org/shedlang/compiler/typechecker/Variable.java index 5c820159..fc06acc9 100644 --- a/src/main/java/org/shedlang/compiler/typechecker/Variable.java +++ b/src/main/java/org/shedlang/compiler/typechecker/Variable.java @@ -13,7 +13,7 @@ public record Variable(Optional type, VariableType variableType) { return new Variable(Optional.empty(), variableType); } - public boolean isDefined() { + public boolean hasType() { return type.isPresent(); } } diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/CannotDeclareTypeOfVariableDeclaredInOuterScopeError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/CannotDeclareTypeOfVariableDeclaredInOuterScopeError.java new file mode 100644 index 00000000..d193481e --- /dev/null +++ b/src/main/java/org/shedlang/compiler/typechecker/errors/CannotDeclareTypeOfVariableDeclaredInOuterScopeError.java @@ -0,0 +1,17 @@ +package org.shedlang.compiler.typechecker.errors; + +import org.shedlang.compiler.errors.SourceError; +import org.shedlang.compiler.sources.Source; + +public class CannotDeclareTypeOfVariableDeclaredInOuterScopeError extends SourceError { + private final String variableName; + + public CannotDeclareTypeOfVariableDeclaredInOuterScopeError(String variableName, Source source) { + super("Cannot declare type of variable declared in outer scope: " + variableName, source); + this.variableName = variableName; + } + + public String variableName() { + return variableName; + } +} diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/CannotDefineVariableDeclaredInOuterScopeError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/CannotDefineVariableDeclaredInOuterScopeError.java deleted file mode 100644 index 7002c637..00000000 --- a/src/main/java/org/shedlang/compiler/typechecker/errors/CannotDefineVariableDeclaredInOuterScopeError.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.shedlang.compiler.typechecker.errors; - -import org.shedlang.compiler.errors.SourceError; -import org.shedlang.compiler.sources.Source; - -public class CannotDefineVariableDeclaredInOuterScopeError extends SourceError { - private final String variableName; - - public CannotDefineVariableDeclaredInOuterScopeError(String variableName, Source source) { - super("Cannot define variable declared in outer scope: " + variableName, source); - this.variableName = variableName; - } - - public String variableName() { - return variableName; - } -} diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/VariableAlreadyHasTypeError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/VariableAlreadyHasTypeError.java new file mode 100644 index 00000000..20f3b9d2 --- /dev/null +++ b/src/main/java/org/shedlang/compiler/typechecker/errors/VariableAlreadyHasTypeError.java @@ -0,0 +1,17 @@ +package org.shedlang.compiler.typechecker.errors; + +import org.shedlang.compiler.errors.InternalCompilerError; +import org.shedlang.compiler.sources.Source; + +public class VariableAlreadyHasTypeError extends InternalCompilerError { + private final String variableName; + + public VariableAlreadyHasTypeError(String variableName, Source source) { + super("Variable already has type: " + variableName, source); + this.variableName = variableName; + } + + public String variableName() { + return variableName; + } +} diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/VariableIsAlreadyDefinedError.java b/src/main/java/org/shedlang/compiler/typechecker/errors/VariableIsAlreadyDefinedError.java deleted file mode 100644 index e781d398..00000000 --- a/src/main/java/org/shedlang/compiler/typechecker/errors/VariableIsAlreadyDefinedError.java +++ /dev/null @@ -1,17 +0,0 @@ -package org.shedlang.compiler.typechecker.errors; - -import org.shedlang.compiler.errors.SourceError; -import org.shedlang.compiler.sources.Source; - -public class VariableIsAlreadyDefinedError extends SourceError { - private final String variableName; - - public VariableIsAlreadyDefinedError(String variableName, Source source) { - super("Variable is already defined: " + variableName, source); - this.variableName = variableName; - } - - public String variableName() { - return variableName; - } -} diff --git a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerContextTests.java b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerContextTests.java index aa06e499..7d2bac3e 100644 --- a/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerContextTests.java +++ b/src/test/java/org/shedlang/compiler/typechecker/TypeCheckerContextTests.java @@ -2,9 +2,9 @@ package org.shedlang.compiler.typechecker; import org.junit.jupiter.api.Test; import org.shedlang.compiler.sources.Sources; -import org.shedlang.compiler.typechecker.errors.CannotDefineVariableDeclaredInOuterScopeError; +import org.shedlang.compiler.typechecker.errors.CannotDeclareTypeOfVariableDeclaredInOuterScopeError; import org.shedlang.compiler.typechecker.errors.UnknownVariableError; -import org.shedlang.compiler.typechecker.errors.VariableIsAlreadyDefinedError; +import org.shedlang.compiler.typechecker.errors.VariableAlreadyHasTypeError; import org.shedlang.compiler.types.NamespaceName; import org.shedlang.compiler.types.Types; import org.shedlang.compiler.util.P; @@ -24,7 +24,7 @@ public class TypeCheckerContextTests { Map.entry("y", Variable.undefined(VariableType.VAL)) )); - context = context.define("x", Types.STRING, Sources.NULL); + context = context.declareVariableType("x", Types.STRING, Sources.NULL); var result = context.runtimeLookup("x", Sources.NULL); assertThat(result.value(), isOptionalOf(equalTo(Variable.defined(Types.STRING, VariableType.VAL)))); @@ -39,7 +39,7 @@ public class TypeCheckerContextTests { var error = assertThrows( UnknownVariableError.class, - () -> context.define("x", Types.STRING, Sources.NULL) + () -> context.declareVariableType("x", Types.STRING, Sources.NULL) ); assertThat(error.variableName(), equalTo("x")); @@ -53,8 +53,8 @@ public class TypeCheckerContextTests { )); var error = assertThrows( - VariableIsAlreadyDefinedError.class, - () -> context.define("x", Types.STRING, Sources.NULL) + VariableAlreadyHasTypeError.class, + () -> context.declareVariableType("x", Types.STRING, Sources.NULL) ); assertThat(error.variableName(), equalTo("x")); @@ -69,8 +69,8 @@ public class TypeCheckerContextTests { .enterNamespace(NamespaceName.of("Example"), P.map()); var error = assertThrows( - CannotDefineVariableDeclaredInOuterScopeError.class, - () -> context.define("x", Types.STRING, Sources.NULL) + CannotDeclareTypeOfVariableDeclaredInOuterScopeError.class, + () -> context.declareVariableType("x", Types.STRING, Sources.NULL) ); assertThat(error.variableName(), equalTo("x")); @@ -87,7 +87,7 @@ public class TypeCheckerContextTests { context = context.enterBlock(P.map( Map.entry("x", Variable.undefined(VariableType.VAL)) )); - context = context.define("x", Types.STRING, Sources.NULL); + context = context.declareVariableType("x", Types.STRING, Sources.NULL); assertThat( context.runtimeLookup("x", Sources.NULL).value(), isOptionalOf(equalTo(Variable.defined(Types.STRING, VariableType.VAL))) -- cgit v1.2.3