private static void addSettersAndListeners(CompletionResultSet result, PsiClass containingClass, PsiFile origin) {
    // see PyJavaType.init() in Jython source code for matching logic
    for (PsiMethod method : containingClass.getAllMethods()) {
      final Project project = containingClass.getProject();
      if (PropertyUtilBase.isSimplePropertySetter(method)) {
        final String propName = PropertyUtilBase.getPropertyName(method);
        result.addElement(PyUtil.createNamedParameterLookup(propName, origin));
      }
      else if (method.getName().startsWith("add") && method.getName().endsWith("Listener") && PsiTypes.voidType().equals(method.getReturnType())) {
        final PsiParameter[] parameters = method.getParameterList().getParameters();
        if (parameters.length == 1) {
          final PsiType type = parameters[0].getType();
          if (type instanceof PsiClassType) {
            final PsiClass parameterClass = ((PsiClassType)type).resolve();
            if (parameterClass != null) {
              result.addElement(PyUtil.createNamedParameterLookup(StringUtil.decapitalize(StringUtil.notNullize(parameterClass.getName())), origin));
              for (PsiMethod parameterMethod : parameterClass.getMethods()) {
                result.addElement(PyUtil.createNamedParameterLookup(parameterMethod.getName(), origin));
              }
            }
          }
        }
      }
    }
  }
private static void addSettersAndListeners(CompletionResultSet result, PsiClass containingClass, PsiFile origin)