@Override
  public @Nullable HashMap getLwProperties(final String className) {
    if (myCache.containsKey(className)) {
      return myCache.get(className);
    }

    final PsiManager psiManager = PsiManager.getInstance(myModule.getProject());
    final GlobalSearchScope scope = GlobalSearchScope.moduleWithDependenciesAndLibrariesScope(myModule);
    final PsiClass aClass = JavaPsiFacade.getInstance(psiManager.getProject()).findClass(className, scope);
    if (aClass == null) {
      return null;
    }

    final HashMap result = new HashMap();

    final PsiMethod[] methods = aClass.getAllMethods();
    for (final PsiMethod method : methods) {
      // it's a setter candidate.. try to find getter

      if (!PropertyUtilBase.isSimplePropertySetter(method)) {
        continue;
      }
      final String name = PropertyUtilBase.getPropertyName(method);
      if (name == null) {
        throw new IllegalStateException();
      }
      final PsiMethod getter = PropertyUtilBase.findPropertyGetter(aClass, name, false, true);
      if (getter == null) {
        continue;
      }

      final PsiType type = getter.getReturnType();
      String propertyClassName =
        StringUtil.defaultIfEmpty(StringUtil.substringBefore(type.getCanonicalText(), "<"), type.getCanonicalText());

      LwIntrospectedProperty property = CompiledClassPropertiesProvider.propertyFromClassName(propertyClassName, name);
      if (property == null) {
        try (AccessToken ignore = SlowOperations.knownIssue("IDEA-307701, EA-513290")) {
          PsiClass propClass = JavaPsiFacade.getInstance(psiManager.getProject()).findClass(propertyClassName, scope);
          if (propClass == null) continue;
          if (propClass.isEnum()) {
            final String enumClassName = ClassUtil.getJVMClassName(propClass);
            final ClassLoader loader = LoaderFactory.getInstance(myModule.getProject()).getLoader(myModule);
            try {
              property = new LwIntroEnumProperty(name, loader.loadClass(enumClassName));
            }
            catch (ClassNotFoundException e) {
              continue;
            }
          }
          else {
            PsiClass componentClass = JavaPsiFacade.getInstance(psiManager.getProject()).findClass(Component.class.getName(), scope);
            PsiClass listModelClass = JavaPsiFacade.getInstance(psiManager.getProject()).findClass(ListModel.class.getName(), scope);
            if (componentClass != null && InheritanceUtil.isInheritorOrSelf(propClass, componentClass, true)) {
              property = new LwIntroComponentProperty(name, propertyClassName);
            }
            else if (componentClass != null &&
                     listModelClass != null &&
                     InheritanceUtil.isInheritorOrSelf(propClass, listModelClass, true)) {
              property = new LwIntroListModelProperty(name, propertyClassName);
            }
            else {
              // type is not supported
              continue;
            }
          }
        }
      }

      result.put(name, property);
    }

    myCache.put(className, result);
    return result;
  }
@Override
  public @Nullable HashMap getLwProperties(final String className)