summaryrefslogtreecommitdiff
path: root/st/SymbolTable.java
diff options
context:
space:
mode:
authorbd-912 <bdunahu@colostate.edu>2024-05-10 13:03:12 -0600
committerbd-912 <bdunahu@colostate.edu>2024-05-10 13:03:12 -0600
commit58fa180a069cef9692f002cb5b5eb401d6c90d0b (patch)
tree92121488fec6752a5e1271de7a3f00edc668ec0a /st/SymbolTable.java
parentf86e714a4fdebb994101813a5fa6664f5883a0ab (diff)
Fixed many issues with overloading in extensions
Diffstat (limited to 'st/SymbolTable.java')
-rw-r--r--st/SymbolTable.java57
1 files changed, 39 insertions, 18 deletions
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<TypeInstance> expected = exist.getArguments();
+ ArrayList<TypeInstance> 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()));
+ }
}
}