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:
@@ -355,12 +355,15 @@ public class ContextAnalysis extends KlangBaseVisitor<Node> {
|
|||||||
}
|
}
|
||||||
|
|
||||||
var enumValueName = path.get(0);
|
var enumValueName = path.get(0);
|
||||||
if (Arrays.stream(enumDef.enums).noneMatch(e -> e.value.equals(enumValueName))) {
|
var enumValue = Arrays.stream(enumDef.enums)
|
||||||
var error = "Unknown enum value " + enumValueName + " of enum " + enumDef.name + ".";
|
.filter(e -> e.value.equals(enumValueName))
|
||||||
throw new RuntimeException(Helper.getErrorPrefix(line, col) + error);
|
.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.type = enumDef.type;
|
||||||
enumAccessExpression.line = line;
|
enumAccessExpression.line = line;
|
||||||
enumAccessExpression.col = col;
|
enumAccessExpression.col = col;
|
||||||
|
|||||||
@@ -1,14 +1,22 @@
|
|||||||
package de.hsrm.compiler.Klang.nodes.expressions;
|
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;
|
import de.hsrm.compiler.Klang.visitors.Visitor;
|
||||||
|
|
||||||
public class EnumAccessExpression extends Expression {
|
public class EnumAccessExpression extends Expression {
|
||||||
public String enumName;
|
public String enumName;
|
||||||
public String enumValueName;
|
public String enumValueName;
|
||||||
|
public EnumValue enumValue;
|
||||||
|
|
||||||
public EnumAccessExpression(String enumName, String enumValueName) {
|
public EnumAccessExpression(
|
||||||
|
String enumName,
|
||||||
|
String enumValueName,
|
||||||
|
EnumValue enumValue
|
||||||
|
) {
|
||||||
this.enumName = enumName;
|
this.enumName = enumName;
|
||||||
this.enumValueName = enumValueName;
|
this.enumValueName = enumValueName;
|
||||||
|
this.enumValue = enumValue;
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
|
|||||||
Reference in New Issue
Block a user