IDEA-246372 No documentation found in quickDoc
authorDmitry Batrak <Dmitry.Batrak@jetbrains.com>
Thu, 13 Aug 2020 16:23:42 +0000 (19:23 +0300)
committerintellij-monorepo-bot <intellij-monorepo-bot-no-reply@jetbrains.com>
Thu, 13 Aug 2020 16:26:36 +0000 (16:26 +0000)
GitOrigin-RevId: 3681a04888abd82e5bf36628b5f8a401ff3eba21

java/java-tests/testSrc/com/intellij/java/codeInsight/JavaDocumentationTest.groovy
platform/lang-impl/src/com/intellij/codeInsight/documentation/DockablePopupManager.java
platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationComponent.java
platform/lang-impl/src/com/intellij/codeInsight/documentation/DocumentationManager.java
platform/lang-impl/src/com/intellij/codeInsight/documentation/render/DocRenderer.java

index 51c1487331fd5bc6c44e1dd1269f129607e0689c..e55c82f3c0e759f2ddaf370bb9e6c5aa1e3e8b68 100644 (file)
@@ -235,7 +235,7 @@ class Bar {
 
       assert component.decoratedText == expected
 
-      documentationManager.navigateByLink(component, "psi_element://java.lang.String#regionMatches(int, java.lang.String, int, int)")
+      documentationManager.navigateByLink(component, null, "psi_element://java.lang.String#regionMatches(int, java.lang.String, int, int)")
       try {
         JavaExternalDocumentationTest.waitTillDone(documentationManager.getLastAction())
       }
index ebda5481ae1d74adef15e60ea423982ca0056370..7092d9df2c19b94d9f65df5743d620d37a366ca9 100644 (file)
@@ -8,6 +8,7 @@ import com.intellij.ide.IdeEventQueue;
 import com.intellij.ide.util.PropertiesComponent;
 import com.intellij.openapi.Disposable;
 import com.intellij.openapi.actionSystem.*;
+import com.intellij.openapi.application.ApplicationManager;
 import com.intellij.openapi.diagnostic.Logger;
 import com.intellij.openapi.editor.Editor;
 import com.intellij.openapi.project.DumbAwareAction;
@@ -38,6 +39,7 @@ public abstract class DockablePopupManager<T extends JComponent & Disposable> {
   private final static Logger LOG = Logger.getInstance(DockablePopupManager.class);
   protected ToolWindow myToolWindow;
   private Runnable myAutoUpdateRequest;
+  private boolean myAutoUpdateMuted;
   @NotNull protected final Project myProject;
 
   public DockablePopupManager(@NotNull Project project) {
@@ -205,7 +207,8 @@ public abstract class DockablePopupManager<T extends JComponent & Disposable> {
   }
 
   void restartAutoUpdate(final boolean state) {
-    if (state && myToolWindow != null) {
+    boolean enabled = state && myToolWindow != null && !myAutoUpdateMuted;
+    if (enabled) {
       if (myAutoUpdateRequest == null) {
         myAutoUpdateRequest = this::updateComponent;
 
@@ -220,6 +223,17 @@ public abstract class DockablePopupManager<T extends JComponent & Disposable> {
     }
   }
 
+  public void muteAutoUpdateTill(@NotNull Disposable disposable) {
+    ApplicationManager.getApplication().assertIsDispatchThread();
+    myAutoUpdateMuted = true;
+    resetAutoUpdateState();
+    Disposer.register(disposable, () -> {
+      ApplicationManager.getApplication().assertIsDispatchThread();
+      myAutoUpdateMuted = false;
+      resetAutoUpdateState();
+    });
+  }
+
   public void resetAutoUpdateState() {
     restartAutoUpdate(PropertiesComponent.getInstance().getBoolean(getAutoUpdateEnabledProperty(), getAutoUpdateDefault()));
   }
index 595a103cbc8031730624b47d1ea25e9049c1fe50..f38fca4a9f1043dd3c84172f42f3056de45784c2 100644 (file)
@@ -469,7 +469,7 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr
       public void hyperlinkUpdate(HyperlinkEvent e) {
         HyperlinkEvent.EventType type = e.getEventType();
         if (type == HyperlinkEvent.EventType.ACTIVATED) {
-          manager.navigateByLink(DocumentationComponent.this, e.getDescription());
+          manager.navigateByLink(DocumentationComponent.this, null, e.getDescription());
         }
       }
     };
@@ -1537,7 +1537,7 @@ public class DocumentationComponent extends JPanel implements Disposable, DataPr
     HTMLDocument.Iterator link = getLink(n);
     if (link != null) {
       String href = (String)link.getAttributes().getAttribute(HTML.Attribute.HREF);
-      myManager.navigateByLink(this, href);
+      myManager.navigateByLink(this, null, href);
     }
   }
 
index ee57580fdce945746a60267df1bbed7d889dfd77..9334c8b2c51b4fc4b0c1f11d3e4a46e9579f11a0 100644 (file)
@@ -966,11 +966,15 @@ public class DocumentationManager extends DockablePopupManager<DocumentationComp
     return collector instanceof MyCollector ? ((MyCollector)collector).originalElement : targetElement;
   }
 
-  public void navigateByLink(DocumentationComponent component, String url) {
+  public void navigateByLink(@NotNull DocumentationComponent component, @Nullable PsiElement context, @NotNull String url) {
+    myPrecalculatedDocumentation = null;
     component.setCursor(Cursor.getPredefinedCursor(Cursor.WAIT_CURSOR));
-    PsiElement psiElement = component.getElement();
+    PsiElement psiElement = context;
     if (psiElement == null) {
-      return;
+      psiElement = component.getElement();
+      if (psiElement == null) {
+        return;
+      }
     }
     PsiManager manager = PsiManager.getInstance(getProject(psiElement));
     if (url.equals("external_doc")) {
@@ -1015,10 +1019,11 @@ public class DocumentationManager extends DockablePopupManager<DocumentationComp
           ExternalDocumentationHandler externalHandler = (ExternalDocumentationHandler)p;
           if (externalHandler.canFetchDocumentationLink(url)) {
             String ref = externalHandler.extractRefFromLink(url);
-            cancelAndFetchDocInfo(component, new DocumentationCollector(psiElement, url, ref, p) {
+            PsiElement finalPsiElement = psiElement;
+            cancelAndFetchDocInfo(component, new DocumentationCollector(finalPsiElement, url, ref, p) {
               @Override
               public String getDocumentation() {
-                return externalHandler.fetchExternalDocumentation(url, psiElement);
+                return externalHandler.fetchExternalDocumentation(url, finalPsiElement);
               }
             });
             processed = true;
index 915b19109633c6dcd7736c3b12dd8bc494309836..5c4256542932a2e8e20374451046b39f3054d26c 100644 (file)
@@ -334,21 +334,20 @@ class DocRenderer implements EditorCustomElementRenderer {
       if (!documentationManager.hasActiveDockedDocWindow()) {
         component.startWait();
       }
-      documentationManager.navigateByLink(component, linkUrl);
+      documentationManager.navigateByLink(component, context, linkUrl);
     }
     if (documentationManager.getDocInfoHint() == null) {
       editor.putUserData(PopupFactoryImpl.ANCHOR_POPUP_POINT, null);
     }
     if (documentationManager.hasActiveDockedDocWindow()) {
-      documentationManager.setAllowContentUpdateFromContext(false);
       Disposable disposable = Disposer.newDisposable();
       editor.getCaretModel().addCaretListener(new CaretListener() {
         @Override
         public void caretPositionChanged(@NotNull CaretEvent e) {
-          documentationManager.resetAutoUpdateState();
           Disposer.dispose(disposable);
         }
       }, disposable);
+      documentationManager.muteAutoUpdateTill(disposable);
     }
   }