From dde921139f8e284f04ef7cc58af2b3ce7731fe46 Mon Sep 17 00:00:00 2001 From: Alexey Kudravtsev Date: Tue, 10 Sep 2024 18:00:14 +0200 Subject: [PATCH] optimization: do not reallocate/repeatedly find order root type in the hot path (part of KTIJ-27513 K2 IDE: Slow reference search for specific symbols in unused symbol inspection) GitOrigin-RevId: 0931017e36cc1178070f795e64d1473f244081cc --- .../ExternalAnnotationsManagerImpl.java | 4 +- platform/projectModel-impl/api-dump.txt | 1 - .../roots/AnnotationOrderRootType.java | 57 +++++++++---------- .../openapi/roots/JavadocOrderRootType.java | 48 ++++++---------- 4 files changed, 45 insertions(+), 65 deletions(-) diff --git a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java index 1138acbaec62..37f1014805ce 100644 --- a/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java +++ b/java/java-impl/src/com/intellij/codeInsight/ExternalAnnotationsManagerImpl.java @@ -730,7 +730,7 @@ public class ExternalAnnotationsManagerImpl extends ModCommandAwareExternalAnnot if (!entries.isEmpty()) { for (OrderEntry entry : entries) { if (!(entry instanceof ModuleOrderEntry)) { - if (!AnnotationOrderRootType.getUrls(entry).isEmpty()) { + if (AnnotationOrderRootType.hasUrls(entry)) { return AnnotationPlace.EXTERNAL; } break; @@ -899,7 +899,7 @@ public class ExternalAnnotationsManagerImpl extends ModCommandAwareExternalAnnot if (hasAnyAnnotationsRoots()) { ProjectFileIndex fileIndex = ProjectRootManager.getInstance(myPsiManager.getProject()).getFileIndex(); for (OrderEntry entry : fileIndex.getOrderEntriesForFile(file)) { - if (!(entry instanceof ModuleOrderEntry) && !AnnotationOrderRootType.getUrls(entry).isEmpty()) { + if (!(entry instanceof ModuleOrderEntry) && AnnotationOrderRootType.hasUrls(entry)) { return true; } } diff --git a/platform/projectModel-impl/api-dump.txt b/platform/projectModel-impl/api-dump.txt index 2dc1b580aa86..65147c20554b 100644 --- a/platform/projectModel-impl/api-dump.txt +++ b/platform/projectModel-impl/api-dump.txt @@ -299,7 +299,6 @@ c:com.intellij.openapi.roots.AnnotationOrderRootType - sf:ANNOTATIONS_ID:java.lang.String - s:getFiles(com.intellij.openapi.roots.OrderEntry):com.intellij.openapi.vfs.VirtualFile[] - s:getInstance():com.intellij.openapi.roots.OrderRootType -- s:getUrls(com.intellij.openapi.roots.OrderEntry):java.util.List - skipWriteIfEmpty():Z c:com.intellij.openapi.roots.JavaSyntheticLibrary - com.intellij.openapi.roots.SyntheticLibrary diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/AnnotationOrderRootType.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/AnnotationOrderRootType.java index 531d44b0330c..dec7fc45ac54 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/AnnotationOrderRootType.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/AnnotationOrderRootType.java @@ -1,15 +1,10 @@ // Copyright 2000-2023 JetBrains s.r.o. and contributors. Use of this source code is governed by the Apache 2.0 license. package com.intellij.openapi.roots; -import com.intellij.openapi.vfs.VfsUtilCore; import com.intellij.openapi.vfs.VirtualFile; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - public class AnnotationOrderRootType extends PersistentOrderRootType { public static final String ANNOTATIONS_ID = "ANNOTATIONS"; @@ -32,44 +27,44 @@ public class AnnotationOrderRootType extends PersistentOrderRootType { } public static VirtualFile @NotNull [] getFiles(@NotNull OrderEntry entry) { - List result = new ArrayList<>(); if (entry instanceof LibraryOrderEntry orderEntry) { - Collections.addAll(result, orderEntry.getRootFiles(getInstance())); + return orderEntry.getRootFiles(getInstance()); } else if (entry instanceof JdkOrderEntry orderEntry) { - Collections.addAll(result, orderEntry.getRootFiles(getInstance())); + return orderEntry.getRootFiles(getInstance()); } else if (entry instanceof ModuleSourceOrderEntry orderEntry) { JavaModuleExternalPaths moduleExtension = orderEntry.getRootModel().getModuleExtension(JavaModuleExternalPaths.class); if (moduleExtension != null) { - Collections.addAll(result, moduleExtension.getExternalAnnotationsRoots()); + return moduleExtension.getExternalAnnotationsRoots(); + } + else { + return VirtualFile.EMPTY_ARRAY; } } - return VfsUtilCore.toVirtualFileArray(result); + return VirtualFile.EMPTY_ARRAY; } - public static @NotNull List getUrls(@NotNull OrderEntry entry) { - List result = new ArrayList<>(); - RootPolicy> policy = new RootPolicy<>() { - @Override - public List visitLibraryOrderEntry(@NotNull final LibraryOrderEntry orderEntry, final List value) { - Collections.addAll(value, orderEntry.getRootUrls(getInstance())); - return value; - } + private final static RootPolicy GET_ANNOTATION_URL_POLICY = new RootPolicy<>() { + @Override + public String[] visitLibraryOrderEntry(@NotNull LibraryOrderEntry libraryOrderEntry, String[] value) { + return libraryOrderEntry.getRootUrls(getInstance()); + } - @Override - public List visitJdkOrderEntry(@NotNull final JdkOrderEntry orderEntry, final List value) { - Collections.addAll(value, orderEntry.getRootUrls(getInstance())); - return value; - } + @Override + public String[] visitJdkOrderEntry(@NotNull JdkOrderEntry jdkOrderEntry, String[] value) { + return jdkOrderEntry.getRootUrls(getInstance()); + } - @Override - public List visitModuleSourceOrderEntry(@NotNull ModuleSourceOrderEntry orderEntry, List value) { - Collections.addAll(value, orderEntry.getRootModel().getModuleExtension(JavaModuleExternalPaths.class).getExternalAnnotationsUrls()); - return value; - } - }; - entry.accept(policy, result); - return result; + @Override + public String[] visitModuleSourceOrderEntry(@NotNull ModuleSourceOrderEntry moduleSourceOrderEntry, String[] value) { + return moduleSourceOrderEntry.getRootModel().getModuleExtension(JavaModuleExternalPaths.class).getExternalAnnotationsUrls(); + } + }; + + @ApiStatus.Internal + public static boolean hasUrls(@NotNull OrderEntry entry) { + String[] urls = entry.accept(GET_ANNOTATION_URL_POLICY, null); + return urls != null && urls.length != 0; } } diff --git a/platform/projectModel-impl/src/com/intellij/openapi/roots/JavadocOrderRootType.java b/platform/projectModel-impl/src/com/intellij/openapi/roots/JavadocOrderRootType.java index 68a447b548d3..4036ae459609 100644 --- a/platform/projectModel-impl/src/com/intellij/openapi/roots/JavadocOrderRootType.java +++ b/platform/projectModel-impl/src/com/intellij/openapi/roots/JavadocOrderRootType.java @@ -1,14 +1,9 @@ // Copyright 2000-2021 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.openapi.roots; -import com.intellij.util.ArrayUtilRt; import org.jetbrains.annotations.ApiStatus; import org.jetbrains.annotations.NotNull; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; - public class JavadocOrderRootType extends PersistentOrderRootType { @ApiStatus.Internal @@ -21,32 +16,23 @@ public class JavadocOrderRootType extends PersistentOrderRootType { return getOrderRootType(JavadocOrderRootType.class); } + private final static RootPolicy GET_JAVADOC_URL_POLICY = new RootPolicy<>() { + @Override + public String @NotNull [] visitLibraryOrderEntry(@NotNull LibraryOrderEntry libraryOrderEntry, String[] value) { + return libraryOrderEntry.getRootUrls(getInstance()); + } + + @Override + public String @NotNull [] visitJdkOrderEntry(@NotNull JdkOrderEntry jdkOrderEntry, String[] value) { + return jdkOrderEntry.getRootUrls(getInstance()); + } + + @Override + public String @NotNull [] visitModuleSourceOrderEntry(@NotNull ModuleSourceOrderEntry moduleSourceOrderEntry, String[] value) { + return moduleSourceOrderEntry.getRootModel().getModuleExtension(JavaModuleExternalPaths.class).getJavadocUrls(); + } + }; public static String @NotNull [] getUrls(@NotNull OrderEntry entry) { - return ((JavadocOrderRootType)getInstance()).doGetUrls(entry); - } - - private String @NotNull [] doGetUrls(@NotNull OrderEntry entry) { - List result = new ArrayList<>(); - RootPolicy> policy = new RootPolicy<>() { - @Override - public List visitLibraryOrderEntry(@NotNull final LibraryOrderEntry orderEntry, final List value) { - Collections.addAll(value, orderEntry.getRootUrls(JavadocOrderRootType.this)); - return value; - } - - @Override - public List visitJdkOrderEntry(@NotNull final JdkOrderEntry orderEntry, final List value) { - Collections.addAll(value, orderEntry.getRootUrls(JavadocOrderRootType.this)); - return value; - } - - @Override - public List visitModuleSourceOrderEntry(@NotNull final ModuleSourceOrderEntry orderEntry, final List value) { - Collections.addAll(value, orderEntry.getRootModel().getModuleExtension(JavaModuleExternalPaths.class).getJavadocUrls()); - return value; - } - }; - entry.accept(policy, result); - return ArrayUtilRt.toStringArray(result); + return entry.accept(GET_JAVADOC_URL_POLICY, null); } }