Esempio n. 1
0
        public static Iterable <MemberInfo> getMembers(Library typeSystem, TypeInfo type, String name)
        {
            var result = new ArrayList <MemberInfo>();

            foreach (var f in type.Fields)
            {
                if (f.Name.equals(name))
                {
                    result.add(MemberInfo.getInfo(f));
                    break;
                }
            }

            MethodInfo getAccessor = null;
            MethodInfo setAccessor = null;

            foreach (var m in type.Methods)
            {
                if (getAccessor == null || setAccessor == null)
                {
                    foreach (var annotation in BytecodeHelper.getAnnotations(typeSystem, m))
                    {
                        if (BytecodeHelper.isPropertyGet(annotation) && name.equals(BytecodeHelper.getPropertyGetName(m, annotation)))
                        {
                            getAccessor = m;
                            break;
                        }
                        if (BytecodeHelper.isPropertySet(annotation) && name.equals(BytecodeHelper.getPropertySetName(m, annotation)))
                        {
                            setAccessor = m;
                            break;
                        }
                    }
                }
                if (m.Name.equals(name))
                {
                    result.add(MemberInfo.getInfo(m));
                }
            }
            if (getAccessor != null || setAccessor != null)
            {
                result.add(MemberInfo.getInfo(getAccessor, setAccessor, name));
            }

            foreach (var t in type.NestedTypes)
            {
                if (name.equals(t.Name))
                {
                    result.add(MemberInfo.getInfo(t));
                    break;
                }
            }

            return(result);
        }
 public static MethodInfo getDisposeMethod(Library typeSystem, TypeInfo type)
 {
     foreach (var method in Collections.singletonList(type).concat(type.getBaseTypes()).selectMany(p => p.Methods))
     {
         if (!method.Parameters.any())
         {
             foreach (var annotation in BytecodeHelper.getAnnotations(typeSystem, method))
             {
                 if (BytecodeHelper.isDispose(annotation))
                 {
                     return(method);
                 }
             }
         }
     }
     return(null);
 }
Esempio n. 3
0
        public static Iterable <MemberInfo> getIndexers(Library typeSystem, TypeInfo type, int indexes)
        {
            List <MethodInfo> getters = null;
            List <MethodInfo> setters = null;

            foreach (var method in type.Methods)
            {
                foreach (var annotation in BytecodeHelper.getAnnotations(typeSystem, method))
                {
                    if (BytecodeHelper.isIndexerGet(annotation))
                    {
                        var nparams = method.Parameters.count();
                        if (indexes == nparams || (method.IsVarargs && indexes >= nparams))
                        {
                            if (getters == null)
                            {
                                getters = new ArrayList <MethodInfo>();
                            }
                            getters.add(method);
                        }
                        break;
                    }
                    if (BytecodeHelper.isIndexerSet(annotation))
                    {
                        var nparams = method.Parameters.count() - 1;
                        if (indexes == nparams || (method.IsVarargs && indexes >= nparams))
                        {
                            if (setters == null)
                            {
                                setters = new ArrayList <MethodInfo>();
                            }
                            setters.add(method);
                        }
                        break;
                    }
                }
            }
            if (setters == null && getters == null)
            {
                return(Query.empty());
            }
            var result   = new ArrayList <MemberInfo>();
            var getters2 = (getters == null) ? Collections.emptySet <MethodInfo>() : new HashSet <MethodInfo>(getters);
            var setters2 = (setters == null) ? Collections.emptySet <MethodInfo>() : new HashSet <MethodInfo>(setters);

            if (getters == null)
            {
                getters = Collections.emptyList();
            }
            if (setters == null)
            {
                setters = Collections.emptyList();
            }
            foreach (var get in getters)
            {
                foreach (var set in setters)
                {
                    if (get.Parameters.count() == set.Parameters.count() - 1)
                    {
                        var it1   = get.OriginalMethodDefinition.Parameters.iterator();
                        var it2   = set.OriginalMethodDefinition.Parameters.iterator();
                        var match = true;
                        while (it1.hasNext())
                        {
                            var t1 = it1.next().Type;
                            var t2 = it2.next().Type;
                            if (t1.IsGenericParameter)
                            {
                                t1 = BytecodeHelper.getGenericParameterTypeErasure(typeSystem, t1);
                            }
                            if (t2.IsGenericParameter)
                            {
                                t2 = BytecodeHelper.getGenericParameterTypeErasure(typeSystem, t2);
                            }
                            if (t1 != t2)
                            {
                                match = false;
                                break;
                            }
                        }
                        if (match)
                        {
                            var t1 = get.OriginalMethodDefinition.ReturnType;
                            if (t1.IsGenericParameter)
                            {
                                t1 = BytecodeHelper.getGenericParameterTypeErasure(typeSystem, t1);
                            }
                            var t2 = it2.next().Type;
                            if (t2.IsGenericParameter)
                            {
                                t2 = BytecodeHelper.getGenericParameterTypeErasure(typeSystem, t2);
                            }
                            if (t1 == t2)
                            {
                                getters2.remove(get);
                                setters2.remove(set);
                                result.add(MemberInfo.getInfo(get, set));
                            }
                        }
                    }
                }
            }
            foreach (var m in getters2)
            {
                result.add(MemberInfo.getInfo(m, null));
            }
            foreach (var m in setters2)
            {
                result.add(MemberInfo.getInfo((MethodInfo)null, m));
            }
            return(result);
        }