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);
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));
return true;
}
@@ -51,7 +51,7 @@ public final class ImportPath {
}
public String getPathStr() {
return DescriptorRenderer.SOURCE_CODE.renderFqName(fqName) + (isAllUnder ? ".*" : "");
return DescriptorRenderer.FQ_NAMES_IN_TYPES.renderFqName(fqName) + (isAllUnder ? ".*" : "");
}
@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.ValueParameterDescriptor;
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.Name;
import org.jetbrains.jet.lang.types.JetType;
@@ -32,22 +31,6 @@ import java.util.List;
public interface DescriptorRenderer extends Renderer<DeclarationDescriptor> {
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()
.setWithDefinedIn(false)
.setModifiers().build();
@@ -16,9 +16,11 @@
package org.jetbrains.jet.renderer;
import kotlin.Function1;
import kotlin.KotlinPackage;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.types.JetType;
import java.util.Collection;
import java.util.Collections;
@@ -43,6 +45,12 @@ public class DescriptorRendererBuilder {
private boolean withoutFunctionParameterNames = false;
private boolean withoutTypeParameters = false;
private boolean withoutSuperTypes = false;
private Function1<JetType, JetType> typeNormalizer = new Function1<JetType, JetType>() {
@Override
public JetType invoke(JetType type) {
return type;
}
};
@NotNull
private DescriptorRenderer.OverrideRenderingPolicy overrideRenderingPolicy = DescriptorRenderer.OverrideRenderingPolicy.RENDER_OPEN;
@@ -201,6 +209,12 @@ public class DescriptorRendererBuilder {
return this;
}
@NotNull
public DescriptorRendererBuilder setTypeNormalizer(@NotNull Function1<JetType, JetType> typeNormalizer) {
this.typeNormalizer = typeNormalizer;
return this;
}
@NotNull
public DescriptorRenderer build() {
return new DescriptorRendererImpl(
@@ -208,7 +222,7 @@ public class DescriptorRendererBuilder {
normalizedVisibilities, showInternalKeyword, prettyFunctionTypes, uninferredTypeParameterAsName,
overrideRenderingPolicy, valueParametersHandler, textFormat, excludedAnnotationClasses, includePropertyConstant,
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;
public class DescriptorRendererImpl implements DescriptorRenderer {
private final Function1<JetType, JetType> typeNormalizer;
private final boolean shortNames;
private final boolean withDefinedIn;
private final Set<DescriptorRenderer.Modifier> modifiers;
@@ -98,7 +99,8 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
boolean withoutTypeParameters,
boolean receiverAfterName,
boolean renderClassObjectName,
boolean withoutSuperTypes
boolean withoutSuperTypes,
Function1<JetType, JetType> typeNormalizer
) {
this.shortNames = shortNames;
this.withDefinedIn = withDefinedIn;
@@ -123,6 +125,7 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
this.receiverAfterName = receiverAfterName;
this.renderClassObjectName = renderClassObjectName;
this.withoutSuperTypes = withoutSuperTypes;
this.typeNormalizer = typeNormalizer;
}
/* FORMATTING */
@@ -293,19 +296,24 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
@NotNull
@Override
public String renderType(@NotNull JetType type) {
return renderNormalizedType(typeNormalizer.invoke(type));
}
@NotNull
private String renderNormalizedType(@NotNull JetType type) {
if (type.isFlexible()) {
if (!debugMode) {
return renderFlexibleType(type);
}
else {
return "(" + renderType(type.getLowerBound()) + ".." + renderType(type.getUpperBound()) + ")";
return "(" + renderNormalizedType(type.getLowerBound()) + ".." + renderNormalizedType(type.getUpperBound()) + ")";
}
}
return renderInflexibleType(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) {
return "???";
@@ -364,7 +372,7 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
kotlinPrefix + "Array<(out) "
);
if (array != null) return array;
return "(" + renderType(lower) + ".." + renderType(upper) + ")";
return "(" + renderNormalizedType(lower) + ".." + renderNormalizedType(upper) + ")";
}
@Nullable
@@ -438,7 +446,7 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
if (typeProjection.getProjectionKind() != Variance.INVARIANT) {
builder.append(typeProjection.getProjectionKind()).append(" ");
}
builder.append(renderType(typeProjection.getType()));
builder.append(renderNormalizedType(typeProjection.getType()));
if (iterator.hasNext()) {
builder.append(", ");
}
@@ -451,14 +459,14 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
JetType receiverType = KotlinBuiltIns.getInstance().getReceiverType(type);
if (receiverType != null) {
sb.append(renderType(receiverType));
sb.append(renderNormalizedType(receiverType));
sb.append(".");
}
sb.append("(");
appendTypeProjections(KotlinBuiltIns.getInstance().getParameterTypeProjectionsFromFunctionType(type), sb);
sb.append(") ").append(arrow()).append(" ");
sb.append(renderType(KotlinBuiltIns.getInstance().getReturnTypeFromFunctionType(type)));
sb.append(renderNormalizedType(KotlinBuiltIns.getInstance().getReturnTypeFromFunctionType(type)));
if (type.isNullable()) {
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.codeInsight.DescriptorToDeclarationUtil;
import org.jetbrains.jet.plugin.codeInsight.ShortenReferences;
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers;
import org.jetbrains.jet.renderer.DescriptorRenderer;
import javax.swing.*;
@@ -74,7 +75,7 @@ public class JetAddFunctionToClassifierAction implements QuestionAction {
@NotNull final ClassDescriptor typeDescriptor,
@NotNull final FunctionDescriptor functionDescriptor
) {
final String signatureString = DescriptorRenderer.SOURCE_CODE.render(functionDescriptor);
final String signatureString = IdeDescriptorRenderers.SOURCE_CODE.render(functionDescriptor);
PsiDocumentManager.getInstance(project).commitAllDocuments();
@@ -158,7 +159,7 @@ public class JetAddFunctionToClassifierAction implements QuestionAction {
public String getTextFor(FunctionDescriptor functionDescriptor) {
ClassDescriptor type = (ClassDescriptor) functionDescriptor.getContainingDeclaration();
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());
}
};
@@ -30,6 +30,8 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.jet.lang.psi.*;
import org.jetbrains.jet.lang.types.JetType;
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.List;
@@ -64,6 +64,7 @@ import org.jetbrains.jet.utils.*
import org.jetbrains.jet.renderer.DescriptorRenderer
import org.jetbrains.jet.lang.resolve.descriptorUtil.isExtension
import com.intellij.openapi.progress.ProcessCanceledException
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
//NOTE: this class is based on CopyPasteReferenceProcessor and JavaCopyPasteReferenceProcessor
public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor<ReferenceTransferableData>() {
@@ -332,7 +333,7 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor<Refere
fun lengthenReference(expression: JetElement, fqName: FqName) {
assert(canLengthenReferenceExpression(expression, fqName))
val parent = expression.getParent()
val prefixToInsert = DescriptorRenderer.SOURCE_CODE.renderFqName(fqName.parent())
val prefixToInsert = IdeDescriptorRenderers.SOURCE_CODE.renderFqName(fqName.parent())
val psiFactory = JetPsiFactory(expression)
if (parent is JetCallExpression) {
val text = "$prefixToInsert.${parent.getText()}"
@@ -345,7 +346,7 @@ public class KotlinCopyPasteReferenceProcessor() : CopyPastePostProcessor<Refere
typeReference!!.replace(psiFactory.createType("$prefixToInsert.${typeReference.getText()}"))
}
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.plugin.caches.resolve.ResolvePackage;
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.DescriptorRendererBuilder;
@@ -58,7 +59,9 @@ public abstract class OverrideImplementMethodsHandler implements LanguageCodeIns
.setWithDefinedIn(false)
.setShortNames(false)
.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());
@@ -23,11 +23,11 @@ import com.intellij.openapi.progress.ProcessCanceledException
import com.intellij.codeInsight.completion.CompletionService
import com.intellij.codeInsight.completion.CompletionProgressIndicator
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.PackageFragmentDescriptor
import org.jetbrains.jet.lang.descriptors.ClassKind
import org.jetbrains.jet.lang.descriptors.DeclarationDescriptor
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
enum class ItemPriority {
MULTIPLE_ARGUMENTS_ITEM
@@ -65,14 +65,14 @@ fun rethrowWithCancelIndicator(exception: ProcessCanceledException): ProcessCanc
fun qualifiedNameForSourceCode(descriptor: ClassDescriptor): String? {
val name = descriptor.getName()
if (name.isSpecial()) return null
val nameString = DescriptorRenderer.SOURCE_CODE.renderName(name)
val nameString = IdeDescriptorRenderers.SOURCE_CODE.renderName(name)
val qualifier = qualifierName(descriptor.getContainingDeclaration())
return if (qualifier != null && qualifier != "") qualifier + "." + nameString else nameString
}
private fun qualifierName(descriptor: DeclarationDescriptor): String? = when (descriptor) {
is ClassDescriptor -> if (descriptor.getKind() != ClassKind.CLASS_OBJECT) qualifiedNameForSourceCode(descriptor) else qualifierName(descriptor.getContainingDeclaration())
is PackageViewDescriptor -> DescriptorRenderer.SOURCE_CODE.renderFqName(descriptor.getFqName())
is PackageFragmentDescriptor -> DescriptorRenderer.SOURCE_CODE.renderFqName(descriptor.fqName)
is PackageViewDescriptor -> IdeDescriptorRenderers.SOURCE_CODE.renderFqName(descriptor.getFqName())
is PackageFragmentDescriptor -> IdeDescriptorRenderers.SOURCE_CODE.renderFqName(descriptor.fqName)
else -> null
}
@@ -38,6 +38,7 @@ import org.jetbrains.jet.lang.psi.psiUtil.getCallNameExpression
import com.intellij.psi.PsiElement
import com.intellij.codeInsight.completion.InsertHandler
import org.jetbrains.jet.lang.resolve.name.Name
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
object NamedParametersCompletion {
private val positionFilter = AndFilter(
@@ -109,7 +110,7 @@ object NamedParametersCompletion {
}
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.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.completion.InsertionContext
import org.jetbrains.jet.plugin.completion.DeclarationLookupObject
import org.jetbrains.jet.renderer.DescriptorRenderer
import com.intellij.openapi.util.TextRange
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
open class BaseDeclarationInsertHandler : InsertHandler<LookupElement> {
override fun handleInsert(context: InsertionContext, item: LookupElement) {
val descriptor = (item.getObject() as? DeclarationLookupObject)?.descriptor
if (descriptor != null) {
val name = descriptor.getName()
val nameInCode = DescriptorRenderer.SOURCE_CODE.renderName(name)
val nameInCode = IdeDescriptorRenderers.SOURCE_CODE.renderName(name)
val document = context.getDocument()
val needEscaping = nameInCode != name.asString()
// 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.codeInsight.completion.InsertionContext
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.util.Computable
import com.intellij.codeInsight.template.TemplateManager
import com.intellij.openapi.util.TextRange
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.util.application.runWriteAction
import org.jetbrains.jet.plugin.refactoring.EmptyValidator
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
fun insertLambdaTemplate(context: InsertionContext, placeholderRange: TextRange, lambdaType: JetType) {
val explicitParameterTypes = needExplicitParameterTypes(context, placeholderRange, lambdaType)
@@ -118,7 +117,7 @@ private fun buildTemplate(lambdaType: JetType, explicitParameterTypes: Boolean,
//TODO: check for names in scope
template.addVariable(ParameterNameExpression(JetNameSuggester.suggestNames(parameterType, EmptyValidator, "p")), true)
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 org.jetbrains.jet.lang.types.checker.JetTypeChecker
import com.intellij.ui.LayeredIcon
import org.jetbrains.jet.renderer.DescriptorRenderer
import com.intellij.codeInsight.lookup.LookupElementBuilder
import org.jetbrains.jet.plugin.completion.Tail
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.lang.descriptors.VariableDescriptor
import org.jetbrains.jet.plugin.completion.PositionalArgumentExpectedInfo
import org.jetbrains.jet.plugin.completion.assignPriority
import java.util.ArrayList
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
import org.jetbrains.jet.plugin.completion.assignPriority
class MultipleArgumentsItemProvider(val bindingContext: BindingContext,
val typesWithAutoCasts: (DeclarationDescriptor) -> Iterable<JetType>) {
@@ -75,7 +75,7 @@ class MultipleArgumentsItemProvider(val bindingContext: BindingContext,
compoundIcon.setIcon(firstIcon, 1, 0, 0)
return LookupElementBuilder
.create(variables.map { DescriptorRenderer.SOURCE_CODE.renderName(it.getName()) }.joinToString(", "))
.create(variables.map { IdeDescriptorRenderers.SOURCE_CODE.renderName(it.getName()) }.joinToString(", "))
.withIcon(compoundIcon)
.addTail(Tail.RPARENTH) //TODO: support square brackets
.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.renderer.DescriptorRenderer
import org.jetbrains.jet.lang.psi.psiUtil.getReceiverExpression
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
class SmartCompletion(val expression: JetSimpleNameExpression,
val resolveSession: ResolveSessionForBodies,
@@ -296,7 +297,7 @@ class SmartCompletion(val expression: JetSimpleNameExpression,
val typeArgs = jetType.getArguments()
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> {
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.completion.qualifiedNameForSourceCode
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
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) {
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.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.Visibilities
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) {
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)
val insertHandler: InsertHandler<LookupElement>
val typeText = qualifiedNameForSourceCode(classifier) + DescriptorRenderer.SOURCE_CODE.renderTypeArguments(typeArgs)
val typeText = qualifiedNameForSourceCode(classifier) + IdeDescriptorRenderers.SOURCE_CODE.renderTypeArguments(typeArgs)
if (isAbstract) {
val constructorParenthesis = if (classifier.getKind() != ClassKind.TRAIT) "()" else ""
itemText += constructorParenthesis
@@ -20,11 +20,11 @@ import org.jetbrains.jet.lang.psi.JetFunctionLiteralExpression
import com.intellij.openapi.editor.Editor
import org.jetbrains.jet.plugin.project.AnalyzerFacadeWithCache
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.psi.JetPsiFactory
import com.intellij.psi.PsiWhiteSpace
import org.jetbrains.jet.plugin.codeInsight.ShortenReferences
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
public class MakeTypeExplicitInLambdaIntention : JetSelfTargetingIntention<JetFunctionLiteralExpression>(
"make.type.explicit.in.lambda", javaClass()) {
@@ -61,7 +61,7 @@ public class MakeTypeExplicitInLambdaIntention : JetSelfTargetingIntention<JetFu
// Step 1: make the parameters types explicit
val valueParameters = func.getValueParameters()
val parameterString = valueParameters.map({descriptor -> "" + descriptor.getName() +
": " + DescriptorRenderer.SOURCE_CODE.renderType(descriptor.getType())
": " + IdeDescriptorRenderers.SOURCE_CODE.renderType(descriptor.getType())
}).makeString(", ", "(", ")")
val psiFactory = JetPsiFactory(element)
val newParameterList = psiFactory.createParameterList(parameterString)
@@ -87,7 +87,7 @@ public class MakeTypeExplicitInLambdaIntention : JetSelfTargetingIntention<JetFu
if (hasImplicitReturnType(element) && expectedReturnType != null) {
val paramList = functionLiteral.getValueParameterList()
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(returnTypeColon, paramList)
ShortenReferences.process(functionLiteral.getTypeReference()!!)
@@ -96,7 +96,7 @@ public class MakeTypeExplicitInLambdaIntention : JetSelfTargetingIntention<JetFu
// Step 3: make the receiver type explicit
val expectedReceiverType = func.getExtensionReceiverParameter()?.getType()
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())
functionLiteral.addBefore(psiFactory.createType(receiverTypeString), dot)
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.codeInsight.ShortenReferences;
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;
@@ -45,7 +45,7 @@ public class ReconstructTypeInCastOrIsAction extends PsiElementBaseIntentionActi
assert typeRef != null : "Must be checked by isAvailable(): " + element;
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);
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.caches.resolve.ResolvePackage;
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.renderer.DescriptorRenderer;
@@ -173,12 +174,12 @@ public class SpecifyTypeExplicitlyAction extends PsiElementBaseIntentionAction {
) {
@Override
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
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.resolve.BindingContext
import org.jetbrains.jet.lang.descriptors.FunctionDescriptor
import org.jetbrains.jet.renderer.DescriptorRenderer
import org.jetbrains.jet.plugin.codeInsight.ShortenReferences
import org.jetbrains.jet.JetNodeTypes
import org.jetbrains.jet.lexer.JetTokens
import org.jetbrains.jet.plugin.caches.resolve.getLazyResolveSession
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
fun specifyTypeExplicitly(declaration: JetNamedFunction, typeText: String) {
specifyTypeExplicitly(declaration, JetPsiFactory(declaration).createType(typeText))
@@ -32,7 +32,7 @@ fun specifyTypeExplicitly(declaration: JetNamedFunction, typeText: String) {
fun specifyTypeExplicitly(declaration: JetNamedFunction, `type`: JetType) {
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)
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.actions.JetAddFunctionToClassifierAction;
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.Comparator;
@@ -125,7 +125,7 @@ public class AddFunctionToSupertypeFix extends JetHintAction<JetNamedFunction> {
FunctionDescriptor newFunction = functionsToAdd.get(0);
ClassDescriptor supertype = (ClassDescriptor) newFunction.getContainingDeclaration();
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());
}
else {
@@ -50,6 +50,7 @@ import org.jetbrains.jet.lang.types.checker.JetTypeChecker;
import org.jetbrains.jet.plugin.JetBundle;
import org.jetbrains.jet.plugin.caches.resolve.ResolvePackage;
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.DescriptorRendererBuilder;
@@ -358,7 +359,7 @@ public class ChangeMemberFunctionSignatureFix extends JetHintAction<JetNamedFunc
}
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();
@@ -29,7 +29,7 @@ import org.jetbrains.jet.lang.resolve.name.FqName;
import org.jetbrains.jet.lang.resolve.name.NamePackage;
import org.jetbrains.jet.plugin.project.ProjectStructureUtil;
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 java.util.List;
@@ -87,7 +87,7 @@ public class ImportInsertHelper {
Document document = PsiDocumentManager.getInstance(file.getProject()).getDocument(file);
assert document != null;
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;
}
@@ -54,6 +54,7 @@ import org.jetbrains.jet.plugin.JetBundle;
import org.jetbrains.jet.plugin.codeInsight.CodeInsightUtils;
import org.jetbrains.jet.plugin.codeInsight.DescriptorToDeclarationUtil;
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.renderer.DescriptorRenderer;
@@ -94,7 +95,7 @@ public class JetRefactoringUtil {
@NotNull
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
@@ -169,7 +170,7 @@ public class JetRefactoringUtil {
String message = JetBundle.message(
"x.overrides.y.in.class.list",
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,
JetBundle.message(actionStringKey)
);
@@ -19,7 +19,6 @@ package org.jetbrains.jet.plugin.refactoring.extractFunction
import com.intellij.psi.PsiElement
import org.jetbrains.jet.lang.types.*
import org.jetbrains.jet.lang.psi.*
import org.jetbrains.jet.renderer.DescriptorRenderer
import org.jetbrains.jet.lang.descriptors.*
import org.jetbrains.jet.plugin.refactoring.JetRefactoringBundle
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.plugin.refactoring.extractFunction.OutputValueBoxer.AsList
import org.jetbrains.jet.plugin.refactoring.getContextForContainingDeclarationBody
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
private val DEFAULT_FUNCTION_NAME = "myFun"
private val DEFAULT_RETURN_TYPE = KotlinBuiltIns.getInstance().getUnitType()
private val DEFAULT_PARAMETER_TYPE = KotlinBuiltIns.getInstance().getNullableAnyType()
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 =
DescriptorRenderer.SOURCE_CODE.renderType(this)
IdeDescriptorRenderers.SOURCE_CODE.renderType(this)
private fun JetDeclaration.renderForMessage(bindingContext: BindingContext): String? =
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.RefactoringPackage;
import org.jetbrains.jet.plugin.refactoring.extractFunction.*;
import org.jetbrains.jet.renderer.DescriptorRenderer;
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers;
import javax.swing.*;
import java.awt.event.ActionEvent;
@@ -111,7 +111,7 @@ public class KotlinExtractFunctionDialog extends DialogWrapper {
setOKActionEnabled(checkNames());
signaturePreviewField.setText(
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.project.AnalyzerFacadeWithCache;
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.renderer.DescriptorRenderer;
@@ -357,7 +358,7 @@ public class KotlinInlineValHandler extends InlineActionHandler {
return StringUtil.join(typeArguments, new Function<JetType, String>() {
@Override
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.project.AnalyzerFacadeWithCache;
import org.jetbrains.jet.plugin.refactoring.JetRefactoringUtil;
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers;
import org.jetbrains.jet.renderer.DescriptorRenderer;
import javax.swing.*;
@@ -98,7 +99,7 @@ class KotlinOverridingDialog extends DialogWrapper {
return JetBundle.message(
"x.in.y",
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.JetDelegationSpecifier
import org.jetbrains.jet.plugin.refactoring.getContextForContainingDeclarationBody
import org.jetbrains.jet.plugin.util.IdeDescriptorRenderers
public trait UnificationResult {
public enum class Status {
@@ -564,7 +565,7 @@ public class JetPsiUnifier(
fun resolveAndSortDeclarationsByDescriptor(declarations: List<JetDeclaration>): List<Pair<JetDeclaration, DeclarationDescriptor?>> {
return declarations
.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> {
@@ -1,7 +1,7 @@
package foo
class Impl : Bar() {
override fun f(): Any {
override fun f(): Any? {
<selection><caret>return super<Bar>.f()</selection>
}
}
@@ -11,7 +11,7 @@ class A {
if (declarationDescriptor is CallableMemberDescriptor) {
val containingDescriptor = declarationDescriptor.getContainingDeclaration()
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(
"x.in.y",
DescriptorRenderer.COMPACT.render(declarationDescriptor),
DescriptorRenderer.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(containingDescriptor)
IdeDescriptorRenderers.SOURCE_CODE_SHORT_NAMES_IN_TYPES.render(containingDescriptor)
);
}
}