diff options
Diffstat (limited to 'st')
-rw-r--r-- | st/ClassInstance.java | 35 | ||||
-rw-r--r-- | st/SymbolTable.java | 2 |
2 files changed, 30 insertions, 7 deletions
diff --git a/st/ClassInstance.java b/st/ClassInstance.java index d51446f..804b1b0 100644 --- a/st/ClassInstance.java +++ b/st/ClassInstance.java @@ -29,13 +29,9 @@ public class ClassInstance extends AbstractInstance { else return false; - if (o.getName().equals(this.getName())) { - MinimalLogger.info(String.format("Found extension end.")); - if (o.getExtend() != null && o.getExtend().equals(this.getExtend())) - throw new TypecheckException(String.format("Recursive extension on %s detected", - this.toString())); + if (o.getName().equals(this.getName())) return true; - } else + else MinimalLogger.info(String.format("I (%s) do not have the same name as %s... Checking if I extend...", this.getName(), o.getName())); @@ -53,6 +49,33 @@ public class ClassInstance extends AbstractInstance { return false; } + public void recursiveExtendFilter() { + ClassInstance ce = this.getExtend(); + if (ce != null) + this.findMyselfHelper(ce); + } + + public boolean findMyselfHelper(ClassInstance c) { + /** + * Returns true if there is a path through extensions that reaches + * the original class. Such a case is a type error. + */ + if (this.getName().equals(c.getName())) { + MinimalLogger.info(String.format("%s is part of an extension loop!", + this.getName())); + throw new TypecheckException(String.format("Recursive extension detected!")); + } + + if (c.getExtend() == null) { + MinimalLogger.info(String.format("Search ended at %s.", + c.getName())); + return false; + } + + ClassInstance ce = c.getExtend(); + return this.findMyselfHelper(ce); + } + public ClassInstance getExtend() { /** * Returns the parent class, or diff --git a/st/SymbolTable.java b/st/SymbolTable.java index 7b509b2..68a2829 100644 --- a/st/SymbolTable.java +++ b/st/SymbolTable.java @@ -56,7 +56,7 @@ public class SymbolTable { cls.getName(), ext.getName())); cls.setExtend(ext); - ext.equalsOnExtend(cls); // finds recursive extensions + cls.recursiveExtendFilter(); TokenKey k; for (TypeInstance t : ext.getLocals()) { k = new TokenKey(t.getName(), TypeEnum.integer, |