From cc896ed433082e252b940facb8c9300bfcb4dd0f Mon Sep 17 00:00:00 2001 From: Andrey Breslav Date: Fri, 6 May 2011 20:17:51 +0400 Subject: [PATCH] Text displayed in hovers is a little nicer now --- .../annotations/JetLineMarkerProvider.java | 3 +- .../lang/resolve/MutableClassDescriptor.java | 6 + .../jetbrains/jet/resolve/DescriptorUtil.java | 261 +++++++++--------- 3 files changed, 142 insertions(+), 128 deletions(-) diff --git a/idea/src/org/jetbrains/jet/lang/annotations/JetLineMarkerProvider.java b/idea/src/org/jetbrains/jet/lang/annotations/JetLineMarkerProvider.java index c7d17d9feea..53d0aca7aaf 100644 --- a/idea/src/org/jetbrains/jet/lang/annotations/JetLineMarkerProvider.java +++ b/idea/src/org/jetbrains/jet/lang/annotations/JetLineMarkerProvider.java @@ -22,6 +22,7 @@ import org.jetbrains.jet.lang.psi.JetFunction; import org.jetbrains.jet.lang.resolve.AnalyzingUtils; import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.types.FunctionDescriptor; +import org.jetbrains.jet.resolve.DescriptorUtil; import javax.swing.*; import java.awt.event.MouseEvent; @@ -81,7 +82,7 @@ public class JetLineMarkerProvider implements LineMarkerProvider { public String getElementText(PsiElement element) { if (element instanceof JetFunction) { JetFunction function = (JetFunction) element; - return bindingContext.getFunctionDescriptor(function).toString(); + return DescriptorUtil.renderPresentableText(bindingContext.getFunctionDescriptor(function)); } return super.getElementText(element); } diff --git a/idea/src/org/jetbrains/jet/lang/resolve/MutableClassDescriptor.java b/idea/src/org/jetbrains/jet/lang/resolve/MutableClassDescriptor.java index 64085b07d36..c6cddf28323 100644 --- a/idea/src/org/jetbrains/jet/lang/resolve/MutableClassDescriptor.java +++ b/idea/src/org/jetbrains/jet/lang/resolve/MutableClassDescriptor.java @@ -4,6 +4,7 @@ import com.google.common.collect.Sets; import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.Nullable; import org.jetbrains.jet.lang.types.*; +import org.jetbrains.jet.resolve.DescriptorUtil; import java.util.List; import java.util.Map; @@ -160,4 +161,9 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme public boolean hasConstructors() { return !constructors.isEmpty(); } + + @Override + public String toString() { + return DescriptorUtil.renderPresentableText(this) + "[" + getClass().getCanonicalName() + "@" + System.identityHashCode(this) + "]"; + } } diff --git a/idea/src/org/jetbrains/jet/resolve/DescriptorUtil.java b/idea/src/org/jetbrains/jet/resolve/DescriptorUtil.java index b757ec93fcc..c76f9ad19f9 100644 --- a/idea/src/org/jetbrains/jet/resolve/DescriptorUtil.java +++ b/idea/src/org/jetbrains/jet/resolve/DescriptorUtil.java @@ -10,140 +10,22 @@ import java.util.List; * @author abreslav */ public class DescriptorUtil { - private DescriptorUtil() {} + + private static final DeclarationDescriptorVisitor rootVisitor = new RenderDeclarationDescriptorVisitor(); + private static final DeclarationDescriptorVisitor subVisitor = new RenderDeclarationDescriptorVisitor() { + @Override + protected void renderName(DeclarationDescriptor descriptor, StringBuilder stringBuilder) { + stringBuilder.append(descriptor.getName()); + } + }; public static String renderPresentableText(DeclarationDescriptor declarationDescriptor) { if (declarationDescriptor == null) return ""; StringBuilder stringBuilder = new StringBuilder(); - declarationDescriptor.accept( - new DeclarationDescriptorVisitor() { - @Override - public Void visitValueParameterDescriptor(ValueParameterDescriptor descriptor, StringBuilder builder) { - builder.append("value-parameter "); - return super.visitValueParameterDescriptor(descriptor, builder); - } - - @Override - public Void visitVariableDescriptor(VariableDescriptor descriptor, StringBuilder builder) { - JetType outType = descriptor.getOutType(); - JetType inType = descriptor.getInType(); - String typeString = ""; - if (inType != null && outType != null) { - builder.append("var "); - if (inType.equals(outType)) { - typeString = outType.toString(); - } - else { - typeString = ""; - } - } - else if (outType != null) { - builder.append("val "); - typeString = outType.toString(); - } - else if (inType != null) { - builder.append(" "); - typeString = inType.toString(); - } - builder.append(renderName(descriptor)).append(" : ").append(typeString); - return super.visitVariableDescriptor(descriptor, builder); - } - - @Override - public Void visitFunctionDescriptor(FunctionDescriptor descriptor, StringBuilder builder) { - builder.append("fun ").append(renderName(descriptor)); - List typeParameters = descriptor.getTypeParameters(); - renderTypeParameters(typeParameters, builder); - builder.append("("); - for (Iterator iterator = descriptor.getUnsubstitutedValueParameters().iterator(); iterator.hasNext(); ) { - ValueParameterDescriptor parameterDescriptor = iterator.next(); - visitVariableDescriptor(parameterDescriptor, builder); - if (iterator.hasNext()) { - builder.append(", "); - } - } - builder.append(") : ").append(descriptor.getUnsubstitutedReturnType()); - return super.visitFunctionDescriptor(descriptor, builder); - } - - private void renderTypeParameters(List typeParameters, StringBuilder builder) { - if (!typeParameters.isEmpty()) { - builder.append("<"); - for (Iterator iterator = typeParameters.iterator(); iterator.hasNext(); ) { - TypeParameterDescriptor typeParameterDescriptor = iterator.next(); - renderTypeParameter(typeParameterDescriptor, builder); - if (iterator.hasNext()) { - builder.append(", "); - } - } - builder.append(">"); - } - } - - @Override - public Void visitTypeParameterDescriptor(TypeParameterDescriptor descriptor, StringBuilder builder) { - builder.append("<"); - renderTypeParameter(descriptor, builder); - builder.append(">"); - return super.visitTypeParameterDescriptor(descriptor, builder); - } - - @Override - public Void visitNamespaceDescriptor(NamespaceDescriptor namespaceDescriptor, StringBuilder builder) { - builder.append("namespace ").append(renderName(namespaceDescriptor)); - return super.visitNamespaceDescriptor(namespaceDescriptor, builder); - } - - @Override - public Void visitClassDescriptor(ClassDescriptor descriptor, StringBuilder builder) { - builder.append("class ").append(renderName(descriptor)); - renderTypeParameters(descriptor.getTypeConstructor().getParameters(), builder); - Collection supertypes = descriptor.getTypeConstructor().getSupertypes(); - if (!supertypes.isEmpty()) { - builder.append(" : "); - for (Iterator iterator = supertypes.iterator(); iterator.hasNext(); ) { - JetType supertype = iterator.next(); - builder.append(supertype); - if (iterator.hasNext()) { - builder.append(", "); - } - } - } - return super.visitClassDescriptor(descriptor, builder); - } - }, - stringBuilder); + declarationDescriptor.accept(rootVisitor, stringBuilder); return stringBuilder.toString(); } - private static StringBuilder renderName(DeclarationDescriptor descriptor) { - StringBuilder stringBuilder = new StringBuilder(); - renderName(descriptor, stringBuilder); - return stringBuilder; - } - - private static void renderName(DeclarationDescriptor descriptor, StringBuilder stringBuilder) { - DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); - if (containingDeclaration != null) { - renderName(containingDeclaration, stringBuilder); - stringBuilder.append("::"); - } - stringBuilder.append(descriptor.getName()); - } - - private static void renderTypeParameter(TypeParameterDescriptor descriptor, StringBuilder builder) { - builder.append(renderName(descriptor)); - if (!descriptor.getUpperBounds().isEmpty()) { - JetType bound = descriptor.getUpperBounds().iterator().next(); - if (bound != JetStandardClasses.getAnyType()) { - builder.append(" : ").append(bound); - if (descriptor.getUpperBounds().size() > 1) { - builder.append(" (...)"); - } - } - } - } - public static String getFQName(DeclarationDescriptor descriptor) { DeclarationDescriptor container = descriptor.getContainingDeclaration(); if (container != null && !(container instanceof ModuleDescriptor)) { @@ -153,4 +35,129 @@ public class DescriptorUtil { return descriptor.getName(); } + + private DescriptorUtil() {} + + private static class RenderDeclarationDescriptorVisitor extends DeclarationDescriptorVisitor { + @Override + public Void visitValueParameterDescriptor(ValueParameterDescriptor descriptor, StringBuilder builder) { + builder.append("value-parameter "); + return super.visitValueParameterDescriptor(descriptor, builder); + } + + @Override + public Void visitVariableDescriptor(VariableDescriptor descriptor, StringBuilder builder) { + JetType outType = descriptor.getOutType(); + JetType inType = descriptor.getInType(); + String typeString = ""; + if (inType != null && outType != null) { + builder.append("var "); + if (inType.equals(outType)) { + typeString = outType.toString(); + } + else { + typeString = ""; + } + } + else if (outType != null) { + builder.append("val "); + typeString = outType.toString(); + } + else if (inType != null) { + builder.append(" "); + typeString = inType.toString(); + } + renderName(descriptor, builder); + builder.append(" : ").append(typeString); + return super.visitVariableDescriptor(descriptor, builder); + } + + @Override + public Void visitFunctionDescriptor(FunctionDescriptor descriptor, StringBuilder builder) { + builder.append("fun "); + renderName(descriptor, builder); + List typeParameters = descriptor.getTypeParameters(); + renderTypeParameters(typeParameters, builder); + builder.append("("); + for (Iterator iterator = descriptor.getUnsubstitutedValueParameters().iterator(); iterator.hasNext(); ) { + ValueParameterDescriptor parameterDescriptor = iterator.next(); + parameterDescriptor.accept(subVisitor, builder); + if (iterator.hasNext()) { + builder.append(", "); + } + } + builder.append(") : ").append(descriptor.getUnsubstitutedReturnType()); + return super.visitFunctionDescriptor(descriptor, builder); + } + + private void renderTypeParameters(List typeParameters, StringBuilder builder) { + if (!typeParameters.isEmpty()) { + builder.append("<"); + for (Iterator iterator = typeParameters.iterator(); iterator.hasNext(); ) { + TypeParameterDescriptor typeParameterDescriptor = iterator.next(); + typeParameterDescriptor.accept(subVisitor, builder); + if (iterator.hasNext()) { + builder.append(", "); + } + } + builder.append(">"); + } + } + + @Override + public Void visitTypeParameterDescriptor(TypeParameterDescriptor descriptor, StringBuilder builder) { + builder.append("<"); + renderTypeParameter(descriptor, builder); + builder.append(">"); + return super.visitTypeParameterDescriptor(descriptor, builder); + } + + @Override + public Void visitNamespaceDescriptor(NamespaceDescriptor namespaceDescriptor, StringBuilder builder) { + builder.append("namespace "); + renderName(namespaceDescriptor, builder); + return super.visitNamespaceDescriptor(namespaceDescriptor, builder); + } + + @Override + public Void visitClassDescriptor(ClassDescriptor descriptor, StringBuilder builder) { + builder.append("class "); + renderName(descriptor, builder); + renderTypeParameters(descriptor.getTypeConstructor().getParameters(), builder); + Collection supertypes = descriptor.getTypeConstructor().getSupertypes(); + if (!supertypes.isEmpty()) { + builder.append(" : "); + for (Iterator iterator = supertypes.iterator(); iterator.hasNext(); ) { + JetType supertype = iterator.next(); + builder.append(supertype); + if (iterator.hasNext()) { + builder.append(", "); + } + } + } + return super.visitClassDescriptor(descriptor, builder); + } + + protected void renderName(DeclarationDescriptor descriptor, StringBuilder stringBuilder) { + DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); + if (containingDeclaration != null) { + renderName(containingDeclaration, stringBuilder); + stringBuilder.append("::"); + } + stringBuilder.append(descriptor.getName()); + } + + private void renderTypeParameter(TypeParameterDescriptor descriptor, StringBuilder builder) { + renderName(descriptor, builder); + if (!descriptor.getUpperBounds().isEmpty()) { + JetType bound = descriptor.getUpperBounds().iterator().next(); + if (bound != JetStandardClasses.getAnyType()) { + builder.append(" : ").append(bound); + if (descriptor.getUpperBounds().size() > 1) { + builder.append(" (...)"); + } + } + } + } + } }