IDEA-172425 Improve diagnostics
authorVitaliy.Bibaev <vitaliy.bibaev@jetbrains.com>
Mon, 2 Apr 2018 09:54:56 +0000 (12:54 +0300)
committerVitaliy.Bibaev <vitaliy.bibaev@jetbrains.com>
Mon, 2 Apr 2018 09:54:56 +0000 (12:54 +0300)
java/java-impl/src/com/intellij/refactoring/extractMethodObject/ExtractLightMethodObjectHandler.java
java/java-impl/src/com/intellij/refactoring/extractMethodObject/reflect/ConstructorReflectionAccessor.java
java/java-impl/src/com/intellij/refactoring/extractMethodObject/reflect/MethodReferenceReflectionAccessor.java
java/java-impl/src/com/intellij/refactoring/extractMethodObject/reflect/ReflectionAccessMethodBuilder.java
java/java-impl/src/com/intellij/refactoring/extractMethodObject/reflect/ReflectionAccessorBase.java

index b4ba548e78b2742d530dacbd1bb588746d396a71..746d27d9ee8815869d8b6a167cc1cf5f4b677e47 100644 (file)
@@ -209,6 +209,7 @@ public class ExtractLightMethodObjectHandler {
     boolean useMagicAccessor = Registry.is("debugger.compiling.evaluator.magic.accessor") &&
                                javaVersion != null && !javaVersion.isAtLeast(JavaSdkVersion.JDK_1_9);
     if (useMagicAccessor) {
+      LOG.info("Magic accessor available");
       copy.accept(new JavaRecursiveElementWalkingVisitor() {
         private void makePublic(PsiMember method) {
           if (method.hasModifierProperty(PsiModifier.PRIVATE)) {
@@ -275,6 +276,7 @@ public class ExtractLightMethodObjectHandler {
                             Registry.is("debugger.compiling.evaluator.reflection.access.with.java8");
     if (useReflection && methods.length == 1) {
       final PsiMethod method = methods[0];
+      LOG.info("Use reflection to evaluate inaccessible members");
       CompositeReflectionAccessor.createAccessorToEverything(inner, elementFactory)
                                  .accessThroughReflection(method);
     }
index 044a9bfbcd99df347d243f937a3790ca811e4015..e3c3d702080e27c5fd8e5aedbb23f124538d1ba8 100644 (file)
@@ -48,7 +48,7 @@ public class ConstructorReflectionAccessor extends ReflectionAccessorBase<Constr
     String returnType = PsiReflectionAccessUtil.getAccessibleReturnType(descriptor.psiClass);
     PsiExpressionList argumentList = descriptor.newExpression.getArgumentList();
     if (className == null || argumentList == null || returnType == null) {
-      LOG.debug("expression is incomplete");
+      LOG.warn("code is incomplete: " + descriptor.newExpression);
       return;
     }
 
index ddead6c0eb1c50ede369af53a3f4d90bb5d05681..0788259957950b573c4b4a61208a36b22fc48582 100644 (file)
@@ -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.refactoring.extractMethodObject.reflect;
 
+import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.psi.*;
 import com.intellij.refactoring.extractMethodObject.ItemToReplaceDescriptor;
 import com.intellij.refactoring.extractMethodObject.reflect.ConstructorReflectionAccessor.ConstructorDescriptor;
@@ -15,6 +16,8 @@ import static com.intellij.refactoring.extractMethodObject.reflect.ConstructorRe
  */
 public class MethodReferenceReflectionAccessor
   extends ReferenceReflectionAccessorBase<MethodReferenceReflectionAccessor.MethodReferenceDescriptor> {
+  private static final Logger LOG = Logger.getInstance(MethodReferenceReflectionAccessor.class);
+
   private final MethodReflectionAccessor myMethodAccessor;
   private final ConstructorReflectionAccessor myConstructorReflectionAccessor;
   public MethodReferenceReflectionAccessor(@NotNull PsiClass psiClass,
@@ -43,13 +46,16 @@ public class MethodReferenceReflectionAccessor
   @Override
   protected void grantAccess(@NotNull MethodReferenceDescriptor descriptor) {
     PsiLambdaExpression lambda = LambdaRefactoringUtil.convertMethodReferenceToLambda(descriptor.expression, false, true);
-    if (lambda != null) {
-      PsiElement lambdaBody = lambda.getBody();
+    PsiElement lambdaBody = lambda == null ? null : lambda.getBody();
+    if (lambdaBody != null) {
       if (lambdaBody instanceof PsiNewExpression) {
         ConstructorDescriptor constructorDescriptor = createIfInaccessible((PsiNewExpression)lambdaBody);
         if (constructorDescriptor != null) {
           myConstructorReflectionAccessor.grantAccess(constructorDescriptor);
         }
+        else {
+          LOG.warn("Inaccessible constructor not found. Method reference: " + descriptor.expression.getText());
+        }
       }
       else if (lambdaBody instanceof PsiMethodCallExpression) {
         PsiMethodCallExpression callExpression = (PsiMethodCallExpression)lambdaBody;
@@ -57,7 +63,16 @@ public class MethodReferenceReflectionAccessor
         if (method != null) {
           myMethodAccessor.grantAccess(new MethodReflectionAccessor.MethodCallDescriptor(callExpression, method));
         }
+        else {
+          LOG.warn("Could not resolve method from expression: " + callExpression.getText());
+        }
       }
+      else {
+        LOG.warn("Unexpected type of lambda body: " + lambdaBody.getClass().getCanonicalName());
+      }
+    }
+    else {
+      LOG.warn("Could not replace method reference with lambda: " + descriptor.expression.getText());
     }
   }
 
index 8ff91d19ef58675289527d69e8ec06aea81d1935..7ab52f507f62b40b0ac137b5535b86d07704c8bd 100644 (file)
@@ -76,6 +76,9 @@ public class ReflectionAccessMethodBuilder {
   }
 
   private void checkRequirements() {
+    if (myMemberAccessor == null) {
+      LOG.error("Accessed member not specified");
+    }
   }
 
   public ReflectionAccessMethodBuilder accessedMethod(@NotNull String jvmClassName, @NotNull String methodName) {
@@ -124,7 +127,7 @@ public class ReflectionAccessMethodBuilder {
       String jvmType = erasedType != null ? extractJvmType(erasedType) : typeName;
 
       if (name == null) {
-        LOG.info("Parameter name not found, index = " + i + ", type = " + typeName);
+        LOG.warn("Parameter name not found, index = " + i + ", type = " + typeName);
         name = "arg" + i;
       }
 
@@ -143,7 +146,7 @@ public class ReflectionAccessMethodBuilder {
         typeName = typeName.substring(0, typeParameterIndex);
       }
 
-      LOG.info("Type erasure failed, the following type used instead: " + typeName);
+      LOG.warn("Type erasure failed, the following type used instead: " + typeName);
       return typeName;
     }
 
index 3dabbe47163142e8b6b8c96c62cc2ca5bd182890..fe87ae05731c4f7582509ef36a390170be8d71f4 100644 (file)
@@ -17,9 +17,9 @@ import java.util.List;
  * @author Vitaliy.Bibaev
  */
 public abstract class ReflectionAccessorBase<T extends ItemToReplaceDescriptor> implements ReflectionAccessor {
-  private static final Logger LOG = Logger.getInstance(ReferenceReflectionAccessorBase.class);
   private final PsiClass myPsiClass;
   private final PsiElementFactory myElementFactory;
+  private final Logger log = Logger.getInstance(getClass());
 
   protected ReflectionAccessorBase(@NotNull PsiClass psiClass, @NotNull PsiElementFactory elementFactory) {
     myPsiClass = psiClass;
@@ -29,13 +29,14 @@ public abstract class ReflectionAccessorBase<T extends ItemToReplaceDescriptor>
   @Override
   public void accessThroughReflection(@NotNull PsiElement element) {
     List<T> toReplace = findItemsToReplace(element);
+    log.info("Found " + toReplace.size() + " items to replace");
     for (T item : toReplace) {
       grantAccess(item);
     }
 
     List<T> remaining = findItemsToReplace(element);
     if (!remaining.isEmpty()) {
-      LOG.warn("Some inaccessible items were not replaced");
+      log.warn("Some inaccessible items were not replaced");
     }
   }