diff options
Diffstat (limited to 'asm/src/org/aspectj/asm/internal')
4 files changed, 136 insertions, 28 deletions
diff --git a/asm/src/org/aspectj/asm/internal/AspectJElementHierarchy.java b/asm/src/org/aspectj/asm/internal/AspectJElementHierarchy.java index 0a36642ab..da1b09e38 100644 --- a/asm/src/org/aspectj/asm/internal/AspectJElementHierarchy.java +++ b/asm/src/org/aspectj/asm/internal/AspectJElementHierarchy.java @@ -8,6 +8,7 @@ * * Contributors: * Mik Kersten initial implementation + * Andy Clement Extensions for better IDE representation * ******************************************************************/ @@ -32,7 +33,19 @@ public class AspectJElementHierarchy implements IHierarchy { private Map typeMap = null; public IProgramElement getElement(String handle) { - throw new RuntimeException("unimplemented"); + IProgramElement cachedEntry = (IProgramElement)handleMap.get(handle); + if (cachedEntry!=null) return cachedEntry; + + StringTokenizer st = new StringTokenizer(handle, ProgramElement.ID_DELIM); + String file = st.nextToken(); + int line = new Integer(st.nextToken()).intValue(); + // int col = new Integer(st.nextToken()).intValue(); TODO: use column number when available + String canonicalSFP = AsmManager.getDefault().getCanonicalFilePath(new File(file)); + IProgramElement ret = findNodeForSourceLineHelper(root,canonicalSFP, line); + if (ret!=null) { + handleMap.put(handle,ret); + } + return ret; } public IProgramElement getRoot() { @@ -48,6 +61,10 @@ public class AspectJElementHierarchy implements IHierarchy { public void addToFileMap( Object key, Object value ){ fileMap.put( key, value ); } + + public boolean removeFromFileMap(Object key) { + return (fileMap.remove(key)!=null); + } public void setFileMap(HashMap fileMap) { this.fileMap = fileMap; @@ -336,5 +353,14 @@ public class AspectJElementHierarchy implements IHierarchy { protected void cache(String handle, ProgramElement pe) { handleMap.put(handle,pe); } + + public void flushTypeMap() { + typeMap.clear(); + + } + + public void flushHandleMap() { + handleMap.clear(); + } } diff --git a/asm/src/org/aspectj/asm/internal/ProgramElement.java b/asm/src/org/aspectj/asm/internal/ProgramElement.java index 3cff3287d..913a1cebc 100644 --- a/asm/src/org/aspectj/asm/internal/ProgramElement.java +++ b/asm/src/org/aspectj/asm/internal/ProgramElement.java @@ -8,16 +8,22 @@ * * Contributors: * Mik Kersten initial implementation + * Andy Clement Extensions for better IDE representation * ******************************************************************/ package org.aspectj.asm.internal; -import java.io.*; -import java.util.*; +import java.io.File; +import java.util.ArrayList; +import java.util.Iterator; +import java.util.List; -import org.aspectj.asm.*; -import org.aspectj.bridge.*; +import org.aspectj.asm.AsmManager; +import org.aspectj.asm.HierarchyWalker; +import org.aspectj.asm.IProgramElement; +import org.aspectj.bridge.IMessage; +import org.aspectj.bridge.ISourceLocation; /** @@ -55,6 +61,8 @@ public class ProgramElement implements IProgramElement { private List parameterTypes = null; private String details = null; + + private ExtraInformation info; /** * Used during de-externalization. @@ -126,6 +134,10 @@ public class ProgramElement implements IProgramElement { public Accessibility getAccessibility() { return accessibility; } + + public void setAccessibility(Accessibility a) { + accessibility=a; + } public String getDeclaringType() { return declaringType; @@ -388,6 +400,9 @@ public class ProgramElement implements IProgramElement { return sb.toString(); } + + public static boolean shortITDNames = true; + /** * TODO: move the "parent != null"==>injar heuristic to more explicit */ @@ -396,13 +411,20 @@ public class ProgramElement implements IProgramElement { if (kind == Kind.CODE || kind == Kind.INITIALIZER) { label = parent.getParent().getName() + ": "; } else if (kind.isInterTypeMember()) { - int dotIndex = name.indexOf('.'); - if (dotIndex != -1) { - return parent.getName() + ": " + toLabelString().substring(dotIndex+1); + if (shortITDNames) { + // if (name.indexOf('.')!=-1) return toLabelString().substring(name.indexOf('.')+1); + label=""; } else { + int dotIndex = name.indexOf('.'); + if (dotIndex != -1) { + return parent.getName() + ": " + toLabelString().substring(dotIndex+1); + } else { label = parent.getName() + '.'; + } } - } else if (kind == Kind.CLASS || kind == Kind.ASPECT) { + } else if (kind == Kind.CLASS || kind == Kind.ASPECT || kind == Kind.INTERFACE) { + label = ""; + } else if (kind.equals(Kind.DECLARE_PARENTS)) { label = ""; } else { if (parent != null) { @@ -487,5 +509,15 @@ public class ProgramElement implements IProgramElement { hierarchy.cache(handle,this); } } + + public void setExtraInfo(ExtraInformation info) { + this.info = info; + + } + + public ExtraInformation getExtraInfo() { + return info; + } + } diff --git a/asm/src/org/aspectj/asm/internal/Relationship.java b/asm/src/org/aspectj/asm/internal/Relationship.java index 68ee50e3f..c47fb159e 100644 --- a/asm/src/org/aspectj/asm/internal/Relationship.java +++ b/asm/src/org/aspectj/asm/internal/Relationship.java @@ -8,6 +8,7 @@ * * Contributors: * Mik Kersten initial implementation + * Andy Clement Extensions for better IDE representation * ******************************************************************/ @@ -15,7 +16,6 @@ package org.aspectj.asm.internal; import java.util.List; -//import org.aspectj.asm.*; import org.aspectj.asm.IRelationship; //import org.aspectj.asm.IRelationship.Kind; @@ -29,17 +29,20 @@ public class Relationship implements IRelationship { private Kind kind; private String sourceHandle; private List targets; + private boolean hasRuntimeTest; public Relationship( String name, Kind kind, String sourceHandle, - List targets) { + List targets, + boolean runtimeTest) { this.name = name; this.kind = kind; this.sourceHandle = sourceHandle; this.targets = targets; + this.hasRuntimeTest = runtimeTest; } public String getName() { @@ -61,5 +64,15 @@ public class Relationship implements IRelationship { public List getTargets() { return targets; } + + public boolean addTarget(String handle) { + if (targets.contains(handle)) return false; + targets.add(handle); + return true; + } + + public boolean hasRuntimeTest() { + return hasRuntimeTest; + } } diff --git a/asm/src/org/aspectj/asm/internal/RelationshipMap.java b/asm/src/org/aspectj/asm/internal/RelationshipMap.java index ce05fd5c6..b70887af6 100644 --- a/asm/src/org/aspectj/asm/internal/RelationshipMap.java +++ b/asm/src/org/aspectj/asm/internal/RelationshipMap.java @@ -15,6 +15,7 @@ package org.aspectj.asm.internal; import java.util.*; import org.aspectj.asm.*; +import org.aspectj.asm.IRelationship.Kind; /** * TODO: add a remove, and a clear all @@ -24,12 +25,20 @@ import org.aspectj.asm.*; */ public class RelationshipMap extends HashMap implements IRelationshipMap { - private IHierarchy hierarchy; + // As this gets serialized, make the hierarchy transient and + // settable + private transient IHierarchy hierarchy; + + public RelationshipMap() { } public RelationshipMap(IHierarchy hierarchy) { this.hierarchy = hierarchy; } + public void setHierarchy(IHierarchy hierarchy) { + this.hierarchy = hierarchy; + } + public List get(String handle) { List relationships = (List)super.get(handle); if (relationships == null) { @@ -43,48 +52,67 @@ public class RelationshipMap extends HashMap implements IRelationshipMap { return get(source.getHandleIdentifier()); } - public IRelationship get(String source, IRelationship.Kind kind, String relationshipName) { + public IRelationship get(String source, IRelationship.Kind kind, + String relationshipName,boolean runtimeTest,boolean createIfMissing) { List relationships = get(source); if (relationships == null) { + if (!createIfMissing) return null; relationships = new ArrayList(); - IRelationship rel = new Relationship(relationshipName, kind, source, new ArrayList()); + IRelationship rel = new Relationship(relationshipName, kind, source, new ArrayList(),runtimeTest); relationships.add(rel); super.put(source, relationships); return rel; } else { for (Iterator it = relationships.iterator(); it.hasNext(); ) { IRelationship curr = (IRelationship)it.next(); - if (curr.getKind() == kind && curr.getName().equals(relationshipName)) { + if (curr.getKind() == kind && + curr.getName().equals(relationshipName) && + curr.hasRuntimeTest() == runtimeTest) { return curr; } } + if (createIfMissing) { + // At this point we did find some relationships for 'source' but not one that looks like what we are + // after (either the kind or the name or the dynamictests setting don't match) + IRelationship rel = new Relationship(relationshipName, kind, source, new ArrayList(),runtimeTest); + relationships.add(rel); + return rel; + } } return null; } - public IRelationship get(IProgramElement source, IRelationship.Kind kind, String relationshipName) { - return get(source.getHandleIdentifier(), kind, relationshipName); + public IRelationship get(IProgramElement source, IRelationship.Kind kind, String relationshipName, boolean runtimeTest,boolean createIfMissing) { + return get(source.getHandleIdentifier(), kind, relationshipName,runtimeTest,createIfMissing); } - public void remove(String source, IRelationship relationship) { + public IRelationship get(IProgramElement source, Kind kind, String relationshipName) { + return get(source,kind,relationshipName,false,true); + } + + public boolean remove(String source, IRelationship relationship) { List list = (List)super.get(source); if (list != null) { - boolean matched = false; - for (Iterator it = list.iterator(); it.hasNext(); ) { - IRelationship curr = (IRelationship)it.next(); - if (curr.getName().equals(relationship.getName())) { - curr.getTargets().addAll(relationship.getTargets()); - matched = true; - } - } - if (!matched) list.remove(relationship); + return list.remove(relationship); +// boolean matched = false; +// for (Iterator it = list.iterator(); it.hasNext(); ) { +// IRelationship curr = (IRelationship)it.next(); +// if (curr.getName().equals(relationship.getName())) { +// curr.getTargets().addAll(relationship.getTargets()); +// matched = true; +// } +// } +// if (!matched) list.remove(relationship); } + return false; } public void removeAll(String source) { super.remove(source); } + public Object put(Object o, Object p) {throw new RuntimeException("Fuck off!"); + } public void put(String source, IRelationship relationship) { System.err.println(">> for: " + source + ", put::" + relationship); @@ -103,7 +131,11 @@ public class RelationshipMap extends HashMap implements IRelationshipMap { matched = true; } } - if (matched) list.add(relationship); + if (matched) { + // bug? + System.err.println("matched = true"); + } + if (matched) list.add(relationship); // Is this a bug, will it give us double entries? } } @@ -115,4 +147,9 @@ public class RelationshipMap extends HashMap implements IRelationshipMap { super.clear(); } + public Set getEntries() { + return keySet(); + } + + } |