From 9f955c1182e5bf20dc88761492295934f93741eb Mon Sep 17 00:00:00 2001 From: peter Date: Thu, 31 Jan 2019 16:40:29 +0100 Subject: [PATCH] java PIEAE diagnostics, blame plugins where possible (EA-135158, EA-135126, EA-135093, EA-134991) --- .../quickfix/ChangeMethodSignatureFromUsageFix.java | 10 +++++++++- .../com/intellij/psi/augment/PsiAugmentProvider.java | 8 ++++++++ .../psi/util/MethodSignatureBackedByPsiMethod.java | 10 ++++++++-- .../psi/impl/source/PsiClassReferenceType.java | 6 ++++-- .../intellij/psi/impl/source/PsiTypeElementImpl.java | 8 +++++++- .../util/src/com/intellij/openapi/util/Computable.java | 5 +++++ 6 files changed, 41 insertions(+), 6 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeMethodSignatureFromUsageFix.java b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeMethodSignatureFromUsageFix.java index 3dc15c773f3d..545009fc8d91 100644 --- a/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeMethodSignatureFromUsageFix.java +++ b/java/java-impl/src/com/intellij/codeInsight/daemon/impl/quickfix/ChangeMethodSignatureFromUsageFix.java @@ -6,6 +6,7 @@ import com.intellij.codeInsight.JavaTargetElementEvaluator; import com.intellij.codeInsight.daemon.QuickFixBundle; import com.intellij.codeInsight.daemon.impl.analysis.JavaHighlightUtil; import com.intellij.codeInsight.intention.IntentionAction; +import com.intellij.diagnostic.PluginException; import com.intellij.find.FindManager; import com.intellij.find.findUsages.FindUsagesHandler; import com.intellij.find.findUsages.FindUsagesManager; @@ -316,7 +317,14 @@ public class ChangeMethodSignatureFromUsageFix implements IntentionAction/*, Hig PsiExpression expression = expressions[i]; PsiType bareParamType = parameter.getType(); if (!bareParamType.isValid()) { - PsiUtil.ensureValidType(bareParamType, parameter.getClass() + "; valid=" + parameter.isValid() + "; method.valid=" + targetMethod.isValid()); + try { + PsiUtil.ensureValidType(bareParamType); + } + catch (Throwable e) { + throw PluginException.createByClass( + parameter.getClass() + "; valid=" + parameter.isValid() + "; method.valid=" + targetMethod.isValid(), + e, parameter.getClass()); + } } PsiType paramType = substitutor.substitute(bareParamType); PsiUtil.ensureValidType(paramType); diff --git a/java/java-psi-api/src/com/intellij/psi/augment/PsiAugmentProvider.java b/java/java-psi-api/src/com/intellij/psi/augment/PsiAugmentProvider.java index 9b4a68c78f83..fae26ee849c2 100644 --- a/java/java-psi-api/src/com/intellij/psi/augment/PsiAugmentProvider.java +++ b/java/java-psi-api/src/com/intellij/psi/augment/PsiAugmentProvider.java @@ -1,6 +1,7 @@ // Copyright 2000-2018 JetBrains s.r.o. Use of this source code is governed by the Apache 2.0 license that can be found in the LICENSE file. package com.intellij.psi.augment; +import com.intellij.diagnostic.PluginException; import com.intellij.openapi.diagnostic.Logger; import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.progress.ProcessCanceledException; @@ -12,6 +13,7 @@ import com.intellij.psi.PsiElement; import com.intellij.psi.PsiModifierList; import com.intellij.psi.PsiType; import com.intellij.psi.PsiTypeElement; +import com.intellij.psi.util.PsiUtil; import com.intellij.util.Processor; import com.intellij.util.containers.ContainerUtil; import org.jetbrains.annotations.NotNull; @@ -82,6 +84,12 @@ public abstract class PsiAugmentProvider { forEach(typeElement.getProject(), provider -> { PsiType type = provider.inferType(typeElement); if (type != null) { + try { + PsiUtil.ensureValidType(type); + } + catch (Throwable e) { + throw PluginException.createByClass(e.getMessage(), e, provider.getClass()); + } result.set(type); return false; } diff --git a/java/java-psi-api/src/com/intellij/psi/util/MethodSignatureBackedByPsiMethod.java b/java/java-psi-api/src/com/intellij/psi/util/MethodSignatureBackedByPsiMethod.java index 5cd0ac703b9e..78ab8a186d52 100644 --- a/java/java-psi-api/src/com/intellij/psi/util/MethodSignatureBackedByPsiMethod.java +++ b/java/java-psi-api/src/com/intellij/psi/util/MethodSignatureBackedByPsiMethod.java @@ -15,6 +15,7 @@ */ package com.intellij.psi.util; +import com.intellij.diagnostic.PluginException; import com.intellij.psi.*; import org.jetbrains.annotations.NotNull; @@ -76,8 +77,13 @@ public class MethodSignatureBackedByPsiMethod extends MethodSignatureBase { substitutor = JavaPsiFacade.getElementFactory(method.getProject()).createRawSubstitutor(substitutor, methodTypeParameters); methodTypeParameters = PsiTypeParameter.EMPTY_ARRAY; } - - assert substitutor.isValid(); + + try { + substitutor.ensureValid(); + } + catch (Throwable e) { + throw PluginException.createByClass(e.getMessage(), e, method.getClass()); + } final PsiParameter[] parameters = method.getParameterList().getParameters(); PsiType[] parameterTypes = PsiType.createArray(parameters.length); diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassReferenceType.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassReferenceType.java index 27007618dd3c..2af87063d111 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassReferenceType.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiClassReferenceType.java @@ -19,10 +19,10 @@ import com.intellij.openapi.util.Comparing; import com.intellij.openapi.util.Computable; import com.intellij.pom.java.LanguageLevel; import com.intellij.psi.*; +import com.intellij.psi.augment.PsiAugmentProvider; import com.intellij.psi.impl.light.LightClassReference; import com.intellij.psi.search.GlobalSearchScope; import com.intellij.psi.util.PsiUtil; -import com.intellij.psi.util.PsiUtilCore; import com.intellij.util.ArrayUtil; import com.intellij.util.ObjectUtils; import com.intellij.util.SmartList; @@ -189,7 +189,9 @@ public class PsiClassReferenceType extends PsiClassType.Stub { @NotNull public ClassResolveResult resolveGenerics() { PsiJavaCodeReferenceElement reference = getReference(); - PsiUtilCore.ensureValid(reference); + if (!reference.isValid()) { + throw new PsiInvalidElementAccessException(reference, myReference.toString() + "; augmenters=" + PsiAugmentProvider.EP_NAME.getExtensionList()); + } final JavaResolveResult result = reference.advancedResolve(false); return result.getElement() == null ? ClassResolveResult.EMPTY : new DelegatingClassResolveResult(result); } diff --git a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java index d52fe9a4974e..614fbcd0ab8b 100644 --- a/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java +++ b/java/java-psi-impl/src/com/intellij/psi/impl/source/PsiTypeElementImpl.java @@ -228,7 +228,7 @@ public class PsiTypeElementImpl extends CompositePsiElement implements PsiTypeEl } @NotNull - private static Computable computeFromTypeOwner(final PsiElement parent, @NotNull WeakReference ref) { + private static Computable computeFromTypeOwner(PsiElement parent, @NotNull WeakReference ref) { return new Computable() { volatile WeakReference myCache = ref; @@ -247,6 +247,12 @@ public class PsiTypeElementImpl extends CompositePsiElement implements PsiTypeEl : ((PsiVariable)parent).getTypeElement(); return (PsiTypeElementImpl)ObjectUtils.assertNotNull(typeElement); } + + @Override + public String toString() { + String msg = "Type element reference of " + parent.getClass() + " #" + parent.getClass().getSimpleName(); + return parent.isValid() ? msg + " #" + parent.getLanguage() : msg + ", invalid"; + } }; } diff --git a/platform/util/src/com/intellij/openapi/util/Computable.java b/platform/util/src/com/intellij/openapi/util/Computable.java index c61dd54b6635..d87e262bfd9e 100644 --- a/platform/util/src/com/intellij/openapi/util/Computable.java +++ b/platform/util/src/com/intellij/openapi/util/Computable.java @@ -38,6 +38,11 @@ public interface Computable { public T compute() { return myValue; } + + @Override + public String toString() { + return "PredefinedValueComputable{" + myValue + "}"; + } } /**