void (@NotNull List<? super UsageInfo> usageInfos, @NotNull MultiMap<PsiElement, String> conflicts) { if (mySourceClassesByDir.isEmpty()) return; PackageIndex packageIndex = PackageIndex.getInstance(myProject); JavaPsiFacade psiFacade = JavaPsiFacade.getInstance(myProject); MultiMap<PsiJavaModule, PsiDirectory> sourceDirsByModuleDescriptor = groupDirsByModuleDescriptor(mySourceClassesByDir.keySet()); List<ModifyModuleStatementUsageInfo> moduleStatementUsages = new SmartList<>(); for (var entry : sourceDirsByModuleDescriptor.entrySet()) { PsiJavaModule sourceModuleDescriptor = entry.getKey(); Collection<PsiDirectory> sourceDirs = entry.getValue(); MultiMap<PsiPackage, PsiPackageAccessibilityStatement> sourceExports = collectModuleStatements(sourceModuleDescriptor.getExports()); MultiMap<PsiPackage, PsiPackageAccessibilityStatement> sourceOpens = collectModuleStatements(sourceModuleDescriptor.getOpens()); for (PsiDirectory sourceDir : sourceDirs) { String sourcePkgName = packageIndex.getPackageNameByDirectory(sourceDir.getVirtualFile()); if (sourcePkgName == null) continue; PsiPackage sourcePkg = psiFacade.findPackage(sourcePkgName); if (sourcePkg == null) continue; List<PsiPackageAccessibilityStatement> sourceStatements = findModuleStatementsForPkg(sourcePkg, sourceExports, sourceOpens); if (sourceStatements.isEmpty()) continue; // if a package doesn't contain any other classes except moved ones then we need to delete a corresponding export statement Collection<PsiClass> sourceClasses = mySourceClassesByDir.get(sourceDir); if (dirContainsOnlyClasses(sourceDir, sourceClasses)) { moduleStatementUsages.addAll( ContainerUtil.map(sourceStatements, statement -> ModifyModuleStatementUsageInfo.createLastDeletionInfo(statement, sourceModuleDescriptor))); } } } if (moduleStatementUsages.isEmpty()) return; PsiPackageAccessibilityStatement firstModuleStatement = moduleStatementUsages.get(0).getModuleStatement(); if (firstModuleStatement != null) { usageInfos.add(new SafeDeleteModuleStatementsUsageInfo(firstModuleStatement, moduleStatementUsages)); } }