[FIR IDE] Move IconProvider in fir independed module
This commit is contained in:
@@ -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()
|
||||
}
|
||||
+2
-2
@@ -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);
|
||||
}
|
||||
};
|
||||
}
|
||||
|
||||
+160
@@ -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()
|
||||
}
|
||||
}
|
||||
}
|
||||
+83
@@ -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");
|
||||
}
|
||||
}
|
||||
+5
@@ -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)
|
||||
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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"
|
||||
|
||||
@@ -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)
|
||||
}
|
||||
+2
-2
@@ -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 {
|
||||
|
||||
+2
-2
@@ -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? {
|
||||
|
||||
+2
-2
@@ -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) {
|
||||
|
||||
Reference in New Issue
Block a user