highlight only parameter hint for innermost method call
authorDmitry Batrak <Dmitry.Batrak@jetbrains.com>
Wed, 9 Aug 2017 08:16:47 +0000 (11:16 +0300)
committerDmitry Batrak <Dmitry.Batrak@jetbrains.com>
Wed, 9 Aug 2017 08:19:22 +0000 (11:19 +0300)
java/java-impl/src/com/intellij/codeInsight/hint/api/impls/MethodParameterInfoHandler.java
java/java-tests/testSrc/com/intellij/java/codeInsight/completion/CompletionHintsTest.java
platform/lang-api/src/com/intellij/lang/parameterInfo/UpdateParameterInfoContext.java
platform/lang-impl/src/com/intellij/codeInsight/hint/ParameterInfoController.java
platform/testFramework/src/com/intellij/testFramework/utils/parameterInfo/MockUpdateParameterInfoContext.java
python/testSrc/com/jetbrains/python/PyParameterInfoTest.java

index 1a9c4ad23e1b63c9160817a7094a821d222b4cbc..d704a6e8b38468a63c93625b0b93e008b5edd212 100644 (file)
@@ -172,7 +172,7 @@ public class MethodParameterInfoHandler implements ParameterInfoHandlerWithTabAc
                                                                           context.getOffset(), JavaTokenType.COMMA);
                   TextRange textRange = expressionList.getTextRange();
                   if (context.getOffset() <= textRange.getStartOffset() || context.getOffset() >= textRange.getEndOffset()) index = -1;
-                  highlightHints(context.getEditor(), expressionList, index);
+                  highlightHints(context.getEditor(), expressionList, context.isInnermostContext() ? index : -1);
                 }
               }
 
index 9fa46c82c9f73fa710f289fac3e79baea68b1ea1..9607b4f3e2f6947ecbcbc3de17bf07229dfc1efa 100644 (file)
@@ -209,7 +209,7 @@ public class CompletionHintsTest extends LightFixtureCompletionTestCase {
     myFixture.type("System.getPro");
     complete("getProperty(String key, String def)");
     waitForAllAsyncStuff();
-    checkResultWithInlays("class C { void m() { System.setProperty(<HINT text=\"key:\"/>System.getProperty(<HINT text=\"key:\"/><caret>, <hint text=\"def:\"/>), <hint text=\"value:\"/>) } }");
+    checkResultWithInlays("class C { void m() { System.setProperty(<hint text=\"key:\"/>System.getProperty(<HINT text=\"key:\"/><caret>, <hint text=\"def:\"/>), <hint text=\"value:\"/>) } }");
   }
 
   public void testTabWithNestedCompletion() throws Exception {
@@ -219,10 +219,10 @@ public class CompletionHintsTest extends LightFixtureCompletionTestCase {
     myFixture.type("System.getPro");
     complete("getProperty(String key, String def)");
     waitForAllAsyncStuff();
-    checkResultWithInlays("class C { void m() { System.setProperty(<HINT text=\"key:\"/>System.getProperty(<HINT text=\"key:\"/><caret>, <hint text=\"def:\"/>), <hint text=\"value:\"/>) } }");
+    checkResultWithInlays("class C { void m() { System.setProperty(<hint text=\"key:\"/>System.getProperty(<HINT text=\"key:\"/><caret>, <hint text=\"def:\"/>), <hint text=\"value:\"/>) } }");
     next();
     waitForAllAsyncStuff();
-    checkResultWithInlays("class C { void m() { System.setProperty(<HINT text=\"key:\"/>System.getProperty(<hint text=\"key:\"/>, <HINT text=\"def:\"/><caret>), <hint text=\"value:\"/>) } }");
+    checkResultWithInlays("class C { void m() { System.setProperty(<hint text=\"key:\"/>System.getProperty(<hint text=\"key:\"/>, <HINT text=\"def:\"/><caret>), <hint text=\"value:\"/>) } }");
     next();
     waitForAllAsyncStuff();
     checkResultWithInlays("class C { void m() { System.setProperty(<HINT text=\"key:\"/>System.getProperty(<hint text=\"key:\"/>, <hint text=\"def:\"/>)<caret>, <hint text=\"value:\"/>) } }");
index 9af579841c325f889f302afb7e2a926f4133fd34..9f631b9925af13c808128a1446427913394d9391 100644 (file)
@@ -33,4 +33,6 @@ public interface UpdateParameterInfoContext extends ParameterInfoContext {
   int getParameterListStart();
 
   Object[] getObjectsToView();
+  
+  boolean isInnermostContext();
 }
index 2989dba1e2cb147f73e239192cacc91210a622ed..648344f862ebb71108b19ec5a4f2ef19767e4580 100644 (file)
@@ -644,6 +644,24 @@ public class ParameterInfoController implements Disposable {
       return myComponent.getObjects();
     }
 
+    @Override
+    public boolean isInnermostContext() {
+      PsiElement ourOwner = myComponent.getParameterOwner();
+      if (ourOwner == null || !ourOwner.isValid()) return false;
+      TextRange ourRange = ourOwner.getTextRange();
+      if (ourRange == null) return false;
+      List<ParameterInfoController> allControllers = getAllControllers(myEditor);
+      for (ParameterInfoController controller : allControllers) {
+        if (controller != ParameterInfoController.this) {
+          PsiElement parameterOwner = controller.myComponent.getParameterOwner();
+          if (parameterOwner != null && parameterOwner.isValid()) {
+            TextRange range = parameterOwner.getTextRange();
+            if (range != null && range.contains(myOffset) && ourRange.contains(range)) return false;
+          }
+        }
+      }
+      return true;
+    }
   }
 
   private static class MyBestLocationPointProvider  {
index f7483be2b5728f84841d8f3042cb8da0de598b14..82b4ef4ef60aa7b6bdc7c7d7d2a84bd52239cbee 100644 (file)
@@ -1,5 +1,5 @@
 /*
- * Copyright 2000-2011 JetBrains s.r.o.
+ * Copyright 2000-2017 JetBrains s.r.o.
  *
  * Licensed under the Apache License, Version 2.0 (the "License");
  * you may not use this file except in compliance with the License.
@@ -89,6 +89,11 @@ public class MockUpdateParameterInfoContext implements UpdateParameterInfoContex
     return myItems;
   }
 
+  @Override
+  public boolean isInnermostContext() {
+    return false;
+  }
+
   public Project getProject() {
     return myFile.getProject();
   }
index f2ee9d920d559c8ec788fd64f6b0c3753b678eca..742f3d6db51734c87fd9e431f7c3813ee3db4a69 100644 (file)
@@ -864,6 +864,11 @@ public class PyParameterInfoTest extends LightMarkedTestCase {
       return null; // we don't use it
     }
 
+    @Override
+    public boolean isInnermostContext() {
+      return false;
+    }
+
     @Override
     public PsiElement getHighlightedElement() {
       return null;  // we don't use it