Approximating flexible types in descriptor renderer

This commit is contained in:
Andrey Breslav
2014-09-18 19:12:10 +04:00
parent 40932f84c8
commit fe2fb60daf
34 changed files with 149 additions and 77 deletions
@@ -608,7 +608,7 @@ public class SignaturesPropagationData {
boolean annotatedAsNotNull = howThisTypeIsUsed != TYPE_ARGUMENT && !TypeUtils.isNullableType(autoType); boolean annotatedAsNotNull = howThisTypeIsUsed != TYPE_ARGUMENT && !TypeUtils.isNullableType(autoType);
if (annotatedAsNotNull && someSupersNotCovariantNullable) { if (annotatedAsNotNull && someSupersNotCovariantNullable) {
DescriptorRenderer renderer = DescriptorRenderer.SOURCE_CODE_SHORT_NAMES_IN_TYPES; DescriptorRenderer renderer = DescriptorRenderer.SHORT_NAMES_IN_TYPES;
reportError("In superclass type is nullable: " + typesFromSuper + ", in subclass it is not: " + renderer.renderType(autoType)); reportError("In superclass type is nullable: " + typesFromSuper + ", in subclass it is not: " + renderer.renderType(autoType));
return true; return true;
} }
@@ -51,7 +51,7 @@ public final class ImportPath {
} }
public String getPathStr() { public String getPathStr() {
return DescriptorRenderer.SOURCE_CODE.renderFqName(fqName) + (isAllUnder ? ".*" : ""); return DescriptorRenderer.FQ_NAMES_IN_TYPES.renderFqName(fqName) + (isAllUnder ? ".*" : "");
} }
@Override @Override
@@ -21,7 +21,6 @@ import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor;
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.descriptors.FunctionDescriptor;
import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor; import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor;
import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.FqNameBase; import org.jetbrains.jet.lang.resolve.name.FqNameBase;
import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.resolve.name.Name;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
@@ -32,22 +31,6 @@ import java.util.List;
public interface DescriptorRenderer extends Renderer<DeclarationDescriptor> { public interface DescriptorRenderer extends Renderer<DeclarationDescriptor> {
DescriptorRenderer COMPACT_WITH_MODIFIERS = new DescriptorRendererBuilder().setWithDefinedIn(false).build(); DescriptorRenderer COMPACT_WITH_MODIFIERS = new DescriptorRendererBuilder().setWithDefinedIn(false).build();
DescriptorRenderer SOURCE_CODE = new DescriptorRendererBuilder()
.setNormalizedVisibilities(true)
.setWithDefinedIn(false)
.setShortNames(false)
.setShowInternalKeyword(false)
.setOverrideRenderingPolicy(OverrideRenderingPolicy.RENDER_OVERRIDE)
.setUnitReturnType(false).build();
DescriptorRenderer SOURCE_CODE_SHORT_NAMES_IN_TYPES = new DescriptorRendererBuilder()
.setNormalizedVisibilities(true)
.setWithDefinedIn(false)
.setShortNames(true)
.setShowInternalKeyword(false)
.setOverrideRenderingPolicy(OverrideRenderingPolicy.RENDER_OVERRIDE)
.setUnitReturnType(false).build();
DescriptorRenderer COMPACT = new DescriptorRendererBuilder() DescriptorRenderer COMPACT = new DescriptorRendererBuilder()
.setWithDefinedIn(false) .setWithDefinedIn(false)
.setModifiers().build(); .setModifiers().build();
@@ -16,9 +16,11 @@
package org.jetbrains.jet.renderer; package org.jetbrains.jet.renderer;
import kotlin.Function1;
import kotlin.KotlinPackage; import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.name.FqName; import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.types.JetType;
import java.util.Collection; import java.util.Collection;
import java.util.Collections; import java.util.Collections;
@@ -43,6 +45,12 @@ public class DescriptorRendererBuilder {
private boolean withoutFunctionParameterNames = false; private boolean withoutFunctionParameterNames = false;
private boolean withoutTypeParameters = false; private boolean withoutTypeParameters = false;
private boolean withoutSuperTypes = false; private boolean withoutSuperTypes = false;
private Function1<JetType, JetType> typeNormalizer = new Function1<JetType, JetType>() {
@Override
public JetType invoke(JetType type) {
return type;
}
};
@NotNull @NotNull
private DescriptorRenderer.OverrideRenderingPolicy overrideRenderingPolicy = DescriptorRenderer.OverrideRenderingPolicy.RENDER_OPEN; private DescriptorRenderer.OverrideRenderingPolicy overrideRenderingPolicy = DescriptorRenderer.OverrideRenderingPolicy.RENDER_OPEN;
@@ -201,6 +209,12 @@ public class DescriptorRendererBuilder {
return this; return this;
} }
@NotNull
public DescriptorRendererBuilder setTypeNormalizer(@NotNull Function1<JetType, JetType> typeNormalizer) {
this.typeNormalizer = typeNormalizer;
return this;
}
@NotNull @NotNull
public DescriptorRenderer build() { public DescriptorRenderer build() {
return new DescriptorRendererImpl( return new DescriptorRendererImpl(
@@ -208,7 +222,7 @@ public class DescriptorRendererBuilder {
normalizedVisibilities, showInternalKeyword, prettyFunctionTypes, uninferredTypeParameterAsName, normalizedVisibilities, showInternalKeyword, prettyFunctionTypes, uninferredTypeParameterAsName,
overrideRenderingPolicy, valueParametersHandler, textFormat, excludedAnnotationClasses, includePropertyConstant, overrideRenderingPolicy, valueParametersHandler, textFormat, excludedAnnotationClasses, includePropertyConstant,
includeSynthesizedParameterNames, withoutFunctionParameterNames, withoutTypeParameters, receiverAfterName, includeSynthesizedParameterNames, withoutFunctionParameterNames, withoutTypeParameters, receiverAfterName,
renderClassObjectName, withoutSuperTypes); renderClassObjectName, withoutSuperTypes, typeNormalizer);
} }
} }
@@ -46,6 +46,7 @@ import static org.jetbrains.jet.lang.types.TypeUtils.CANT_INFER_LAMBDA_PARAM_TYP
import static org.jetbrains.jet.lang.types.TypeUtils.DONT_CARE; import static org.jetbrains.jet.lang.types.TypeUtils.DONT_CARE;
public class DescriptorRendererImpl implements DescriptorRenderer { public class DescriptorRendererImpl implements DescriptorRenderer {
private final Function1<JetType, JetType> typeNormalizer;
private final boolean shortNames; private final boolean shortNames;
private final boolean withDefinedIn; private final boolean withDefinedIn;
private final Set<DescriptorRenderer.Modifier> modifiers; private final Set<DescriptorRenderer.Modifier> modifiers;
@@ -98,7 +99,8 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
boolean withoutTypeParameters, boolean withoutTypeParameters,
boolean receiverAfterName, boolean receiverAfterName,
boolean renderClassObjectName, boolean renderClassObjectName,
boolean withoutSuperTypes boolean withoutSuperTypes,
Function1<JetType, JetType> typeNormalizer
) { ) {
this.shortNames = shortNames; this.shortNames = shortNames;
this.withDefinedIn = withDefinedIn; this.withDefinedIn = withDefinedIn;
@@ -123,6 +125,7 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
this.receiverAfterName = receiverAfterName; this.receiverAfterName = receiverAfterName;
this.renderClassObjectName = renderClassObjectName; this.renderClassObjectName = renderClassObjectName;
this.withoutSuperTypes = withoutSuperTypes; this.withoutSuperTypes = withoutSuperTypes;
this.typeNormalizer = typeNormalizer;
} }
/* FORMATTING */ /* FORMATTING */
@@ -293,19 +296,24 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
@NotNull @NotNull
@Override @Override
public String renderType(@NotNull JetType type) { public String renderType(@NotNull JetType type) {
return renderNormalizedType(typeNormalizer.invoke(type));
}
@NotNull
private String renderNormalizedType(@NotNull JetType type) {
if (type.isFlexible()) { if (type.isFlexible()) {
if (!debugMode) { if (!debugMode) {
return renderFlexibleType(type); return renderFlexibleType(type);
} }
else { else {
return "(" + renderType(type.getLowerBound()) + ".." + renderType(type.getUpperBound()) + ")"; return "(" + renderNormalizedType(type.getLowerBound()) + ".." + renderNormalizedType(type.getUpperBound()) + ")";
} }
} }
return renderInflexibleType(type); return renderInflexibleType(type);
} }
private String renderInflexibleType(@NotNull JetType type) { private String renderInflexibleType(@NotNull JetType type) {
assert !type.isFlexible() : "Flexible types not allowed here: " + renderType(type); assert !type.isFlexible() : "Flexible types not allowed here: " + renderNormalizedType(type);
if (type == CANT_INFER_LAMBDA_PARAM_TYPE || type == DONT_CARE) { if (type == CANT_INFER_LAMBDA_PARAM_TYPE || type == DONT_CARE) {
return "???"; return "???";
@@ -364,7 +372,7 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
kotlinPrefix + "Array<(out) " kotlinPrefix + "Array<(out) "
); );
if (array != null) return array; if (array != null) return array;
return "(" + renderType(lower) + ".." + renderType(upper) + ")"; return "(" + renderNormalizedType(lower) + ".." + renderNormalizedType(upper) + ")";
} }
@Nullable @Nullable
@@ -438,7 +446,7 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
if (typeProjection.getProjectionKind() != Variance.INVARIANT) { if (typeProjection.getProjectionKind() != Variance.INVARIANT) {
builder.append(typeProjection.getProjectionKind()).append(" "); builder.append(typeProjection.getProjectionKind()).append(" ");
} }
builder.append(renderType(typeProjection.getType())); builder.append(renderNormalizedType(typeProjection.getType()));
if (iterator.hasNext()) { if (iterator.hasNext()) {
builder.append(", "); builder.append(", ");
} }
@@ -451,14 +459,14 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
JetType receiverType = KotlinBuiltIns.getInstance().getReceiverType(type); JetType receiverType = KotlinBuiltIns.getInstance().getReceiverType(type);
if (receiverType != null) { if (receiverType != null) {
sb.append(renderType(receiverType)); sb.append(renderNormalizedType(receiverType));
sb.append("."); sb.append(".");
} }
sb.append("("); sb.append("(");
appendTypeProjections(KotlinBuiltIns.getInstance().getParameterTypeProjectionsFromFunctionType(type), sb); appendTypeProjections(KotlinBuiltIns.getInstance().getParameterTypeProjectionsFromFunctionType(type), sb);
sb.append(") ").append(arrow()).append(" "); sb.append(") ").append(arrow()).append(" ");
sb.append(renderType(KotlinBuiltIns.getInstance().getReturnTypeFromFunctionType(type))); sb.append(renderNormalizedType(KotlinBuiltIns.getInstance().getReturnTypeFromFunctionType(type)));
if (type.isNullable()) { if (type.isNullable()) {
return "(" + sb + ")?"; return "(" + sb + ")?";
@@ -42,6 +42,7 @@ import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.plugin.JetBundle; import org.jetbrains.jet.plugin.JetBundle;
import org.jetbrains.jet.plugin.codeInsight.DescriptorToDeclarationUtil; import org.jetbrains.jet.plugin.codeInsight.DescriptorToDeclarationUtil;
import org.jetbrains.jet.plugin.codeInsight.ShortenReferences; import org.jetbrains.jet.plugin.codeInsight.ShortenReferences;
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers;
import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.renderer.DescriptorRenderer;
import javax.swing.*; import javax.swing.*;
@@ -74,7 +75,7 @@ public class JetAddFunctionToClassifierAction implements QuestionAction {
@NotNull final ClassDescriptor typeDescriptor, @NotNull final ClassDescriptor typeDescriptor,
@NotNull final FunctionDescriptor functionDescriptor @NotNull final FunctionDescriptor functionDescriptor
) { ) {
final String signatureString = DescriptorRenderer.SOURCE_CODE.render(functionDescriptor); final String signatureString = IdeDescriptorRenderers.SOURCE_CODE.render(functionDescriptor);
PsiDocumentManager.getInstance(project).commitAllDocuments(); PsiDocumentManager.getInstance(project).commitAllDocuments();
@@ -158,7 +159,7 @@ public class JetAddFunctionToClassifierAction implements QuestionAction {
public String getTextFor(FunctionDescriptor functionDescriptor) { public String getTextFor(FunctionDescriptor functionDescriptor) {
ClassDescriptor type = (ClassDescriptor) functionDescriptor.getContainingDeclaration(); ClassDescriptor type = (ClassDescriptor) functionDescriptor.getContainingDeclaration();
return JetBundle.message("add.function.to.type.action.single", return JetBundle.message("add.function.to.type.action.single",
DescriptorRenderer.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(functionDescriptor), IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(functionDescriptor),
type.getName().toString()); type.getName().toString());
} }
}; };
@@ -30,6 +30,8 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.types.JetType; import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers;
import org.jetbrains.jet.renderer.DescriptorRenderer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.List; import java.util.List;
@@ -64,6 +64,7 @@ import org.jetbrains.jet.utils.*
import org.jetbrains.jet.renderer.DescriptorRenderer import org.jetbrains.jet.renderer.DescriptorRenderer
import org.jetbrains.jet.lang.resolve.descriptorUtil.isExtension import org.jetbrains.jet.lang.resolve.descriptorUtil.isExtension
import com.intellij.openapi.progress.ProcessCanceledException import com.intellij.openapi.progress.ProcessCanceledException
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
//NOTE: this class is based on CopyPasteReferenceProcessor and JavaCopyPasteReferenceProcessor //NOTE: this class is based on CopyPasteReferenceProcessor and JavaCopyPasteReferenceProcessor
public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor<ReferenceTransferableData>() { public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor<ReferenceTransferableData>() {
@@ -332,7 +333,7 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor<Refere
fun lengthenReference(expression: JetElement, fqName: FqName) { fun lengthenReference(expression: JetElement, fqName: FqName) {
assert(canLengthenReferenceExpression(expression, fqName)) assert(canLengthenReferenceExpression(expression, fqName))
val parent = expression.getParent() val parent = expression.getParent()
val prefixToInsert = DescriptorRenderer.SOURCE_CODE.renderFqName(fqName.parent()) val prefixToInsert = IdeDescriptorRenderers.SOURCE_CODE.renderFqName(fqName.parent())
val psiFactory = JetPsiFactory(expression) val psiFactory = JetPsiFactory(expression)
if (parent is JetCallExpression) { if (parent is JetCallExpression) {
val text = "$prefixToInsert.${parent.getText()}" val text = "$prefixToInsert.${parent.getText()}"
@@ -345,7 +346,7 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor<Refere
typeReference!!.replace(psiFactory.createType("$prefixToInsert.${typeReference.getText()}")) typeReference!!.replace(psiFactory.createType("$prefixToInsert.${typeReference.getText()}"))
} }
else { else {
expression.replace(createQualifiedExpression(psiFactory, DescriptorRenderer.SOURCE_CODE.renderFqName(fqName))) expression.replace(createQualifiedExpression(psiFactory, IdeDescriptorRenderers.SOURCE_CODE.renderFqName(fqName)))
} }
} }
@@ -41,6 +41,7 @@ import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage; import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage;
import org.jetbrains.jet.plugin.quickfix.QuickfixPackage; import org.jetbrains.jet.plugin.quickfix.QuickfixPackage;
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers;
import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.renderer.DescriptorRenderer;
import org.jetbrains.jet.renderer.DescriptorRendererBuilder; import org.jetbrains.jet.renderer.DescriptorRendererBuilder;
@@ -58,7 +59,9 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns
.setWithDefinedIn(false) .setWithDefinedIn(false)
.setShortNames(false) .setShortNames(false)
.setOverrideRenderingPolicy(DescriptorRenderer.OverrideRenderingPolicy.RENDER_OVERRIDE) .setOverrideRenderingPolicy(DescriptorRenderer.OverrideRenderingPolicy.RENDER_OVERRIDE)
.setUnitReturnType(false).build(); .setUnitReturnType(false)
.setTypeNormalizer(IdeDescriptorRenderers.APPROXIMATE_FLEXIBLE_TYPES)
.build();
private static final Logger LOG = Logger.getInstance(OverrideImplementMethodsHandler.class.getCanonicalName()); private static final Logger LOG = Logger.getInstance(OverrideImplementMethodsHandler.class.getCanonicalName());
@@ -23,11 +23,11 @@ import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.codeInsight.completion.CompletionService import com.intellij.codeInsight.completion.CompletionService
import com.intellij.codeInsight.completion.CompletionProgressIndicator import com.intellij.codeInsight.completion.CompletionProgressIndicator
import org.jetbrains.jet.lang.descriptors.ClassDescriptor import org.jetbrains.jet.lang.descriptors.ClassDescriptor
import org.jetbrains.jet.renderer.DescriptorRenderer
import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor import org.jetbrains.jet.lang.descriptors.PackageViewDescriptor
import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor import org.jetbrains.jet.lang.descriptors.PackageFragmentDescriptor
import org.jetbrains.jet.lang.descriptors.ClassKind import org.jetbrains.jet.lang.descriptors.ClassKind
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
enum class ItemPriority { enum class ItemPriority {
MULTIPLE_ARGUMENTS_ITEM MULTIPLE_ARGUMENTS_ITEM
@@ -65,14 +65,14 @@ fun rethrowWithCancelIndicator(exception: ProcessCanceledException): ProcessCanc
fun qualifiedNameForSourceCode(descriptor: ClassDescriptor): String? { fun qualifiedNameForSourceCode(descriptor: ClassDescriptor): String? {
val name = descriptor.getName() val name = descriptor.getName()
if (name.isSpecial()) return null if (name.isSpecial()) return null
val nameString = DescriptorRenderer.SOURCE_CODE.renderName(name) val nameString = IdeDescriptorRenderers.SOURCE_CODE.renderName(name)
val qualifier = qualifierName(descriptor.getContainingDeclaration()) val qualifier = qualifierName(descriptor.getContainingDeclaration())
return if (qualifier != null && qualifier != "") qualifier + "." + nameString else nameString return if (qualifier != null && qualifier != "") qualifier + "." + nameString else nameString
} }
private fun qualifierName(descriptor: DeclarationDescriptor): String? = when (descriptor) { private fun qualifierName(descriptor: DeclarationDescriptor): String? = when (descriptor) {
is ClassDescriptor -> if (descriptor.getKind() != ClassKind.CLASS_OBJECT) qualifiedNameForSourceCode(descriptor) else qualifierName(descriptor.getContainingDeclaration()) is ClassDescriptor -> if (descriptor.getKind() != ClassKind.CLASS_OBJECT) qualifiedNameForSourceCode(descriptor) else qualifierName(descriptor.getContainingDeclaration())
is PackageViewDescriptor -> DescriptorRenderer.SOURCE_CODE.renderFqName(descriptor.getFqName()) is PackageViewDescriptor -> IdeDescriptorRenderers.SOURCE_CODE.renderFqName(descriptor.getFqName())
is PackageFragmentDescriptor -> DescriptorRenderer.SOURCE_CODE.renderFqName(descriptor.fqName) is PackageFragmentDescriptor -> IdeDescriptorRenderers.SOURCE_CODE.renderFqName(descriptor.fqName)
else -> null else -> null
} }
@@ -38,6 +38,7 @@ import org.jetbrains.jet.lang.psi.psiUtil.getCallNameExpression
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import com.intellij.codeInsight.completion.InsertHandler import com.intellij.codeInsight.completion.InsertHandler
import org.jetbrains.jet.lang.resolve.name.Name import org.jetbrains.jet.lang.resolve.name.Name
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
object NamedParametersCompletion { object NamedParametersCompletion {
private val positionFilter = AndFilter( private val positionFilter = AndFilter(
@@ -109,7 +110,7 @@ object NamedParametersCompletion {
} }
val editor = context.getEditor() val editor = context.getEditor()
val text = DescriptorRenderer.SOURCE_CODE.renderName(parameterName) + " = " val text = IdeDescriptorRenderers.SOURCE_CODE.renderName(parameterName) + " = "
editor.getDocument().replaceString(context.getStartOffset(), context.getTailOffset(), text) editor.getDocument().replaceString(context.getStartOffset(), context.getTailOffset(), text)
editor.getCaretModel().moveToOffset(context.getStartOffset() + text.length) editor.getCaretModel().moveToOffset(context.getStartOffset() + text.length)
} }
@@ -20,15 +20,15 @@ import com.intellij.codeInsight.completion.InsertHandler
import com.intellij.codeInsight.lookup.LookupElement import com.intellij.codeInsight.lookup.LookupElement
import com.intellij.codeInsight.completion.InsertionContext import com.intellij.codeInsight.completion.InsertionContext
import org.jetbrains.jet.plugin.completion.DeclarationLookupObject import org.jetbrains.jet.plugin.completion.DeclarationLookupObject
import org.jetbrains.jet.renderer.DescriptorRenderer
import com.intellij.openapi.util.TextRange import com.intellij.openapi.util.TextRange
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
open class BaseDeclarationInsertHandler : InsertHandler<LookupElement> { open class BaseDeclarationInsertHandler : InsertHandler<LookupElement> {
override fun handleInsert(context: InsertionContext, item: LookupElement) { override fun handleInsert(context: InsertionContext, item: LookupElement) {
val descriptor = (item.getObject() as? DeclarationLookupObject)?.descriptor val descriptor = (item.getObject() as? DeclarationLookupObject)?.descriptor
if (descriptor != null) { if (descriptor != null) {
val name = descriptor.getName() val name = descriptor.getName()
val nameInCode = DescriptorRenderer.SOURCE_CODE.renderName(name) val nameInCode = IdeDescriptorRenderers.SOURCE_CODE.renderName(name)
val document = context.getDocument() val document = context.getDocument()
val needEscaping = nameInCode != name.asString() val needEscaping = nameInCode != name.asString()
// we check that text inserted matches the name because something else can be inserted by custom insert handler // we check that text inserted matches the name because something else can be inserted by custom insert handler
@@ -18,8 +18,6 @@ package org.jetbrains.jet.plugin.completion.handlers
import com.intellij.openapi.command.CommandProcessor import com.intellij.openapi.command.CommandProcessor
import com.intellij.codeInsight.completion.InsertionContext import com.intellij.codeInsight.completion.InsertionContext
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.util.Computable
import com.intellij.codeInsight.template.TemplateManager import com.intellij.codeInsight.template.TemplateManager
import com.intellij.openapi.util.TextRange import com.intellij.openapi.util.TextRange
import com.intellij.codeInsight.template.Template import com.intellij.codeInsight.template.Template
@@ -43,6 +41,7 @@ import org.jetbrains.jet.lang.psi.JetFile
import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession
import org.jetbrains.jet.plugin.util.application.runWriteAction import org.jetbrains.jet.plugin.util.application.runWriteAction
import org.jetbrains.jet.plugin.refactoring.EmptyValidator import org.jetbrains.jet.plugin.refactoring.EmptyValidator
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
fun insertLambdaTemplate(context: InsertionContext, placeholderRange: TextRange, lambdaType: JetType) { fun insertLambdaTemplate(context: InsertionContext, placeholderRange: TextRange, lambdaType: JetType) {
val explicitParameterTypes = needExplicitParameterTypes(context, placeholderRange, lambdaType) val explicitParameterTypes = needExplicitParameterTypes(context, placeholderRange, lambdaType)
@@ -118,7 +117,7 @@ private fun buildTemplate(lambdaType: JetType, explicitParameterTypes: Boolean,
//TODO: check for names in scope //TODO: check for names in scope
template.addVariable(ParameterNameExpression(JetNameSuggester.suggestNames(parameterType, EmptyValidator, "p")), true) template.addVariable(ParameterNameExpression(JetNameSuggester.suggestNames(parameterType, EmptyValidator, "p")), true)
if (explicitParameterTypes) { if (explicitParameterTypes) {
template.addTextSegment(": " + DescriptorRenderer.SOURCE_CODE.renderType(parameterType)) template.addTextSegment(": " + IdeDescriptorRenderers.SOURCE_CODE.renderType(parameterType))
} }
} }
@@ -21,7 +21,6 @@ import org.jetbrains.jet.lang.psi.JetExpression
import com.intellij.codeInsight.lookup.LookupElement import com.intellij.codeInsight.lookup.LookupElement
import org.jetbrains.jet.lang.types.checker.JetTypeChecker import org.jetbrains.jet.lang.types.checker.JetTypeChecker
import com.intellij.ui.LayeredIcon import com.intellij.ui.LayeredIcon
import org.jetbrains.jet.renderer.DescriptorRenderer
import com.intellij.codeInsight.lookup.LookupElementBuilder import com.intellij.codeInsight.lookup.LookupElementBuilder
import org.jetbrains.jet.plugin.completion.Tail import org.jetbrains.jet.plugin.completion.Tail
import org.jetbrains.jet.plugin.completion.ItemPriority import org.jetbrains.jet.plugin.completion.ItemPriority
@@ -34,8 +33,9 @@ import org.jetbrains.jet.lang.descriptors.ValueParameterDescriptor
import org.jetbrains.jet.plugin.JetDescriptorIconProvider import org.jetbrains.jet.plugin.JetDescriptorIconProvider
import org.jetbrains.jet.lang.descriptors.VariableDescriptor import org.jetbrains.jet.lang.descriptors.VariableDescriptor
import org.jetbrains.jet.plugin.completion.PositionalArgumentExpectedInfo import org.jetbrains.jet.plugin.completion.PositionalArgumentExpectedInfo
import org.jetbrains.jet.plugin.completion.assignPriority
import java.util.ArrayList import java.util.ArrayList
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
import org.jetbrains.jet.plugin.completion.assignPriority
class MultipleArgumentsItemProvider(val bindingContext: BindingContext, class MultipleArgumentsItemProvider(val bindingContext: BindingContext,
val typesWithAutoCasts: (DeclarationDescriptor) -> Iterable<JetType>) { val typesWithAutoCasts: (DeclarationDescriptor) -> Iterable<JetType>) {
@@ -75,7 +75,7 @@ class MultipleArgumentsItemProvider(val bindingContext: BindingContext,
compoundIcon.setIcon(firstIcon, 1, 0, 0) compoundIcon.setIcon(firstIcon, 1, 0, 0)
return LookupElementBuilder return LookupElementBuilder
.create(variables.map { DescriptorRenderer.SOURCE_CODE.renderName(it.getName()) }.joinToString(", ")) .create(variables.map { IdeDescriptorRenderers.SOURCE_CODE.renderName(it.getName()) }.joinToString(", "))
.withIcon(compoundIcon) .withIcon(compoundIcon)
.addTail(Tail.RPARENTH) //TODO: support square brackets .addTail(Tail.RPARENTH) //TODO: support square brackets
.assignPriority(ItemPriority.MULTIPLE_ARGUMENTS_ITEM) .assignPriority(ItemPriority.MULTIPLE_ARGUMENTS_ITEM)
@@ -33,6 +33,7 @@ import com.intellij.psi.util.PsiTreeUtil
import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession
import org.jetbrains.jet.renderer.DescriptorRenderer import org.jetbrains.jet.renderer.DescriptorRenderer
import org.jetbrains.jet.lang.psi.psiUtil.getReceiverExpression import org.jetbrains.jet.lang.psi.psiUtil.getReceiverExpression
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
class SmartCompletion(val expression: JetSimpleNameExpression, class SmartCompletion(val expression: JetSimpleNameExpression,
val resolveSession: ResolveSessionForBodies, val resolveSession: ResolveSessionForBodies,
@@ -296,7 +297,7 @@ class SmartCompletion(val expression: JetSimpleNameExpression,
val typeArgs = jetType.getArguments() val typeArgs = jetType.getArguments()
var itemText = lookupString + DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderTypeArguments(typeArgs) var itemText = lookupString + DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderTypeArguments(typeArgs)
val typeText = DescriptorUtils.getFqName(classifier).toString() + DescriptorRenderer.SOURCE_CODE.renderTypeArguments(typeArgs) val typeText = DescriptorUtils.getFqName(classifier).toString() + IdeDescriptorRenderers.SOURCE_CODE.renderTypeArguments(typeArgs)
val insertHandler: InsertHandler<LookupElement> = object : InsertHandler<LookupElement> { val insertHandler: InsertHandler<LookupElement> = object : InsertHandler<LookupElement> {
override fun handleInsert(context: InsertionContext, item: LookupElement) { override fun handleInsert(context: InsertionContext, item: LookupElement) {
@@ -32,6 +32,7 @@ import org.jetbrains.jet.plugin.completion.ExpectedInfo
import org.jetbrains.jet.plugin.util.makeNotNullable import org.jetbrains.jet.plugin.util.makeNotNullable
import org.jetbrains.jet.plugin.completion.qualifiedNameForSourceCode import org.jetbrains.jet.plugin.completion.qualifiedNameForSourceCode
import org.jetbrains.jet.lang.resolve.descriptorUtil.isExtension import org.jetbrains.jet.lang.resolve.descriptorUtil.isExtension
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
// adds java static members, enum members and members from class object // adds java static members, enum members and members from class object
class StaticMembers(val bindingContext: BindingContext, val resolveSession: ResolveSessionForBodies) { class StaticMembers(val bindingContext: BindingContext, val resolveSession: ResolveSessionForBodies) {
@@ -133,7 +134,7 @@ class StaticMembers(val bindingContext: BindingContext, val resolveSession: Reso
} }
override fun handleInsert(context: InsertionContext) { override fun handleInsert(context: InsertionContext) {
var text = qualifierText + "." + DescriptorRenderer.SOURCE_CODE.renderName(memberDescriptor.getName()) var text = qualifierText + "." + IdeDescriptorRenderers.SOURCE_CODE.renderName(memberDescriptor.getName())
context.getDocument().replaceString(context.getStartOffset(), context.getTailOffset(), text) context.getDocument().replaceString(context.getStartOffset(), context.getTailOffset(), text)
context.setTailOffset(context.getStartOffset() + text.length) context.setTailOffset(context.getStartOffset() + text.length)
@@ -35,7 +35,7 @@ import org.jetbrains.jet.plugin.completion.handlers.CaretPosition
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
import org.jetbrains.jet.lang.descriptors.Visibilities import org.jetbrains.jet.lang.descriptors.Visibilities
import org.jetbrains.jet.plugin.util.makeNotNullable import org.jetbrains.jet.plugin.util.makeNotNullable
import org.jetbrains.jet.lang.resolve.DescriptorUtils import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
class TypeInstantiationItems(val resolveSession: ResolveSessionForBodies, val visibilityFilter: (DeclarationDescriptor) -> Boolean) { class TypeInstantiationItems(val resolveSession: ResolveSessionForBodies, val visibilityFilter: (DeclarationDescriptor) -> Boolean) {
public fun addToCollection(collection: MutableCollection<LookupElement>, expectedInfos: Collection<ExpectedInfo>) { public fun addToCollection(collection: MutableCollection<LookupElement>, expectedInfos: Collection<ExpectedInfo>) {
@@ -70,7 +70,7 @@ class TypeInstantiationItems(val resolveSession: ResolveSessionForBodies, val vi
var itemText = lookupString + DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderTypeArguments(typeArgs) var itemText = lookupString + DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderTypeArguments(typeArgs)
val insertHandler: InsertHandler<LookupElement> val insertHandler: InsertHandler<LookupElement>
val typeText = qualifiedNameForSourceCode(classifier) + DescriptorRenderer.SOURCE_CODE.renderTypeArguments(typeArgs) val typeText = qualifiedNameForSourceCode(classifier) + IdeDescriptorRenderers.SOURCE_CODE.renderTypeArguments(typeArgs)
if (isAbstract) { if (isAbstract) {
val constructorParenthesis = if (classifier.getKind() != ClassKind.TRAIT) "()" else "" val constructorParenthesis = if (classifier.getKind() != ClassKind.TRAIT) "()" else ""
itemText += constructorParenthesis itemText += constructorParenthesis
@@ -20,11 +20,11 @@ import org.jetbrains.jet.lang.psi.JetFunctionLiteralExpression
import com.intellij.openapi.editor.Editor import com.intellij.openapi.editor.Editor
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache
import org.jetbrains.jet.lang.resolve.BindingContext import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.renderer.DescriptorRenderer
import org.jetbrains.jet.lang.types.ErrorUtils import org.jetbrains.jet.lang.types.ErrorUtils
import org.jetbrains.jet.lang.psi.JetPsiFactory import org.jetbrains.jet.lang.psi.JetPsiFactory
import com.intellij.psi.PsiWhiteSpace import com.intellij.psi.PsiWhiteSpace
import org.jetbrains.jet.plugin.codeInsight.ShortenReferences import org.jetbrains.jet.plugin.codeInsight.ShortenReferences
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
public class MakeTypeExplicitInLambdaIntention : JetSelfTargetingIntention<JetFunctionLiteralExpression>( public class MakeTypeExplicitInLambdaIntention : JetSelfTargetingIntention<JetFunctionLiteralExpression>(
"make.type.explicit.in.lambda", javaClass()) { "make.type.explicit.in.lambda", javaClass()) {
@@ -61,7 +61,7 @@ public class MakeTypeExplicitInLambdaIntention : JetSelfTargetingIntention<JetFu
// Step 1: make the parameters types explicit // Step 1: make the parameters types explicit
val valueParameters = func.getValueParameters() val valueParameters = func.getValueParameters()
val parameterString = valueParameters.map({descriptor -> "" + descriptor.getName() + val parameterString = valueParameters.map({descriptor -> "" + descriptor.getName() +
": " + DescriptorRenderer.SOURCE_CODE.renderType(descriptor.getType()) ": " + IdeDescriptorRenderers.SOURCE_CODE.renderType(descriptor.getType())
}).makeString(", ", "(", ")") }).makeString(", ", "(", ")")
val psiFactory = JetPsiFactory(element) val psiFactory = JetPsiFactory(element)
val newParameterList = psiFactory.createParameterList(parameterString) val newParameterList = psiFactory.createParameterList(parameterString)
@@ -87,7 +87,7 @@ public class MakeTypeExplicitInLambdaIntention : JetSelfTargetingIntention<JetFu
if (hasImplicitReturnType(element) && expectedReturnType != null) { if (hasImplicitReturnType(element) && expectedReturnType != null) {
val paramList = functionLiteral.getValueParameterList() val paramList = functionLiteral.getValueParameterList()
val returnTypeColon = psiFactory.createColon() val returnTypeColon = psiFactory.createColon()
val returnTypeExpr = psiFactory.createType(DescriptorRenderer.SOURCE_CODE.renderType(expectedReturnType)) val returnTypeExpr = psiFactory.createType(IdeDescriptorRenderers.SOURCE_CODE.renderType(expectedReturnType))
functionLiteral.addAfter(returnTypeExpr, paramList) functionLiteral.addAfter(returnTypeExpr, paramList)
functionLiteral.addAfter(returnTypeColon, paramList) functionLiteral.addAfter(returnTypeColon, paramList)
ShortenReferences.process(functionLiteral.getTypeReference()!!) ShortenReferences.process(functionLiteral.getTypeReference()!!)
@@ -96,7 +96,7 @@ public class MakeTypeExplicitInLambdaIntention : JetSelfTargetingIntention<JetFu
// Step 3: make the receiver type explicit // Step 3: make the receiver type explicit
val expectedReceiverType = func.getExtensionReceiverParameter()?.getType() val expectedReceiverType = func.getExtensionReceiverParameter()?.getType()
if (hasImplicitReceiverType(element) && expectedReceiverType != null) { if (hasImplicitReceiverType(element) && expectedReceiverType != null) {
val receiverTypeString = DescriptorRenderer.SOURCE_CODE.renderType(expectedReceiverType) val receiverTypeString = IdeDescriptorRenderers.SOURCE_CODE.renderType(expectedReceiverType)
val dot = functionLiteral.addBefore(psiFactory.createDot(), functionLiteral.getValueParameterList()) val dot = functionLiteral.addBefore(psiFactory.createDot(), functionLiteral.getValueParameterList())
functionLiteral.addBefore(psiFactory.createType(receiverTypeString), dot) functionLiteral.addBefore(psiFactory.createType(receiverTypeString), dot)
ShortenReferences.process(functionLiteral.getReceiverTypeReference()!!) ShortenReferences.process(functionLiteral.getReceiverTypeReference()!!)
@@ -28,7 +28,7 @@ import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.plugin.JetBundle; import org.jetbrains.jet.plugin.JetBundle;
import org.jetbrains.jet.plugin.codeInsight.ShortenReferences; import org.jetbrains.jet.plugin.codeInsight.ShortenReferences;
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache;
import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers;
import static org.jetbrains.jet.lang.psi.PsiPackage.JetPsiFactory; import static org.jetbrains.jet.lang.psi.PsiPackage.JetPsiFactory;
@@ -45,7 +45,7 @@ public class ReconstructTypeInCastOrIsAction extends PsiElementBaseIntentionActi
assert typeRef != null : "Must be checked by isAvailable(): " + element; assert typeRef != null : "Must be checked by isAvailable(): " + element;
JetType type = getReconstructedType(typeRef); JetType type = getReconstructedType(typeRef);
JetTypeReference newType = JetPsiFactory(typeRef).createType(DescriptorRenderer.SOURCE_CODE.renderType(type)); JetTypeReference newType = JetPsiFactory(typeRef).createType(IdeDescriptorRenderers.SOURCE_CODE.renderType(type));
JetTypeReference replaced = (JetTypeReference) typeRef.replace(newType); JetTypeReference replaced = (JetTypeReference) typeRef.replace(newType);
ShortenReferences.INSTANCE$.process(replaced); ShortenReferences.INSTANCE$.process(replaced);
} }
@@ -42,6 +42,7 @@ import org.jetbrains.jet.lang.types.TypeUtils;
import org.jetbrains.jet.plugin.JetBundle; import org.jetbrains.jet.plugin.JetBundle;
import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage; import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage;
import org.jetbrains.jet.plugin.codeInsight.ShortenReferences; import org.jetbrains.jet.plugin.codeInsight.ShortenReferences;
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers;
import org.jetbrains.jet.plugin.util.UtilPackage; import org.jetbrains.jet.plugin.util.UtilPackage;
import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.renderer.DescriptorRenderer;
@@ -173,12 +174,12 @@ public class SpecifyTypeExplicitlyAction extends PsiElementBaseIntentionAction {
) { ) {
@Override @Override
protected String getLookupString(JetType element) { protected String getLookupString(JetType element) {
return DescriptorRenderer.SHORT_NAMES_IN_TYPES.renderType(UtilPackage.approximateFlexibleTypes(element, true)); return IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.renderType(element);
} }
@Override @Override
protected String getResult(JetType element) { protected String getResult(JetType element) {
return DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(UtilPackage.approximateFlexibleTypes(element, true)); return IdeDescriptorRenderers.SOURCE_CODE.renderType(element);
} }
}; };
@@ -20,11 +20,11 @@ import org.jetbrains.jet.lang.psi.*
import org.jetbrains.jet.lang.types.JetType import org.jetbrains.jet.lang.types.JetType
import org.jetbrains.jet.lang.resolve.BindingContext import org.jetbrains.jet.lang.resolve.BindingContext
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
import org.jetbrains.jet.renderer.DescriptorRenderer
import org.jetbrains.jet.plugin.codeInsight.ShortenReferences import org.jetbrains.jet.plugin.codeInsight.ShortenReferences
import org.jetbrains.jet.JetNodeTypes import org.jetbrains.jet.JetNodeTypes
import org.jetbrains.jet.lexer.JetTokens import org.jetbrains.jet.lexer.JetTokens
import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
fun specifyTypeExplicitly(declaration: JetNamedFunction, typeText: String) { fun specifyTypeExplicitly(declaration: JetNamedFunction, typeText: String) {
specifyTypeExplicitly(declaration, JetPsiFactory(declaration).createType(typeText)) specifyTypeExplicitly(declaration, JetPsiFactory(declaration).createType(typeText))
@@ -32,7 +32,7 @@ fun specifyTypeExplicitly(declaration: JetNamedFunction, typeText: String) {
fun specifyTypeExplicitly(declaration: JetNamedFunction, `type`: JetType) { fun specifyTypeExplicitly(declaration: JetNamedFunction, `type`: JetType) {
if (`type`.isError()) return if (`type`.isError()) return
val typeReference = JetPsiFactory(declaration).createType(DescriptorRenderer.SOURCE_CODE.renderType(`type`)) val typeReference = JetPsiFactory(declaration).createType(IdeDescriptorRenderers.SOURCE_CODE.renderType(`type`))
specifyTypeExplicitly(declaration, typeReference) specifyTypeExplicitly(declaration, typeReference)
ShortenReferences.process(declaration.getTypeReference()!!) ShortenReferences.process(declaration.getTypeReference()!!)
} }
@@ -36,7 +36,7 @@ import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns;
import org.jetbrains.jet.plugin.JetBundle; import org.jetbrains.jet.plugin.JetBundle;
import org.jetbrains.jet.plugin.actions.JetAddFunctionToClassifierAction; import org.jetbrains.jet.plugin.actions.JetAddFunctionToClassifierAction;
import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage; import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage;
import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers;
import java.util.Collections; import java.util.Collections;
import java.util.Comparator; import java.util.Comparator;
@@ -125,7 +125,7 @@ public class AddFunctionToSupertypeFix extends JetHintAction<JetNamedFunction> {
FunctionDescriptor newFunction = functionsToAdd.get(0); FunctionDescriptor newFunction = functionsToAdd.get(0);
ClassDescriptor supertype = (ClassDescriptor) newFunction.getContainingDeclaration(); ClassDescriptor supertype = (ClassDescriptor) newFunction.getContainingDeclaration();
return JetBundle.message("add.function.to.type.action.single", return JetBundle.message("add.function.to.type.action.single",
DescriptorRenderer.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(newFunction), IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(newFunction),
supertype.getName().toString()); supertype.getName().toString());
} }
else { else {
@@ -50,6 +50,7 @@ import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
import org.jetbrains.jet.plugin.JetBundle; import org.jetbrains.jet.plugin.JetBundle;
import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage; import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage;
import org.jetbrains.jet.plugin.codeInsight.ShortenReferences; import org.jetbrains.jet.plugin.codeInsight.ShortenReferences;
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers;
import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.renderer.DescriptorRenderer;
import org.jetbrains.jet.renderer.DescriptorRendererBuilder; import org.jetbrains.jet.renderer.DescriptorRendererBuilder;
@@ -358,7 +359,7 @@ public class ChangeMemberFunctionSignatureFix extends JetHintAction<JetNamedFunc
} }
private void changeSignature(FunctionDescriptor patternDescriptor) { private void changeSignature(FunctionDescriptor patternDescriptor) {
final String signatureString = DescriptorRenderer.SOURCE_CODE.render(patternDescriptor); final String signatureString = IdeDescriptorRenderers.SOURCE_CODE.render(patternDescriptor);
PsiDocumentManager.getInstance(project).commitAllDocuments(); PsiDocumentManager.getInstance(project).commitAllDocuments();
@@ -29,7 +29,7 @@ import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.NamePackage; import org.jetbrains.jet.lang.resolve.name.NamePackage;
import org.jetbrains.jet.plugin.project.ProjectStructureUtil; import org.jetbrains.jet.plugin.project.ProjectStructureUtil;
import org.jetbrains.jet.plugin.references.JetReference; import org.jetbrains.jet.plugin.references.JetReference;
import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers;
import org.jetbrains.k2js.analyze.TopDownAnalyzerFacadeForJS; import org.jetbrains.k2js.analyze.TopDownAnalyzerFacadeForJS;
import java.util.List; import java.util.List;
@@ -87,7 +87,7 @@ public class ImportInsertHelper {
Document document = PsiDocumentManager.getInstance(file.getProject()).getDocument(file); Document document = PsiDocumentManager.getInstance(file.getProject()).getDocument(file);
assert document != null; assert document != null;
TextRange refRange = reference.getElement().getTextRange(); TextRange refRange = reference.getElement().getTextRange();
document.replaceString(refRange.getStartOffset(), refRange.getEndOffset(), DescriptorRenderer.SOURCE_CODE.renderFqName(importFqn)); document.replaceString(refRange.getStartOffset(), refRange.getEndOffset(), IdeDescriptorRenderers.SOURCE_CODE.renderFqName(importFqn));
} }
return; return;
} }
@@ -54,6 +54,7 @@ import org.jetbrains.jet.plugin.JetBundle;
import org.jetbrains.jet.plugin.codeInsight.CodeInsightUtils; import org.jetbrains.jet.plugin.codeInsight.CodeInsightUtils;
import org.jetbrains.jet.plugin.codeInsight.DescriptorToDeclarationUtil; import org.jetbrains.jet.plugin.codeInsight.DescriptorToDeclarationUtil;
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache;
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers;
import org.jetbrains.jet.plugin.util.UtilPackage; import org.jetbrains.jet.plugin.util.UtilPackage;
import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.renderer.DescriptorRenderer;
@@ -94,7 +95,7 @@ public class JetRefactoringUtil {
@NotNull @NotNull
public static String formatClassDescriptor(@NotNull DeclarationDescriptor classDescriptor) { public static String formatClassDescriptor(@NotNull DeclarationDescriptor classDescriptor) {
return DescriptorRenderer.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(classDescriptor); return IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(classDescriptor);
} }
@NotNull @NotNull
@@ -169,7 +170,7 @@ public class JetRefactoringUtil {
String message = JetBundle.message( String message = JetBundle.message(
"x.overrides.y.in.class.list", "x.overrides.y.in.class.list",
DescriptorRenderer.COMPACT.render(declarationDescriptor), DescriptorRenderer.COMPACT.render(declarationDescriptor),
DescriptorRenderer.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(declarationDescriptor.getContainingDeclaration()), IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(declarationDescriptor.getContainingDeclaration()),
superClassesStr, superClassesStr,
JetBundle.message(actionStringKey) JetBundle.message(actionStringKey)
); );
@@ -19,7 +19,6 @@ package org.jetbrains.jet.plugin.refactoring.extractFunction
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.jet.lang.types.* import org.jetbrains.jet.lang.types.*
import org.jetbrains.jet.lang.psi.* import org.jetbrains.jet.lang.psi.*
import org.jetbrains.jet.renderer.DescriptorRenderer
import org.jetbrains.jet.lang.descriptors.* import org.jetbrains.jet.lang.descriptors.*
import org.jetbrains.jet.plugin.refactoring.JetRefactoringBundle import org.jetbrains.jet.plugin.refactoring.JetRefactoringBundle
import org.jetbrains.jet.lang.psi.psiUtil.isInsideOf import org.jetbrains.jet.lang.psi.psiUtil.isInsideOf
@@ -67,16 +66,17 @@ import org.jetbrains.jet.plugin.refactoring.extractFunction.OutputValue.Jump
import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.traverseFollowingInstructions import org.jetbrains.jet.lang.cfg.pseudocodeTraverser.traverseFollowingInstructions
import org.jetbrains.jet.plugin.refactoring.extractFunction.OutputValueBoxer.AsList import org.jetbrains.jet.plugin.refactoring.extractFunction.OutputValueBoxer.AsList
import org.jetbrains.jet.plugin.refactoring.getContextForContainingDeclarationBody import org.jetbrains.jet.plugin.refactoring.getContextForContainingDeclarationBody
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
private val DEFAULT_FUNCTION_NAME = "myFun" private val DEFAULT_FUNCTION_NAME = "myFun"
private val DEFAULT_RETURN_TYPE = KotlinBuiltIns.getInstance().getUnitType() private val DEFAULT_RETURN_TYPE = KotlinBuiltIns.getInstance().getUnitType()
private val DEFAULT_PARAMETER_TYPE = KotlinBuiltIns.getInstance().getNullableAnyType() private val DEFAULT_PARAMETER_TYPE = KotlinBuiltIns.getInstance().getNullableAnyType()
private fun DeclarationDescriptor.renderForMessage(): String = private fun DeclarationDescriptor.renderForMessage(): String =
DescriptorRenderer.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(this) IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(this)
private fun JetType.renderForMessage(): String = private fun JetType.renderForMessage(): String =
DescriptorRenderer.SOURCE_CODE.renderType(this) IdeDescriptorRenderers.SOURCE_CODE.renderType(this)
private fun JetDeclaration.renderForMessage(bindingContext: BindingContext): String? = private fun JetDeclaration.renderForMessage(bindingContext: BindingContext): String? =
bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, this]?.renderForMessage() bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, this]?.renderForMessage()
@@ -33,7 +33,7 @@ import org.jetbrains.jet.plugin.refactoring.JetNameSuggester;
import org.jetbrains.jet.plugin.refactoring.JetRefactoringBundle; import org.jetbrains.jet.plugin.refactoring.JetRefactoringBundle;
import org.jetbrains.jet.plugin.refactoring.RefactoringPackage; import org.jetbrains.jet.plugin.refactoring.RefactoringPackage;
import org.jetbrains.jet.plugin.refactoring.extractFunction.*; import org.jetbrains.jet.plugin.refactoring.extractFunction.*;
import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers;
import javax.swing.*; import javax.swing.*;
import java.awt.event.ActionEvent; import java.awt.event.ActionEvent;
@@ -111,7 +111,7 @@ public class KotlinExtractFunctionDialog extends DialogWrapper {
setOKActionEnabled(checkNames()); setOKActionEnabled(checkNames());
signaturePreviewField.setText( signaturePreviewField.setText(
ExtractFunctionPackage.getDeclarationText(currentDescriptor, getGeneratorOptions(), false, ExtractFunctionPackage.getDeclarationText(currentDescriptor, getGeneratorOptions(), false,
DescriptorRenderer.SOURCE_CODE_SHORT_NAMES_IN_TYPES) IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES)
); );
} }
@@ -63,6 +63,7 @@ import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage;
import org.jetbrains.jet.plugin.codeInsight.ShortenReferences; import org.jetbrains.jet.plugin.codeInsight.ShortenReferences;
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache;
import org.jetbrains.jet.plugin.project.ResolveSessionForBodies; import org.jetbrains.jet.plugin.project.ResolveSessionForBodies;
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers;
import org.jetbrains.jet.plugin.util.UtilPackage; import org.jetbrains.jet.plugin.util.UtilPackage;
import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.renderer.DescriptorRenderer;
@@ -357,7 +358,7 @@ public class KotlinInlineValHandler extends InlineActionHandler {
return StringUtil.join(typeArguments, new Function<JetType, String>() { return StringUtil.join(typeArguments, new Function<JetType, String>() {
@Override @Override
public String fun(JetType type) { public String fun(JetType type) {
return DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(UtilPackage.approximateFlexibleTypes(type, true)); return IdeDescriptorRenderers.SOURCE_CODE.renderType(type);
} }
}, ", "); }, ", ");
} }
@@ -41,6 +41,7 @@ import org.jetbrains.jet.lang.resolve.BindingContext;
import org.jetbrains.jet.plugin.JetBundle; import org.jetbrains.jet.plugin.JetBundle;
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache; import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache;
import org.jetbrains.jet.plugin.refactoring.JetRefactoringUtil; import org.jetbrains.jet.plugin.refactoring.JetRefactoringUtil;
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers;
import org.jetbrains.jet.renderer.DescriptorRenderer; import org.jetbrains.jet.renderer.DescriptorRenderer;
import javax.swing.*; import javax.swing.*;
@@ -98,7 +99,7 @@ class KotlinOverridingDialog extends DialogWrapper {
return JetBundle.message( return JetBundle.message(
"x.in.y", "x.in.y",
DescriptorRenderer.COMPACT.render(declarationDescriptor), DescriptorRenderer.COMPACT.render(declarationDescriptor),
DescriptorRenderer.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(containingDescriptor) IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(containingDescriptor)
); );
} }
} }
@@ -0,0 +1,52 @@
/*
* 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.util;
import kotlin.Function1;
import org.jetbrains.jet.lang.types.JetType;
import org.jetbrains.jet.renderer.DescriptorRenderer;
import org.jetbrains.jet.renderer.DescriptorRendererBuilder;
public class IdeDescriptorRenderers {
public static final Function1<JetType, JetType> APPROXIMATE_FLEXIBLE_TYPES = new Function1<JetType, JetType>() {
@Override
public JetType invoke(JetType type) {
return UtilPackage.approximateFlexibleTypes(type, true);
}
};
public static final DescriptorRenderer SOURCE_CODE = new DescriptorRendererBuilder()
.setNormalizedVisibilities(true)
.setWithDefinedIn(false)
.setShortNames(false)
.setShowInternalKeyword(false)
.setOverrideRenderingPolicy(DescriptorRenderer.OverrideRenderingPolicy.RENDER_OVERRIDE)
.setUnitReturnType(false)
.setTypeNormalizer(APPROXIMATE_FLEXIBLE_TYPES)
.build();
public static final DescriptorRenderer SOURCE_CODE_SHORT_NAMES_IN_TYPES = new DescriptorRendererBuilder()
.setNormalizedVisibilities(true)
.setWithDefinedIn(false)
.setShortNames(true)
.setShowInternalKeyword(false)
.setOverrideRenderingPolicy(DescriptorRenderer.OverrideRenderingPolicy.RENDER_OVERRIDE)
.setUnitReturnType(false)
.setTypeNormalizer(APPROXIMATE_FLEXIBLE_TYPES)
.build();
}
@@ -88,6 +88,7 @@ import org.jetbrains.jet.lang.psi.JetProperty
import org.jetbrains.jet.lang.psi.JetDelegatorToSuperClass import org.jetbrains.jet.lang.psi.JetDelegatorToSuperClass
import org.jetbrains.jet.lang.psi.JetDelegationSpecifier import org.jetbrains.jet.lang.psi.JetDelegationSpecifier
import org.jetbrains.jet.plugin.refactoring.getContextForContainingDeclarationBody import org.jetbrains.jet.plugin.refactoring.getContextForContainingDeclarationBody
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
public trait UnificationResult { public trait UnificationResult {
public enum class Status { public enum class Status {
@@ -564,7 +565,7 @@ public class JetPsiUnifier(
fun resolveAndSortDeclarationsByDescriptor(declarations: List<JetDeclaration>): List<Pair<JetDeclaration, DeclarationDescriptor?>> { fun resolveAndSortDeclarationsByDescriptor(declarations: List<JetDeclaration>): List<Pair<JetDeclaration, DeclarationDescriptor?>> {
return declarations return declarations
.map { it to it.bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, it] } .map { it to it.bindingContext[BindingContext.DECLARATION_TO_DESCRIPTOR, it] }
.sortBy { it.second?.let { DescriptorRenderer.SOURCE_CODE.render(it) } ?: "" } .sortBy { it.second?.let { IdeDescriptorRenderers.SOURCE_CODE.render(it) } ?: "" }
} }
fun sortDeclarationsByElementType(declarations: List<JetDeclaration>): List<JetDeclaration> { fun sortDeclarationsByElementType(declarations: List<JetDeclaration>): List<JetDeclaration> {
@@ -1,7 +1,7 @@
package foo package foo
class Impl : Bar() { class Impl : Bar() {
override fun f(): Any { override fun f(): Any? {
<selection><caret>return super<Bar>.f()</selection> <selection><caret>return super<Bar>.f()</selection>
} }
} }
@@ -11,7 +11,7 @@ class A {
if (declarationDescriptor is CallableMemberDescriptor) { if (declarationDescriptor is CallableMemberDescriptor) {
val containingDescriptor = declarationDescriptor.getContainingDeclaration() val containingDescriptor = declarationDescriptor.getContainingDeclaration()
if (containingDescriptor is ClassDescriptor) { if (containingDescriptor is ClassDescriptor) {
return JetBundle.message("x.in.y", DescriptorRenderer.COMPACT.render(declarationDescriptor), DescriptorRenderer.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(containingDescriptor)) return JetBundle.message("x.in.y", DescriptorRenderer.COMPACT.render(declarationDescriptor), IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(containingDescriptor))
} }
} }
} }
@@ -12,7 +12,7 @@ class A {
return JetBundle.message( return JetBundle.message(
"x.in.y", "x.in.y",
DescriptorRenderer.COMPACT.render(declarationDescriptor), DescriptorRenderer.COMPACT.render(declarationDescriptor),
DescriptorRenderer.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(containingDescriptor) IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(containingDescriptor)
); );
} }
} }