Check that a parameter name of a function definition does not shadow an enum definition.

This commit is contained in:
2023-03-15 23:17:43 +01:00
parent 22634c9652
commit f77d6a002d
2 changed files with 30 additions and 1 deletions

View File

@@ -851,10 +851,24 @@ public class ContextAnalysis extends KlangBaseVisitor<Node> {
var parameterName = ctx.IDENT().getText(); var parameterName = ctx.IDENT().getText();
var parameterType = Type.getByName(ctx.type_annotation().type().getText()); var parameterType = Type.getByName(ctx.type_annotation().type().getText());
if (structDefs.containsKey(parameterName)) {
var line = ctx.start.getLine();
var col = ctx.start.getCharPositionInLine();
var error = "Parameter name " + parameterName + " duplicates a struct of the same name.";
throw new RuntimeException(Helper.getErrorPrefix(line, col) + error);
}
if (enumDefs.containsKey(parameterName)) {
var line = ctx.start.getLine();
var col = ctx.start.getCharPositionInLine();
var error = "Parameter name " + parameterName + " duplicates an enum of the same name.";
throw new RuntimeException(Helper.getErrorPrefix(line, col) + error);
}
if (!parameterType.isPrimitiveType() && !structDefs.containsKey(parameterType.getName()) && !enumDefs.containsKey(parameterType.getName())) { if (!parameterType.isPrimitiveType() && !structDefs.containsKey(parameterType.getName()) && !enumDefs.containsKey(parameterType.getName())) {
var line = ctx.type_annotation().start.getLine(); var line = ctx.type_annotation().start.getLine();
var col = ctx.type_annotation().start.getCharPositionInLine(); var col = ctx.type_annotation().start.getCharPositionInLine();
String error = "Type " + parameterType.getName() + " not defined."; var error = "Type " + parameterType.getName() + " not defined.";
throw new RuntimeException(Helper.getErrorPrefix(line, col) + error); throw new RuntimeException(Helper.getErrorPrefix(line, col) + error);
} }

View File

@@ -77,4 +77,19 @@ public class FunctionDefinitionTest {
var e = assertThrows(RuntimeException.class, () -> ctxAnal.visit(tree)); var e = assertThrows(RuntimeException.class, () -> ctxAnal.visit(tree));
assertEquals("Error in line 1:20 Function foo has to return something of type int.", e.getMessage()); assertEquals("Error in line 1:20 Function foo has to return something of type int.", e.getMessage());
} }
@Test
void shouldThrowExceptionIfParameterNameMatchesEnumName() {
// given
var tree = Helper.prepareParser("enum Bar { A, B } function foo(Bar: int): int { return 1; } foo(1);");
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:31 Parameter name Bar duplicates an enum of the same name.", e.getMessage());
}
} }