Better caching: do not recount when field true value is null
This commit is contained in:
@@ -18,41 +18,29 @@ package org.jetbrains.jet.plugin.structureView;
|
|||||||
|
|
||||||
import com.intellij.ide.structureView.StructureViewTreeElement;
|
import com.intellij.ide.structureView.StructureViewTreeElement;
|
||||||
import com.intellij.ide.util.treeView.smartTree.TreeElement;
|
import com.intellij.ide.util.treeView.smartTree.TreeElement;
|
||||||
import com.intellij.navigation.ColoredItemPresentation;
|
|
||||||
import com.intellij.navigation.ItemPresentation;
|
import com.intellij.navigation.ItemPresentation;
|
||||||
import com.intellij.navigation.LocationPresentation;
|
|
||||||
import com.intellij.openapi.editor.colors.CodeInsightColors;
|
|
||||||
import com.intellij.openapi.editor.colors.TextAttributesKey;
|
|
||||||
import com.intellij.openapi.ui.Queryable;
|
import com.intellij.openapi.ui.Queryable;
|
||||||
import com.intellij.openapi.util.Iconable;
|
|
||||||
import com.intellij.openapi.util.text.StringUtil;
|
|
||||||
import com.intellij.psi.NavigatablePsiElement;
|
import com.intellij.psi.NavigatablePsiElement;
|
||||||
import com.intellij.util.ArrayUtil;
|
import com.intellij.util.ArrayUtil;
|
||||||
import com.intellij.util.Function;
|
import com.intellij.util.Function;
|
||||||
import com.intellij.util.PsiIconUtil;
|
|
||||||
import com.intellij.util.containers.ContainerUtil;
|
import com.intellij.util.containers.ContainerUtil;
|
||||||
import com.intellij.util.ui.UIUtil;
|
|
||||||
import org.jetbrains.annotations.NotNull;
|
import org.jetbrains.annotations.NotNull;
|
||||||
import org.jetbrains.annotations.Nullable;
|
import org.jetbrains.annotations.Nullable;
|
||||||
import org.jetbrains.annotations.TestOnly;
|
import org.jetbrains.annotations.TestOnly;
|
||||||
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
|
|
||||||
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
import org.jetbrains.jet.lang.psi.*;
|
import org.jetbrains.jet.lang.psi.*;
|
||||||
import org.jetbrains.jet.lang.resolve.OverrideResolver;
|
|
||||||
import org.jetbrains.jet.plugin.JetDescriptorIconProvider;
|
|
||||||
import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage;
|
import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage;
|
||||||
import org.jetbrains.jet.renderer.DescriptorRenderer;
|
|
||||||
|
|
||||||
import javax.swing.*;
|
import java.util.ArrayList;
|
||||||
import java.util.*;
|
import java.util.Collections;
|
||||||
|
import java.util.List;
|
||||||
|
import java.util.Map;
|
||||||
|
|
||||||
public class JetStructureViewElement implements StructureViewTreeElement, ColoredItemPresentation, LocationPresentation, Queryable {
|
public class JetStructureViewElement implements StructureViewTreeElement, Queryable {
|
||||||
private final NavigatablePsiElement element;
|
private final NavigatablePsiElement element;
|
||||||
private final boolean isInherited;
|
private final boolean isInherited;
|
||||||
|
|
||||||
private String elementText;
|
private KotlinStructureElementPresentation presentation;
|
||||||
private String locationString;
|
|
||||||
private Icon icon;
|
|
||||||
|
|
||||||
public JetStructureViewElement(@NotNull NavigatablePsiElement element, @NotNull DeclarationDescriptor descriptor, boolean isInherited) {
|
public JetStructureViewElement(@NotNull NavigatablePsiElement element, @NotNull DeclarationDescriptor descriptor, boolean isInherited) {
|
||||||
this.element = element;
|
this.element = element;
|
||||||
@@ -60,9 +48,7 @@ public class JetStructureViewElement implements StructureViewTreeElement, Colore
|
|||||||
|
|
||||||
if (!(element instanceof JetElement)) {
|
if (!(element instanceof JetElement)) {
|
||||||
// Avoid storing descriptor in fields
|
// Avoid storing descriptor in fields
|
||||||
elementText = getElementText(element, descriptor);
|
presentation = new KotlinStructureElementPresentation(isInherited(), element, descriptor);
|
||||||
locationString = isInherited ? getElementLocationString(descriptor) : null;
|
|
||||||
icon = getElementIcon(element, descriptor);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -104,7 +90,11 @@ public class JetStructureViewElement implements StructureViewTreeElement, Colore
|
|||||||
@NotNull
|
@NotNull
|
||||||
@Override
|
@Override
|
||||||
public ItemPresentation getPresentation() {
|
public ItemPresentation getPresentation() {
|
||||||
return this;
|
if (presentation == null) {
|
||||||
|
presentation = new KotlinStructureElementPresentation(isInherited(), element, getDescriptor());
|
||||||
|
}
|
||||||
|
|
||||||
|
return presentation;
|
||||||
}
|
}
|
||||||
|
|
||||||
@NotNull
|
@NotNull
|
||||||
@@ -119,66 +109,11 @@ public class JetStructureViewElement implements StructureViewTreeElement, Colore
|
|||||||
}), TreeElement.class);
|
}), TreeElement.class);
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public TextAttributesKey getTextAttributesKey() {
|
|
||||||
if (isInherited()) {
|
|
||||||
return CodeInsightColors.NOT_USED_ELEMENT_ATTRIBUTES;
|
|
||||||
}
|
|
||||||
|
|
||||||
|
|
||||||
if (element instanceof JetModifierListOwner && JetPsiUtil.isDeprecated((JetModifierListOwner) element)) {
|
|
||||||
return CodeInsightColors.DEPRECATED_ATTRIBUTES;
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public String getPresentableText() {
|
|
||||||
if (elementText == null) {
|
|
||||||
elementText = getElementText(element, getDescriptor());
|
|
||||||
}
|
|
||||||
|
|
||||||
return elementText;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public String getLocationString() {
|
|
||||||
if (locationString == null) {
|
|
||||||
locationString = isInherited() ? getElementLocationString(getDescriptor()) : null;
|
|
||||||
}
|
|
||||||
|
|
||||||
return locationString;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
@Override
|
|
||||||
public Icon getIcon(boolean unused) {
|
|
||||||
if (icon == null) {
|
|
||||||
icon = getElementIcon(element, getDescriptor());
|
|
||||||
}
|
|
||||||
|
|
||||||
return icon;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getLocationPrefix() {
|
|
||||||
return isInherited() ? " " : LocationPresentation.DEFAULT_LOCATION_PREFIX;
|
|
||||||
}
|
|
||||||
|
|
||||||
@Override
|
|
||||||
public String getLocationSuffix() {
|
|
||||||
return isInherited() ? "" : LocationPresentation.DEFAULT_LOCATION_SUFFIX;
|
|
||||||
}
|
|
||||||
|
|
||||||
@TestOnly
|
@TestOnly
|
||||||
@Override
|
@Override
|
||||||
public void putInfo(@NotNull Map<String, String> info) {
|
public void putInfo(@NotNull Map<String, String> info) {
|
||||||
info.put("text", getPresentableText());
|
info.put("text", getPresentation().getPresentableText());
|
||||||
info.put("location", getLocationString());
|
info.put("location", getPresentation().getLocationString());
|
||||||
}
|
}
|
||||||
|
|
||||||
public boolean isInherited() {
|
public boolean isInherited() {
|
||||||
@@ -199,6 +134,7 @@ public class JetStructureViewElement implements StructureViewTreeElement, Colore
|
|||||||
return ResolvePackage.getLazyResolveSession(declaration).resolveToDescriptor(declaration);
|
return ResolvePackage.getLazyResolveSession(declaration).resolveToDescriptor(declaration);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@NotNull
|
||||||
private List<JetDeclaration> getChildrenDeclarations() {
|
private List<JetDeclaration> getChildrenDeclarations() {
|
||||||
if (element instanceof JetFile) {
|
if (element instanceof JetFile) {
|
||||||
JetFile jetFile = (JetFile) element;
|
JetFile jetFile = (JetFile) element;
|
||||||
@@ -225,51 +161,4 @@ public class JetStructureViewElement implements StructureViewTreeElement, Colore
|
|||||||
|
|
||||||
return Collections.emptyList();
|
return Collections.emptyList();
|
||||||
}
|
}
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private static Icon getElementIcon(@NotNull NavigatablePsiElement navigatablePsiElement, @Nullable DeclarationDescriptor descriptor) {
|
|
||||||
if (descriptor != null) {
|
|
||||||
return JetDescriptorIconProvider.getIcon(descriptor, navigatablePsiElement, Iconable.ICON_FLAG_VISIBILITY);
|
|
||||||
}
|
|
||||||
|
|
||||||
return PsiIconUtil.getProvidersIcon(navigatablePsiElement, Iconable.ICON_FLAG_VISIBILITY);
|
|
||||||
}
|
|
||||||
|
|
||||||
@Nullable
|
|
||||||
private static String getElementText(@NotNull NavigatablePsiElement navigatablePsiElement, @Nullable DeclarationDescriptor descriptor) {
|
|
||||||
if (descriptor != null) {
|
|
||||||
return DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES.render(descriptor);
|
|
||||||
}
|
|
||||||
|
|
||||||
String text = navigatablePsiElement.getName();
|
|
||||||
if (!StringUtil.isEmpty(text)) {
|
|
||||||
return text;
|
|
||||||
}
|
|
||||||
|
|
||||||
if (navigatablePsiElement instanceof JetClassInitializer) {
|
|
||||||
return "<class initializer>";
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String getElementLocationString(@Nullable DeclarationDescriptor descriptor) {
|
|
||||||
if (descriptor instanceof CallableMemberDescriptor) {
|
|
||||||
Set<CallableMemberDescriptor> baseCallableDescriptors = OverrideResolver.getDeepestSuperDeclarations((CallableMemberDescriptor) descriptor);
|
|
||||||
CallableMemberDescriptor first = ContainerUtil.getFirstItem(baseCallableDescriptors);
|
|
||||||
if (first != null) {
|
|
||||||
DeclarationDescriptor typeDescriptor = first.getContainingDeclaration();
|
|
||||||
|
|
||||||
String typeName = DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES.render(typeDescriptor);
|
|
||||||
return withRightArrow(typeName);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return null;
|
|
||||||
}
|
|
||||||
|
|
||||||
private static String withRightArrow(String str) {
|
|
||||||
char rightArrow = '\u2192';
|
|
||||||
return UIUtil.getLabelFont().canDisplay(rightArrow) ? rightArrow + str : "->" + str;
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|||||||
+157
@@ -0,0 +1,157 @@
|
|||||||
|
/*
|
||||||
|
* Copyright 2010-2014 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.jet.plugin.structureView;
|
||||||
|
|
||||||
|
import com.intellij.navigation.ColoredItemPresentation;
|
||||||
|
import com.intellij.navigation.LocationPresentation;
|
||||||
|
import com.intellij.openapi.editor.colors.CodeInsightColors;
|
||||||
|
import com.intellij.openapi.editor.colors.TextAttributesKey;
|
||||||
|
import com.intellij.openapi.util.Iconable;
|
||||||
|
import com.intellij.openapi.util.text.StringUtil;
|
||||||
|
import com.intellij.psi.NavigatablePsiElement;
|
||||||
|
import com.intellij.util.PsiIconUtil;
|
||||||
|
import com.intellij.util.containers.ContainerUtil;
|
||||||
|
import com.intellij.util.ui.UIUtil;
|
||||||
|
import org.jetbrains.annotations.NotNull;
|
||||||
|
import org.jetbrains.annotations.Nullable;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.CallableMemberDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
|
||||||
|
import org.jetbrains.jet.lang.psi.JetClassInitializer;
|
||||||
|
import org.jetbrains.jet.lang.psi.JetModifierListOwner;
|
||||||
|
import org.jetbrains.jet.lang.psi.JetPsiUtil;
|
||||||
|
import org.jetbrains.jet.lang.resolve.OverrideResolver;
|
||||||
|
import org.jetbrains.jet.plugin.JetDescriptorIconProvider;
|
||||||
|
import org.jetbrains.jet.renderer.DescriptorRenderer;
|
||||||
|
|
||||||
|
import javax.swing.*;
|
||||||
|
import java.util.Set;
|
||||||
|
|
||||||
|
class KotlinStructureElementPresentation implements ColoredItemPresentation, LocationPresentation {
|
||||||
|
private final TextAttributesKey attributesKey;
|
||||||
|
private final String elementText;
|
||||||
|
private final String locationString;
|
||||||
|
private final Icon icon;
|
||||||
|
private final boolean isInherited;
|
||||||
|
|
||||||
|
public KotlinStructureElementPresentation(
|
||||||
|
boolean isInherited,
|
||||||
|
@NotNull NavigatablePsiElement navigatablePsiElement,
|
||||||
|
@Nullable DeclarationDescriptor descriptor
|
||||||
|
) {
|
||||||
|
this.isInherited = isInherited;
|
||||||
|
attributesKey = getElementAttributesKey(isInherited, navigatablePsiElement);
|
||||||
|
elementText = getElementText(navigatablePsiElement, descriptor);
|
||||||
|
locationString = isInherited ? getElementLocationString(descriptor) : null;
|
||||||
|
icon = getElementIcon(navigatablePsiElement, descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public TextAttributesKey getTextAttributesKey() {
|
||||||
|
return attributesKey;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public String getPresentableText() {
|
||||||
|
return elementText;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public String getLocationString() {
|
||||||
|
return locationString;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
@Override
|
||||||
|
public Icon getIcon(boolean unused) {
|
||||||
|
return icon;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLocationPrefix() {
|
||||||
|
return isInherited ? " " : LocationPresentation.DEFAULT_LOCATION_PREFIX;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String getLocationSuffix() {
|
||||||
|
return isInherited ? "" : LocationPresentation.DEFAULT_LOCATION_SUFFIX;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static TextAttributesKey getElementAttributesKey(boolean isInherited, @NotNull NavigatablePsiElement navigatablePsiElement) {
|
||||||
|
if (isInherited) {
|
||||||
|
return CodeInsightColors.NOT_USED_ELEMENT_ATTRIBUTES;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (navigatablePsiElement instanceof JetModifierListOwner && JetPsiUtil.isDeprecated((JetModifierListOwner) navigatablePsiElement)) {
|
||||||
|
return CodeInsightColors.DEPRECATED_ATTRIBUTES;
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static Icon getElementIcon(@NotNull NavigatablePsiElement navigatablePsiElement, @Nullable DeclarationDescriptor descriptor) {
|
||||||
|
if (descriptor != null) {
|
||||||
|
return JetDescriptorIconProvider.getIcon(descriptor, navigatablePsiElement, Iconable.ICON_FLAG_VISIBILITY);
|
||||||
|
}
|
||||||
|
|
||||||
|
return PsiIconUtil.getProvidersIcon(navigatablePsiElement, Iconable.ICON_FLAG_VISIBILITY);
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static String getElementText(@NotNull NavigatablePsiElement navigatablePsiElement, @Nullable DeclarationDescriptor descriptor) {
|
||||||
|
if (descriptor != null) {
|
||||||
|
return DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES.render(descriptor);
|
||||||
|
}
|
||||||
|
|
||||||
|
String text = navigatablePsiElement.getName();
|
||||||
|
if (!StringUtil.isEmpty(text)) {
|
||||||
|
return text;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (navigatablePsiElement instanceof JetClassInitializer) {
|
||||||
|
return "<class initializer>";
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
@Nullable
|
||||||
|
private static String getElementLocationString(@Nullable DeclarationDescriptor descriptor) {
|
||||||
|
if (descriptor instanceof CallableMemberDescriptor) {
|
||||||
|
Set<CallableMemberDescriptor>
|
||||||
|
baseCallableDescriptors = OverrideResolver.getDeepestSuperDeclarations((CallableMemberDescriptor) descriptor);
|
||||||
|
CallableMemberDescriptor first = ContainerUtil.getFirstItem(baseCallableDescriptors);
|
||||||
|
if (first != null) {
|
||||||
|
DeclarationDescriptor typeDescriptor = first.getContainingDeclaration();
|
||||||
|
|
||||||
|
String typeName = DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES.render(typeDescriptor);
|
||||||
|
return withRightArrow(typeName);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return null;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static String withRightArrow(String str) {
|
||||||
|
char rightArrow = '\u2192';
|
||||||
|
return UIUtil.getLabelFont().canDisplay(rightArrow) ? rightArrow + str : "->" + str;
|
||||||
|
}
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user