Search in sources :

Example 51 with Clazz

use of aQute.bnd.osgi.Clazz in project bnd by bndtools.

the class ParseSignatureBuilder method parse.

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());
        }
    });
}
Also used : TypeRef(aQute.bnd.osgi.Descriptors.TypeRef) Clazz(aQute.bnd.osgi.Clazz) Analyzer(aQute.bnd.osgi.Analyzer) ClassDataCollector(aQute.bnd.osgi.ClassDataCollector)

Example 52 with Clazz

use of aQute.bnd.osgi.Clazz in project bnd by bndtools.

the class AnnotationReader method getDef.

private ComponentDef getDef() throws Exception {
    clazz.parseClassFileWithCollector(this);
    if (component.implementation == null)
        return null;
    if (options.contains(Options.inherit)) {
        baseclass = false;
        while (extendsClass != null) {
            if (extendsClass.isJava())
                break;
            Clazz ec = analyzer.findClass(extendsClass);
            if (ec == null) {
                analyzer.error("Missing super class for DS annotations: %s from %s", extendsClass, clazz.getClassName()).details(new DeclarativeServicesAnnotationError(className.getFQN(), null, null, ErrorType.UNABLE_TO_LOCATE_SUPER_CLASS));
                break;
            } else {
                ec.parseClassFileWithCollector(this);
            }
        }
    }
    for (ReferenceDef rdef : component.references.values()) {
        if (rdef.bind != null) {
            rdef.unbind = referredMethod(analyzer, rdef, rdef.unbind, "add(.*)", "remove$1", "(.*)", "un$1");
            rdef.updated = referredMethod(analyzer, rdef, rdef.updated, "(add|set|bind)(.*)", "updated$2", "(.*)", "updated$1");
            if (rdef.policy == ReferencePolicy.DYNAMIC && rdef.unbind == null)
                analyzer.error("In component class %s, reference %s is dynamic but has no unbind method.", className.getFQN(), rdef.name).details(getDetails(rdef, ErrorType.DYNAMIC_REFERENCE_WITHOUT_UNBIND));
        }
    }
    return component;
}
Also used : DeclarativeServicesAnnotationError(aQute.bnd.component.error.DeclarativeServicesAnnotationError) Clazz(aQute.bnd.osgi.Clazz)

Aggregations

Clazz (aQute.bnd.osgi.Clazz)52 Analyzer (aQute.bnd.osgi.Analyzer)14 ClassDataCollector (aQute.bnd.osgi.ClassDataCollector)14 TypeRef (aQute.bnd.osgi.Descriptors.TypeRef)12 PackageRef (aQute.bnd.osgi.Descriptors.PackageRef)8 InputStream (java.io.InputStream)8 FileResource (aQute.bnd.osgi.FileResource)7 File (java.io.File)6 FileInputStream (java.io.FileInputStream)6 HashMap (java.util.HashMap)6 MethodDef (aQute.bnd.osgi.Clazz.MethodDef)4 Descriptors (aQute.bnd.osgi.Descriptors)4 Instruction (aQute.bnd.osgi.Instruction)4 Jar (aQute.bnd.osgi.Jar)4 Map (java.util.Map)4 TreeSet (java.util.TreeSet)4 Attrs (aQute.bnd.header.Attrs)3 Parameters (aQute.bnd.header.Parameters)3 Annotation (aQute.bnd.osgi.Annotation)3 Builder (aQute.bnd.osgi.Builder)3