@Nullable
  @Override
  public PsiPackage resolvePackage(
      @NotNull PsiPackageManager packageManager,
      @NotNull VirtualFile virtualFile,
      @NotNull Class<? extends ModuleExtension> extensionClass,
      String qualifiedName) {
    ProjectFileIndex fileIndexFacade =
        ProjectFileIndex.SERVICE.getInstance(packageManager.getProject());
    PsiManager psiManager = PsiManager.getInstance(packageManager.getProject());
    if (fileIndexFacade.isInLibraryClasses(virtualFile)) {

      List<OrderEntry> orderEntriesForFile = fileIndexFacade.getOrderEntriesForFile(virtualFile);
      for (OrderEntry orderEntry : orderEntriesForFile) {
        Module ownerModule = orderEntry.getOwnerModule();
        ModuleExtension extension = ModuleUtilCore.getExtension(ownerModule, extensionClass);
        if (extension != null) {
          for (PsiPackageSupportProvider p : PsiPackageSupportProvider.EP_NAME.getExtensions()) {
            if (p.isSupported(extension)) {
              return p.createPackage(psiManager, packageManager, extensionClass, qualifiedName);
            }
          }
        }
      }
    }
    return null;
  }
 @Override
 public Collection<Module> getValidModules() {
   val list = new ArrayList<Module>();
   for (val module : ModuleManager.getInstance(getProject()).getModules()) {
     if (ModuleUtilCore.getExtension(module, DotNetModuleExtension.class) != null) {
       list.add(module);
     }
   }
   return list;
 }
  @Nullable
  @Override
  public RunProfileState getState(
      @NotNull Executor executor, @NotNull final ExecutionEnvironment executionEnvironment)
      throws ExecutionException {
    val module = getConfigurationModule().getModule();
    if (module == null) {
      throw new ExecutionException("Module is null");
    }

    DotNetModuleExtension<?> extension =
        ModuleUtilCore.getExtension(module, DotNetModuleExtension.class);

    if (extension == null) {
      throw new ExecutionException("Module don't have .NET extension");
    }

    Sdk sdk = extension.getSdk();
    if (sdk == null) {
      throw new ExecutionException("SDK for module is not defined");
    }

    DebugConnectionInfo debugConnectionInfo = null;
    if (executor instanceof DefaultDebugExecutor) {
      debugConnectionInfo = new DebugConnectionInfo("127.0.0.1", -1, true);
    }

    DotNetConfiguration runProfile = (DotNetConfiguration) executionEnvironment.getRunProfile();
    GeneralCommandLine runCommandLine =
        extension.createDefaultCommandLine(sdk, debugConnectionInfo);
    String programParameters = runProfile.getProgramParameters();
    if (!StringUtil.isEmpty(programParameters)) {
      runCommandLine.addParameters(StringUtil.split(programParameters, " "));
    }
    runCommandLine.setPassParentEnvironment(runProfile.isPassParentEnvs());
    runCommandLine.getEnvironment().putAll(runProfile.getEnvs());
    runCommandLine.setWorkDirectory(
        DotNetMacroUtil.expand(module, runProfile.getWorkingDirectory(), false));

    DotNetRunProfileState state = new DotNetRunProfileState(executionEnvironment, runCommandLine);
    if (debugConnectionInfo != null) {
      state.putUserData(DotNetRunKeys.DEBUG_CONNECTION_INFO_KEY, debugConnectionInfo);
    }

    return state;
  }
  private static void collectAllAndroidDependencies(
      Module module,
      boolean androidLibrariesOnly,
      List<AndroidModuleExtension> result,
      Set<AndroidModuleExtension> visited) {
    final OrderEntry[] entries = ModuleRootManager.getInstance(module).getOrderEntries();
    // loop in the inverse order to resolve dependencies on the libraries, so that if a library
    // is required by two higher level libraries it can be inserted in the correct place

    for (int i = entries.length - 1; i >= 0; i--) {
      final OrderEntry orderEntry = entries[i];
      if (orderEntry instanceof ModuleOrderEntry) {
        final ModuleOrderEntry moduleOrderEntry = (ModuleOrderEntry) orderEntry;

        if (moduleOrderEntry.getScope() == DependencyScope.COMPILE) {
          final Module depModule = moduleOrderEntry.getModule();

          if (depModule != null) {
            final AndroidModuleExtension depFacet =
                ModuleUtilCore.getExtension(depModule, AndroidModuleExtension.class);

            if (depFacet != null
                && (!androidLibrariesOnly || depFacet.isLibraryProject())
                && visited.add(depFacet)) {
              final List<WeakReference<AndroidModuleExtension>> cachedDepDeps =
                  getInstance(depModule).getListRef(androidLibrariesOnly).get();

              if (cachedDepDeps != null) {
                final List<AndroidModuleExtension> depDeps = dereference(cachedDepDeps);

                for (AndroidModuleExtension depDepFacet : depDeps) {
                  if (visited.add(depDepFacet)) {
                    result.add(depDepFacet);
                  }
                }
              } else {
                collectAllAndroidDependencies(depModule, androidLibrariesOnly, result, visited);
              }
              result.add(depFacet);
            }
          }
        }
      }
    }
  }