From 55a5b8f54aa04ed9531703895829371cec23e745 Mon Sep 17 00:00:00 2001 From: nitrix Date: Thu, 16 Mar 2023 00:01:31 +0100 Subject: [PATCH] Make sure that a variable that references an enum has to be initialized. --- .../de/hsrm/compiler/Klang/ContextAnalysis.java | 5 +++++ src/test/java/VariableDeclarationTest.java | 17 ++++++++++++++++- 2 files changed, 21 insertions(+), 1 deletion(-) diff --git a/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java b/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java index c4d3da4..9cf7dec 100644 --- a/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java +++ b/src/main/java/de/hsrm/compiler/Klang/ContextAnalysis.java @@ -216,6 +216,11 @@ public class ContextAnalysis extends KlangBaseVisitor { variableDeclaration = new VariableDeclaration(variableName, (Expression) expression); variableDeclaration.initialized = true; } else { + if (enumDefs.containsKey(declaredType.getName())) { + var error = "Variable " + variableName + " references an enum but is not initialized."; + throw new RuntimeException(Helper.getErrorPrefix(line, col) + error); + } + variableDeclaration = new VariableDeclaration(variableName); } diff --git a/src/test/java/VariableDeclarationTest.java b/src/test/java/VariableDeclarationTest.java index 5dba488..7727159 100644 --- a/src/test/java/VariableDeclarationTest.java +++ b/src/test/java/VariableDeclarationTest.java @@ -21,7 +21,7 @@ public class VariableDeclarationTest { @Test void shouldNotThrowIfDeclaredTypeIsAnEnum() { // given - var tree = Helper.prepareParser("enum bar { A, B } function foo(): int { let a: bar; return 1; } foo();"); + var tree = Helper.prepareParser("enum bar { A, B } function foo(): int { let a: bar = bar.A; return 1; } foo();"); var ctxAnal = new ContextAnalysis( Helper.getFuncs(tree), Helper.getStructs(tree), @@ -91,4 +91,19 @@ public class VariableDeclarationTest { var e = assertThrows(RuntimeException.class, () -> ctxAnal.visit(tree)); assertEquals("Error in line 1:34 Redeclaration of variable with name \"x\".", e.getMessage()); } + + @Test + void shouldThrowExceptionIfVariableReferencesEnumButIsNotInitialized() { + // given + var tree = Helper.prepareParser("enum bar { A, B } function foo(): int { let x: bar; return 1; } foo();"); + var ctxAnal = new ContextAnalysis( + Helper.getFuncs(tree), + Helper.getStructs(tree), + Helper.getEnums(tree) + ); + + // when / then + var e = assertThrows(RuntimeException.class, () -> ctxAnal.visit(tree)); + assertEquals("Error in line 1:40 Variable x references an enum but is not initialized.", e.getMessage()); + } } \ No newline at end of file