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
@@ -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 + ")?";