cleanup (inspection "Java | Class structure | Utility class is not 'final'")
[idea/community.git] / platform / platform-api / src / com / intellij / util / OpenSourceUtil.java
index 79610b8dd60d8445a75be63c203c69186511a32e..630b71f2058d0bf4372a11b64de2b3cd95402f0d 100644 (file)
@@ -1,4 +1,4 @@
-// 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.
+// Copyright 2000-2020 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.util;
 
 import com.intellij.openapi.actionSystem.CommonDataKeys;
@@ -10,7 +10,7 @@ import org.jetbrains.annotations.Nullable;
 
 import static java.util.Arrays.asList;
 
-public class OpenSourceUtil {
+public final class OpenSourceUtil {
 
   private OpenSourceUtil() {
   }
@@ -24,23 +24,37 @@ public class OpenSourceUtil {
   }
 
   /**
+   * @return {@code true} if the specified {@code object} is {@link Navigatable} and supports navigation
+   */
+  public static boolean canNavigate(@Nullable Object object) {
+    return object instanceof Navigatable && ((Navigatable)object).canNavigate();
+  }
+
+  /**
+   * @return {@code true} if the specified {@code object} is {@link Navigatable} and supports navigation to source
+   */
+  public static boolean canNavigateToSource(@Nullable Object object) {
+    return object instanceof Navigatable && ((Navigatable)object).canNavigateToSource();
+  }
+
+  /**
    * Invokes {@link #navigate(boolean, Navigatable...)} that always requests focus.
    */
-  public static void navigate(@Nullable Navigatable... navigatables) {
+  public static void navigate(Navigatable @Nullable ... navigatables) {
     navigate(true, navigatables);
   }
 
   /**
    * Invokes {@link #navigate(boolean, boolean, Navigatable...)} that does not try to preserve a state of a corresponding editor.
    */
-  public static void navigate(boolean requestFocus, @Nullable Navigatable... navigatables) {
+  public static void navigate(boolean requestFocus, Navigatable @Nullable ... navigatables) {
     navigate(requestFocus, false, navigatables);
   }
 
   /**
    * Invokes {@link #navigate(boolean, boolean, Iterable)} if at least one navigatable exists
    */
-  public static void navigate(boolean requestFocus, boolean tryNotToScroll, @Nullable Navigatable... navigatables) {
+  public static void navigate(boolean requestFocus, boolean tryNotToScroll, Navigatable @Nullable ... navigatables) {
     if (navigatables != null && navigatables.length > 0) navigate(requestFocus, tryNotToScroll, asList(navigatables));
   }
 
@@ -52,18 +66,16 @@ public class OpenSourceUtil {
    * @param navigatables   an iterable collection of navigatables
    * @return {@code true} if at least one navigatable was processed, {@code false} otherwise
    */
-  public static boolean navigate(boolean requestFocus, boolean tryNotToScroll, @Nullable Iterable<Navigatable> navigatables) {
+  public static boolean navigate(boolean requestFocus, boolean tryNotToScroll, @Nullable Iterable<? extends Navigatable> navigatables) {
     if (navigatables == null) return false;
     Navigatable nonSourceNavigatable = null;
     boolean alreadyNavigatedToSource = false;
     for (Navigatable navigatable : navigatables) {
-      if (navigatable != null) {
-        if (navigateToSource(requestFocus, tryNotToScroll, navigatable)) {
-          alreadyNavigatedToSource = true;
-        }
-        else if (!alreadyNavigatedToSource && nonSourceNavigatable == null && navigatable.canNavigate()) {
-          nonSourceNavigatable = navigatable;
-        }
+      if (navigateToSource(requestFocus, tryNotToScroll, navigatable)) {
+        alreadyNavigatedToSource = true;
+      }
+      else if (!alreadyNavigatedToSource && nonSourceNavigatable == null && canNavigate(navigatable)) {
+        nonSourceNavigatable = navigatable;
       }
     }
     if (alreadyNavigatedToSource) return true;
@@ -80,7 +92,7 @@ public class OpenSourceUtil {
    * @param navigatables   an iterable collection of navigatables
    * @return {@code true} if at least one navigatable was processed, {@code false} otherwise
    */
-  public static boolean navigateToSource(boolean requestFocus, boolean tryNotToScroll, @Nullable Iterable<Navigatable> navigatables) {
+  public static boolean navigateToSource(boolean requestFocus, boolean tryNotToScroll, @Nullable Iterable<? extends Navigatable> navigatables) {
     if (navigatables == null) return false;
     boolean alreadyNavigatedToSource = false;
     for (Navigatable navigatable : navigatables) {
@@ -99,7 +111,7 @@ public class OpenSourceUtil {
    * @return {@code true} if navigation is done, {@code false} otherwise
    */
   public static boolean navigateToSource(boolean requestFocus, boolean tryNotToScroll, @Nullable Navigatable navigatable) {
-    if (navigatable == null || !navigatable.canNavigateToSource()) return false;
+    if (!canNavigateToSource(navigatable)) return false;
     if (tryNotToScroll && navigatable instanceof StatePreservingNavigatable) {
       ((StatePreservingNavigatable)navigatable).navigate(requestFocus, true);
     }