From 75347d06b9c3ac5c95b8273949fbdec82076a38b Mon Sep 17 00:00:00 2001 From: Igor Yakovlev Date: Fri, 28 Aug 2020 18:03:11 +0300 Subject: [PATCH] [FIR IDE] Move IconProvider in fir independed module --- .../kotlin/idea/KotlinIconProvider.kt | 147 +--------------- .../KotlinStructureViewFactory.java | 4 +- .../kotlin/idea/KotlinIconProviderBase.kt | 160 ++++++++++++++++++ .../kotlin/idea/KotlinIconsIndependent.java | 83 +++++++++ .../kotlin/idea/asJava/LightClassProvider.kt | 5 + idea/resources-fir/META-INF/plugin.xml | 6 + idea/resources/META-INF/idea.xml | 2 - idea/resources/META-INF/plugin-common.xml | 2 +- .../idea/asJava/LightClassProviderImpl.kt | 4 + .../AbstractNavBarModelExtensionCompatBase.kt | 4 +- .../KotlinNavBarModelExtension.kt | 4 +- .../presentation/DeclarationPresenters.kt | 11 +- .../idea/projectView/projectViewProviders.kt | 4 +- .../memberInfo/KotlinMemberSelectionTable.kt | 4 +- .../moveMethod/MoveKotlinMethodDialog.java | 4 +- 15 files changed, 283 insertions(+), 161 deletions(-) create mode 100644 idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/KotlinIconProviderBase.kt create mode 100644 idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/KotlinIconsIndependent.java diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinIconProvider.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinIconProvider.kt index d8163e706c4..ab72f0c2e7c 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinIconProvider.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/KotlinIconProvider.kt @@ -5,148 +5,9 @@ package org.jetbrains.kotlin.idea -import com.intellij.ide.IconProvider -import com.intellij.openapi.project.DumbAware -import com.intellij.openapi.project.IndexNotReadyException -import com.intellij.openapi.util.Iconable -import com.intellij.openapi.util.text.StringUtil -import com.intellij.psi.PsiElement -import com.intellij.ui.RowIcon -import com.intellij.util.PlatformIcons -import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade -import org.jetbrains.kotlin.asJava.classes.KtLightClassForSourceDeclaration -import org.jetbrains.kotlin.asJava.unwrapped -import org.jetbrains.kotlin.idea.KotlinIcons.ACTUAL -import org.jetbrains.kotlin.idea.KotlinIcons.EXPECT -import org.jetbrains.kotlin.idea.caches.lightClasses.KtLightClassForDecompiledDeclaration import org.jetbrains.kotlin.idea.util.hasMatchingExpected -import org.jetbrains.kotlin.idea.util.isExpectDeclaration -import org.jetbrains.kotlin.lexer.KtTokens -import org.jetbrains.kotlin.psi.* -import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType -import org.jetbrains.kotlin.psi.psiUtil.isAbstract -import javax.swing.Icon +import org.jetbrains.kotlin.psi.KtDeclaration -class KotlinIconProvider : IconProvider(), DumbAware { - override fun getIcon(psiElement: PsiElement, flags: Int): Icon? { - if (psiElement is KtFile) { - if (psiElement.isScript()) { - return when { - psiElement.name.endsWith(".gradle.kts") -> KotlinIcons.GRADLE_SCRIPT - else -> KotlinIcons.SCRIPT - } - } - val mainClass = getSingleClass(psiElement) - return if (mainClass != null) getIcon(mainClass, flags) else KotlinIcons.FILE - } - - val result = psiElement.getBaseIcon() - if (flags and Iconable.ICON_FLAG_VISIBILITY > 0 && result != null && (psiElement is KtModifierListOwner && psiElement !is KtClassInitializer)) { - val list = psiElement.modifierList - val visibilityIcon = getVisibilityIcon(list) - - val withExpectedActual: Icon = try { - result.addExpectActualMarker(psiElement) - } catch (indexNotReady: IndexNotReadyException) { - result - } - - return createRowIcon(withExpectedActual, visibilityIcon) - } - return result - } - - companion object { - var INSTANCE = KotlinIconProvider() - - fun isSingleClassFile(file: KtFile) = getSingleClass(file) != null - - fun getSingleClass(file: KtFile): KtClassOrObject? { - val mainClass = getMainClass(file) - return if (mainClass != null && file.declarations.size == 1) mainClass else null - } - - fun getMainClass(file: KtFile): KtClassOrObject? { - val classes = file.declarations.filterIsInstance() - if (classes.size == 1 && StringUtil.getPackageName(file.name) == classes[0].name) { - return classes[0] - } - return null - } - - private fun createRowIcon(baseIcon: Icon, visibilityIcon: Icon): RowIcon { - val rowIcon = RowIcon(2) - rowIcon.setIcon(baseIcon, 0) - rowIcon.setIcon(visibilityIcon, 1) - return rowIcon - } - - fun getVisibilityIcon(list: KtModifierList?): Icon { - if (list != null) { - if (list.hasModifier(KtTokens.PRIVATE_KEYWORD)) { - return PlatformIcons.PRIVATE_ICON - } - if (list.hasModifier(KtTokens.PROTECTED_KEYWORD)) { - return PlatformIcons.PROTECTED_ICON - } - if (list.hasModifier(KtTokens.INTERNAL_KEYWORD)) { - return PlatformIcons.PACKAGE_LOCAL_ICON - } - } - - return PlatformIcons.PUBLIC_ICON - } - - fun PsiElement.getBaseIcon(): Icon? = when (this) { - is KtPackageDirective -> PlatformIcons.PACKAGE_ICON - is KtLightClassForFacade -> KotlinIcons.FILE - is KtLightClassForDecompiledDeclaration -> { - val origin = kotlinOrigin - //TODO (light classes for decompiled files): correct presentation - if (origin != null) origin.getBaseIcon() else KotlinIcons.CLASS - } - is KtLightClassForSourceDeclaration -> navigationElement.getBaseIcon() - is KtNamedFunction -> when { - receiverTypeReference != null -> - if (KtPsiUtil.isAbstract(this)) KotlinIcons.ABSTRACT_EXTENSION_FUNCTION else KotlinIcons.EXTENSION_FUNCTION - getStrictParentOfType() is KtClass -> - if (KtPsiUtil.isAbstract(this)) PlatformIcons.ABSTRACT_METHOD_ICON else PlatformIcons.METHOD_ICON - else -> - KotlinIcons.FUNCTION - } - is KtConstructor<*> -> PlatformIcons.METHOD_ICON - is KtFunctionLiteral -> KotlinIcons.LAMBDA - is KtClass -> when { - isInterface() -> KotlinIcons.INTERFACE - isEnum() -> KotlinIcons.ENUM - isAnnotation() -> KotlinIcons.ANNOTATION - this is KtEnumEntry && getPrimaryConstructorParameterList() == null -> KotlinIcons.ENUM - else -> if (isAbstract()) KotlinIcons.ABSTRACT_CLASS else KotlinIcons.CLASS - } - is KtObjectDeclaration -> KotlinIcons.OBJECT - is KtParameter -> { - if (KtPsiUtil.getClassIfParameterIsProperty(this) != null) { - if (isMutable) KotlinIcons.FIELD_VAR else KotlinIcons.FIELD_VAL - } else - KotlinIcons.PARAMETER - } - is KtProperty -> if (isVar) KotlinIcons.FIELD_VAR else KotlinIcons.FIELD_VAL - is KtClassInitializer -> KotlinIcons.CLASS_INITIALIZER - is KtTypeAlias -> KotlinIcons.TYPE_ALIAS - else -> unwrapped?.takeIf { it != this }?.getBaseIcon() - } - } -} - -private fun Icon.addExpectActualMarker(element: PsiElement): Icon { - val declaration = (element as? KtNamedDeclaration) ?: return this - val additionalIcon = when { - declaration.isExpectDeclaration() -> EXPECT - declaration.hasMatchingExpected() -> ACTUAL - else -> return this - } - return RowIcon(2).apply { - setIcon(this@addExpectActualMarker, 0) - setIcon(additionalIcon, 1) - } -} +class KotlinIconProvider : KotlinIconProviderBase() { + override fun KtDeclaration.isMatchingExpected() = hasMatchingExpected() +} \ No newline at end of file diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/structureView/KotlinStructureViewFactory.java b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/structureView/KotlinStructureViewFactory.java index ca92efc62d3..47c86d91393 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/structureView/KotlinStructureViewFactory.java +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/structureView/KotlinStructureViewFactory.java @@ -24,7 +24,7 @@ import com.intellij.openapi.editor.Editor; import com.intellij.psi.PsiFile; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; -import org.jetbrains.kotlin.idea.KotlinIconProvider; +import org.jetbrains.kotlin.idea.KotlinIconProviderBase; import org.jetbrains.kotlin.psi.KtFile; public class KotlinStructureViewFactory implements PsiStructureViewFactory { @@ -44,7 +44,7 @@ public class KotlinStructureViewFactory implements PsiStructureViewFactory { @Override public boolean isRootNodeShown() { - return !KotlinIconProvider.Companion.isSingleClassFile(file); + return !KotlinIconProviderBase.Companion.isSingleClassFile(file); } }; } diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/KotlinIconProviderBase.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/KotlinIconProviderBase.kt new file mode 100644 index 00000000000..4a3936ccf04 --- /dev/null +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/KotlinIconProviderBase.kt @@ -0,0 +1,160 @@ +/* + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. + */ + +package org.jetbrains.kotlin.idea + +import com.intellij.ide.IconProvider +import com.intellij.openapi.project.DumbAware +import com.intellij.openapi.project.IndexNotReadyException +import com.intellij.openapi.util.Iconable +import com.intellij.openapi.util.text.StringUtil +import com.intellij.psi.PsiClass +import com.intellij.psi.PsiElement +import com.intellij.ui.RowIcon +import com.intellij.util.PlatformIcons +import org.jetbrains.kotlin.asJava.classes.KtLightClass +import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade +import org.jetbrains.kotlin.asJava.classes.KtLightClassForSourceDeclaration +import org.jetbrains.kotlin.asJava.unwrapped +import org.jetbrains.kotlin.idea.asJava.LightClassProvider.Companion.providedIsKtLightClassForDecompiledDeclaration +import org.jetbrains.kotlin.idea.KotlinIconsIndependent.ACTUAL +import org.jetbrains.kotlin.idea.KotlinIconsIndependent.EXPECT +import org.jetbrains.kotlin.idea.search.ifTrue +import org.jetbrains.kotlin.lexer.KtTokens +import org.jetbrains.kotlin.psi.* +import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject +import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType +import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier +import org.jetbrains.kotlin.psi.psiUtil.isAbstract +import javax.swing.Icon + +open class KotlinIconProviderBase : IconProvider(), DumbAware { + + private fun KtDeclaration.isExpectDeclaration(): Boolean = + hasExpectModifier() || (containingClassOrObject?.isExpectDeclaration() == true) + + //TODO FIR add support for correct isMatchingExpected + protected open fun KtDeclaration.isMatchingExpected() = false + + private fun Icon.addExpectActualMarker(element: PsiElement): Icon { + val declaration = (element as? KtNamedDeclaration) ?: return this + val additionalIcon = when { + declaration.isExpectDeclaration() -> EXPECT + declaration.isMatchingExpected() -> ACTUAL + else -> return this + } + return RowIcon(2).apply { + setIcon(this@addExpectActualMarker, 0) + setIcon(additionalIcon, 1) + } + } + + override fun getIcon(psiElement: PsiElement, flags: Int): Icon? { + if (psiElement is KtFile) { + if (psiElement.isScript()) { + return when { + psiElement.name.endsWith(".gradle.kts") -> KotlinIconsIndependent.GRADLE_SCRIPT + else -> KotlinIconsIndependent.SCRIPT + } + } + val mainClass = getSingleClass(psiElement) + return if (mainClass != null) getIcon(mainClass, flags) else KotlinIconsIndependent.FILE + } + + val result = psiElement.getBaseIcon() + if (flags and Iconable.ICON_FLAG_VISIBILITY > 0 && result != null && (psiElement is KtModifierListOwner && psiElement !is KtClassInitializer)) { + val list = psiElement.modifierList + val visibilityIcon = getVisibilityIcon(list) + + val withExpectedActual: Icon = try { + result.addExpectActualMarker(psiElement) + } catch (indexNotReady: IndexNotReadyException) { + result + } + + return createRowIcon(withExpectedActual, visibilityIcon) + } + return result + } + + companion object { + fun isSingleClassFile(file: KtFile) = getSingleClass(file) != null + + fun getSingleClass(file: KtFile): KtClassOrObject? { + val mainClass = getMainClass(file) + return if (mainClass != null && file.declarations.size == 1) mainClass else null + } + + fun getMainClass(file: KtFile): KtClassOrObject? { + val classes = file.declarations.filterIsInstance() + if (classes.size == 1 && StringUtil.getPackageName(file.name) == classes[0].name) { + return classes[0] + } + return null + } + + private fun createRowIcon(baseIcon: Icon, visibilityIcon: Icon): RowIcon { + val rowIcon = RowIcon(2) + rowIcon.setIcon(baseIcon, 0) + rowIcon.setIcon(visibilityIcon, 1) + return rowIcon + } + + fun getVisibilityIcon(list: KtModifierList?): Icon { + if (list != null) { + if (list.hasModifier(KtTokens.PRIVATE_KEYWORD)) { + return PlatformIcons.PRIVATE_ICON + } + if (list.hasModifier(KtTokens.PROTECTED_KEYWORD)) { + return PlatformIcons.PROTECTED_ICON + } + if (list.hasModifier(KtTokens.INTERNAL_KEYWORD)) { + return PlatformIcons.PACKAGE_LOCAL_ICON + } + } + + return PlatformIcons.PUBLIC_ICON + } + + fun PsiElement.getBaseIcon(): Icon? = when (this) { + is KtPackageDirective -> PlatformIcons.PACKAGE_ICON + is KtLightClassForFacade -> KotlinIconsIndependent.FILE + is KtLightClassForSourceDeclaration -> navigationElement.getBaseIcon() + is KtNamedFunction -> when { + receiverTypeReference != null -> + if (KtPsiUtil.isAbstract(this)) KotlinIconsIndependent.ABSTRACT_EXTENSION_FUNCTION else KotlinIconsIndependent.EXTENSION_FUNCTION + getStrictParentOfType() is KtClass -> + if (KtPsiUtil.isAbstract(this)) PlatformIcons.ABSTRACT_METHOD_ICON else PlatformIcons.METHOD_ICON + else -> + KotlinIconsIndependent.FUNCTION + } + is KtConstructor<*> -> PlatformIcons.METHOD_ICON + is KtFunctionLiteral -> KotlinIconsIndependent.LAMBDA + is KtClass -> when { + isInterface() -> KotlinIconsIndependent.INTERFACE + isEnum() -> KotlinIconsIndependent.ENUM + isAnnotation() -> KotlinIconsIndependent.ANNOTATION + this is KtEnumEntry && getPrimaryConstructorParameterList() == null -> KotlinIconsIndependent.ENUM + else -> if (isAbstract()) KotlinIconsIndependent.ABSTRACT_CLASS else KotlinIconsIndependent.CLASS + } + is KtObjectDeclaration -> KotlinIconsIndependent.OBJECT + is KtParameter -> { + if (KtPsiUtil.getClassIfParameterIsProperty(this) != null) { + if (isMutable) KotlinIconsIndependent.FIELD_VAR else KotlinIconsIndependent.FIELD_VAL + } else + KotlinIconsIndependent.PARAMETER + } + is KtProperty -> if (isVar) KotlinIconsIndependent.FIELD_VAR else KotlinIconsIndependent.FIELD_VAL + is KtClassInitializer -> KotlinIconsIndependent.CLASS_INITIALIZER + is KtTypeAlias -> KotlinIconsIndependent.TYPE_ALIAS + is PsiClass -> providedIsKtLightClassForDecompiledDeclaration().ifTrue { + val origin = (this as? KtLightClass)?.kotlinOrigin + //TODO (light classes for decompiled files): correct presentation + if (origin != null) origin.getBaseIcon() else KotlinIconsIndependent.CLASS + } + else -> unwrapped?.takeIf { it != this }?.getBaseIcon() + } + } +} \ No newline at end of file diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/KotlinIconsIndependent.java b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/KotlinIconsIndependent.java new file mode 100644 index 00000000000..210bafa2753 --- /dev/null +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/KotlinIconsIndependent.java @@ -0,0 +1,83 @@ +/* + * Copyright 2010-2015 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. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package org.jetbrains.kotlin.idea; + +import com.intellij.icons.AllIcons; +import com.intellij.openapi.util.IconLoader; +import com.intellij.util.PlatformIcons; + +import javax.swing.*; + +public interface KotlinIconsIndependent { + Icon SMALL_LOGO = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/kotlin.svg"); + + Icon SMALL_LOGO_13 = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/kotlin13.svg"); + + Icon CLASS = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/classKotlin.svg"); + Icon ABSTRACT_CLASS = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/abstractClassKotlin.svg"); + Icon ENUM = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/enumKotlin.svg"); + Icon FILE = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/kotlin_file.svg"); + Icon SCRIPT = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/kotlin_script.svg"); + Icon GRADLE_SCRIPT = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/kotlin_gradle_script.svg"); + Icon OBJECT = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/objectKotlin.svg"); + Icon INTERFACE = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/interfaceKotlin.svg"); + Icon ANNOTATION = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/annotationKotlin.svg"); + Icon FUNCTION = AllIcons.Nodes.Function; + Icon EXTENSION_FUNCTION = PlatformIcons.FUNCTION_ICON; + Icon ABSTRACT_EXTENSION_FUNCTION = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/abstract_extension_function.svg"); + Icon LAMBDA = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/lambda.svg"); + Icon VAR = PlatformIcons.VARIABLE_ICON; + Icon VAL = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/value.svg"); + Icon PARAMETER = PlatformIcons.PARAMETER_ICON; + Icon FIELD_VAL = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/field_value.svg"); + Icon FIELD_VAR = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/field_variable.svg"); + Icon CLASS_INITIALIZER = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/classInitializerKotlin.svg"); + Icon TYPE_ALIAS = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/typeAlias.svg"); + + Icon DSL_MARKER_ANNOTATION = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/dslMarkerAnnotation.svg"); + + Icon SUSPEND_CALL = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/suspendCall.svg"); + + Icon ACTUAL = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/actual.svg"); + Icon EXPECT = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/expect.svg"); + + Icon LAUNCH = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/kotlin_launch_configuration.svg"); + Icon LOAD_SCRIPT_CONFIGURATION = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/loadScriptConfiguration.svg"); + + Icon JS = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/kotlin_js.svg"); + Icon MPP = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/kotlin_multiplatform_project.svg"); + Icon NATIVE = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/kotlin_native.svg"); + + interface WizardIndependent { + Icon JVM = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/wizard/jvm.svg"); + Icon JS = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/wizard/js.svg"); + Icon CONSOLE = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/wizard/console.svg"); + Icon MULTIPLATFORM = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/wizard/multiplatform.svg"); + Icon MULTIPLATFORM_LIBRARY = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/wizard/multiplatformLibrary.svg"); + Icon MULTIPLATFORM_MOBILE = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/wizard/multiplatformMobile.svg"); + Icon MULTIPLATFORM_MOBILE_LIBRARY = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/wizard/multiplatformMobileLibrary.svg"); + Icon NATIVE = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/wizard/native.svg"); + Icon WEB = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/wizard/ppWeb.svg"); + Icon ANDROID = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/wizard/android.svg"); + Icon IOS = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/wizard/ios.svg"); + Icon LINUX = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/wizard/linux.svg"); + Icon MAC_OS = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/wizard/macOS.svg"); + Icon WINDOWS = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/wizard/windows.svg"); + Icon NODE_JS = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/wizard/nodejs.svg"); + Icon REACT_JS = IconLoader.getIcon("/org/jetbrains/kotlin/idea/icons/wizard/react.svg"); + } +} diff --git a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/asJava/LightClassProvider.kt b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/asJava/LightClassProvider.kt index cb1f970ff9a..d86a24aac4a 100644 --- a/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/asJava/LightClassProvider.kt +++ b/idea/idea-frontend-independent/src/org/jetbrains/kotlin/idea/asJava/LightClassProvider.kt @@ -44,6 +44,8 @@ interface LightClassProvider { fun isKtFakeLightClass(psiClass: PsiClass): Boolean + fun isKtLightClassForDecompiledDeclaration(psiClass: PsiClass): Boolean + fun createKtFakeLightMethod(ktDeclaration: KtNamedDeclaration): PsiMethod? companion object { @@ -84,6 +86,9 @@ interface LightClassProvider { fun PsiClass.providedIsKtFakeLightClass(): Boolean = getInstance(project).isKtFakeLightClass(this) + fun PsiClass.providedIsKtLightClassForDecompiledDeclaration(): Boolean = + getInstance(project).isKtLightClassForDecompiledDeclaration(this) + fun providedCreateKtFakeLightMethod(ktDeclaration: KtNamedDeclaration): PsiMethod? = getInstance(ktDeclaration.project).createKtFakeLightMethod(ktDeclaration) diff --git a/idea/resources-fir/META-INF/plugin.xml b/idea/resources-fir/META-INF/plugin.xml index 284f85d6903..e3c0b55c43d 100644 --- a/idea/resources-fir/META-INF/plugin.xml +++ b/idea/resources-fir/META-INF/plugin.xml @@ -174,6 +174,8 @@ The Kotlin FIR plugin provides language support in IntelliJ IDEA and Android Stu + + @@ -190,12 +192,16 @@ The Kotlin FIR plugin provides language support in IntelliJ IDEA and Android Stu + + + + - - - + diff --git a/idea/src/org/jetbrains/kotlin/idea/asJava/LightClassProviderImpl.kt b/idea/src/org/jetbrains/kotlin/idea/asJava/LightClassProviderImpl.kt index 6447fc6e834..c06ffc0ea00 100644 --- a/idea/src/org/jetbrains/kotlin/idea/asJava/LightClassProviderImpl.kt +++ b/idea/src/org/jetbrains/kotlin/idea/asJava/LightClassProviderImpl.kt @@ -10,6 +10,7 @@ import org.jetbrains.kotlin.asJava.* import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.idea.caches.lightClasses.KtFakeLightClass import org.jetbrains.kotlin.idea.caches.lightClasses.KtFakeLightMethod +import org.jetbrains.kotlin.idea.caches.lightClasses.KtLightClassForDecompiledDeclaration import org.jetbrains.kotlin.psi.* class LightClassProviderImpl : LightClassProvider { @@ -46,6 +47,9 @@ class LightClassProviderImpl : LightClassProvider { override fun isKtFakeLightClass(psiClass: PsiClass): Boolean = psiClass is KtFakeLightClass + override fun isKtLightClassForDecompiledDeclaration(psiClass: PsiClass): Boolean = + psiClass is KtLightClassForDecompiledDeclaration + override fun createKtFakeLightMethod(ktDeclaration: KtNamedDeclaration): PsiMethod? = KtFakeLightMethod.get(ktDeclaration) } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/AbstractNavBarModelExtensionCompatBase.kt b/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/AbstractNavBarModelExtensionCompatBase.kt index c5794523587..e4245bab394 100644 --- a/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/AbstractNavBarModelExtensionCompatBase.kt +++ b/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/AbstractNavBarModelExtensionCompatBase.kt @@ -8,7 +8,7 @@ package org.jetbrains.kotlin.idea.navigationToolbar import com.intellij.ide.navigationToolbar.StructureAwareNavBarModelExtension import com.intellij.lang.Language import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.idea.KotlinIconProvider +import org.jetbrains.kotlin.idea.KotlinIconProviderBase import org.jetbrains.kotlin.idea.KotlinLanguage import org.jetbrains.kotlin.psi.KtFile @@ -25,7 +25,7 @@ abstract class AbstractNavBarModelExtensionCompatBase : StructureAwareNavBarMode override fun acceptParentFromModel(psiElement: PsiElement?): Boolean { if (psiElement is KtFile) { - return KotlinIconProvider.getSingleClass(psiElement) == null + return KotlinIconProviderBase.getSingleClass(psiElement) == null } return true } diff --git a/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/KotlinNavBarModelExtension.kt b/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/KotlinNavBarModelExtension.kt index 83eb8b9ce35..3517957cfb0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/KotlinNavBarModelExtension.kt +++ b/idea/src/org/jetbrains/kotlin/idea/navigationToolbar/KotlinNavBarModelExtension.kt @@ -6,7 +6,7 @@ package org.jetbrains.kotlin.idea.navigationToolbar import com.intellij.psi.PsiElement -import org.jetbrains.kotlin.idea.KotlinIconProvider +import org.jetbrains.kotlin.idea.KotlinIconProviderBase import org.jetbrains.kotlin.idea.projectView.KtDeclarationTreeNode.Companion.tryGetRepresentableText import org.jetbrains.kotlin.psi.KtDeclaration import org.jetbrains.kotlin.psi.KtFile @@ -21,6 +21,6 @@ class KotlinNavBarModelExtension : AbstractNavBarModelExtensionCompatBase() { } val containingFile = psiElement?.containingFile as? KtFile ?: return psiElement if (containingFile.isScript()) return psiElement - return KotlinIconProvider.getSingleClass(containingFile) ?: psiElement + return KotlinIconProviderBase.getSingleClass(containingFile) ?: psiElement } } \ No newline at end of file diff --git a/idea/src/org/jetbrains/kotlin/idea/presentation/DeclarationPresenters.kt b/idea/src/org/jetbrains/kotlin/idea/presentation/DeclarationPresenters.kt index ecf43e84e7d..3780f4989af 100644 --- a/idea/src/org/jetbrains/kotlin/idea/presentation/DeclarationPresenters.kt +++ b/idea/src/org/jetbrains/kotlin/idea/presentation/DeclarationPresenters.kt @@ -5,17 +5,20 @@ package org.jetbrains.kotlin.idea.presentation +import com.intellij.ide.IconProvider import com.intellij.navigation.ColoredItemPresentation import com.intellij.navigation.ItemPresentation import com.intellij.navigation.ItemPresentationProvider import com.intellij.openapi.editor.colors.CodeInsightColors import com.intellij.openapi.editor.colors.TextAttributesKey +import com.intellij.openapi.extensions.ExtensionPointName import com.intellij.openapi.util.Iconable import org.jetbrains.kotlin.idea.KotlinBundle -import org.jetbrains.kotlin.idea.KotlinIconProvider +import org.jetbrains.kotlin.idea.KotlinIconProviderBase import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType +import javax.swing.Icon open class KotlinDefaultNamedDeclarationPresentation(private val declaration: KtNamedDeclaration) : ColoredItemPresentation { @@ -65,8 +68,10 @@ open class KotlinDefaultNamedDeclarationPresentation(private val declaration: Kt return KotlinBundle.message("presentation.text.object.in.container", containerFqName) } - override fun getIcon(unused: Boolean) = - KotlinIconProvider.INSTANCE.getIcon(declaration, Iconable.ICON_FLAG_VISIBILITY or Iconable.ICON_FLAG_READ_STATUS) + override fun getIcon(unused: Boolean): Icon? { + val instance = IconProvider.EXTENSION_POINT_NAME.findFirstSafe { it is KotlinIconProviderBase } + return instance?.getIcon(declaration, Iconable.ICON_FLAG_VISIBILITY or Iconable.ICON_FLAG_READ_STATUS) + } } class KtDefaultDeclarationPresenter : ItemPresentationProvider { diff --git a/idea/src/org/jetbrains/kotlin/idea/projectView/projectViewProviders.kt b/idea/src/org/jetbrains/kotlin/idea/projectView/projectViewProviders.kt index 99f3c4a895c..a0363991b55 100644 --- a/idea/src/org/jetbrains/kotlin/idea/projectView/projectViewProviders.kt +++ b/idea/src/org/jetbrains/kotlin/idea/projectView/projectViewProviders.kt @@ -16,7 +16,7 @@ import com.intellij.openapi.vfs.VirtualFile import com.intellij.psi.PsiElement import org.jetbrains.kotlin.asJava.classes.KtLightClass import org.jetbrains.kotlin.asJava.classes.KtLightClassForFacade -import org.jetbrains.kotlin.idea.KotlinIconProvider +import org.jetbrains.kotlin.idea.KotlinIconProviderBase import org.jetbrains.kotlin.psi.KtClassBody import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtDeclaration @@ -38,7 +38,7 @@ class KotlinExpandNodeProjectViewProvider : TreeStructureProvider, DumbAware { val childValue = child.value?.asKtFile() if (childValue != null) { - val mainClass = KotlinIconProvider.getSingleClass(childValue) + val mainClass = KotlinIconProviderBase.getSingleClass(childValue) if (mainClass != null) { result.add(KtClassOrObjectTreeNode(childValue.project, mainClass, settings)) } else { diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/memberInfo/KotlinMemberSelectionTable.kt b/idea/src/org/jetbrains/kotlin/idea/refactoring/memberInfo/KotlinMemberSelectionTable.kt index 0084d8f92b0..76850dacb00 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/memberInfo/KotlinMemberSelectionTable.kt +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/memberInfo/KotlinMemberSelectionTable.kt @@ -20,7 +20,7 @@ import com.intellij.icons.AllIcons import com.intellij.refactoring.classMembers.MemberInfoModel import com.intellij.refactoring.ui.AbstractMemberSelectionTable import com.intellij.ui.RowIcon -import org.jetbrains.kotlin.idea.KotlinIconProvider +import org.jetbrains.kotlin.idea.KotlinIconProviderBase import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedFunction @@ -62,7 +62,7 @@ class KotlinMemberSelectionTable( } override fun setVisibilityIcon(memberInfo: KotlinMemberInfo, icon: RowIcon) { - icon.setIcon(KotlinIconProvider.getVisibilityIcon(memberInfo.member.modifierList), 1) + icon.setIcon(KotlinIconProviderBase.getVisibilityIcon(memberInfo.member.modifierList), 1) } override fun getOverrideIcon(memberInfo: KotlinMemberInfo): Icon? { diff --git a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveMethod/MoveKotlinMethodDialog.java b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveMethod/MoveKotlinMethodDialog.java index 7d1057456f4..ce1d5cbd19b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveMethod/MoveKotlinMethodDialog.java +++ b/idea/src/org/jetbrains/kotlin/idea/refactoring/move/moveMethod/MoveKotlinMethodDialog.java @@ -22,7 +22,7 @@ import org.jetbrains.kotlin.asJava.LightClassUtilsKt; import org.jetbrains.kotlin.asJava.classes.KtLightClassForSourceDeclaration; import org.jetbrains.kotlin.idea.KotlinBundle; import org.jetbrains.kotlin.idea.KotlinFileType; -import org.jetbrains.kotlin.idea.KotlinIconProvider; +import org.jetbrains.kotlin.idea.KotlinIconProviderBase; import org.jetbrains.kotlin.idea.completion.CompletionUtilsKt; import org.jetbrains.kotlin.idea.core.KotlinNameSuggester; import org.jetbrains.kotlin.idea.core.NewDeclarationNameValidator; @@ -162,7 +162,7 @@ public class MoveKotlinMethodDialog extends RefactoringDialog { super.getListCellRendererComponent(list, value, index, isSelected, cellHasFocus); if (value instanceof KtNamedDeclaration) { KtNamedDeclaration variable = (KtNamedDeclaration) value; - setIcon(KotlinIconProvider.Companion.getBaseIcon(variable)); + setIcon(KotlinIconProviderBase.Companion.getBaseIcon(variable)); setText(variable.getName()); KotlinType type = MoveKotlinMethodProcessorKt.type(variable); if (type != null) {