diff --git a/images/src/org/intellij/images/editor/impl/ImageFileEditorState.java b/images/src/org/intellij/images/editor/impl/ImageFileEditorState.java index ba2afd4d0e95..6a7dab4d116a 100644 --- a/images/src/org/intellij/images/editor/impl/ImageFileEditorState.java +++ b/images/src/org/intellij/images/editor/impl/ImageFileEditorState.java @@ -87,7 +87,7 @@ public class ImageFileEditorState implements TransferableFileEditorState, Serial o = options.get(ZOOM_FACTOR_OPTION); if (o != null) { - zoomFactor = Double.valueOf(o); + zoomFactor = Double.parseDouble(o); } } } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/NamedObjectProviderBinding.java b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/NamedObjectProviderBinding.java index 65ce61bc86a4..3fb382cde223 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/NamedObjectProviderBinding.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/NamedObjectProviderBinding.java @@ -17,7 +17,6 @@ package com.intellij.psi.impl.source.resolve.reference; import com.intellij.openapi.project.IndexNotReadyException; -import com.intellij.openapi.util.Trinity; import com.intellij.patterns.ElementPattern; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReferenceProvider; @@ -33,32 +32,37 @@ import org.jetbrains.annotations.Nullable; import java.util.ArrayList; import java.util.List; import java.util.concurrent.ConcurrentMap; -import java.util.concurrent.CopyOnWriteArrayList; /** * @author maxim */ public abstract class NamedObjectProviderBinding implements ProviderBinding { - private final ConcurrentMap>> myNamesToProvidersMap = new ConcurrentHashMap>>(5); - private final ConcurrentMap>> myNamesToProvidersMapInsensitive = new ConcurrentHashMap>>(5); + private final ConcurrentMap>> myNamesToProvidersMap = new ConcurrentHashMap>>(5); + private final ConcurrentMap>> myNamesToProvidersMapInsensitive = new ConcurrentHashMap>>(5); - public void registerProvider(@NonNls String[] names, ElementPattern filter, boolean caseSensitive, Provider provider, final double priority) { - final ConcurrentMap>> map = caseSensitive ? myNamesToProvidersMap : myNamesToProvidersMapInsensitive; + public void registerProvider(@NonNls @NotNull String[] names, + @NotNull ElementPattern filter, + boolean caseSensitive, + @NotNull Provider provider, + final double priority) { + final ConcurrentMap>> map = caseSensitive ? myNamesToProvidersMap : myNamesToProvidersMapInsensitive; for (final String attributeName : names) { - CopyOnWriteArrayList> psiReferenceProviders = map.get(attributeName); + List> psiReferenceProviders = map.get(attributeName); if (psiReferenceProviders == null) { - psiReferenceProviders = ConcurrencyUtil.cacheOrGet(map, caseSensitive ? attributeName : attributeName.toLowerCase(), ContainerUtil.>createEmptyCOWList()); + String key = caseSensitive ? attributeName : attributeName.toLowerCase(); + psiReferenceProviders = ConcurrencyUtil.cacheOrGet(map, key, ContainerUtil.>createEmptyCOWList()); } - psiReferenceProviders.add(new Trinity(provider, filter, priority)); + psiReferenceProviders.add(new ProviderInfo(provider, filter, priority)); } } @Override - public void addAcceptableReferenceProviders(@NotNull PsiElement position, @NotNull List list, - PsiReferenceService.Hints hints) { + public void addAcceptableReferenceProviders(@NotNull PsiElement position, + @NotNull List> list, + @NotNull PsiReferenceService.Hints hints) { String name = getName(position); if (name != null) { addMatchingProviders(position, myNamesToProvidersMap.get(name), list, hints); @@ -67,17 +71,17 @@ public abstract class NamedObjectProviderBinding implements ProviderBi } @Override - public void unregisterProvider(final Provider provider) { - for (final CopyOnWriteArrayList> list : myNamesToProvidersMap.values()) { - for (final Trinity trinity : new ArrayList>(list)) { - if (trinity.first.equals(provider)) { + public void unregisterProvider(@NotNull final Provider provider) { + for (final List> list : myNamesToProvidersMap.values()) { + for (final ProviderInfo trinity : new ArrayList>(list)) { + if (trinity.provider.equals(provider)) { list.remove(trinity); } } } - for (final CopyOnWriteArrayList> list : myNamesToProvidersMapInsensitive.values()) { - for (final Trinity trinity : new ArrayList>(list)) { - if (trinity.first.equals(provider)) { + for (final List> list : myNamesToProvidersMapInsensitive.values()) { + for (final ProviderInfo trinity : new ArrayList>(list)) { + if (trinity.provider.equals(provider)) { list.remove(trinity); } } @@ -85,15 +89,16 @@ public abstract class NamedObjectProviderBinding implements ProviderBi } @Nullable - abstract protected String getName(final PsiElement position); + protected abstract String getName(final PsiElement position); - private static void addMatchingProviders(final PsiElement position, @Nullable final List> providerList, - final List> ret, - PsiReferenceService.Hints hints) { + private void addMatchingProviders(final PsiElement position, + @Nullable final List> providerList, + @NotNull List> ret, + PsiReferenceService.Hints hints) { if (providerList == null) return; - for(Trinity trinity:providerList) { - if (hints != PsiReferenceService.Hints.NO_HINTS && !((PsiReferenceProvider)trinity.first).acceptsHints(position, hints)) { + for(ProviderInfo trinity:providerList) { + if (hints != PsiReferenceService.Hints.NO_HINTS && !((PsiReferenceProvider)trinity.provider).acceptsHints(position, hints)) { continue; } @@ -103,12 +108,12 @@ public abstract class NamedObjectProviderBinding implements ProviderBi } boolean suitable = false; try { - suitable = trinity.second.accepts(position, context); + suitable = trinity.processingContext.accepts(position, context); } catch (IndexNotReadyException ignored) { } if (suitable) { - ret.add(Trinity.create(trinity.first, context, trinity.third)); + ret.add(new ProviderInfo(trinity.provider, context, trinity.priority)); } } } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/ProviderBinding.java b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/ProviderBinding.java index 4effe87b38e1..c3e852fdba3b 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/ProviderBinding.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/ProviderBinding.java @@ -18,6 +18,7 @@ package com.intellij.psi.impl.source.resolve.reference; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReferenceService; +import com.intellij.util.ProcessingContext; import org.jetbrains.annotations.NotNull; import java.util.List; @@ -30,8 +31,20 @@ import java.util.List; * To change this template use Options | File Templates. */ public interface ProviderBinding { - void addAcceptableReferenceProviders(@NotNull PsiElement position, @NotNull List list, - PsiReferenceService.Hints hints); + class ProviderInfo { + public final T provider; + public final Context processingContext; + public final double priority; - void unregisterProvider(final T provider); + public ProviderInfo(@NotNull T provider, @NotNull Context processingContext, double priority) { + this.provider = provider; + this.processingContext = processingContext; + this.priority = priority; + } + } + void addAcceptableReferenceProviders(@NotNull PsiElement position, + @NotNull List> list, + @NotNull PsiReferenceService.Hints hints); + + void unregisterProvider(@NotNull T provider); } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/PsiReferenceRegistrarImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/PsiReferenceRegistrarImpl.java index afd3d3fc7252..8dd2a2e1e508 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/PsiReferenceRegistrarImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/PsiReferenceRegistrarImpl.java @@ -15,7 +15,6 @@ */ package com.intellij.psi.impl.source.resolve.reference; -import com.intellij.openapi.util.Trinity; import com.intellij.patterns.*; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReferenceProvider; @@ -40,9 +39,8 @@ import java.util.concurrent.ConcurrentMap; * @author Dmitry Avdeev */ public class PsiReferenceRegistrarImpl extends PsiReferenceRegistrar { - - private final ConcurrentMap myBindingsMap = new ConcurrentHashMap(); - private final ConcurrentMap myNamedBindingsMap = new ConcurrentHashMap(); + private final ConcurrentMap> myBindingsMap = new ConcurrentHashMap>(); + private final ConcurrentMap> myNamedBindingsMap = new ConcurrentHashMap>(); private final FactoryMap myKnownSupers = new ConcurrentFactoryMap() { @Override protected Class[] create(Class key) { @@ -71,7 +69,8 @@ public class PsiReferenceRegistrarImpl extends PsiReferenceRegistrar { @NotNull Class scope, @NotNull PsiReferenceProvider provider, double priority) { - registerReferenceProvider(PlatformPatterns.psiElement(scope).and(new FilterPattern(elementFilter)), provider, priority); + PsiElementPattern.Capture capture = PlatformPatterns.psiElement(scope); + registerReferenceProvider(capture.and(new FilterPattern(elementFilter)), provider, priority); } @Override @@ -81,36 +80,35 @@ public class PsiReferenceRegistrarImpl extends PsiReferenceRegistrar { myKnownSupers.clear(); // we should clear the cache final Class scope = pattern.getCondition().getInitialCondition().getAcceptedClass(); final List> conditions = pattern.getCondition().getConditions(); - for (int i = 0, conditionsSize = conditions.size(); i < conditionsSize; i++) { - PatternCondition _condition = conditions.get(i); - if (_condition instanceof PsiNamePatternCondition) { - final PsiNamePatternCondition nameCondition = (PsiNamePatternCondition)_condition; - List> conditions1 = nameCondition.getNamePattern().getCondition().getConditions(); - for (int i1 = 0, conditions1Size = conditions1.size(); i1 < conditions1Size; i1++) { - PatternCondition condition = conditions1.get(i1); - if (condition instanceof ValuePatternCondition) { - final Collection strings = ((ValuePatternCondition)condition).getValues(); - registerNamedReferenceProvider(ArrayUtil.toStringArray(strings), nameCondition, scope, true, provider, priority, pattern); - return; - } - if (condition instanceof CaseInsensitiveValuePatternCondition) { - final String[] strings = ((CaseInsensitiveValuePatternCondition)condition).getValues(); - registerNamedReferenceProvider(strings, nameCondition, scope, false, provider, priority, pattern); - return; - } - } - break; + for (PatternCondition _condition : conditions) { + if (!(_condition instanceof PsiNamePatternCondition)) { + continue; } + final PsiNamePatternCondition nameCondition = (PsiNamePatternCondition)_condition; + List> conditions1 = nameCondition.getNamePattern().getCondition().getConditions(); + for (PatternCondition condition1 : conditions1) { + if (condition1 instanceof ValuePatternCondition) { + final Collection strings = ((ValuePatternCondition)condition1).getValues(); + registerNamedReferenceProvider(ArrayUtil.toStringArray(strings), nameCondition, scope, true, provider, priority, pattern); + return; + } + if (condition1 instanceof CaseInsensitiveValuePatternCondition) { + final String[] strings = ((CaseInsensitiveValuePatternCondition)condition1).getValues(); + registerNamedReferenceProvider(strings, nameCondition, scope, false, provider, priority, pattern); + return; + } + } + break; } while (true) { - final SimpleProviderBinding providerBinding = myBindingsMap.get(scope); + SimpleProviderBinding providerBinding = myBindingsMap.get(scope); if (providerBinding != null) { providerBinding.registerProvider(provider, pattern, priority); return; } - final SimpleProviderBinding binding = new SimpleProviderBinding(); + SimpleProviderBinding binding = new SimpleProviderBinding(); binding.registerProvider(provider, pattern, priority); if (myBindingsMap.putIfAbsent(scope, binding) == null) break; } @@ -126,19 +124,22 @@ public class PsiReferenceRegistrarImpl extends PsiReferenceRegistrar { } public void unregisterReferenceProvider(@NotNull Class scope, @NotNull PsiReferenceProvider provider) { - final ProviderBinding providerBinding = myBindingsMap.get(scope); + ProviderBinding providerBinding = myBindingsMap.get(scope); providerBinding.unregisterProvider(provider); } - private void registerNamedReferenceProvider(final String[] names, final PsiNamePatternCondition nameCondition, - final Class scopeClass, + private void registerNamedReferenceProvider(@NotNull String[] names, + final PsiNamePatternCondition nameCondition, + @NotNull Class scopeClass, final boolean caseSensitive, - final PsiReferenceProvider provider, final double priority, final ElementPattern pattern) { - NamedObjectProviderBinding providerBinding = myNamedBindingsMap.get(scopeClass); + @NotNull PsiReferenceProvider provider, + final double priority, + @NotNull ElementPattern pattern) { + NamedObjectProviderBinding providerBinding = myNamedBindingsMap.get(scopeClass); if (providerBinding == null) { - providerBinding = ConcurrencyUtil.cacheOrGet(myNamedBindingsMap, scopeClass, new NamedObjectProviderBinding() { + providerBinding = ConcurrencyUtil.cacheOrGet(myNamedBindingsMap, scopeClass, new NamedObjectProviderBinding() { @Override protected String getName(final PsiElement position) { return nameCondition.getPropertyValue(position); @@ -158,17 +159,17 @@ public class PsiReferenceRegistrarImpl extends PsiReferenceRegistrar { } @NotNull - List> getPairsByElement(@NotNull PsiElement element, - @NotNull PsiReferenceService.Hints hints) { + List> getPairsByElement(@NotNull PsiElement element, + @NotNull PsiReferenceService.Hints hints) { final Class clazz = element.getClass(); - List> ret = null; + List> ret = null; for (Class aClass : myKnownSupers.get(clazz)) { - final SimpleProviderBinding simpleBinding = myBindingsMap.get(aClass); - final NamedObjectProviderBinding namedBinding = myNamedBindingsMap.get(aClass); + SimpleProviderBinding simpleBinding = myBindingsMap.get(aClass); + NamedObjectProviderBinding namedBinding = myNamedBindingsMap.get(aClass); if (simpleBinding == null && namedBinding == null) continue; - if (ret == null) ret = new SmartList>(); + if (ret == null) ret = new SmartList>(); if (simpleBinding != null) { simpleBinding.addAcceptableReferenceProviders(element, ret, hints); } @@ -176,6 +177,6 @@ public class PsiReferenceRegistrarImpl extends PsiReferenceRegistrar { namedBinding.addAcceptableReferenceProviders(element, ret, hints); } } - return ret == null ? Collections.>emptyList() : ret; + return ret == null ? Collections.>emptyList() : ret; } } diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/ReferenceProvidersRegistryImpl.java b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/ReferenceProvidersRegistryImpl.java index 6bb5e41f47a7..456f6e6e6594 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/ReferenceProvidersRegistryImpl.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/ReferenceProvidersRegistryImpl.java @@ -18,7 +18,7 @@ package com.intellij.psi.impl.source.resolve.reference; import com.intellij.lang.Language; import com.intellij.lang.LanguageExtension; import com.intellij.openapi.project.IndexNotReadyException; -import com.intellij.openapi.util.Trinity; +import com.intellij.openapi.util.Comparing; import com.intellij.patterns.ElementPattern; import com.intellij.psi.*; import com.intellij.util.ProcessingContext; @@ -32,12 +32,12 @@ public class ReferenceProvidersRegistryImpl extends ReferenceProvidersRegistry { private static final LanguageExtension CONTRIBUTOR_EXTENSION = new LanguageExtension(PsiReferenceContributor.EP_NAME.getName()); private static final LanguageExtension REFERENCE_PROVIDER_EXTENSION = new LanguageExtension(PsiReferenceProviderBean.EP_NAME.getName()); - private static final Comparator> PRIORITY_COMPARATOR = - new Comparator>() { + private static final Comparator> PRIORITY_COMPARATOR = + new Comparator>() { @Override - public int compare(final Trinity o1, - final Trinity o2) { - return o2.getThird().compareTo(o1.getThird()); + public int compare(ProviderBinding.ProviderInfo o1, + ProviderBinding.ProviderInfo o2) { + return Comparing.compare(o2.priority, o1.priority); } }; @@ -85,11 +85,11 @@ public class ReferenceProvidersRegistryImpl extends ReferenceProvidersRegistry { @Override protected PsiReference[] doGetReferencesFromProviders(PsiElement context, PsiReferenceService.Hints hints) { - List> providersForContextLanguage; - providersForContextLanguage = getRegistrar(context.getLanguage()).getPairsByElement(context, hints); + List> providersForContextLanguage = + getRegistrar(context.getLanguage()).getPairsByElement(context, hints); - List> providersForAllLanguages; - providersForAllLanguages = getRegistrar(Language.ANY).getPairsByElement(context, hints); + List> providersForAllLanguages = + getRegistrar(Language.ANY).getPairsByElement(context, hints); int providersCount = providersForContextLanguage.size() + providersForAllLanguages.size(); @@ -98,35 +98,30 @@ public class ReferenceProvidersRegistryImpl extends ReferenceProvidersRegistry { } if (providersCount == 1) { - final Trinity firstProvider = + final ProviderBinding.ProviderInfo firstProvider = (providersForAllLanguages.isEmpty() ? providersForContextLanguage : providersForAllLanguages).get(0); - return firstProvider.getFirst().getReferencesByElement(context, firstProvider.getSecond()); + return firstProvider.provider.getReferencesByElement(context, firstProvider.processingContext); } - Trinity[] providers = new Trinity[providersCount]; - - int i = 0; - for (Trinity provider : providersForContextLanguage) { - providers[i++] = provider; - } - for (Trinity provider : providersForAllLanguages) { - providers[i++] = provider; - } + List> list = + ContainerUtil.concat(providersForContextLanguage, providersForAllLanguages); + @SuppressWarnings("unchecked") + ProviderBinding.ProviderInfo[] providers = list.toArray(new ProviderBinding.ProviderInfo[list.size()]); Arrays.sort(providers, PRIORITY_COMPARATOR); List result = new ArrayList(); - final double maxPriority = providers[0].getThird(); + final double maxPriority = providers[0].priority; next: - for (Trinity trinity : providers) { + for (ProviderBinding.ProviderInfo trinity : providers) { final PsiReference[] refs; try { - refs = trinity.getFirst().getReferencesByElement(context, trinity.getSecond()); + refs = trinity.provider.getReferencesByElement(context, trinity.processingContext); } catch(IndexNotReadyException ex) { continue; } - if (trinity.getThird().doubleValue() != maxPriority) { + if (trinity.priority != maxPriority) { for (PsiReference ref : refs) { for (PsiReference reference : result) { if (ref != null && ReferenceRange.containsRangeInElement(reference, ref.getRangeInElement())) { diff --git a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/SimpleProviderBinding.java b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/SimpleProviderBinding.java index 6d8a18f13b9b..4cb4b19d4f37 100644 --- a/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/SimpleProviderBinding.java +++ b/platform/lang-impl/src/com/intellij/psi/impl/source/resolve/reference/SimpleProviderBinding.java @@ -17,7 +17,6 @@ package com.intellij.psi.impl.source.resolve.reference; import com.intellij.openapi.project.IndexNotReadyException; -import com.intellij.openapi.util.Trinity; import com.intellij.patterns.ElementPattern; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReferenceProvider; @@ -37,17 +36,18 @@ import java.util.List; * To change this template use Options | File Templates. */ public class SimpleProviderBinding implements ProviderBinding { - private final List> myProviderPairs = ContainerUtil.createEmptyCOWList(); + private final List> myProviderPairs = ContainerUtil.createEmptyCOWList(); public void registerProvider(Provider provider,ElementPattern pattern, double priority){ - myProviderPairs.add(Trinity.create(provider, pattern, priority)); + myProviderPairs.add(new ProviderInfo(provider, pattern, priority)); } @Override - public void addAcceptableReferenceProviders(@NotNull PsiElement position, @NotNull List list, - PsiReferenceService.Hints hints) { - for(Trinity trinity:myProviderPairs) { - if (hints != PsiReferenceService.Hints.NO_HINTS && !((PsiReferenceProvider)trinity.first).acceptsHints(position, hints)) { + public void addAcceptableReferenceProviders(@NotNull PsiElement position, + @NotNull List> list, + @NotNull PsiReferenceService.Hints hints) { + for(ProviderInfo trinity:myProviderPairs) { + if (hints != PsiReferenceService.Hints.NO_HINTS && !((PsiReferenceProvider)trinity.provider).acceptsHints(position, hints)) { continue; } @@ -57,20 +57,20 @@ public class SimpleProviderBinding implements ProviderBinding(trinity.provider, context, trinity.priority)); } } } @Override - public void unregisterProvider(final Provider provider) { - for (final Trinity trinity : new ArrayList>(myProviderPairs)) { - if (trinity.first.equals(provider)) { + public void unregisterProvider(@NotNull final Provider provider) { + for (final ProviderInfo trinity : new ArrayList>(myProviderPairs)) { + if (trinity.provider.equals(provider)) { myProviderPairs.remove(trinity); } } diff --git a/plugins/git4idea/src/git4idea/commands/GitStandardProgressAnalyzer.java b/plugins/git4idea/src/git4idea/commands/GitStandardProgressAnalyzer.java index 1ad83636eaf5..d442218ac7d7 100644 --- a/plugins/git4idea/src/git4idea/commands/GitStandardProgressAnalyzer.java +++ b/plugins/git4idea/src/git4idea/commands/GitStandardProgressAnalyzer.java @@ -15,8 +15,9 @@ */ package git4idea.commands; -import java.util.HashMap; -import java.util.Map; +import gnu.trove.TObjectDoubleHashMap; +import gnu.trove.TObjectDoubleProcedure; + import java.util.regex.Matcher; import java.util.regex.Pattern; @@ -28,8 +29,8 @@ import java.util.regex.Pattern; public class GitStandardProgressAnalyzer implements GitProgressAnalyzer { // progress of each operation is stored here. this is an overhead since operations go one by one, - // but it looks simplier than storing current operation, checking that ther was no skipped, etc. - private Map myOperationsProgress = new HashMap(4); + // but it looks simpler than storing current operation, checking that ther was no skipped, etc. + private TObjectDoubleHashMap myOperationsProgress = new TObjectDoubleHashMap(4); /** * A long git command usually consists of the operations in this enum. @@ -96,11 +97,15 @@ public class GitStandardProgressAnalyzer implements GitProgressAnalyzer { } } // counting progress - double totalProgress = 0; - for (Map.Entry progressEntry : myOperationsProgress.entrySet()) { - totalProgress += progressEntry.getKey().myFractionInTotal * progressEntry.getValue(); - } - return totalProgress; + final double[] totalProgress = new double[1]; + myOperationsProgress.forEachEntry(new TObjectDoubleProcedure() { + @Override + public boolean execute(Operation operation, double progress) { + totalProgress[0] += operation.myFractionInTotal * progress; + return true; + } + }); + return totalProgress[0]; } }