diff --git a/lib/java/se/lth/control/labcomm/ASTbuilder.java b/lib/java/se/lth/control/labcomm/ASTbuilder.java index d16b15621bfab4335b96cca4084fb4a2a8c59383..b1525cbcf44baaf73121711e5d60f5a18ba84dba 100644 --- a/lib/java/se/lth/control/labcomm/ASTbuilder.java +++ b/lib/java/se/lth/control/labcomm/ASTbuilder.java @@ -158,13 +158,17 @@ public class ASTbuilder implements TypeDefParser.ParsedSymbolVisitor { /** Create a labcomm AST for the ParsedTypeDef d, including * all declarations from p. * - * This copies the declarations in p, and creates a new AST. * - * If d is a sampleDecl, include the typedefs it depends on. + * If p is not null, and the source of d matches the + * TypeDefParser this ASTbuilder was created for, + * creates a new AST containing the declarations in p + * and d and (if d is a sampleDecl) its dependencies. + * + * Otherwise, makeProgram(d) */ public Program makeProgram(TypeDefParser.ParsedTypeDef d, Program p) { - if(p != null) { + if(p != null && d.checkSource(tdp)) { return makeProgram(d, p.getDecls().fullCopy()); } else { return makeProgram(d); diff --git a/lib/java/se/lth/control/labcomm/TypeDefParser.java b/lib/java/se/lth/control/labcomm/TypeDefParser.java index 773ba32431a0c406229889e57436f8f1a869987e..6ab81831a230bfa9befb264a363de298b9b3a6cc 100644 --- a/lib/java/se/lth/control/labcomm/TypeDefParser.java +++ b/lib/java/se/lth/control/labcomm/TypeDefParser.java @@ -2,8 +2,9 @@ package se.lth.control.labcomm; import java.util.HashMap; import java.util.HashSet; -import java.util.Iterator; import java.util.LinkedList; +import java.util.Iterator; +import java.util.NoSuchElementException; import java.io.ByteArrayInputStream; import java.io.DataInputStream; @@ -17,6 +18,10 @@ import se.lth.control.labcomm.TypeBinding; public class TypeDefParser implements TypeDef.Handler, TypeBinding.Handler { + public interface TypeDefListener { + void onTypeDef(ParsedTypeDef d); + } + static class SelfBinding extends TypeDef { private int sampleIndex; @@ -48,10 +53,25 @@ public class TypeDefParser implements TypeDef.Handler, TypeBinding.Handler { } } - public interface TypeDefListener { - void onTypeDef(ParsedTypeDef d); + static class EmptyIterator<T> implements java.util.Iterator { + @Override + public boolean hasNext() { + return false; + } + + @Override + public T next() { + throw new NoSuchElementException(); + } + + public void remove() { + throw new UnsupportedOperationException(); + } } + static EmptyIterator<ParsedTypeDef> emptyIterator = + new EmptyIterator<>(); + private HashMap<Integer,TypeDef> typeDefs; private HashMap<Integer,Integer> typeBindings; private HashSet<TypeDefListener> listeners; @@ -403,10 +423,22 @@ public class TypeDefParser implements TypeDef.Handler, TypeBinding.Handler { private int idx; private String name; private ParsedType type; + private final TypeDefParser source; + + ParsedTypeDef(TypeDefParser source, int idx, String name){ + this.source = source; + this.idx = idx; + this.name = name; + } + + ParsedTypeDef(TypeDefParser source, + int idx, String name, ParsedType type) { + this(source, idx, name); + this.type = type; + } ParsedTypeDef(int idx, String name){ - this.idx = idx; - this.name = name; + this(null, idx, name); } ParsedTypeDef(int idx, String name, ParsedType type) { @@ -414,6 +446,16 @@ public class TypeDefParser implements TypeDef.Handler, TypeBinding.Handler { this.type = type; } + /** @return true if source is same as + */ + public boolean checkSource(TypeDefParser o) { + boolean result = source == o; + System.err.println("ParsedTypeDef.checkSource: source = "+source); + System.err.println("ParsedTypeDef.checkSource: o "+o); + System.err.println("ParsedTypeDef.checkSource: "+result); + return result; + } + /** To be overridden in ParsedSampleDef */ public boolean isSampleDef() { @@ -421,7 +463,7 @@ public class TypeDefParser implements TypeDef.Handler, TypeBinding.Handler { } Iterator<ParsedTypeDef> getDepIterator() { - throw new Error("ParseTypeDef has no dependencies"); + return emptyIterator; } void setType(ParsedType type) { @@ -465,8 +507,9 @@ public class TypeDefParser implements TypeDef.Handler, TypeBinding.Handler { public class ParsedSampleDef extends ParsedTypeDef{ private HashSet<ParsedTypeDef> deps; + ParsedSampleDef(ParsedTypeDef td) { - super(td.getIndex(), td.getName(), td.getType()); + super(td.source, td.getIndex(), td.getName(), td.getType()); this.deps = new HashSet<ParsedTypeDef>(); } @@ -496,7 +539,7 @@ public class TypeDefParser implements TypeDef.Handler, TypeBinding.Handler { private LinkedList<TypeDef> typeStack; ParsedTypeDef newTypeDef() { - currentParsed =new ParsedTypeDef(getCurrentIndex(), getCurrentName()); + currentParsed =new ParsedTypeDef(TypeDefParser.this, getCurrentIndex(), getCurrentName()); return currentParsed; }