properties: create resource bundle by default only if files have the same extension IDEA-163295

This commit is contained in:
Dmitry Batkovich
2016-10-31 19:12:47 +03:00
parent 5e966402a2
commit f26343e81a
3 changed files with 46 additions and 56 deletions
@@ -23,6 +23,7 @@ import com.intellij.lang.properties.xml.XmlProperty;
import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.fileTypes.StdFileTypes;
import com.intellij.openapi.project.Project;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.openapi.vfs.VirtualFileManager;
import com.intellij.pom.PomTarget;
@@ -38,6 +39,8 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import java.util.*;
import java.util.stream.Collectors;
import java.util.stream.Stream;
/**
* @author Konstantin Bulenkov
@@ -67,9 +70,10 @@ public class PropertiesImplUtil extends PropertiesUtil {
final String baseName = manager.getBaseName(containingFile);
final String extension = containingFile.getVirtualFile().getExtension();
final PsiDirectory directory = ReadAction.compute(() -> containingFile.getContainingDirectory());
if (directory == null) return ResourceBundleWithCachedFiles.EMPTY;
final ResourceBundleWithCachedFiles bundle = getResourceBundle(baseName, directory);
final ResourceBundleWithCachedFiles bundle = getResourceBundle(baseName, extension, directory);
return bundle == null
? new ResourceBundleWithCachedFiles(new ResourceBundleImpl(representative), Collections.singletonList(representative))
: bundle;
@@ -82,34 +86,19 @@ public class PropertiesImplUtil extends PropertiesUtil {
@Nullable
private static ResourceBundleWithCachedFiles getResourceBundle(@NotNull final String baseName,
@NotNull final PsiDirectory baseDirectory) {
PropertiesFile defaultPropertiesFile = null;
@Nullable final String extension,
@NotNull final PsiDirectory baseDirectory) {
final ResourceBundleManager bundleBaseNameManager = ResourceBundleManager.getInstance(baseDirectory.getProject());
final PsiFile[] psiFiles = ReadAction.compute(() -> baseDirectory.getFiles());
final List<PropertiesFile> bundleFiles = new ArrayList<>(1);
for (final PsiFile psiFile : psiFiles) {
final PropertiesFile propertiesFile = getPropertiesFile(psiFile);
if (propertiesFile == null) {
continue;
}
if (baseName.equals(bundleBaseNameManager.getBaseName(psiFile))) {
if (defaultPropertiesFile == null) {
defaultPropertiesFile = propertiesFile;
} else {
final int nameDiff = defaultPropertiesFile.getName().compareTo(propertiesFile.getName());
if (nameDiff > 0) {
defaultPropertiesFile = propertiesFile;
} else if (nameDiff == 0) {
return null;
}
}
bundleFiles.add(propertiesFile);
}
}
if (defaultPropertiesFile == null) {
return null;
}
return new ResourceBundleWithCachedFiles(new ResourceBundleImpl(defaultPropertiesFile), bundleFiles);
final List<PropertiesFile> bundleFiles = Stream
.of(ReadAction.compute(() -> baseDirectory.getFiles()))
.filter(f -> Comparing.strEqual(f.getVirtualFile().getExtension(), extension))
.filter(PropertiesImplUtil::isPropertiesFile)
.filter(Objects::nonNull)
.filter(f -> Comparing.equal(bundleBaseNameManager.getBaseName(f), baseName))
.map(PropertiesImplUtil::getPropertiesFile)
.collect(Collectors.toList());
if (bundleFiles == null) return null;
return new ResourceBundleWithCachedFiles(new ResourceBundleImpl(bundleFiles.get(0)), bundleFiles);
}
public static boolean isPropertiesFile(@Nullable PsiFile file) {
@@ -170,8 +159,17 @@ public class PropertiesImplUtil extends PropertiesUtil {
if (baseDirectory == null) {
return null;
}
final ResourceBundleWithCachedFiles rb = getResourceBundle(baseName, baseDirectory);
return rb == null ? null : rb.getBundle();
final ResourceBundleManager bundleBaseNameManager = ResourceBundleManager.getInstance(project);
for (PsiFile file : baseDirectory.getFiles()) {
final PropertiesFile propertiesFile = getPropertiesFile(file);
if (propertiesFile == null) continue;
final String currBaseName = bundleBaseNameManager.getBaseName(file);
if (currBaseName.equals(baseName)) {
return getResourceBundle(propertiesFile);
}
}
return null;
}
public static boolean isAlphaSorted(final Collection<? extends IProperty> properties) {
@@ -20,14 +20,9 @@
package com.intellij.lang.properties;
import com.intellij.lang.properties.psi.PropertiesFile;
import com.intellij.openapi.application.ReadAction;
import com.intellij.openapi.util.Comparing;
import com.intellij.openapi.vfs.VirtualFile;
import com.intellij.psi.PsiFile;
import com.intellij.util.SmartList;
import org.jetbrains.annotations.NotNull;
import java.util.Collections;
import java.util.List;
public class ResourceBundleImpl extends ResourceBundle {
@@ -41,27 +36,7 @@ public class ResourceBundleImpl extends ResourceBundle {
@NotNull
@Override
public List<PropertiesFile> getPropertiesFiles() {
if (ResourceBundleManager.getInstance(getProject()).isDefaultDissociated(myDefaultPropertiesFile.getVirtualFile())) {
return Collections.singletonList(myDefaultPropertiesFile);
}
PsiFile[] children = ReadAction.compute(() -> myDefaultPropertiesFile.getParent().getFiles());
final String baseName = getBaseName();
List<PropertiesFile> result = new SmartList<>();
for (PsiFile file : children) {
if (!file.isValid()) continue;
PropertiesFile propertiesFile = PropertiesImplUtil.getPropertiesFile(file);
if (propertiesFile == null) {
continue;
}
if (Comparing.strEqual(PropertiesUtil.getDefaultBaseName(file.getVirtualFile()), baseName)) {
result.add(propertiesFile);
if (!propertiesFile.equals(myDefaultPropertiesFile) &&
Comparing.equal(propertiesFile.getName(), myDefaultPropertiesFile.getName())) {
return Collections.singletonList(myDefaultPropertiesFile);
}
}
}
return result;
return PropertiesImplUtil.getResourceBundleWithCachedFiles(myDefaultPropertiesFile).getFiles();
}
@NotNull
@@ -59,6 +59,23 @@ public class ResourceBundleTest extends LightPlatformCodeInsightFixtureTestCase
assertEquals(toCheckFile.getText(), "new_key=value");
}
public void testDifferentPropertiesDontCombinedToResourceBundle() {
final PsiFile xmlFile = myFixture.addFileToProject("p.xml", "<?xml version=\"1.0\" encoding=\"UTF-8\"?>\n" +
"<!DOCTYPE properties SYSTEM \"http://java.sun.com/dtd/properties.dtd\">\n" +
"<properties>\n" +
"</properties>");
final PsiFile propFile = myFixture.addFileToProject("p.properties", "");
final PropertiesFile xmlPropFile = PropertiesImplUtil.getPropertiesFile(xmlFile);
final PropertiesFile propertiesFile = PropertiesImplUtil.getPropertiesFile(propFile);
assertNotNull(xmlPropFile);
assertNotNull(propertiesFile);
assertEquals(xmlPropFile, assertOneElement(xmlPropFile.getResourceBundle().getPropertiesFiles()));
assertEquals(propertiesFile, assertOneElement(propertiesFile.getResourceBundle().getPropertiesFiles()));
}
private void doTestRenameResourceBundleEntryFile(String fileNameToRenameBefore,
String fileNameToCheckBefore,
String fileNameToRenameAfter,