From f26343e81a0f148d7f902aeb66bb729a2da5e1f1 Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Mon, 31 Oct 2016 19:12:05 +0300 Subject: [PATCH] properties: create resource bundle by default only if files have the same extension IDEA-163295 --- .../lang/properties/PropertiesImplUtil.java | 58 +++++++++---------- .../lang/properties/ResourceBundleImpl.java | 27 +-------- .../lang/properties/ResourceBundleTest.java | 17 ++++++ 3 files changed, 46 insertions(+), 56 deletions(-) diff --git a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/PropertiesImplUtil.java b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/PropertiesImplUtil.java index 88305d54709d..14fa10e272f0 100644 --- a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/PropertiesImplUtil.java +++ b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/PropertiesImplUtil.java @@ -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 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 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 properties) { diff --git a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/ResourceBundleImpl.java b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/ResourceBundleImpl.java index ef3a36680637..6da2cc234732 100644 --- a/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/ResourceBundleImpl.java +++ b/plugins/properties/properties-psi-impl/src/com/intellij/lang/properties/ResourceBundleImpl.java @@ -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 getPropertiesFiles() { - if (ResourceBundleManager.getInstance(getProject()).isDefaultDissociated(myDefaultPropertiesFile.getVirtualFile())) { - return Collections.singletonList(myDefaultPropertiesFile); - } - PsiFile[] children = ReadAction.compute(() -> myDefaultPropertiesFile.getParent().getFiles()); - final String baseName = getBaseName(); - List 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 diff --git a/plugins/properties/testSrc/com/intellij/lang/properties/ResourceBundleTest.java b/plugins/properties/testSrc/com/intellij/lang/properties/ResourceBundleTest.java index 5ead1f6bbb47..d0c1b007029d 100644 --- a/plugins/properties/testSrc/com/intellij/lang/properties/ResourceBundleTest.java +++ b/plugins/properties/testSrc/com/intellij/lang/properties/ResourceBundleTest.java @@ -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", "\n" + + "\n" + + "\n" + + ""); + 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,