KotlinIconProvider: J2K and cleanup

This commit is contained in:
Dmitry Jemerov
2016-02-20 14:00:34 +01:00
parent 26ebc075f4
commit bfbd76cc14
2 changed files with 82 additions and 139 deletions
@@ -14,163 +14,106 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.kotlin.idea; package org.jetbrains.kotlin.idea
import com.intellij.ide.IconProvider; import com.intellij.ide.IconProvider
import com.intellij.openapi.project.DumbAware; import com.intellij.openapi.project.DumbAware
import com.intellij.openapi.util.Condition; import com.intellij.openapi.util.Iconable
import com.intellij.openapi.util.Iconable; import com.intellij.openapi.util.text.StringUtil
import com.intellij.openapi.util.text.StringUtil; import com.intellij.psi.PsiElement
import com.intellij.psi.PsiElement; import com.intellij.ui.RowIcon
import com.intellij.psi.util.PsiTreeUtil; import com.intellij.util.PlatformIcons
import com.intellij.ui.RowIcon; import org.jetbrains.kotlin.asJava.KtLightClassForExplicitDeclaration
import com.intellij.util.PlatformIcons; import org.jetbrains.kotlin.asJava.KtLightClassForFacade
import com.intellij.util.containers.ContainerUtil; import org.jetbrains.kotlin.idea.caches.resolve.KtLightClassForDecompiledDeclaration
import org.jetbrains.annotations.NotNull; import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.annotations.Nullable; import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.asJava.KtLightClassForExplicitDeclaration; import org.jetbrains.kotlin.psi.psiUtil.getStrictParentOfType
import org.jetbrains.kotlin.asJava.KtLightClassForFacade; import javax.swing.Icon
import org.jetbrains.kotlin.idea.caches.resolve.KtLightClassForDecompiledDeclaration;
import org.jetbrains.kotlin.lexer.KtTokens;
import org.jetbrains.kotlin.psi.*;
import javax.swing.*; class KotlinIconProvider : IconProvider(), DumbAware {
import java.util.List;
public class KotlinIconProvider extends IconProvider implements DumbAware { override fun getIcon(psiElement: PsiElement, flags: Int): Icon? {
if (psiElement is KtFile) {
public static KotlinIconProvider INSTANCE = new KotlinIconProvider(); val mainClass = getMainClass(psiElement)
return if (mainClass != null && psiElement.declarations.size == 1) getIcon(mainClass, flags) else KotlinIcons.FILE
@Nullable
public static KtClassOrObject getMainClass(@NotNull KtFile file) {
List<KtDeclaration> classes = ContainerUtil.filter(file.getDeclarations(), new Condition<KtDeclaration>() {
@Override
public boolean value(KtDeclaration jetDeclaration) {
return jetDeclaration instanceof KtClassOrObject;
}
});
if (classes.size() == 1) {
if (StringUtil.getPackageName(file.getName()).equals(classes.get(0).getName())) {
return (KtClassOrObject) classes.get(0);
}
}
return null;
} }
@Override val result = psiElement.getBaseIcon()
public Icon getIcon(@NotNull PsiElement psiElement, int flags) { if (flags and Iconable.ICON_FLAG_VISIBILITY > 0 && result != null && psiElement is KtModifierListOwner) {
if (psiElement instanceof KtFile) { val list = psiElement.modifierList
KtFile file = (KtFile) psiElement; return createRowIcon(result, getVisibilityIcon(list))
KtClassOrObject mainClass = getMainClass(file); }
return mainClass != null && file.getDeclarations().size() == 1 ? getIcon(mainClass, flags) : KotlinIcons.FILE; return result
} }
Icon result = getBaseIcon(psiElement); companion object {
if ((flags & Iconable.ICON_FLAG_VISIBILITY) > 0 && psiElement instanceof KtModifierListOwner) {
KtModifierList list = ((KtModifierListOwner) psiElement).getModifierList(); var INSTANCE = KotlinIconProvider()
result = createRowIcon(result, getVisibilityIcon(list));
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 result; return null
} }
private static RowIcon createRowIcon(Icon baseIcon, Icon visibilityIcon) { private fun createRowIcon(baseIcon: Icon, visibilityIcon: Icon): RowIcon {
RowIcon rowIcon = new RowIcon(2); val rowIcon = RowIcon(2)
rowIcon.setIcon(baseIcon, 0); rowIcon.setIcon(baseIcon, 0)
rowIcon.setIcon(visibilityIcon, 1); rowIcon.setIcon(visibilityIcon, 1)
return rowIcon; return rowIcon
} }
public static Icon getVisibilityIcon(@Nullable KtModifierList list) { fun getVisibilityIcon(list: KtModifierList?): Icon {
if (list != null) { if (list != null) {
if (list.hasModifier(KtTokens.PRIVATE_KEYWORD)) { if (list.hasModifier(KtTokens.PRIVATE_KEYWORD)) {
return PlatformIcons.PRIVATE_ICON; return PlatformIcons.PRIVATE_ICON
} }
if (list.hasModifier(KtTokens.PROTECTED_KEYWORD)) { if (list.hasModifier(KtTokens.PROTECTED_KEYWORD)) {
return PlatformIcons.PROTECTED_ICON; return PlatformIcons.PROTECTED_ICON
} }
if (list.hasModifier(KtTokens.INTERNAL_KEYWORD)) { if (list.hasModifier(KtTokens.INTERNAL_KEYWORD)) {
return PlatformIcons.PACKAGE_LOCAL_ICON; return PlatformIcons.PACKAGE_LOCAL_ICON
} }
} }
return PlatformIcons.PUBLIC_ICON; return PlatformIcons.PUBLIC_ICON
} }
public static Icon getBaseIcon(PsiElement psiElement) { fun PsiElement.getBaseIcon(): Icon? = when(this) {
if (psiElement instanceof KtPackageDirective) { is KtPackageDirective -> PlatformIcons.PACKAGE_ICON
return PlatformIcons.PACKAGE_ICON; is KtLightClassForFacade -> KotlinIcons.FILE
} is KtLightClassForDecompiledDeclaration -> {
val origin = getOrigin()
if (psiElement instanceof KtLightClassForFacade) {
return KotlinIcons.FILE;
}
if (psiElement instanceof KtLightClassForDecompiledDeclaration) {
KtClassOrObject origin = ((KtLightClassForDecompiledDeclaration) psiElement).getOrigin();
if (origin != null) {
psiElement = origin;
}
else {
//TODO (light classes for decompiled files): correct presentation //TODO (light classes for decompiled files): correct presentation
return KotlinIcons.CLASS; if (origin != null) origin.getBaseIcon() else KotlinIcons.CLASS
}
is KtLightClassForExplicitDeclaration -> navigationElement.getBaseIcon()
is KtNamedFunction -> when {
receiverTypeReference != null -> KotlinIcons.EXTENSION_FUNCTION
getStrictParentOfType<KtNamedDeclaration>() is KtClass ->
if (KtPsiUtil.isAbstract(this)) PlatformIcons.ABSTRACT_METHOD_ICON else PlatformIcons.METHOD_ICON
else -> KotlinIcons.FUNCTION
}
is KtFunctionLiteral -> KotlinIcons.LAMBDA
is KtClass -> when {
isInterface() -> KotlinIcons.TRAIT
isEnum() -> KotlinIcons.ENUM
this is KtEnumEntry && getPrimaryConstructorParameterList() == null -> KotlinIcons.ENUM
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
else -> null
} }
} }
if (psiElement instanceof KtLightClassForExplicitDeclaration) {
psiElement = psiElement.getNavigationElement();
}
if (psiElement instanceof KtNamedFunction) {
if (((KtFunction) psiElement).getReceiverTypeReference() != null) {
return KotlinIcons.EXTENSION_FUNCTION;
}
if (PsiTreeUtil.getParentOfType(psiElement, KtNamedDeclaration.class) instanceof KtClass) {
if (KtPsiUtil.isAbstract((KtFunction) psiElement)) {
return PlatformIcons.ABSTRACT_METHOD_ICON;
}
else {
return PlatformIcons.METHOD_ICON;
}
}
else {
return KotlinIcons.FUNCTION;
}
}
if (psiElement instanceof KtFunctionLiteral) return KotlinIcons.LAMBDA;
if (psiElement instanceof KtClass) {
KtClass ktClass = (KtClass) psiElement;
if (ktClass.isInterface()) {
return KotlinIcons.TRAIT;
}
Icon icon = ktClass.isEnum() ? KotlinIcons.ENUM : KotlinIcons.CLASS;
if (ktClass instanceof KtEnumEntry) {
KtEnumEntry enumEntry = (KtEnumEntry) ktClass;
if (enumEntry.getPrimaryConstructorParameterList() == null) {
icon = KotlinIcons.ENUM;
}
}
return icon;
}
if (psiElement instanceof KtObjectDeclaration) {
return KotlinIcons.OBJECT;
}
if (psiElement instanceof KtParameter) {
KtParameter parameter = (KtParameter) psiElement;
if (KtPsiUtil.getClassIfParameterIsProperty(parameter) != null) {
return parameter.isMutable() ? KotlinIcons.FIELD_VAR : KotlinIcons.FIELD_VAL;
}
return KotlinIcons.PARAMETER;
}
if (psiElement instanceof KtProperty) {
KtProperty property = (KtProperty) psiElement;
return property.isVar() ? KotlinIcons.FIELD_VAR : KotlinIcons.FIELD_VAL;
}
return null;
}
} }
@@ -61,7 +61,7 @@ public class KtClassOrObjectTreeNode extends AbstractPsiBasedNode<KtClassOrObjec
data.setPresentableText(classOrObject.getName()); data.setPresentableText(classOrObject.getName());
AbstractTreeNode parent = getParent(); AbstractTreeNode parent = getParent();
if (KotlinIconProvider.getMainClass(classOrObject.getContainingKtFile()) != null) { if (KotlinIconProvider.Companion.getMainClass(classOrObject.getContainingKtFile()) != null) {
if (parent instanceof KtFileTreeNode) { if (parent instanceof KtFileTreeNode) {
update(parent.getParent()); update(parent.getParent());
} }