Text displayed in hovers is a little nicer now

This commit is contained in:
Andrey Breslav
2011-05-06 20:17:51 +04:00
parent 792bc0f5d2
commit cc896ed433
3 changed files with 142 additions and 128 deletions
@@ -22,6 +22,7 @@ import org.jetbrains.jet.lang.psi.JetFunction;
import org.jetbrains.jet.lang.resolve.AnalyzingUtils; import org.jetbrains.jet.lang.resolve.AnalyzingUtils;
import org.jetbrains.jet.lang.resolve.BindingContext; import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.lang.types.FunctionDescriptor; import org.jetbrains.jet.lang.types.FunctionDescriptor;
import org.jetbrains.jet.resolve.DescriptorUtil;
import javax.swing.*; import javax.swing.*;
import java.awt.event.MouseEvent; import java.awt.event.MouseEvent;
@@ -81,7 +82,7 @@ public class JetLineMarkerProvider implements LineMarkerProvider {
public String getElementText(PsiElement element) { public String getElementText(PsiElement element) {
if (element instanceof JetFunction) { if (element instanceof JetFunction) {
JetFunction function = (JetFunction) element; JetFunction function = (JetFunction) element;
return bindingContext.getFunctionDescriptor(function).toString(); return DescriptorUtil.renderPresentableText(bindingContext.getFunctionDescriptor(function));
} }
return super.getElementText(element); return super.getElementText(element);
} }
@@ -4,6 +4,7 @@ import com.google.common.collect.Sets;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.types.*; import org.jetbrains.jet.lang.types.*;
import org.jetbrains.jet.resolve.DescriptorUtil;
import java.util.List; import java.util.List;
import java.util.Map; import java.util.Map;
@@ -160,4 +161,9 @@ public class MutableClassDescriptor extends MutableDeclarationDescriptor impleme
public boolean hasConstructors() { public boolean hasConstructors() {
return !constructors.isEmpty(); return !constructors.isEmpty();
} }
@Override
public String toString() {
return DescriptorUtil.renderPresentableText(this) + "[" + getClass().getCanonicalName() + "@" + System.identityHashCode(this) + "]";
}
} }
@@ -10,13 +10,35 @@ import java.util.List;
* @author abreslav * @author abreslav
*/ */
public class DescriptorUtil { public class DescriptorUtil {
private DescriptorUtil() {}
private static final DeclarationDescriptorVisitor<Void, StringBuilder> rootVisitor = new RenderDeclarationDescriptorVisitor();
private static final DeclarationDescriptorVisitor<Void, StringBuilder> subVisitor = new RenderDeclarationDescriptorVisitor() {
@Override
protected void renderName(DeclarationDescriptor descriptor, StringBuilder stringBuilder) {
stringBuilder.append(descriptor.getName());
}
};
public static String renderPresentableText(DeclarationDescriptor declarationDescriptor) { public static String renderPresentableText(DeclarationDescriptor declarationDescriptor) {
if (declarationDescriptor == null) return "<null>"; if (declarationDescriptor == null) return "<null>";
StringBuilder stringBuilder = new StringBuilder(); StringBuilder stringBuilder = new StringBuilder();
declarationDescriptor.accept( declarationDescriptor.accept(rootVisitor, stringBuilder);
new DeclarationDescriptorVisitor<Void, StringBuilder>() { return stringBuilder.toString();
}
public static String getFQName(DeclarationDescriptor descriptor) {
DeclarationDescriptor container = descriptor.getContainingDeclaration();
if (container != null && !(container instanceof ModuleDescriptor)) {
String baseName = getFQName(container);
if (!baseName.isEmpty()) return baseName + "." + descriptor.getName();
}
return descriptor.getName();
}
private DescriptorUtil() {}
private static class RenderDeclarationDescriptorVisitor extends DeclarationDescriptorVisitor<Void, StringBuilder> {
@Override @Override
public Void visitValueParameterDescriptor(ValueParameterDescriptor descriptor, StringBuilder builder) { public Void visitValueParameterDescriptor(ValueParameterDescriptor descriptor, StringBuilder builder) {
builder.append("value-parameter "); builder.append("value-parameter ");
@@ -45,19 +67,21 @@ public class DescriptorUtil {
builder.append("<write-only> "); builder.append("<write-only> ");
typeString = inType.toString(); typeString = inType.toString();
} }
builder.append(renderName(descriptor)).append(" : ").append(typeString); renderName(descriptor, builder);
builder.append(" : ").append(typeString);
return super.visitVariableDescriptor(descriptor, builder); return super.visitVariableDescriptor(descriptor, builder);
} }
@Override @Override
public Void visitFunctionDescriptor(FunctionDescriptor descriptor, StringBuilder builder) { public Void visitFunctionDescriptor(FunctionDescriptor descriptor, StringBuilder builder) {
builder.append("fun ").append(renderName(descriptor)); builder.append("fun ");
renderName(descriptor, builder);
List<TypeParameterDescriptor> typeParameters = descriptor.getTypeParameters(); List<TypeParameterDescriptor> typeParameters = descriptor.getTypeParameters();
renderTypeParameters(typeParameters, builder); renderTypeParameters(typeParameters, builder);
builder.append("("); builder.append("(");
for (Iterator<ValueParameterDescriptor> iterator = descriptor.getUnsubstitutedValueParameters().iterator(); iterator.hasNext(); ) { for (Iterator<ValueParameterDescriptor> iterator = descriptor.getUnsubstitutedValueParameters().iterator(); iterator.hasNext(); ) {
ValueParameterDescriptor parameterDescriptor = iterator.next(); ValueParameterDescriptor parameterDescriptor = iterator.next();
visitVariableDescriptor(parameterDescriptor, builder); parameterDescriptor.accept(subVisitor, builder);
if (iterator.hasNext()) { if (iterator.hasNext()) {
builder.append(", "); builder.append(", ");
} }
@@ -71,7 +95,7 @@ public class DescriptorUtil {
builder.append("<"); builder.append("<");
for (Iterator<TypeParameterDescriptor> iterator = typeParameters.iterator(); iterator.hasNext(); ) { for (Iterator<TypeParameterDescriptor> iterator = typeParameters.iterator(); iterator.hasNext(); ) {
TypeParameterDescriptor typeParameterDescriptor = iterator.next(); TypeParameterDescriptor typeParameterDescriptor = iterator.next();
renderTypeParameter(typeParameterDescriptor, builder); typeParameterDescriptor.accept(subVisitor, builder);
if (iterator.hasNext()) { if (iterator.hasNext()) {
builder.append(", "); builder.append(", ");
} }
@@ -90,13 +114,15 @@ public class DescriptorUtil {
@Override @Override
public Void visitNamespaceDescriptor(NamespaceDescriptor namespaceDescriptor, StringBuilder builder) { public Void visitNamespaceDescriptor(NamespaceDescriptor namespaceDescriptor, StringBuilder builder) {
builder.append("namespace ").append(renderName(namespaceDescriptor)); builder.append("namespace ");
renderName(namespaceDescriptor, builder);
return super.visitNamespaceDescriptor(namespaceDescriptor, builder); return super.visitNamespaceDescriptor(namespaceDescriptor, builder);
} }
@Override @Override
public Void visitClassDescriptor(ClassDescriptor descriptor, StringBuilder builder) { public Void visitClassDescriptor(ClassDescriptor descriptor, StringBuilder builder) {
builder.append("class ").append(renderName(descriptor)); builder.append("class ");
renderName(descriptor, builder);
renderTypeParameters(descriptor.getTypeConstructor().getParameters(), builder); renderTypeParameters(descriptor.getTypeConstructor().getParameters(), builder);
Collection<? extends JetType> supertypes = descriptor.getTypeConstructor().getSupertypes(); Collection<? extends JetType> supertypes = descriptor.getTypeConstructor().getSupertypes();
if (!supertypes.isEmpty()) { if (!supertypes.isEmpty()) {
@@ -111,18 +137,8 @@ public class DescriptorUtil {
} }
return super.visitClassDescriptor(descriptor, builder); return super.visitClassDescriptor(descriptor, builder);
} }
},
stringBuilder);
return stringBuilder.toString();
}
private static StringBuilder renderName(DeclarationDescriptor descriptor) { protected void renderName(DeclarationDescriptor descriptor, StringBuilder stringBuilder) {
StringBuilder stringBuilder = new StringBuilder();
renderName(descriptor, stringBuilder);
return stringBuilder;
}
private static void renderName(DeclarationDescriptor descriptor, StringBuilder stringBuilder) {
DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration();
if (containingDeclaration != null) { if (containingDeclaration != null) {
renderName(containingDeclaration, stringBuilder); renderName(containingDeclaration, stringBuilder);
@@ -131,8 +147,8 @@ public class DescriptorUtil {
stringBuilder.append(descriptor.getName()); stringBuilder.append(descriptor.getName());
} }
private static void renderTypeParameter(TypeParameterDescriptor descriptor, StringBuilder builder) { private void renderTypeParameter(TypeParameterDescriptor descriptor, StringBuilder builder) {
builder.append(renderName(descriptor)); renderName(descriptor, builder);
if (!descriptor.getUpperBounds().isEmpty()) { if (!descriptor.getUpperBounds().isEmpty()) {
JetType bound = descriptor.getUpperBounds().iterator().next(); JetType bound = descriptor.getUpperBounds().iterator().next();
if (bound != JetStandardClasses.getAnyType()) { if (bound != JetStandardClasses.getAnyType()) {
@@ -143,14 +159,5 @@ public class DescriptorUtil {
} }
} }
} }
public static String getFQName(DeclarationDescriptor descriptor) {
DeclarationDescriptor container = descriptor.getContainingDeclaration();
if (container != null && !(container instanceof ModuleDescriptor)) {
String baseName = getFQName(container);
if (!baseName.isEmpty()) return baseName + "." + descriptor.getName();
}
return descriptor.getName();
} }
} }