[FIR IDE] Move IconProvider in fir independed module

This commit is contained in:
Igor Yakovlev
2020-08-28 18:03:11 +03:00
parent e30f09d513
commit 75347d06b9
15 changed files with 283 additions and 161 deletions
@@ -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<KtClassOrObject>()
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<KtNamedDeclaration>() 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()
}
@@ -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);
}
};
}
@@ -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<KtClassOrObject>()
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<KtNamedDeclaration>() 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()
}
}
}
@@ -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");
}
}
@@ -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)
+6
View File
@@ -174,6 +174,8 @@ The Kotlin FIR plugin provides language support in IntelliJ IDEA and Android Stu
<extensions defaultExtensionNs="com.intellij">
<iconProvider implementation="org.jetbrains.kotlin.idea.KotlinIconProviderBase"/>
<projectService serviceImplementation="org.jetbrains.kotlin.idea.caches.resolve.IdePackageOracleFactory"/>
<projectService serviceImplementation="org.jetbrains.kotlin.idea.caches.trackers.KotlinCodeBlockModificationListener"/>
@@ -190,12 +192,16 @@ The Kotlin FIR plugin provides language support in IntelliJ IDEA and Android Stu
<projectService serviceImplementation="org.jetbrains.kotlin.idea.completion.LookupCancelService"/>
<projectService serviceImplementation="org.jetbrains.kotlin.idea.configuration.KotlinMigrationProjectService"/>
<projectService serviceImplementation="org.jetbrains.kotlin.idea.project.KotlinLibraryToSourceAnalysisStateComponent"/>
<highlightingPassFactory implementation="org.jetbrains.kotlin.idea.highlighter.KotlinBeforeResolveHighlightingPass$Registrar"/>
<elementDescriptionProvider
implementation="org.jetbrains.kotlin.idea.findUsages.KotlinElementDescriptionProviderBase"
order="first"/>
<findUsagesHandlerFactory implementation="org.jetbrains.kotlin.idea.findUsages.KotlinFindUsagesHandlerFactory"/>
<lang.findUsagesProvider language="kotlin" implementationClass="org.jetbrains.kotlin.idea.findUsages.KotlinFindUsagesProviderBase"/>
<fileType name="Kotlin"
-2
View File
@@ -62,8 +62,6 @@
<declarationRangeHandler key="org.jetbrains.kotlin.psi.KtDeclarationWithBody"
implementationClass="org.jetbrains.kotlin.idea.codeInsight.KotlinFunDeclarationRangeHandler"/>
<iconProvider implementation="org.jetbrains.kotlin.idea.KotlinIconProvider"/>
<itemPresentationProvider implementationClass="org.jetbrains.kotlin.idea.presentation.KtFunctionPresenter"
forClass="org.jetbrains.kotlin.psi.KtFunction"/>
<itemPresentationProvider implementationClass="org.jetbrains.kotlin.idea.presentation.KtDefaultDeclarationPresenter"
+1 -1
View File
@@ -298,7 +298,7 @@
defaultValue="false"
restartRequired="false"/>
<iconProvider implementation="org.jetbrains.kotlin.idea.KotlinIconProvider"/>
<gotoSymbolContributor implementation="org.jetbrains.kotlin.idea.goto.KotlinGotoSymbolContributor"/>
<gotoClassContributor implementation="org.jetbrains.kotlin.idea.goto.KotlinGotoClassContributor"/>
<searchEverywhereClassifier implementation="org.jetbrains.kotlin.idea.goto.KotlinSearchEverywhereClassifier"/>
@@ -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)
}
@@ -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
}
@@ -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
}
}
@@ -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<KtNamedDeclaration> {
@@ -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 {
@@ -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? {
@@ -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) {