From 58fa180a069cef9692f002cb5b5eb401d6c90d0b Mon Sep 17 00:00:00 2001 From: bd-912 Date: Fri, 10 May 2024 13:03:12 -0600 Subject: Fixed many issues with overloading in extensions --- st/SymbolTable.java | 57 ++++++++++++++++++++++++++++++++++++----------------- 1 file changed, 39 insertions(+), 18 deletions(-) (limited to 'st/SymbolTable.java') diff --git a/st/SymbolTable.java b/st/SymbolTable.java index fa6bdf2..ca38295 100644 --- a/st/SymbolTable.java +++ b/st/SymbolTable.java @@ -56,27 +56,48 @@ public class SymbolTable { cls.getName(), ext.getName())); cls.setExtend(ext); + TokenKey k; for (TypeInstance t : ext.getLocals()) { - MinimalLogger.info(String.format("Added %s (%s) as a local var of %s (%s)", - t.getName(), t.getType(), - cls.getName(), cls.getType())); - cls.addLocal(t); - this.symt.put(new TokenKey(t.getName(), - TypeEnum.integer, - cls, - null), - t); + k = new TokenKey(t.getName(), TypeEnum.integer, + cls, null); + if (this.symt.get(k) == null) { + MinimalLogger.info(String.format("Added %s (%s) as a local var of %s (%s)", + t.getName(), t.getType(), + cls.getName(), cls.getType())); + cls.addLocal(t); + this.symt.put(k, t); + } else { MinimalLogger.info(String.format("%s found to be overridden in %s.", + t.getName(), cls.getName())); } } for (MethodInstance m : ext.getMethods()) { - MinimalLogger.info(String.format("Added %s (%s) as a method of %s (%s)", - m.getName(), m.getType(), - cls.getName(), cls.getType())); - this.symt.put(new TokenKey(m.getName(), - TypeEnum.method, - cls, - null), - m); - cls.addMethod(m); + k = new TokenKey(m.getName(), TypeEnum.method, + cls, null); + if (this.symt.get(k) == null) { + MinimalLogger.info(String.format("Added %s (%s) as a method of %s (%s)", + m.getName(), m.getType(), + cls.getName(), cls.getType())); + this.symt.put(k, m); + cls.addMethod(m); + } else { + MethodInstance exist = (MethodInstance) this.symt.get(k); + ArrayList expected = exist.getArguments(); + ArrayList actual = m.getArguments(); + if (expected.size() != actual.size() || + !exist.getReturn().equals(m.getReturn())) + throw new TypecheckException(String.format("SymbolTable found that %s is overwritten in %s!", + m.getName(), + cls.getName())); + for (int i = 0; i < actual.size(); ++i) { + if (expected.get(i).getClassInstance() != actual.get(i).getClassInstance()) { + throw new TypecheckException(String.format("SymbolTable found that %s is overwritten in %s!", + m.getName(), + cls.getName())); + } + } + + MinimalLogger.info(String.format("%s found to be overridden in %s.", + m.getName(), cls.getName())); + } } } -- cgit v1.2.3