Better parameters naming and order in DescriptorRendererImpl.

This commit is contained in:
Evgeny Gerashchenko
2012-12-25 02:25:02 +04:00
parent 4517113bd3
commit e95bcbcc97
@@ -94,12 +94,12 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
} }
@NotNull @NotNull
private String escape(@NotNull String s) { private String escape(@NotNull String string) {
switch (textFormat) { switch (textFormat) {
case PLAIN: case PLAIN:
return s; return string;
case HTML: case HTML:
return s.replaceAll("<", "&lt;").replaceAll(">", "&gt;"); return string.replaceAll("<", "&lt;").replaceAll(">", "&gt;");
} }
throw new IllegalStateException("Unexpected textFormat: " + textFormat); throw new IllegalStateException("Unexpected textFormat: " + textFormat);
} }
@@ -128,8 +128,8 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
return escape(KEYWORDS.contains(asString) ? '`' + asString + '`' : asString); return escape(KEYWORDS.contains(asString) ? '`' + asString + '`' : asString);
} }
private void renderName(@NotNull DeclarationDescriptor descriptor, @NotNull StringBuilder stringBuilder) { private void renderName(@NotNull DeclarationDescriptor descriptor, @NotNull StringBuilder builder) {
stringBuilder.append(renderName(descriptor.getName())); builder.append(renderName(descriptor.getName()));
} }
@NotNull @NotNull
@@ -205,7 +205,7 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
sb.append(renderTypeName(type.getConstructor())); sb.append(renderTypeName(type.getConstructor()));
if (!type.getArguments().isEmpty()) { if (!type.getArguments().isEmpty()) {
sb.append("<"); sb.append("<");
appendTypeProjections(sb, type.getArguments()); appendTypeProjections(type.getArguments(), sb);
sb.append(">"); sb.append(">");
} }
if (type.isNullable()) { if (type.isNullable()) {
@@ -229,15 +229,15 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
} }
} }
private void appendTypeProjections(@NotNull StringBuilder result, @NotNull List<TypeProjection> typeProjections) { private void appendTypeProjections(@NotNull List<TypeProjection> typeProjections, @NotNull StringBuilder builder) {
for (Iterator<TypeProjection> iterator = typeProjections.iterator(); iterator.hasNext(); ) { for (Iterator<TypeProjection> iterator = typeProjections.iterator(); iterator.hasNext(); ) {
TypeProjection typeProjection = iterator.next(); TypeProjection typeProjection = iterator.next();
if (typeProjection.getProjectionKind() != Variance.INVARIANT) { if (typeProjection.getProjectionKind() != Variance.INVARIANT) {
result.append(typeProjection.getProjectionKind()).append(" "); builder.append(typeProjection.getProjectionKind()).append(" ");
} }
result.append(renderType(typeProjection.getType())); builder.append(renderType(typeProjection.getType()));
if (iterator.hasNext()) { if (iterator.hasNext()) {
result.append(", "); builder.append(", ");
} }
} }
} }
@@ -253,7 +253,7 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
} }
sb.append("("); sb.append("(");
appendTypeProjections(sb, KotlinBuiltIns.getInstance().getParameterTypeProjectionsFromFunctionType(type)); appendTypeProjections(KotlinBuiltIns.getInstance().getParameterTypeProjectionsFromFunctionType(type), sb);
sb.append(") -> "); sb.append(") -> ");
sb.append(renderType(KotlinBuiltIns.getInstance().getReturnTypeFromFunctionType(type))); sb.append(renderType(KotlinBuiltIns.getInstance().getReturnTypeFromFunctionType(type)));
@@ -265,17 +265,17 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
/* METHODS FOR ALL KINDS OF DESCRIPTORS */ /* METHODS FOR ALL KINDS OF DESCRIPTORS */
private void appendDefinedIn(@NotNull DeclarationDescriptor declarationDescriptor, @NotNull StringBuilder stringBuilder) { private void appendDefinedIn(@NotNull DeclarationDescriptor descriptor, @NotNull StringBuilder builder) {
if (declarationDescriptor instanceof ModuleDescriptor) { if (descriptor instanceof ModuleDescriptor) {
stringBuilder.append(" is a module"); builder.append(" is a module");
return; return;
} }
stringBuilder.append(" ").append(renderMessage("defined in")).append(" "); builder.append(" ").append(renderMessage("defined in")).append(" ");
final DeclarationDescriptor containingDeclaration = declarationDescriptor.getContainingDeclaration(); final DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration();
if (containingDeclaration != null) { if (containingDeclaration != null) {
FqNameUnsafe fqName = DescriptorUtils.getFQName(containingDeclaration); FqNameUnsafe fqName = DescriptorUtils.getFQName(containingDeclaration);
stringBuilder.append(FqName.ROOT.equalsTo(fqName) ? "root package" : renderFqName(fqName)); builder.append(FqName.ROOT.equalsTo(fqName) ? "root package" : renderFqName(fqName));
} }
} }
@@ -316,28 +316,28 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
/* TYPE PARAMETERS */ /* TYPE PARAMETERS */
private void renderTypeParameter(@NotNull TypeParameterDescriptor descriptor, @NotNull StringBuilder builder, boolean topLevel) { private void renderTypeParameter(@NotNull TypeParameterDescriptor typeParameter, @NotNull StringBuilder builder, boolean topLevel) {
if (topLevel) { if (topLevel) {
builder.append(lt()); builder.append(lt());
} }
if (descriptor.isReified()) { if (typeParameter.isReified()) {
builder.append(renderKeyword("reified")).append(" "); builder.append(renderKeyword("reified")).append(" ");
} }
String variance = descriptor.getVariance().toString(); String variance = typeParameter.getVariance().toString();
if (!variance.isEmpty()) { if (!variance.isEmpty()) {
builder.append(renderKeyword(variance)).append(" "); builder.append(renderKeyword(variance)).append(" ");
} }
renderName(descriptor, builder); renderName(typeParameter, builder);
if (descriptor.getUpperBounds().size() == 1) { if (typeParameter.getUpperBounds().size() == 1) {
JetType upperBound = descriptor.getUpperBounds().iterator().next(); JetType upperBound = typeParameter.getUpperBounds().iterator().next();
if (!KotlinBuiltIns.getInstance().getDefaultBound().equals(upperBound)) { if (!KotlinBuiltIns.getInstance().getDefaultBound().equals(upperBound)) {
builder.append(" : ").append(renderType(upperBound)); builder.append(" : ").append(renderType(upperBound));
} }
} }
else if (topLevel) { else if (topLevel) {
boolean first = true; boolean first = true;
for (JetType upperBound : descriptor.getUpperBounds()) { for (JetType upperBound : typeParameter.getUpperBounds()) {
if (upperBound.equals(KotlinBuiltIns.getInstance().getDefaultBound())) { if (upperBound.equals(KotlinBuiltIns.getInstance().getDefaultBound())) {
continue; continue;
} }
@@ -360,7 +360,11 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
} }
} }
private void renderTypeParameters(@NotNull List<TypeParameterDescriptor> typeParameters, boolean withSpace, @NotNull StringBuilder builder) { private void renderTypeParameters(
@NotNull List<TypeParameterDescriptor> typeParameters,
@NotNull StringBuilder builder,
boolean withSpace
) {
if (!typeParameters.isEmpty()) { if (!typeParameters.isEmpty()) {
builder.append(lt()); builder.append(lt());
for (Iterator<TypeParameterDescriptor> iterator = typeParameters.iterator(); iterator.hasNext(); ) { for (Iterator<TypeParameterDescriptor> iterator = typeParameters.iterator(); iterator.hasNext(); ) {
@@ -378,37 +382,37 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
} }
/* FUNCTIONS */ /* FUNCTIONS */
private void renderFunction(@NotNull FunctionDescriptor descriptor, @NotNull StringBuilder builder) { private void renderFunction(@NotNull FunctionDescriptor function, @NotNull StringBuilder builder) {
if (!startFromName) { if (!startFromName) {
renderAnnotations(descriptor, builder); renderAnnotations(function, builder);
renderVisibility(descriptor.getVisibility(), builder); renderVisibility(function.getVisibility(), builder);
renderModality(descriptor.getModality(), builder); renderModality(function.getModality(), builder);
builder.append(renderKeyword("fun")).append(" "); builder.append(renderKeyword("fun")).append(" ");
renderTypeParameters(descriptor.getTypeParameters(), true, builder); renderTypeParameters(function.getTypeParameters(), builder, true);
ReceiverParameterDescriptor receiver = descriptor.getReceiverParameter(); ReceiverParameterDescriptor receiver = function.getReceiverParameter();
if (receiver != null) { if (receiver != null) {
builder.append(escape(renderType(receiver.getType()))).append("."); builder.append(escape(renderType(receiver.getType()))).append(".");
} }
} }
renderName(descriptor, builder); renderName(function, builder);
renderValueParameters(descriptor, builder); renderValueParameters(function, builder);
builder.append(" : ").append(escape(renderType(descriptor.getReturnType()))); builder.append(" : ").append(escape(renderType(function.getReturnType())));
renderWhereSuffix(descriptor.getTypeParameters(), builder); renderWhereSuffix(function.getTypeParameters(), builder);
} }
private void renderConstructor(@NotNull ConstructorDescriptor constructorDescriptor, @NotNull StringBuilder builder) { private void renderConstructor(@NotNull ConstructorDescriptor constructor, @NotNull StringBuilder builder) {
renderAnnotations(constructorDescriptor, builder); renderAnnotations(constructor, builder);
renderVisibility(constructorDescriptor.getVisibility(), builder); renderVisibility(constructor.getVisibility(), builder);
builder.append(renderKeyword("ctor")).append(" "); builder.append(renderKeyword("ctor")).append(" ");
ClassDescriptor classDescriptor = constructorDescriptor.getContainingDeclaration(); ClassDescriptor classDescriptor = constructor.getContainingDeclaration();
renderName(classDescriptor, builder); renderName(classDescriptor, builder);
renderTypeParameters(classDescriptor.getTypeConstructor().getParameters(), false, builder); renderTypeParameters(classDescriptor.getTypeConstructor().getParameters(), builder, false);
renderValueParameters(constructorDescriptor, builder); renderValueParameters(constructor, builder);
} }
private void renderWhereSuffix(@NotNull List<TypeParameterDescriptor> typeParameters, @NotNull StringBuilder builder) { private void renderWhereSuffix(@NotNull List<TypeParameterDescriptor> typeParameters, @NotNull StringBuilder builder) {
@@ -452,25 +456,25 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
} }
/* VARIABLES */ /* VARIABLES */
private void renderValueParameter(@NotNull ValueParameterDescriptor descriptor, @NotNull StringBuilder builder, boolean topLevel) { private void renderValueParameter(@NotNull ValueParameterDescriptor valueParameter, @NotNull StringBuilder builder, boolean topLevel) {
if (topLevel) { if (topLevel) {
builder.append(renderKeyword("value-parameter")).append(" "); builder.append(renderKeyword("value-parameter")).append(" ");
} }
renderVariable(descriptor, builder, topLevel); renderVariable(valueParameter, builder, topLevel);
boolean withDefaultValue = debugMode ? descriptor.declaresDefaultValue() : descriptor.hasDefaultValue(); boolean withDefaultValue = debugMode ? valueParameter.declaresDefaultValue() : valueParameter.hasDefaultValue();
if (withDefaultValue) { if (withDefaultValue) {
builder.append(" = ..."); builder.append(" = ...");
} }
} }
private void renderValVarPrefix(@NotNull VariableDescriptor descriptor, @NotNull StringBuilder builder) { private void renderValVarPrefix(@NotNull VariableDescriptor variable, @NotNull StringBuilder builder) {
builder.append(renderKeyword(descriptor.isVar() ? "var" : "val")).append(" "); builder.append(renderKeyword(variable.isVar() ? "var" : "val")).append(" ");
} }
private void renderVariable(@NotNull VariableDescriptor descriptor, @NotNull StringBuilder builder, boolean topLevel) { private void renderVariable(@NotNull VariableDescriptor variable, @NotNull StringBuilder builder, boolean topLevel) {
JetType type = descriptor.getType(); JetType type = variable.getType();
if (descriptor instanceof ValueParameterDescriptor) { if (variable instanceof ValueParameterDescriptor) {
JetType varargElementType = ((ValueParameterDescriptor) descriptor).getVarargElementType(); JetType varargElementType = ((ValueParameterDescriptor) variable).getVarargElementType();
if (varargElementType != null) { if (varargElementType != null) {
builder.append(renderKeyword("vararg")).append(" "); builder.append(renderKeyword("vararg")).append(" ");
type = varargElementType; type = varargElementType;
@@ -478,65 +482,65 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
} }
if (topLevel && !startFromName) { if (topLevel && !startFromName) {
renderValVarPrefix(descriptor, builder); renderValVarPrefix(variable, builder);
} }
renderName(descriptor, builder); renderName(variable, builder);
builder.append(" : ").append(escape(renderType(type))); builder.append(" : ").append(escape(renderType(type)));
} }
private void renderProperty(@NotNull PropertyDescriptor descriptor, @NotNull StringBuilder builder) { private void renderProperty(@NotNull PropertyDescriptor property, @NotNull StringBuilder builder) {
if (!startFromName) { if (!startFromName) {
renderAnnotations(descriptor, builder); renderAnnotations(property, builder);
renderVisibility(descriptor.getVisibility(), builder); renderVisibility(property.getVisibility(), builder);
renderModality(descriptor.getModality(), builder); renderModality(property.getModality(), builder);
renderValVarPrefix(descriptor, builder); renderValVarPrefix(property, builder);
} }
renderTypeParameters(descriptor.getTypeParameters(), true, builder); renderTypeParameters(property.getTypeParameters(), builder, true);
ReceiverParameterDescriptor receiver = descriptor.getReceiverParameter(); ReceiverParameterDescriptor receiver = property.getReceiverParameter();
if (receiver != null) { if (receiver != null) {
builder.append(escape(renderType(receiver.getType()))).append("."); builder.append(escape(renderType(receiver.getType()))).append(".");
} }
renderName(descriptor, builder); renderName(property, builder);
builder.append(" : ").append(escape(renderType(descriptor.getType()))); builder.append(" : ").append(escape(renderType(property.getType())));
renderWhereSuffix(descriptor.getTypeParameters(), builder); renderWhereSuffix(property.getTypeParameters(), builder);
} }
/* CLASSES */ /* CLASSES */
private void renderClass(@NotNull ClassDescriptor descriptor, @NotNull StringBuilder builder) { private void renderClass(@NotNull ClassDescriptor klass, @NotNull StringBuilder builder) {
boolean classObject = descriptor.getKind() == ClassKind.CLASS_OBJECT; boolean classObject = klass.getKind() == ClassKind.CLASS_OBJECT;
if (!startFromName) { if (!startFromName) {
if (!classObject) { if (!classObject) {
renderAnnotations(descriptor, builder); renderAnnotations(klass, builder);
renderVisibility(descriptor.getVisibility(), builder); renderVisibility(klass.getVisibility(), builder);
if (descriptor.getKind() != ClassKind.TRAIT && descriptor.getKind() != ClassKind.OBJECT) { if (klass.getKind() != ClassKind.TRAIT && klass.getKind() != ClassKind.OBJECT) {
renderModality(descriptor.getModality(), builder); renderModality(klass.getModality(), builder);
} }
} }
builder.append(renderKeyword(getClassKindPrefix(descriptor))); builder.append(renderKeyword(getClassKindPrefix(klass)));
if (!classObject) { if (!classObject) {
builder.append(" "); builder.append(" ");
} }
} }
List<TypeParameterDescriptor> typeParameters = descriptor.getTypeConstructor().getParameters(); List<TypeParameterDescriptor> typeParameters = klass.getTypeConstructor().getParameters();
if (!classObject) { if (!classObject) {
renderName(descriptor, builder); renderName(klass, builder);
renderTypeParameters(typeParameters, false, builder); renderTypeParameters(typeParameters, builder, false);
if (classWithPrimaryConstructor) { if (classWithPrimaryConstructor) {
ConstructorDescriptor primaryConstructor = descriptor.getUnsubstitutedPrimaryConstructor(); ConstructorDescriptor primaryConstructor = klass.getUnsubstitutedPrimaryConstructor();
if (primaryConstructor != null) { if (primaryConstructor != null) {
renderValueParameters(primaryConstructor, builder); renderValueParameters(primaryConstructor, builder);
} }
} }
} }
if (!descriptor.equals(KotlinBuiltIns.getInstance().getNothing())) { if (!klass.equals(KotlinBuiltIns.getInstance().getNothing())) {
Collection<JetType> supertypes = descriptor.getTypeConstructor().getSupertypes(); Collection<JetType> supertypes = klass.getTypeConstructor().getSupertypes();
if (supertypes.isEmpty() || supertypes.size() == 1 && KotlinBuiltIns.getInstance().isAny(supertypes.iterator().next())) { if (supertypes.isEmpty() || supertypes.size() == 1 && KotlinBuiltIns.getInstance().isAny(supertypes.iterator().next())) {
} }
else { else {
@@ -555,8 +559,8 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
} }
@NotNull @NotNull
private static String getClassKindPrefix(@NotNull ClassDescriptor descriptor) { private static String getClassKindPrefix(@NotNull ClassDescriptor klass) {
switch (descriptor.getKind()) { switch (klass.getKind()) {
case CLASS: case CLASS:
return "class"; return "class";
case TRAIT: case TRAIT:
@@ -572,19 +576,19 @@ public class DescriptorRendererImpl implements DescriptorRenderer {
case ENUM_ENTRY: case ENUM_ENTRY:
return "enum entry"; return "enum entry";
default: default:
throw new IllegalStateException("unknown class kind: " + descriptor.getKind()); throw new IllegalStateException("unknown class kind: " + klass.getKind());
} }
} }
/* OTHER */ /* OTHER */
private void renderModuleOrScript(@NotNull DeclarationDescriptor descriptor, @NotNull StringBuilder builder) { private void renderModuleOrScript(@NotNull DeclarationDescriptor moduleOrScript, @NotNull StringBuilder builder) {
renderName(descriptor, builder); renderName(moduleOrScript, builder);
} }
private void renderNamespace(@NotNull NamespaceDescriptor namespaceDescriptor, @NotNull StringBuilder builder) { private void renderNamespace(@NotNull NamespaceDescriptor namespace, @NotNull StringBuilder builder) {
builder.append(renderKeyword(JetTokens.PACKAGE_KEYWORD.getValue())).append(" "); builder.append(renderKeyword(JetTokens.PACKAGE_KEYWORD.getValue())).append(" ");
renderName(namespaceDescriptor, builder); renderName(namespace, builder);
} }