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); }
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); }