From 39276f4756a9f859d7d3eecd9665a0d6778bc3d6 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Emmanuel=20Beno=C3=AEt?= Date: Fri, 13 Jan 2023 08:31:08 +0100 Subject: [PATCH] Resolver - Ensure method names are unique --- src/resolver.rs | 11 +++++++++-- 1 file changed, 9 insertions(+), 2 deletions(-) diff --git a/src/resolver.rs b/src/resolver.rs index 82ff3a3..4be5c10 100644 --- a/src/resolver.rs +++ b/src/resolver.rs @@ -1,4 +1,4 @@ -use std::collections::HashMap; +use std::collections::{HashMap, HashSet}; use crate::{ ast::{ClassMemberDecl, ExprNode, ProgramNode, StmtNode, VariableExpr}, @@ -273,10 +273,17 @@ fn resolve_class<'a, 'b>( where 'b: 'a, { + let mut names = HashSet::new(); rs.define_this(); methods.iter().try_for_each(|member| match member { ClassMemberDecl::Method(method) | ClassMemberDecl::StaticMethod(method) => rs.with_scope( - |rs| resolve_function(rs, &method.params, &method.body), + |rs| { + if names.insert(method.name.lexeme.clone()) { + resolve_function(rs, &method.params, &method.body) + } else { + rs.error(&method.name, "duplicate method name") + } + }, if method.name.lexeme == "init" { ScopeType::Initializer } else {