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 +- ...tDeclareTypeOfVariableDeclaredInOuterScopeError.java | 17 +++++++++++++++++ .../CannotDefineVariableDeclaredInOuterScopeError.java | 17 ----------------- .../typechecker/errors/VariableAlreadyHasTypeError.java | 17 +++++++++++++++++ .../errors/VariableIsAlreadyDefinedError.java | 17 ----------------- 7 files changed, 44 insertions(+), 44 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/main/java') 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; - } -} -- cgit v1.2.3