Skip to content

Commit

Permalink
Implemented a sketch version of the method graph.
Browse files Browse the repository at this point in the history
  • Loading branch information
Rafael Winterhalter committed Jul 29, 2015
1 parent eddc240 commit d113061
Showing 1 changed file with 64 additions and 9 deletions.
@@ -1,11 +1,13 @@
package net.bytebuddy.dynamic.scaffold; package net.bytebuddy.dynamic.scaffold;


import net.bytebuddy.description.method.MethodDescription; import net.bytebuddy.description.method.MethodDescription;
import net.bytebuddy.description.method.MethodList;
import net.bytebuddy.description.type.TypeDescription; import net.bytebuddy.description.type.TypeDescription;
import net.bytebuddy.description.type.generic.GenericTypeDescription;


import java.util.*; import java.util.*;


public interface MethodGraph extends MethodLookupEngine.Finding { public interface MethodGraph {


interface Factory { interface Factory {


Expand All @@ -15,7 +17,33 @@ class Default implements Factory {


@Override @Override
public MethodGraph make(TypeDescription typeDescription) { public MethodGraph make(TypeDescription typeDescription) {
return null; return new KeyStoreMethodGraph(doAnalyze(typeDescription));
}

protected Key.Store analyze(GenericTypeDescription typeDescription) {
return typeDescription == null
? new Key.Store()
: doAnalyze(typeDescription);
}

protected Key.Store doAnalyze(GenericTypeDescription typeDescription) {
Key.Store keyStore = analyze(typeDescription.getSuperType());
for (GenericTypeDescription interfaceType : typeDescription.getInterfaces()) {
keyStore.mergeWith(doAnalyze(interfaceType));
}
for (MethodDescription methodDescription : typeDescription.getDeclaredMethods()) {
keyStore = keyStore.register(methodDescription);
}
return keyStore;
}

protected static class KeyStoreMethodGraph implements MethodGraph {

private final Key.Store keyStore;

protected KeyStoreMethodGraph(Key.Store keyStore) {
this.keyStore = keyStore;
}
} }


protected static class Key { protected static class Key {
Expand All @@ -26,23 +54,29 @@ public static Key of(MethodDescription methodDescription) {


private final String internalName; private final String internalName;


private final Set<MethodDescription.Token> keys; private final Set<MethodDescription.Token> tokens;


protected Key(String internalName, Set<MethodDescription.Token> keys) { protected Key(String internalName, Set<MethodDescription.Token> tokens) {
this.internalName = internalName; this.internalName = internalName;
this.keys = keys; this.tokens = tokens;
} }


protected Key expand(MethodDescription.InDefinedShape methodDescription) { protected Key expandWith(MethodDescription.InDefinedShape methodDescription) {
Set<MethodDescription.Token> keys = new HashSet<MethodDescription.Token>(this.keys); Set<MethodDescription.Token> keys = new HashSet<MethodDescription.Token>(this.tokens);
keys.add(methodDescription.asToken()); keys.add(methodDescription.asToken());
return new Key(internalName, keys); return new Key(internalName, keys);
} }


protected Key mergeWith(Key key) {
Set<MethodDescription.Token> keys = new HashSet<MethodDescription.Token>(this.tokens);
keys.addAll(key.tokens);
return new Key(internalName, keys);
}

@Override @Override
public boolean equals(Object other) { public boolean equals(Object other) {
return other == this || (other instanceof Key return other == this || (other instanceof Key
&& !Collections.disjoint(keys, ((Key) other).keys)); && !Collections.disjoint(tokens, ((Key) other).tokens));
} }


@Override @Override
Expand Down Expand Up @@ -73,6 +107,23 @@ protected Store register(MethodDescription methodDescription) {
return new Store(entries); return new Store(entries);
} }


protected Store mergeWith(Store keyStore) {
for (Entry entry : keyStore.entries.values()) {
keyStore = keyStore.inject(entry);
}
return keyStore;
}

protected Store inject(Entry entry) {
Map<Key, Entry> entries = new HashMap<Key, Entry>(this.entries);
Entry dominantEntry = entries.get(entry.getKey());
Entry mergedEntry = dominantEntry == null
? entry
: dominantEntry.mergeWith(entry);
entries.put(mergedEntry.getKey(), mergedEntry);
return new Store(entries);
}

protected static class Entry { protected static class Entry {


private final Key key; private final Key key;
Expand All @@ -85,7 +136,11 @@ protected Entry(Key key, MethodDescription methodDescription) {
} }


protected Entry expand(MethodDescription methodDescription) { protected Entry expand(MethodDescription methodDescription) {
return new Entry(key.expand(methodDescription.asDefined()), methodDescription); return new Entry(key.expandWith(methodDescription.asDefined()), methodDescription);
}

protected Entry mergeWith(Entry entry) {
return new Entry(key.mergeWith(entry.getKey()), methodDescription);
} }


protected Key getKey() { protected Key getKey() {
Expand Down

0 comments on commit d113061

Please sign in to comment.