From 54fbcf396e9b3675e6a0379290a7ec5541b63bec Mon Sep 17 00:00:00 2001 From: Dmitry Batkovich Date: Sat, 11 Apr 2015 13:14:50 +0300 Subject: [PATCH] PropertiesImplUtil.getResourceBundle() doesn't evaluate default base name (regexp, split, etc) for properties files every time --- .../lang/properties/PropertiesUtil.java | 53 ++++++++++++------- 1 file changed, 34 insertions(+), 19 deletions(-) diff --git a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/PropertiesUtil.java b/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/PropertiesUtil.java index ed1d7080705c..cbc14754d557 100644 --- a/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/PropertiesUtil.java +++ b/plugins/properties/properties-psi-api/src/com/intellij/lang/properties/PropertiesUtil.java @@ -19,6 +19,7 @@ import com.intellij.lang.properties.psi.PropertiesFile; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.project.Project; import com.intellij.openapi.roots.ProjectRootManager; +import com.intellij.openapi.util.Key; import com.intellij.openapi.util.io.FileUtil; import com.intellij.openapi.util.text.StringUtil; import com.intellij.openapi.vfs.VirtualFile; @@ -26,7 +27,7 @@ import com.intellij.psi.PsiDirectory; import com.intellij.reference.SoftLazyValue; import com.intellij.util.Function; import com.intellij.util.SmartList; -import com.intellij.util.containers.*; +import com.intellij.util.containers.ContainerUtil; import com.intellij.util.containers.HashSet; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; @@ -59,6 +60,9 @@ public class PropertiesUtil { } }; + private static final Key LAST_CALCULATION_FILE_NAME = Key.create("PROPERTIES_FILE_LAST_CALCULATION_FILE_NAME"); + private static final Key BASE_NAME = Key.create("PROPERTIES_FILE_BASE_NAME"); + /** * @deprecated use PropertiesUtil.isPropertyComplete(ResourceBundle resourceBundle, String propertyName) @@ -99,31 +103,42 @@ public class PropertiesUtil { @NotNull public static String getDefaultBaseName(@NotNull final VirtualFile file) { + final String lastBaseNameCalculationFileName = file.getUserData(LAST_CALCULATION_FILE_NAME); final String name = file.getName(); + if (name.equals(lastBaseNameCalculationFileName)) { + final String baseName = file.getUserData(BASE_NAME); + LOG.assertTrue(baseName != null); + return baseName; + } + final String calculatedBaseName; if (!StringUtil.containsChar(name, '_')) { - return FileUtil.getNameWithoutExtension(name); - } + calculatedBaseName = FileUtil.getNameWithoutExtension(name); + } else { + final Matcher matcher = LOCALE_PATTERN.matcher(name); + final String baseNameWithExtension; - final Matcher matcher = LOCALE_PATTERN.matcher(name); - final String baseNameWithExtension; - - int matchIndex = 0; - while (matcher.find(matchIndex)) { - final MatchResult matchResult = matcher.toMatchResult(); - final String[] splitted = matchResult.group(1).split("_"); - if (splitted.length > 1) { - final String langCode = splitted[1]; - if (!LOCALES_LANGUAGE_CODES.getValue().contains(langCode)) { - matchIndex = matchResult.start(1) + 1; - continue; + int matchIndex = 0; + while (matcher.find(matchIndex)) { + final MatchResult matchResult = matcher.toMatchResult(); + final String[] split = matchResult.group(1).split("_"); + if (split.length > 1) { + final String langCode = split[1]; + if (!LOCALES_LANGUAGE_CODES.getValue().contains(langCode)) { + matchIndex = matchResult.start(1) + 1; + continue; + } + baseNameWithExtension = name.substring(0, matchResult.start(1)) + name.substring(matchResult.end(1)); + return FileUtil.getNameWithoutExtension(baseNameWithExtension); } - baseNameWithExtension = name.substring(0, matchResult.start(1)) + name.substring(matchResult.end(1)); - return FileUtil.getNameWithoutExtension(baseNameWithExtension); } + baseNameWithExtension = name; + calculatedBaseName = FileUtil.getNameWithoutExtension(baseNameWithExtension); } - baseNameWithExtension = name; - return FileUtil.getNameWithoutExtension(baseNameWithExtension); + + file.putUserData(LAST_CALCULATION_FILE_NAME, name); + file.putUserData(BASE_NAME, calculatedBaseName); + return calculatedBaseName; } @NotNull