aboutsummaryrefslogtreecommitdiff
path: root/src/main/java
diff options
context:
space:
mode:
authorMichael Williamson <mike@zwobble.org>2023-07-03 12:35:23 +0100
committerMichael Williamson <mike@zwobble.org>2023-07-03 12:35:23 +0100
commit28b744b0039e381e197f46cea0e5e87ac4b8bab2 (patch)
tree2d007b968e11347f7d389bfc28258330180b6119 /src/main/java
parent3b69ffa33d419ee31331582edac427393009e711 (diff)
Check for duplicate variable names
Diffstat (limited to 'src/main/java')
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java22
-rw-r--r--src/main/java/org/shedlang/compiler/typechecker/errors/DuplicateVariableName.java17
2 files changed, 33 insertions, 6 deletions
diff --git a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
index feafa5f4..bf09b84b 100644
--- a/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
+++ b/src/main/java/org/shedlang/compiler/typechecker/TypeChecker.java
@@ -69,20 +69,20 @@ public class TypeChecker {
});
}
- private static List<String> definedVariableNames(UntypedFunctionStatementNode statement) {
+ private static List<UntypedTargetNode.Variable> targetVariables(UntypedFunctionStatementNode statement) {
return switch (statement) {
case UntypedExpressionStatementNode expressionStatement ->
List.of();
case UntypedValNode val ->
- definedVariableNames(val.target());
+ targetVariables(val.target());
};
}
- private static List<String> definedVariableNames(UntypedTargetNode target) {
+ private static List<UntypedTargetNode.Variable> targetVariables(UntypedTargetNode target) {
return switch (target) {
case UntypedTargetNode.Variable variable ->
- List.of(variable.name());
+ List.of(variable);
};
}
@@ -259,6 +259,7 @@ public class TypeChecker {
var typedReturnType = typeCheckTypeLevelExpression(TypeSets.META_TYPE, untyped.returnType(), context);
+ // TODO: check for duplicate param names
var bodyEnvironment = typedParams.all()
.map(param -> Map.entry(
param.name(),
@@ -267,8 +268,17 @@ public class TypeChecker {
.collect(PCollectors.toMap());
for (var statement : untyped.body()) {
- for (var definedVariableName : definedVariableNames(statement)) {
- bodyEnvironment = bodyEnvironment.plus(definedVariableName, TypeCheckerContext.undefined());
+ for (var targetVariable : targetVariables(statement)) {
+ if (bodyEnvironment.containsKey(targetVariable.name())) {
+ throw new DuplicateVariableName(
+ targetVariable.name(),
+ targetVariable.source()
+ );
+ }
+ bodyEnvironment = bodyEnvironment.plus(
+ targetVariable.name(),
+ TypeCheckerContext.undefined()
+ );
}
}
diff --git a/src/main/java/org/shedlang/compiler/typechecker/errors/DuplicateVariableName.java b/src/main/java/org/shedlang/compiler/typechecker/errors/DuplicateVariableName.java
new file mode 100644
index 00000000..21771987
--- /dev/null
+++ b/src/main/java/org/shedlang/compiler/typechecker/errors/DuplicateVariableName.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 DuplicateVariableName extends SourceError {
+ private final String variableName;
+
+ public DuplicateVariableName(String variableName, Source source) {
+ super("Duplicate variable name: " + variableName, source);
+ this.variableName = variableName;
+ }
+
+ public String variableName() {
+ return variableName;
+ }
+}