Use local copy of latest bndlib code for pre-release testing purposes
git-svn-id: https://svn.apache.org/repos/asf/felix/trunk@1347815 13f79535-47bb-0310-9956-ffa450edef68
diff --git a/bundleplugin/src/main/java/aQute/bnd/compatibility/ParseSignatureBuilder.java b/bundleplugin/src/main/java/aQute/bnd/compatibility/ParseSignatureBuilder.java
new file mode 100644
index 0000000..f1f91d1
--- /dev/null
+++ b/bundleplugin/src/main/java/aQute/bnd/compatibility/ParseSignatureBuilder.java
@@ -0,0 +1,119 @@
+package aQute.bnd.compatibility;
+
+import java.io.*;
+
+import aQute.lib.osgi.*;
+import aQute.lib.osgi.Descriptors.TypeRef;
+
+public class ParseSignatureBuilder {
+ final Scope root;
+
+ public ParseSignatureBuilder(Scope root) {
+ this.root = root;
+ }
+
+ public void add( Jar jar ) throws Exception {
+ for ( Resource r : jar.getResources().values()) {
+ InputStream in = r.openInputStream();
+ try {
+ parse(in);
+ } finally {
+ in.close();
+ }
+ }
+ }
+
+ public Scope getRoot() { return root; }
+
+
+ public void parse(InputStream in) throws Exception {
+ Analyzer analyzer = new Analyzer();
+ Clazz clazz = new Clazz(analyzer, "", null);
+
+ clazz.parseClassFile(in, new ClassDataCollector() {
+ Scope s;
+ Scope enclosing;
+ Scope declaring;
+
+ @Override
+ public void classBegin(int access, TypeRef name) {
+ s = root.getScope(name.getBinary());
+ s.access = Access.modifier(access);
+ s.kind = Kind.CLASS;
+ }
+
+ @Override
+ public void extendsClass(TypeRef name) {
+// s.setBase(new GenericType(name));
+ }
+
+ @Override
+ public void implementsInterfaces(TypeRef names[]) {
+ s.setParameterTypes(convert(names));
+ }
+
+ GenericType[] convert(TypeRef names[]) {
+ GenericType tss[] = new GenericType[names.length];
+ for (int i = 0; i < names.length; i++) {
+// tss[i] = new GenericType(names[i]);
+ }
+ return tss;
+ }
+
+ @Override
+ public void method(Clazz.MethodDef defined) {
+ String descriptor;
+ Kind kind;
+ if (defined.isConstructor()) {
+ descriptor = ":" + defined.getDescriptor();
+ kind = Kind.CONSTRUCTOR;
+ } else {
+ descriptor = defined.getName() + ":" + defined.getDescriptor();
+ kind = Kind.METHOD;
+ }
+ Scope m = s.getScope(descriptor);
+ m.access = Access.modifier(defined.getAccess());
+ m.kind = kind;
+ m.declaring = s;
+ s.add(m);
+ }
+
+ @Override
+ public void field(Clazz.FieldDef defined) {
+ String descriptor = defined.getName() + ":" + defined.getDescriptor();
+ Kind kind = Kind.FIELD;
+ Scope m = s.getScope(descriptor);
+ m.access = Access.modifier(defined.getAccess());
+ m.kind = kind;
+ m.declaring = s;
+ s.add(m);
+ }
+
+ @Override
+ public void classEnd() {
+ if (enclosing != null)
+ s.setEnclosing( enclosing );
+ if (declaring != null)
+ s.setDeclaring( declaring );
+ }
+
+ @Override
+ public void enclosingMethod(TypeRef cName, String mName, String mDescriptor) {
+ enclosing = root.getScope(cName.getBinary());
+ if (mName != null) {
+ enclosing = enclosing.getScope(Scope.methodIdentity(mName, mDescriptor));
+ }
+ }
+
+ @Override
+ public void innerClass(TypeRef innerClass, TypeRef outerClass, String innerName,
+ int innerClassAccessFlags) {
+ if (outerClass != null && innerClass != null && innerClass.getBinary().equals(s.name))
+ declaring = root.getScope(outerClass.getBinary());
+ }
+ });
+
+
+ }
+}
+