diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/resolve/reference/NamedObjectProviderBinding.java b/platform/core-impl/src/com/intellij/psi/impl/source/resolve/reference/NamedObjectProviderBinding.java index afd67810f0e4..74ebee05b853 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/resolve/reference/NamedObjectProviderBinding.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/resolve/reference/NamedObjectProviderBinding.java @@ -45,12 +45,20 @@ public abstract class NamedObjectProviderBinding implements ProviderBinding { ProviderInfo>[] psiReferenceProviders = map.get(key); ProviderInfo> newInfo = new ProviderInfo<>(provider, filter, priority); - ProviderInfo>[] newProviders = psiReferenceProviders == null ? new ProviderInfo[]{newInfo} : ArrayUtil.append(psiReferenceProviders, newInfo); + ProviderInfo>[] newProviders = appendToArray(psiReferenceProviders, newInfo); map.put(key, newProviders); } } + static @NotNull ProviderInfo> @NotNull [] appendToArray(@NotNull ProviderInfo> @Nullable [] psiReferenceProviders, + @NotNull ProviderInfo> newInfo) { + @SuppressWarnings("unchecked") + ProviderInfo>[] newProviders = psiReferenceProviders == null ? new ProviderInfo[]{newInfo} + : ArrayUtil.append(psiReferenceProviders, newInfo); + return newProviders; + } + @Override public void addAcceptableReferenceProviders(@NotNull PsiElement position, @NotNull List> list, @@ -65,17 +73,18 @@ public abstract class NamedObjectProviderBinding implements ProviderBinding { @Override public synchronized void unregisterProvider(@NotNull PsiReferenceProvider provider) { for (Map.Entry>[]> entry : myNamesToProvidersMap.entrySet()) { - entry.setValue((ProviderInfo>[])removeFromArray(provider, entry.getValue())); + entry.setValue(removeFromArray(provider, entry.getValue())); } for (Map.Entry>[]> entry : myNamesToProvidersMapInsensitive.entrySet()) { - entry.setValue((ProviderInfo>[])removeFromArray(provider, entry.getValue())); + entry.setValue(removeFromArray(provider, entry.getValue())); } } - static @NotNull ProviderInfo @NotNull [] removeFromArray(@NotNull PsiReferenceProvider provider, @NotNull ProviderInfo @NotNull [] array) { + static @NotNull ProviderInfo> @NotNull [] removeFromArray(@NotNull PsiReferenceProvider provider, @NotNull ProviderInfo> @NotNull [] array) { int i = ContainerUtil.indexOf(array, trinity -> trinity.provider.equals(provider)); if (i != -1) { - return ArrayUtil.remove(array, i, ProviderInfo.ARRAY_FACTORY); + //noinspection unchecked + return (ProviderInfo>[])ArrayUtil.remove(array, i, ProviderInfo.ARRAY_FACTORY); } return array; } diff --git a/platform/core-impl/src/com/intellij/psi/impl/source/resolve/reference/SimpleProviderBinding.java b/platform/core-impl/src/com/intellij/psi/impl/source/resolve/reference/SimpleProviderBinding.java index 03c7ecd1d8d7..07f238c2aa2d 100644 --- a/platform/core-impl/src/com/intellij/psi/impl/source/resolve/reference/SimpleProviderBinding.java +++ b/platform/core-impl/src/com/intellij/psi/impl/source/resolve/reference/SimpleProviderBinding.java @@ -6,7 +6,6 @@ import com.intellij.patterns.ElementPattern; import com.intellij.psi.PsiElement; import com.intellij.psi.PsiReferenceProvider; import com.intellij.psi.PsiReferenceService; -import com.intellij.util.ArrayUtil; import com.intellij.util.ProcessingContext; import org.jetbrains.annotations.NotNull; @@ -16,18 +15,19 @@ class SimpleProviderBinding implements ProviderBinding { /** * the array must be copy-on-write to avoid data races, since it can be read concurrently, via {@link #addAcceptableReferenceProviders} */ - private volatile @NotNull ProviderInfo @NotNull [] myProviderInfos = ProviderInfo.EMPTY_ARRAY; + @SuppressWarnings("unchecked") + private volatile @NotNull ProviderInfo> @NotNull [] myProviderInfos = (ProviderInfo>[])ProviderInfo.EMPTY_ARRAY; synchronized void registerProvider(@NotNull PsiReferenceProvider provider, @NotNull ElementPattern pattern, double priority) { - myProviderInfos = ArrayUtil.append(myProviderInfos, new ProviderInfo<>(provider, pattern, priority), ProviderInfo.ARRAY_FACTORY); + myProviderInfos = NamedObjectProviderBinding.appendToArray(myProviderInfos, new ProviderInfo<>(provider, pattern, priority)); } @Override public void addAcceptableReferenceProviders(@NotNull PsiElement position, @NotNull List> list, @NotNull PsiReferenceService.Hints hints) { - NamedObjectProviderBinding.addMatchingProviders(position, (ProviderInfo>[])myProviderInfos, list, hints); + NamedObjectProviderBinding.addMatchingProviders(position, myProviderInfos, list, hints); } @Override