aboutsummaryrefslogtreecommitdiffstats
path: root/asm/src/org/aspectj/asm/internal
diff options
context:
space:
mode:
Diffstat (limited to 'asm/src/org/aspectj/asm/internal')
-rw-r--r--asm/src/org/aspectj/asm/internal/AspectJElementHierarchy.java28
-rw-r--r--asm/src/org/aspectj/asm/internal/ProgramElement.java48
-rw-r--r--asm/src/org/aspectj/asm/internal/Relationship.java17
-rw-r--r--asm/src/org/aspectj/asm/internal/RelationshipMap.java71
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();
+ }
+
+
}