Enums: Make the EnumAccessExpression save a reference to the EnumValue it is referencing.

This can be used during assembler generation to easily find the correct EnumValue for a given EnumAccessExpression.
This commit is contained in:
2023-03-20 19:54:48 +01:00
parent 0594542167
commit 198bd74a47
2 changed files with 17 additions and 6 deletions

View File

@@ -355,12 +355,15 @@ public class ContextAnalysis extends KlangBaseVisitor<Node> {
}
var enumValueName = path.get(0);
if (Arrays.stream(enumDef.enums).noneMatch(e -> e.value.equals(enumValueName))) {
var error = "Unknown enum value " + enumValueName + " of enum " + enumDef.name + ".";
throw new RuntimeException(Helper.getErrorPrefix(line, col) + error);
}
var enumValue = Arrays.stream(enumDef.enums)
.filter(e -> e.value.equals(enumValueName))
.findFirst()
.orElseThrow(() -> {
var error = "Unknown enum value " + enumValueName + " of enum " + enumDef.name + ".";
throw new RuntimeException(Helper.getErrorPrefix(line, col) + error);
});
var enumAccessExpression = new EnumAccessExpression(baseName, enumValueName);
var enumAccessExpression = new EnumAccessExpression(baseName, enumValueName, enumValue);
enumAccessExpression.type = enumDef.type;
enumAccessExpression.line = line;
enumAccessExpression.col = col;

View File

@@ -1,14 +1,22 @@
package de.hsrm.compiler.Klang.nodes.expressions;
import de.hsrm.compiler.Klang.nodes.EnumDefinition;
import de.hsrm.compiler.Klang.nodes.EnumValue;
import de.hsrm.compiler.Klang.visitors.Visitor;
public class EnumAccessExpression extends Expression {
public String enumName;
public String enumValueName;
public EnumValue enumValue;
public EnumAccessExpression(String enumName, String enumValueName) {
public EnumAccessExpression(
String enumName,
String enumValueName,
EnumValue enumValue
) {
this.enumName = enumName;
this.enumValueName = enumValueName;
this.enumValue = enumValue;
}
@Override