Rename: Renderer -> DiagnosticParameterRenderer and move it out of descriptors module

DescriptorRenderer is no longer a renderer
DescriptorRenderers should not be used to render diagnostic parameters explicitly
This commit is contained in:
Pavel V. Talanov
2016-02-16 18:40:59 +03:00
parent 41f5b5e8b1
commit 4f18b3da53
20 changed files with 197 additions and 329 deletions
@@ -20,9 +20,9 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor; import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages; import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages;
import org.jetbrains.kotlin.diagnostics.rendering.DiagnosticFactoryToRendererMap; import org.jetbrains.kotlin.diagnostics.rendering.DiagnosticFactoryToRendererMap;
import org.jetbrains.kotlin.diagnostics.rendering.DiagnosticParameterRenderer;
import org.jetbrains.kotlin.diagnostics.rendering.Renderers; import org.jetbrains.kotlin.diagnostics.rendering.Renderers;
import org.jetbrains.kotlin.renderer.DescriptorRenderer; import org.jetbrains.kotlin.renderer.DescriptorRenderer;
import org.jetbrains.kotlin.renderer.Renderer;
import java.util.ArrayList; import java.util.ArrayList;
import java.util.Collections; import java.util.Collections;
@@ -30,7 +30,7 @@ import java.util.List;
public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension { public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension {
private static final Renderer<ConflictingJvmDeclarationsData> CONFLICTING_JVM_DECLARATIONS_DATA = new Renderer<ConflictingJvmDeclarationsData>() { private static final DiagnosticParameterRenderer<ConflictingJvmDeclarationsData> CONFLICTING_JVM_DECLARATIONS_DATA = new DiagnosticParameterRenderer<ConflictingJvmDeclarationsData>() {
@NotNull @NotNull
@Override @Override
public String render(@NotNull ConflictingJvmDeclarationsData data) { public String render(@NotNull ConflictingJvmDeclarationsData data) {
@@ -1,39 +0,0 @@
/*
* Copyright 2010-2015 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.kotlin.diagnostics.rendering;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.diagnostics.Diagnostic;
import java.text.MessageFormat;
public abstract class AbstractDiagnosticWithParametersRenderer<D extends Diagnostic> implements DiagnosticRenderer<D> {
@NotNull private final MessageFormat messageFormat;
protected AbstractDiagnosticWithParametersRenderer(@NotNull String message) {
messageFormat = new MessageFormat(message);
}
@NotNull
@Override
public String render(@NotNull D diagnostic) {
return messageFormat.format(renderParameters(diagnostic));
}
@NotNull
public abstract Object[] renderParameters(@NotNull D diagnostic);
}
@@ -17,7 +17,6 @@
package org.jetbrains.kotlin.diagnostics.rendering; package org.jetbrains.kotlin.diagnostics.rendering;
import com.intellij.openapi.extensions.ExtensionPointName; import com.intellij.openapi.extensions.ExtensionPointName;
import kotlin.Unit;
import kotlin.jvm.functions.Function1; import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
@@ -30,8 +29,6 @@ import org.jetbrains.kotlin.psi.KtExpression;
import org.jetbrains.kotlin.psi.KtSimpleNameExpression; import org.jetbrains.kotlin.psi.KtSimpleNameExpression;
import org.jetbrains.kotlin.psi.KtTypeConstraint; import org.jetbrains.kotlin.psi.KtTypeConstraint;
import org.jetbrains.kotlin.renderer.DescriptorRenderer; import org.jetbrains.kotlin.renderer.DescriptorRenderer;
import org.jetbrains.kotlin.renderer.DescriptorRendererOptions;
import org.jetbrains.kotlin.renderer.Renderer;
import org.jetbrains.kotlin.resolve.varianceChecker.VarianceChecker.VarianceConflictDiagnosticData; import org.jetbrains.kotlin.resolve.varianceChecker.VarianceChecker.VarianceConflictDiagnosticData;
import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.KotlinType;
import org.jetbrains.kotlin.util.MappedExtensionProvider; import org.jetbrains.kotlin.util.MappedExtensionProvider;
@@ -44,7 +41,6 @@ import java.util.List;
import static org.jetbrains.kotlin.diagnostics.Errors.*; import static org.jetbrains.kotlin.diagnostics.Errors.*;
import static org.jetbrains.kotlin.diagnostics.rendering.Renderers.*; import static org.jetbrains.kotlin.diagnostics.rendering.Renderers.*;
import static org.jetbrains.kotlin.renderer.DescriptorRenderer.*;
public class DefaultErrorMessages { public class DefaultErrorMessages {
@@ -95,18 +91,6 @@ public class DefaultErrorMessages {
return null; return null;
} }
public static final DescriptorRenderer DEPRECATION_RENDERER = DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES.withOptions(
new Function1<DescriptorRendererOptions, Unit>() {
@Override
public Unit invoke(DescriptorRendererOptions options) {
options.setWithoutTypeParameters(false);
options.setReceiverAfterName(false);
options.setRenderAccessors(true);
return Unit.INSTANCE;
}
}
);
static { static {
MAP.put(UNRESOLVED_REFERENCE, "Unresolved reference: {0}", ELEMENT_TEXT); MAP.put(UNRESOLVED_REFERENCE, "Unresolved reference: {0}", ELEMENT_TEXT);
@@ -143,7 +127,7 @@ public class DefaultErrorMessages {
} }
}); });
MAP.put(MEMBER_PROJECTED_OUT, "Out-projected type ''{1}'' prohibits the use of ''{0}''", DescriptorRenderer.FQ_NAMES_IN_TYPES, RENDER_TYPE); MAP.put(MEMBER_PROJECTED_OUT, "Out-projected type ''{1}'' prohibits the use of ''{0}''", FQ_NAMES_IN_TYPES, RENDER_TYPE);
MAP.put(INCOMPATIBLE_MODIFIERS, "Modifier ''{0}'' is incompatible with ''{1}''", TO_STRING, TO_STRING); MAP.put(INCOMPATIBLE_MODIFIERS, "Modifier ''{0}'' is incompatible with ''{1}''", TO_STRING, TO_STRING);
MAP.put(DEPRECATED_MODIFIER_PAIR, "Modifier ''{0}'' is deprecated in presence of ''{1}''", TO_STRING, TO_STRING); MAP.put(DEPRECATED_MODIFIER_PAIR, "Modifier ''{0}'' is deprecated in presence of ''{1}''", TO_STRING, TO_STRING);
MAP.put(REPEATED_MODIFIER, "Repeated ''{0}''", TO_STRING); MAP.put(REPEATED_MODIFIER, "Repeated ''{0}''", TO_STRING);
@@ -188,7 +172,7 @@ public class DefaultErrorMessages {
MAP.put(MIXING_NAMED_AND_POSITIONED_ARGUMENTS, "Mixing named and positioned arguments is not allowed"); MAP.put(MIXING_NAMED_AND_POSITIONED_ARGUMENTS, "Mixing named and positioned arguments is not allowed");
MAP.put(ARGUMENT_PASSED_TWICE, "An argument is already passed for this parameter"); MAP.put(ARGUMENT_PASSED_TWICE, "An argument is already passed for this parameter");
MAP.put(NAMED_PARAMETER_NOT_FOUND, "Cannot find a parameter with this name: {0}", ELEMENT_TEXT); MAP.put(NAMED_PARAMETER_NOT_FOUND, "Cannot find a parameter with this name: {0}", ELEMENT_TEXT);
MAP.put(NAMED_ARGUMENTS_NOT_ALLOWED, "Named arguments are not allowed for {0}", new Renderer<BadNamedArgumentsTarget>() { MAP.put(NAMED_ARGUMENTS_NOT_ALLOWED, "Named arguments are not allowed for {0}", new DiagnosticParameterRenderer<BadNamedArgumentsTarget>() {
@NotNull @NotNull
@Override @Override
public String render(@NotNull BadNamedArgumentsTarget target) { public String render(@NotNull BadNamedArgumentsTarget target) {
@@ -404,7 +388,7 @@ public class DefaultErrorMessages {
MAP.put(IMPLICIT_CAST_TO_ANY, "Conditional branch result of type {0} is implicitly cast to {1}", MAP.put(IMPLICIT_CAST_TO_ANY, "Conditional branch result of type {0} is implicitly cast to {1}",
RENDER_TYPE, RENDER_TYPE); RENDER_TYPE, RENDER_TYPE);
MAP.put(EXPRESSION_EXPECTED, "{0} is not an expression, and only expressions are allowed here", new Renderer<KtExpression>() { MAP.put(EXPRESSION_EXPECTED, "{0} is not an expression, and only expressions are allowed here", new DiagnosticParameterRenderer<KtExpression>() {
@NotNull @NotNull
@Override @Override
public String render(@NotNull KtExpression expression) { public String render(@NotNull KtExpression expression) {
@@ -500,7 +484,7 @@ public class DefaultErrorMessages {
MAP.put(UNEXPECTED_SAFE_CALL, "Safe-call is not allowed here"); MAP.put(UNEXPECTED_SAFE_CALL, "Safe-call is not allowed here");
MAP.put(UNNECESSARY_NOT_NULL_ASSERTION, "Unnecessary non-null assertion (!!) on a non-null receiver of type {0}", RENDER_TYPE); MAP.put(UNNECESSARY_NOT_NULL_ASSERTION, "Unnecessary non-null assertion (!!) on a non-null receiver of type {0}", RENDER_TYPE);
MAP.put(NOT_NULL_ASSERTION_ON_LAMBDA_EXPRESSION, "Non-null assertion (!!) is called on a lambda expression"); MAP.put(NOT_NULL_ASSERTION_ON_LAMBDA_EXPRESSION, "Non-null assertion (!!) is called on a lambda expression");
MAP.put(NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER, "{0} does not refer to a type parameter of {1}", new Renderer<KtTypeConstraint>() { MAP.put(NAME_IN_CONSTRAINT_IS_NOT_A_TYPE_PARAMETER, "{0} does not refer to a type parameter of {1}", new DiagnosticParameterRenderer<KtTypeConstraint>() {
@NotNull @NotNull
@Override @Override
public String render(@NotNull KtTypeConstraint typeConstraint) { public String render(@NotNull KtTypeConstraint typeConstraint) {
@@ -561,7 +545,7 @@ public class DefaultErrorMessages {
MAP.put(INCONSISTENT_TYPE_PARAMETER_VALUES, "Type parameter {0} of ''{1}'' has inconsistent values: {2}", NAME, NAME, RENDER_COLLECTION_OF_TYPES); MAP.put(INCONSISTENT_TYPE_PARAMETER_VALUES, "Type parameter {0} of ''{1}'' has inconsistent values: {2}", NAME, NAME, RENDER_COLLECTION_OF_TYPES);
MAP.put(INCONSISTENT_TYPE_PARAMETER_BOUNDS, "Type parameter {0} of ''{1}'' has inconsistent bounds: {2}", NAME, NAME, RENDER_COLLECTION_OF_TYPES); MAP.put(INCONSISTENT_TYPE_PARAMETER_BOUNDS, "Type parameter {0} of ''{1}'' has inconsistent bounds: {2}", NAME, NAME, RENDER_COLLECTION_OF_TYPES);
MAP.put(EQUALITY_NOT_APPLICABLE, "Operator ''{0}'' cannot be applied to ''{1}'' and ''{2}''", new Renderer<KtSimpleNameExpression>() { MAP.put(EQUALITY_NOT_APPLICABLE, "Operator ''{0}'' cannot be applied to ''{1}'' and ''{2}''", new DiagnosticParameterRenderer<KtSimpleNameExpression>() {
@NotNull @NotNull
@Override @Override
public String render(@NotNull KtSimpleNameExpression nameExpression) { public String render(@NotNull KtSimpleNameExpression nameExpression) {
@@ -616,7 +600,7 @@ public class DefaultErrorMessages {
MAP.put(FUNCTION_EXPECTED, "Expression ''{0}''{1} cannot be invoked as a function. " + MAP.put(FUNCTION_EXPECTED, "Expression ''{0}''{1} cannot be invoked as a function. " +
"The function '" + OperatorNameConventions.INVOKE.asString() + "()' is not found", "The function '" + OperatorNameConventions.INVOKE.asString() + "()' is not found",
ELEMENT_TEXT, new Renderer<KotlinType>() { ELEMENT_TEXT, new DiagnosticParameterRenderer<KotlinType>() {
@NotNull @NotNull
@Override @Override
public String render(@NotNull KotlinType type) { public String render(@NotNull KotlinType type) {
@@ -624,7 +608,7 @@ public class DefaultErrorMessages {
return " of type '" + RENDER_TYPE.render(type) + "'"; return " of type '" + RENDER_TYPE.render(type) + "'";
} }
}); });
MAP.put(FUNCTION_CALL_EXPECTED, "Function invocation ''{0}({1})'' expected", ELEMENT_TEXT, new Renderer<Boolean>() { MAP.put(FUNCTION_CALL_EXPECTED, "Function invocation ''{0}({1})'' expected", ELEMENT_TEXT, new DiagnosticParameterRenderer<Boolean>() {
@NotNull @NotNull
@Override @Override
public String render(@NotNull Boolean hasValueParameters) { public String render(@NotNull Boolean hasValueParameters) {
@@ -665,7 +649,7 @@ public class DefaultErrorMessages {
MAP.put(TYPE_INFERENCE_FAILED_ON_SPECIAL_CONSTRUCT, "Type inference for control flow expression failed. Please specify its type explicitly."); MAP.put(TYPE_INFERENCE_FAILED_ON_SPECIAL_CONSTRUCT, "Type inference for control flow expression failed. Please specify its type explicitly.");
MAP.put(WRONG_NUMBER_OF_TYPE_ARGUMENTS, "{0,choice,0#No type arguments|1#Type argument|1<{0,number,integer} type arguments} expected", (Renderer) null); MAP.put(WRONG_NUMBER_OF_TYPE_ARGUMENTS, "{0,choice,0#No type arguments|1#Type argument|1<{0,number,integer} type arguments} expected", (DiagnosticParameterRenderer) null);
MAP.put(NO_TYPE_ARGUMENTS_ON_RHS, "{0,choice,0#No type arguments|1#Type argument|1<{0,number,integer} type arguments} expected. " + MAP.put(NO_TYPE_ARGUMENTS_ON_RHS, "{0,choice,0#No type arguments|1#Type argument|1<{0,number,integer} type arguments} expected. " +
"Use ''{1}'' if you don''t want to pass type arguments", null, STRING); "Use ''{1}'' if you don''t want to pass type arguments", null, STRING);
@@ -20,7 +20,6 @@ import com.intellij.psi.PsiElement;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.diagnostics.*; import org.jetbrains.kotlin.diagnostics.*;
import org.jetbrains.kotlin.renderer.Renderer;
import java.util.HashMap; import java.util.HashMap;
import java.util.Map; import java.util.Map;
@@ -54,29 +53,29 @@ public final class DiagnosticFactoryToRendererMap {
map.put(factory, new SimpleDiagnosticRenderer(message)); map.put(factory, new SimpleDiagnosticRenderer(message));
} }
public <E extends PsiElement, A> void put(@NotNull DiagnosticFactory1<E, A> factory, @NotNull String message, @Nullable Renderer<? super A> rendererA) { public <E extends PsiElement, A> void put(@NotNull DiagnosticFactory1<E, A> factory, @NotNull String message, @Nullable DiagnosticParameterRenderer<? super A> rendererA) {
checkMutability(); checkMutability();
map.put(factory, new DiagnosticWithParameters1Renderer<A>(message, rendererA)); map.put(factory, new DiagnosticWithParameters1Renderer<A>(message, rendererA));
} }
public <E extends PsiElement, A> void put(@NotNull DiagnosticFactory1<E, A> factory, @NotNull String message, @NotNull MultiRenderer<? super A> rendererA) { public <E extends PsiElement, A> void put(@NotNull DiagnosticFactory1<E, A> factory, @NotNull String message, @NotNull MultiRenderer<? super A> rendererA) {
checkMutability(); checkMutability();
map.put(factory, new DiagnosticWithMultiParametersRenderer<A>(message, rendererA)); map.put(factory, new DiagnosticWithParametersMultiRenderer<A>(message, rendererA));
} }
public <E extends PsiElement, A, B> void put(@NotNull DiagnosticFactory2<E, A, B> factory, public <E extends PsiElement, A, B> void put(@NotNull DiagnosticFactory2<E, A, B> factory,
@NotNull String message, @NotNull String message,
@Nullable Renderer<? super A> rendererA, @Nullable DiagnosticParameterRenderer<? super A> rendererA,
@Nullable Renderer<? super B> rendererB) { @Nullable DiagnosticParameterRenderer<? super B> rendererB) {
checkMutability(); checkMutability();
map.put(factory, new DiagnosticWithParameters2Renderer<A, B>(message, rendererA, rendererB)); map.put(factory, new DiagnosticWithParameters2Renderer<A, B>(message, rendererA, rendererB));
} }
public <E extends PsiElement, A, B, C> void put(@NotNull DiagnosticFactory3<E, A, B, C> factory, public <E extends PsiElement, A, B, C> void put(@NotNull DiagnosticFactory3<E, A, B, C> factory,
@NotNull String message, @NotNull String message,
@Nullable Renderer<? super A> rendererA, @Nullable DiagnosticParameterRenderer<? super A> rendererA,
@Nullable Renderer<? super B> rendererB, @Nullable DiagnosticParameterRenderer<? super B> rendererB,
@Nullable Renderer<? super C> rendererC) { @Nullable DiagnosticParameterRenderer<? super C> rendererC) {
checkMutability(); checkMutability();
map.put(factory, new DiagnosticWithParameters3Renderer<A, B, C>(message, rendererA, rendererB, rendererC)); map.put(factory, new DiagnosticWithParameters3Renderer<A, B, C>(message, rendererA, rendererB, rendererC));
} }
@@ -1,5 +1,5 @@
/* /*
* Copyright 2010-2015 JetBrains s.r.o. * Copyright 2010-2016 JetBrains s.r.o.
* *
* Licensed under the Apache License, Version 2.0 (the "License"); * Licensed under the Apache License, Version 2.0 (the "License");
* you may not use this file except in compliance with the License. * you may not use this file except in compliance with the License.
@@ -14,12 +14,12 @@
* limitations under the License. * limitations under the License.
*/ */
package org.jetbrains.kotlin.renderer package org.jetbrains.kotlin.diagnostics.rendering
interface Renderer<in O> { interface DiagnosticParameterRenderer<in O> {
fun render(obj: O): String fun render(obj: O): String
} }
fun <O> Renderer(block: (O) -> String) = object : Renderer<O> { fun <O> Renderer(block: (O) -> String) = object : DiagnosticParameterRenderer<O> {
override fun render(obj: O) = block(obj) override fun render(obj: O) = block(obj)
} }
@@ -18,10 +18,8 @@ package org.jetbrains.kotlin.diagnostics.rendering;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.diagnostics.Diagnostic; import org.jetbrains.kotlin.diagnostics.Diagnostic;
import org.jetbrains.kotlin.renderer.Renderer;
public interface DiagnosticRenderer<D extends Diagnostic> extends Renderer<D> { public interface DiagnosticRenderer<D extends Diagnostic> {
@NotNull @NotNull
@Override
String render(@NotNull D diagnostic); String render(@NotNull D diagnostic);
} }
@@ -18,9 +18,8 @@ package org.jetbrains.kotlin.diagnostics.rendering
import org.jetbrains.kotlin.descriptors.ClassDescriptor import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.renderer.Renderer
fun <P : Any> renderParameter(parameter: P, renderer: Renderer<P>?): Any = renderer?.render(parameter) ?: parameter fun <P : Any> renderParameter(parameter: P, renderer: DiagnosticParameterRenderer<P>?): Any = renderer?.render(parameter) ?: parameter
fun ClassDescriptor.renderKindWithName(): String = DescriptorRenderer.getClassKindPrefix(this) + " '" + name + "'" fun ClassDescriptor.renderKindWithName(): String = DescriptorRenderer.getClassKindPrefix(this) + " '" + name + "'"
@@ -1,35 +0,0 @@
/*
* Copyright 2010-2015 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.kotlin.diagnostics.rendering;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.kotlin.diagnostics.DiagnosticWithParameters1;
public class DiagnosticWithMultiParametersRenderer<A> extends AbstractDiagnosticWithParametersRenderer<DiagnosticWithParameters1<?,A>> {
@NotNull private final MultiRenderer<? super A> renderersForA;
public DiagnosticWithMultiParametersRenderer(@NotNull String message, @NotNull MultiRenderer<? super A> renderersForA) {
super(message);
this.renderersForA = renderersForA;
}
@NotNull
@Override
public Object[] renderParameters(@NotNull DiagnosticWithParameters1<?, A> diagnostic) {
return renderersForA.render(diagnostic.getA());
}
}
@@ -1,37 +0,0 @@
/*
* Copyright 2010-2015 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.kotlin.diagnostics.rendering;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.diagnostics.DiagnosticWithParameters1;
import org.jetbrains.kotlin.renderer.Renderer;
public class DiagnosticWithParameters1Renderer<A> extends AbstractDiagnosticWithParametersRenderer<DiagnosticWithParameters1<?, A>> {
private final Renderer<? super A> rendererForA;
public DiagnosticWithParameters1Renderer(@NotNull String message, @Nullable Renderer<? super A> rendererForA) {
super(message);
this.rendererForA = rendererForA;
}
@NotNull
@Override
public Object[] renderParameters(@NotNull DiagnosticWithParameters1<?, A> diagnostic) {
return new Object[]{DiagnosticRendererUtilKt.renderParameter(diagnostic.getA(), rendererForA)};
}
}
@@ -1,41 +0,0 @@
/*
* Copyright 2010-2015 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.kotlin.diagnostics.rendering;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.diagnostics.DiagnosticWithParameters2;
import org.jetbrains.kotlin.renderer.Renderer;
public class DiagnosticWithParameters2Renderer<A, B> extends AbstractDiagnosticWithParametersRenderer<DiagnosticWithParameters2<?, A, B>> {
private final Renderer<? super A> rendererForA;
private final Renderer<? super B> rendererForB;
public DiagnosticWithParameters2Renderer(@NotNull String message, @Nullable Renderer<? super A> rendererForA, @Nullable Renderer<? super B> rendererForB) {
super(message);
this.rendererForA = rendererForA;
this.rendererForB = rendererForB;
}
@NotNull
@Override
public Object[] renderParameters(@NotNull DiagnosticWithParameters2<?, A, B> diagnostic) {
return new Object[]{
DiagnosticRendererUtilKt.renderParameter(diagnostic.getA(), rendererForA),
DiagnosticRendererUtilKt.renderParameter(diagnostic.getB(), rendererForB)};
}
}
@@ -1,47 +0,0 @@
/*
* Copyright 2010-2015 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.kotlin.diagnostics.rendering;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.diagnostics.DiagnosticWithParameters3;
import org.jetbrains.kotlin.renderer.Renderer;
public class DiagnosticWithParameters3Renderer<A, B, C> extends AbstractDiagnosticWithParametersRenderer<DiagnosticWithParameters3<?, A, B, C>> {
private final Renderer<? super A> rendererForA;
private final Renderer<? super B> rendererForB;
private final Renderer<? super C> rendererForC;
public DiagnosticWithParameters3Renderer(@NotNull String message,
@Nullable Renderer<? super A> rendererForA,
@Nullable Renderer<? super B> rendererForB,
@Nullable Renderer<? super C> rendererForC) {
super(message);
this.rendererForA = rendererForA;
this.rendererForB = rendererForB;
this.rendererForC = rendererForC;
}
@NotNull
@Override
public Object[] renderParameters(@NotNull DiagnosticWithParameters3<?, A, B, C> diagnostic) {
return new Object[]{
DiagnosticRendererUtilKt.renderParameter(diagnostic.getA(), rendererForA),
DiagnosticRendererUtilKt.renderParameter(diagnostic.getB(), rendererForB),
DiagnosticRendererUtilKt.renderParameter(diagnostic.getC(), rendererForC)};
}
}
@@ -1,24 +0,0 @@
/*
* Copyright 2010-2016 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.kotlin.diagnostics.rendering;
import org.jetbrains.annotations.NotNull;
public interface MultiRenderer<O> {
@NotNull
String[] render(@NotNull O object);
}
@@ -31,7 +31,6 @@ import org.jetbrains.kotlin.psi.KtClass
import org.jetbrains.kotlin.psi.KtClassOrObject import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtNamedDeclaration
import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.renderer.Renderer
import org.jetbrains.kotlin.resolve.DescriptorUtils import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.resolve.MemberComparator import org.jetbrains.kotlin.resolve.MemberComparator
import org.jetbrains.kotlin.resolve.calls.inference.* import org.jetbrains.kotlin.resolve.calls.inference.*
@@ -56,7 +55,7 @@ object Renderers {
private val LOG = Logger.getInstance(Renderers::class.java) private val LOG = Logger.getInstance(Renderers::class.java)
@JvmField val TO_STRING: Renderer<Any> = Renderer { @JvmField val TO_STRING = Renderer<Any> {
element -> element ->
if (element is DeclarationDescriptor) { if (element is DeclarationDescriptor) {
LOG.warn("Diagnostic renderer TO_STRING was used to render an instance of DeclarationDescriptor.\n" LOG.warn("Diagnostic renderer TO_STRING was used to render an instance of DeclarationDescriptor.\n"
@@ -66,17 +65,17 @@ object Renderers {
element.toString() element.toString()
} }
@JvmField val STRING: Renderer<String> = Renderer { it } @JvmField val STRING = Renderer<String> { it }
@JvmField val THROWABLE: Renderer<Throwable> = Renderer { @JvmField val THROWABLE = Renderer<Throwable> {
val writer = StringWriter() val writer = StringWriter()
it.printStackTrace(PrintWriter(writer)) it.printStackTrace(PrintWriter(writer))
StringUtil.first(writer.toString(), 2048, true) StringUtil.first(writer.toString(), 2048, true)
} }
@JvmField val NAME: Renderer<Named> = Renderer { it.name.asString() } @JvmField val NAME = Renderer<Named> { it.name.asString() }
@JvmField val DECLARATION_NAME_WITH_KIND: Renderer<DeclarationDescriptor> = Renderer { @JvmField val DECLARATION_NAME_WITH_KIND = Renderer<DeclarationDescriptor> {
val declarationKindWithSpace = when (it) { val declarationKindWithSpace = when (it) {
is PackageFragmentDescriptor -> "package " is PackageFragmentDescriptor -> "package "
is ClassDescriptor -> "${it.renderKind()} " is ClassDescriptor -> "${it.renderKind()} "
@@ -89,7 +88,7 @@ object Renderers {
"$declarationKindWithSpace'${it.name.asString()}'" "$declarationKindWithSpace'${it.name.asString()}'"
} }
@JvmField val NAME_OF_PARENT_OR_FILE: Renderer<DeclarationDescriptor> = Renderer { @JvmField val NAME_OF_PARENT_OR_FILE = Renderer<DeclarationDescriptor> {
if (DescriptorUtils.isTopLevelDeclaration(it) && it is DeclarationDescriptorWithVisibility && it.visibility == Visibilities.PRIVATE) { if (DescriptorUtils.isTopLevelDeclaration(it) && it is DeclarationDescriptorWithVisibility && it.visibility == Visibilities.PRIVATE) {
"file" "file"
} }
@@ -98,21 +97,21 @@ object Renderers {
} }
} }
@JvmField val ELEMENT_TEXT: Renderer<PsiElement> = Renderer { it.text } @JvmField val ELEMENT_TEXT = Renderer<PsiElement> { it.text }
@JvmField val DECLARATION_NAME: Renderer<KtNamedDeclaration> = Renderer { it.nameAsSafeName.asString() } @JvmField val DECLARATION_NAME = Renderer<KtNamedDeclaration> { it.nameAsSafeName.asString() }
@JvmField val RENDER_CLASS_OR_OBJECT: Renderer<KtClassOrObject> = Renderer { @JvmField val RENDER_CLASS_OR_OBJECT = Renderer {
classOrObject: KtClassOrObject -> classOrObject: KtClassOrObject ->
val name = if (classOrObject.getName() != null) " '" + classOrObject.getName() + "'" else "" val name = if (classOrObject.getName() != null) " '" + classOrObject.getName() + "'" else ""
if (classOrObject is KtClass) "Class" + name else "Object" + name if (classOrObject is KtClass) "Class" + name else "Object" + name
} }
@JvmField val RENDER_CLASS_OR_OBJECT_NAME: Renderer<ClassDescriptor> = Renderer { it.renderKindWithName() } @JvmField val RENDER_CLASS_OR_OBJECT_NAME = Renderer<ClassDescriptor> { it.renderKindWithName() }
@JvmField val RENDER_TYPE: Renderer<KotlinType> = Renderer { DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(it) } @JvmField val RENDER_TYPE = Renderer<KotlinType> { DescriptorRenderer.FQ_NAMES_IN_TYPES.renderType(it) }
@JvmField val RENDER_POSITION_VARIANCE: Renderer<Variance> = Renderer { @JvmField val RENDER_POSITION_VARIANCE = Renderer {
variance: Variance -> variance: Variance ->
when (variance) { when (variance) {
Variance.INVARIANT -> "invariant" Variance.INVARIANT -> "invariant"
@@ -121,7 +120,7 @@ object Renderers {
} }
} }
@JvmField val AMBIGUOUS_CALLS: Renderer<Collection<ResolvedCall<*>>> = Renderer { @JvmField val AMBIGUOUS_CALLS = Renderer {
calls: Collection<ResolvedCall<*>> -> calls: Collection<ResolvedCall<*>> ->
calls calls
.map { it.resultingDescriptor } .map { it.resultingDescriptor }
@@ -129,7 +128,7 @@ object Renderers {
.joinToString(separator = "\n", prefix = "\n") { DescriptorRenderer.FQ_NAMES_IN_TYPES.render(it) } .joinToString(separator = "\n", prefix = "\n") { DescriptorRenderer.FQ_NAMES_IN_TYPES.render(it) }
} }
@JvmStatic fun <T> commaSeparated(itemRenderer: Renderer<T>): Renderer<Collection<T>> = Renderer { @JvmStatic fun <T> commaSeparated(itemRenderer: DiagnosticParameterRenderer<T>) = Renderer<Collection<T>> {
collection -> collection ->
buildString { buildString {
val iterator = collection.iterator() val iterator = collection.iterator()
@@ -143,23 +142,23 @@ object Renderers {
} }
} }
@JvmField val TYPE_INFERENCE_CONFLICTING_SUBSTITUTIONS_RENDERER: Renderer<InferenceErrorData> = Renderer { @JvmField val TYPE_INFERENCE_CONFLICTING_SUBSTITUTIONS_RENDERER = Renderer<InferenceErrorData> {
renderConflictingSubstitutionsInferenceError(it, TabledDescriptorRenderer.create()).toString() renderConflictingSubstitutionsInferenceError(it, TabledDescriptorRenderer.create()).toString()
} }
@JvmField val TYPE_INFERENCE_PARAMETER_CONSTRAINT_ERROR_RENDERER: Renderer<InferenceErrorData> = Renderer { @JvmField val TYPE_INFERENCE_PARAMETER_CONSTRAINT_ERROR_RENDERER = Renderer<InferenceErrorData> {
renderParameterConstraintError(it, TabledDescriptorRenderer.create()).toString() renderParameterConstraintError(it, TabledDescriptorRenderer.create()).toString()
} }
@JvmField val TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER_RENDERER: Renderer<InferenceErrorData> = Renderer { @JvmField val TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER_RENDERER = Renderer<InferenceErrorData> {
renderNoInformationForParameterError(it, TabledDescriptorRenderer.create()).toString() renderNoInformationForParameterError(it, TabledDescriptorRenderer.create()).toString()
} }
@JvmField val TYPE_INFERENCE_UPPER_BOUND_VIOLATED_RENDERER: Renderer<InferenceErrorData> = Renderer { @JvmField val TYPE_INFERENCE_UPPER_BOUND_VIOLATED_RENDERER = Renderer<InferenceErrorData> {
renderUpperBoundViolatedInferenceError(it, TabledDescriptorRenderer.create()).toString() renderUpperBoundViolatedInferenceError(it, TabledDescriptorRenderer.create()).toString()
} }
@JvmField val TYPE_INFERENCE_CANNOT_CAPTURE_TYPES_RENDERER: Renderer<InferenceErrorData> = Renderer { @JvmField val TYPE_INFERENCE_CANNOT_CAPTURE_TYPES_RENDERER = Renderer<InferenceErrorData> {
renderCannotCaptureTypeParameterError(it, TabledDescriptorRenderer.create()).toString() renderCannotCaptureTypeParameterError(it, TabledDescriptorRenderer.create()).toString()
} }
@@ -349,7 +348,7 @@ object Renderers {
return result return result
} }
@JvmField val CLASSES_OR_SEPARATED: Renderer<Collection<ClassDescriptor>> = Renderer { @JvmField val CLASSES_OR_SEPARATED = Renderer<Collection<ClassDescriptor>> {
descriptors -> descriptors ->
buildString { buildString {
var index = 0 var index = 0
@@ -368,9 +367,9 @@ object Renderers {
private fun renderTypes(types: Collection<KotlinType>) = StringUtil.join(types, { RENDER_TYPE.render(it) }, ", ") private fun renderTypes(types: Collection<KotlinType>) = StringUtil.join(types, { RENDER_TYPE.render(it) }, ", ")
@JvmField val RENDER_COLLECTION_OF_TYPES: Renderer<Collection<KotlinType>> = Renderer { renderTypes(it) } @JvmField val RENDER_COLLECTION_OF_TYPES = Renderer<Collection<KotlinType>> { renderTypes(it) }
private fun renderConstraintSystem(constraintSystem: ConstraintSystem, renderTypeBounds: Renderer<TypeBounds>): String { private fun renderConstraintSystem(constraintSystem: ConstraintSystem, renderTypeBounds: DiagnosticParameterRenderer<TypeBounds>): String {
val typeBounds = linkedSetOf<TypeBounds>() val typeBounds = linkedSetOf<TypeBounds>()
for (variable in constraintSystem.typeVariables) { for (variable in constraintSystem.typeVariables) {
typeBounds.add(constraintSystem.getTypeBounds(variable)) typeBounds.add(constraintSystem.getTypeBounds(variable))
@@ -380,9 +379,9 @@ object Renderers {
ConstraintsUtil.getDebugMessageForStatus(constraintSystem.status) ConstraintsUtil.getDebugMessageForStatus(constraintSystem.status)
} }
@JvmField val RENDER_CONSTRAINT_SYSTEM: Renderer<ConstraintSystem> = Renderer { renderConstraintSystem(it, RENDER_TYPE_BOUNDS) } @JvmField val RENDER_CONSTRAINT_SYSTEM = Renderer<ConstraintSystem> { renderConstraintSystem(it, RENDER_TYPE_BOUNDS) }
@JvmField val RENDER_CONSTRAINT_SYSTEM_SHORT: Renderer<ConstraintSystem> = Renderer { renderConstraintSystem(it, RENDER_TYPE_BOUNDS_SHORT) } @JvmField val RENDER_CONSTRAINT_SYSTEM_SHORT = Renderer<ConstraintSystem> { renderConstraintSystem(it, RENDER_TYPE_BOUNDS_SHORT) }
private fun renderTypeBounds(typeBounds: TypeBounds, short: Boolean): String { private fun renderTypeBounds(typeBounds: TypeBounds, short: Boolean): String {
val renderBound = { bound: Bound -> val renderBound = { bound: Bound ->
@@ -399,9 +398,9 @@ object Renderers {
"$typeVariableName ${StringUtil.join(typeBounds.bounds, renderBound, ", ")}" "$typeVariableName ${StringUtil.join(typeBounds.bounds, renderBound, ", ")}"
} }
@JvmField val RENDER_TYPE_BOUNDS: Renderer<TypeBounds> = Renderer { renderTypeBounds(it, short = false) } @JvmField val RENDER_TYPE_BOUNDS = Renderer<TypeBounds> { renderTypeBounds(it, short = false) }
@JvmField val RENDER_TYPE_BOUNDS_SHORT: Renderer<TypeBounds> = Renderer { renderTypeBounds(it, short = true) } @JvmField val RENDER_TYPE_BOUNDS_SHORT = Renderer<TypeBounds> { renderTypeBounds(it, short = true) }
private fun renderDebugMessage(message: String, inferenceErrorData: InferenceErrorData) = buildString { private fun renderDebugMessage(message: String, inferenceErrorData: InferenceErrorData) = buildString {
append(message) append(message)
@@ -425,7 +424,7 @@ object Renderers {
private val WHEN_MISSING_LIMIT = 7 private val WHEN_MISSING_LIMIT = 7
@JvmField val RENDER_WHEN_MISSING_CASES: Renderer<List<WhenMissingCase>> = Renderer { @JvmField val RENDER_WHEN_MISSING_CASES = Renderer<List<WhenMissingCase>> {
if (!it.hasUnknown) { if (!it.hasUnknown) {
val list = it.joinToString(", ", limit = WHEN_MISSING_LIMIT) { "'$it'" } val list = it.joinToString(", ", limit = WHEN_MISSING_LIMIT) { "'$it'" }
val branches = if (it.size > 1) "branches" else "branch" val branches = if (it.size > 1) "branches" else "branch"
@@ -435,4 +434,18 @@ object Renderers {
"'else' branch" "'else' branch"
} }
} }
@JvmField val FQ_NAMES_IN_TYPES = DescriptorRenderer.FQ_NAMES_IN_TYPES.asRenderer()
@JvmField val COMPACT = DescriptorRenderer.COMPACT.asRenderer()
@JvmField val SHORT_NAMES_IN_TYPES = DescriptorRenderer.SHORT_NAMES_IN_TYPES.asRenderer()
@JvmField val COMPACT_WITH_MODIFIERS = DescriptorRenderer.COMPACT_WITH_MODIFIERS.asRenderer()
@JvmField val DEPRECATION_RENDERER = DescriptorRenderer.ONLY_NAMES_WITH_SHORT_TYPES.withOptions {
withoutTypeParameters = false
receiverAfterName = false
renderAccessors = true
}.asRenderer()
}
fun DescriptorRenderer.asRenderer() = Renderer<DeclarationDescriptor> {
render(it)
} }
@@ -27,7 +27,6 @@ import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.Table
import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.TableRenderer.TableRow; import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.TableRenderer.TableRow;
import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.TextRenderer.TextElement; import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.TextRenderer.TextElement;
import org.jetbrains.kotlin.renderer.DescriptorRenderer; import org.jetbrains.kotlin.renderer.DescriptorRenderer;
import org.jetbrains.kotlin.renderer.Renderer;
import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPosition; import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPosition;
import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.KotlinType;
@@ -156,7 +155,7 @@ public class TabledDescriptorRenderer {
} }
@NotNull @NotNull
public Renderer<KotlinType> getTypeRenderer() { public DiagnosticParameterRenderer<KotlinType> getTypeRenderer() {
return Renderers.RENDER_TYPE; return Renderers.RENDER_TYPE;
} }
@@ -0,0 +1,93 @@
/*
* Copyright 2010-2016 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.kotlin.diagnostics.rendering
import org.jetbrains.kotlin.diagnostics.*
import java.text.MessageFormat
abstract class AbstractDiagnosticWithParametersRenderer<D : Diagnostic> protected constructor(message: String) : DiagnosticRenderer<D> {
private val messageFormat: MessageFormat
init {
messageFormat = MessageFormat(message)
}
override fun render(obj: D): String {
return messageFormat.format(renderParameters(obj))
}
abstract fun renderParameters(diagnostic: D): Array<out Any>
}
class DiagnosticWithParameters1Renderer<A : Any>(
message: String,
private val rendererForA: DiagnosticParameterRenderer<A>?
) : AbstractDiagnosticWithParametersRenderer<DiagnosticWithParameters1<*, A>>(message) {
override fun renderParameters(diagnostic: DiagnosticWithParameters1<*, A>): Array<out Any> {
return arrayOf(renderParameter(diagnostic.a, rendererForA))
}
}
class DiagnosticWithParameters2Renderer<A : Any, B : Any>(
message: String,
private val rendererForA: DiagnosticParameterRenderer<A>?,
private val rendererForB: DiagnosticParameterRenderer<B>?
) : AbstractDiagnosticWithParametersRenderer<DiagnosticWithParameters2<*, A, B>>(message) {
override fun renderParameters(diagnostic: DiagnosticWithParameters2<*, A, B>): Array<out Any> {
return arrayOf(
renderParameter(diagnostic.a, rendererForA),
renderParameter(diagnostic.b, rendererForB)
)
}
}
class DiagnosticWithParameters3Renderer<A : Any, B : Any, C : Any>(
message: String,
private val rendererForA: DiagnosticParameterRenderer<A>?,
private val rendererForB: DiagnosticParameterRenderer<B>?,
private val rendererForC: DiagnosticParameterRenderer<C>?
) : AbstractDiagnosticWithParametersRenderer<DiagnosticWithParameters3<*, A, B, C>>(message) {
override fun renderParameters(diagnostic: DiagnosticWithParameters3<*, A, B, C>): Array<out Any> {
return arrayOf(
renderParameter(diagnostic.a, rendererForA),
renderParameter(diagnostic.b, rendererForB),
renderParameter(diagnostic.c, rendererForC)
)
}
}
class DiagnosticWithParametersMultiRenderer<A>(
message: String,
private val renderer: MultiRenderer<A>
) : AbstractDiagnosticWithParametersRenderer<DiagnosticWithParameters1<*, A>>(message) {
override fun renderParameters(diagnostic: DiagnosticWithParameters1<*, A>): Array<out Any> {
return renderer.render(diagnostic.a)
}
}
interface MultiRenderer<in A> {
fun render(a: A): Array<String>
}
@@ -26,7 +26,7 @@ import org.jetbrains.kotlin.types.KotlinType
import org.jetbrains.kotlin.types.TypeConstructor import org.jetbrains.kotlin.types.TypeConstructor
import org.jetbrains.kotlin.types.TypeProjection import org.jetbrains.kotlin.types.TypeProjection
abstract class DescriptorRenderer : Renderer<DeclarationDescriptor> { abstract class DescriptorRenderer {
fun withOptions(changeOptions: DescriptorRendererOptions.() -> Unit): DescriptorRenderer { fun withOptions(changeOptions: DescriptorRendererOptions.() -> Unit): DescriptorRenderer {
val options = (this as DescriptorRendererImpl).options.copy() val options = (this as DescriptorRendererImpl).options.copy()
options.changeOptions() options.changeOptions()
@@ -48,7 +48,7 @@ abstract class DescriptorRenderer : Renderer<DeclarationDescriptor> {
abstract fun renderAnnotation(annotation: AnnotationDescriptor, target: AnnotationUseSiteTarget? = null): String abstract fun renderAnnotation(annotation: AnnotationDescriptor, target: AnnotationUseSiteTarget? = null): String
override abstract fun render(declarationDescriptor: DeclarationDescriptor): String abstract fun render(declarationDescriptor: DeclarationDescriptor): String
abstract fun renderValueParameters(parameters: Collection<ValueParameterDescriptor>, synthesizedParameterNames: Boolean): String abstract fun renderValueParameters(parameters: Collection<ValueParameterDescriptor>, synthesizedParameterNames: Boolean): String
@@ -22,12 +22,16 @@ import kotlin.jvm.functions.Function1;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor; import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor;
import org.jetbrains.kotlin.diagnostics.rendering.DiagnosticParameterRenderer;
import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer; import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer;
import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.TableRenderer.DescriptorRow; import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.TableRenderer.DescriptorRow;
import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.TableRenderer.FunctionArgumentsRow; import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.TableRenderer.FunctionArgumentsRow;
import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.TableRenderer.TableRow; import org.jetbrains.kotlin.diagnostics.rendering.TabledDescriptorRenderer.TableRenderer.TableRow;
import org.jetbrains.kotlin.idea.highlighter.renderersUtil.RenderersUtilKt; import org.jetbrains.kotlin.idea.highlighter.renderersUtil.RenderersUtilKt;
import org.jetbrains.kotlin.renderer.*; import org.jetbrains.kotlin.renderer.DescriptorRenderer;
import org.jetbrains.kotlin.renderer.DescriptorRendererModifier;
import org.jetbrains.kotlin.renderer.DescriptorRendererOptions;
import org.jetbrains.kotlin.renderer.RenderingFormat;
import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPosition; import org.jetbrains.kotlin.resolve.calls.inference.constraintPosition.ConstraintPosition;
import org.jetbrains.kotlin.types.KotlinType; import org.jetbrains.kotlin.types.KotlinType;
@@ -43,7 +47,7 @@ public class HtmlTabledDescriptorRenderer extends TabledDescriptorRenderer {
@NotNull @NotNull
@Override @Override
public Renderer<KotlinType> getTypeRenderer() { public DiagnosticParameterRenderer<KotlinType> getTypeRenderer() {
return IdeRenderers.HTML_RENDER_TYPE; return IdeRenderers.HTML_RENDER_TYPE;
} }
@@ -24,7 +24,6 @@ import org.jetbrains.kotlin.diagnostics.TypeMismatchDueToTypeProjectionsData;
import org.jetbrains.kotlin.diagnostics.rendering.*; import org.jetbrains.kotlin.diagnostics.rendering.*;
import org.jetbrains.kotlin.js.resolve.diagnostics.ErrorsJs; import org.jetbrains.kotlin.js.resolve.diagnostics.ErrorsJs;
import org.jetbrains.kotlin.js.resolve.diagnostics.JsCallDataHtmlRenderer; import org.jetbrains.kotlin.js.resolve.diagnostics.JsCallDataHtmlRenderer;
import org.jetbrains.kotlin.renderer.DescriptorRenderer;
import java.net.URL; import java.net.URL;
@@ -76,7 +75,7 @@ public class IdeErrorMessages {
HTML_RENDER_TYPE.render(object.getExpectedType()), HTML_RENDER_TYPE.render(object.getExpectedType()),
HTML_RENDER_TYPE.render(object.getExpressionType()), HTML_RENDER_TYPE.render(object.getExpressionType()),
HTML_RENDER_TYPE.render(object.getReceiverType()), HTML_RENDER_TYPE.render(object.getReceiverType()),
DescriptorRenderer.HTML.render(object.getCallableDescriptor()) HTML.render(object.getCallableDescriptor())
}; };
} }
}); });
@@ -110,30 +109,30 @@ public class IdeErrorMessages {
"<tr><td>Parameter:</td><td>{1}</td></tr></table></html>", HTML_RENDER_TYPE, HTML_RENDER_TYPE); "<tr><td>Parameter:</td><td>{1}</td></tr></table></html>", HTML_RENDER_TYPE, HTML_RENDER_TYPE);
MAP.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, "<html>Return type is ''{0}'', which is not a subtype of overridden<br/>" + MAP.put(RETURN_TYPE_MISMATCH_ON_OVERRIDE, "<html>Return type is ''{0}'', which is not a subtype of overridden<br/>" +
"{1}</html>", HTML_RENDER_RETURN_TYPE, DescriptorRenderer.HTML); "{1}</html>", HTML_RENDER_RETURN_TYPE, HTML);
MAP.put(RETURN_TYPE_MISMATCH_ON_INHERITANCE, "<html>Return types of inherited members are incompatible:<br/>{0},<br/>{1}</html>", MAP.put(RETURN_TYPE_MISMATCH_ON_INHERITANCE, "<html>Return types of inherited members are incompatible:<br/>{0},<br/>{1}</html>",
DescriptorRenderer.HTML, DescriptorRenderer.HTML); HTML, HTML);
MAP.put(PROPERTY_TYPE_MISMATCH_ON_OVERRIDE, "<html>Property type is ''{0}'', which is not a subtype type of overridden<br/>" + MAP.put(PROPERTY_TYPE_MISMATCH_ON_OVERRIDE, "<html>Property type is ''{0}'', which is not a subtype type of overridden<br/>" +
"{1}</html>", HTML_RENDER_RETURN_TYPE, DescriptorRenderer.HTML); "{1}</html>", HTML_RENDER_RETURN_TYPE, HTML);
MAP.put(VAR_TYPE_MISMATCH_ON_OVERRIDE, "<html>Var-property type is ''{0}'', which is not a type of overridden<br/>" + MAP.put(VAR_TYPE_MISMATCH_ON_OVERRIDE, "<html>Var-property type is ''{0}'', which is not a type of overridden<br/>" +
"{1}</html>", HTML_RENDER_RETURN_TYPE, DescriptorRenderer.HTML); "{1}</html>", HTML_RENDER_RETURN_TYPE, HTML);
MAP.put(PROPERTY_TYPE_MISMATCH_ON_INHERITANCE, "<html>Types of inherited properties are incompatible:<br/>{0},<br/>{1}</html>", MAP.put(PROPERTY_TYPE_MISMATCH_ON_INHERITANCE, "<html>Types of inherited properties are incompatible:<br/>{0},<br/>{1}</html>",
DescriptorRenderer.HTML, DescriptorRenderer.HTML); HTML, HTML);
MAP.put(VAR_TYPE_MISMATCH_ON_INHERITANCE, "<html>Types of inherited var-properties do not match:<br/>{0},<br/>{1}</html>", MAP.put(VAR_TYPE_MISMATCH_ON_INHERITANCE, "<html>Types of inherited var-properties do not match:<br/>{0},<br/>{1}</html>",
DescriptorRenderer.HTML, DescriptorRenderer.HTML); HTML, HTML);
MAP.put(VAR_OVERRIDDEN_BY_VAL, "<html>Val-property cannot override var-property<br />" + MAP.put(VAR_OVERRIDDEN_BY_VAL, "<html>Val-property cannot override var-property<br />" +
"{1}</html>", DescriptorRenderer.HTML, DescriptorRenderer.HTML); "{1}</html>", HTML, HTML);
MAP.put(VAR_OVERRIDDEN_BY_VAL_BY_DELEGATION, "<html>Val-property cannot override var-property<br />" + MAP.put(VAR_OVERRIDDEN_BY_VAL_BY_DELEGATION, "<html>Val-property cannot override var-property<br />" +
"{1}</html>", DescriptorRenderer.HTML, DescriptorRenderer.HTML); "{1}</html>", HTML, HTML);
MAP.put(ABSTRACT_MEMBER_NOT_IMPLEMENTED, "<html>{0} must be declared abstract or implement abstract member<br/>" + MAP.put(ABSTRACT_MEMBER_NOT_IMPLEMENTED, "<html>{0} must be declared abstract or implement abstract member<br/>" +
"{1}</html>", RENDER_CLASS_OR_OBJECT, "{1}</html>", RENDER_CLASS_OR_OBJECT,
DescriptorRenderer.HTML); HTML);
MAP.put(MANY_IMPL_MEMBER_NOT_IMPLEMENTED, "<html>{0} must override {1}<br />because it inherits many implementations of it</html>", MAP.put(MANY_IMPL_MEMBER_NOT_IMPLEMENTED, "<html>{0} must override {1}<br />because it inherits many implementations of it</html>",
RENDER_CLASS_OR_OBJECT, DescriptorRenderer.HTML); RENDER_CLASS_OR_OBJECT, HTML);
MAP.put(CONFLICTING_OVERLOADS, "<html>''{0}''<br />conflicts with another declaration in {1}</html>", MAP.put(CONFLICTING_OVERLOADS, "<html>''{0}''<br />conflicts with another declaration in {1}</html>",
IdeRenderers.HTML_COMPACT_WITH_MODIFIERS, Renderers.DECLARATION_NAME_WITH_KIND); IdeRenderers.HTML_COMPACT_WITH_MODIFIERS, Renderers.DECLARATION_NAME_WITH_KIND);
@@ -17,10 +17,11 @@
package org.jetbrains.kotlin.idea.highlighter package org.jetbrains.kotlin.idea.highlighter
import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor import org.jetbrains.kotlin.descriptors.CallableMemberDescriptor
import org.jetbrains.kotlin.diagnostics.rendering.Renderer
import org.jetbrains.kotlin.diagnostics.rendering.Renderers import org.jetbrains.kotlin.diagnostics.rendering.Renderers
import org.jetbrains.kotlin.diagnostics.rendering.asRenderer
import org.jetbrains.kotlin.idea.highlighter.renderersUtil.renderResolvedCall import org.jetbrains.kotlin.idea.highlighter.renderersUtil.renderResolvedCall
import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.renderer.Renderer
import org.jetbrains.kotlin.resolve.MemberComparator import org.jetbrains.kotlin.resolve.MemberComparator
import org.jetbrains.kotlin.resolve.calls.inference.InferenceErrorData import org.jetbrains.kotlin.resolve.calls.inference.InferenceErrorData
import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall import org.jetbrains.kotlin.resolve.calls.model.ResolvedCall
@@ -30,7 +31,7 @@ import kotlin.comparisons.compareBy
object IdeRenderers { object IdeRenderers {
@JvmField val HTML_AMBIGUOUS_CALLS: Renderer<Collection<ResolvedCall<*>>> = Renderer { @JvmField val HTML_AMBIGUOUS_CALLS = Renderer {
calls: Collection<ResolvedCall<*>> -> calls: Collection<ResolvedCall<*>> ->
calls calls
.map { it.resultingDescriptor } .map { it.resultingDescriptor }
@@ -38,11 +39,11 @@ object IdeRenderers {
.joinToString("") { "<li>${DescriptorRenderer.HTML.render(it)}</li>" } .joinToString("") { "<li>${DescriptorRenderer.HTML.render(it)}</li>" }
} }
@JvmField val HTML_RENDER_TYPE: Renderer<KotlinType> = Renderer { @JvmField val HTML_RENDER_TYPE = Renderer<KotlinType> {
DescriptorRenderer.HTML.renderType(it) DescriptorRenderer.HTML.renderType(it)
} }
@JvmField val HTML_NONE_APPLICABLE_CALLS: Renderer<Collection<ResolvedCall<*>>> = Renderer { @JvmField val HTML_NONE_APPLICABLE_CALLS= Renderer {
calls: Collection<ResolvedCall<*>> -> calls: Collection<ResolvedCall<*>> ->
val comparator = compareBy(MemberComparator.INSTANCE) { c: ResolvedCall<*> -> c.resultingDescriptor } val comparator = compareBy(MemberComparator.INSTANCE) { c: ResolvedCall<*> -> c.resultingDescriptor }
calls calls
@@ -50,32 +51,32 @@ object IdeRenderers {
.joinToString("") { "<li>${renderResolvedCall(it)}</li>" } .joinToString("") { "<li>${renderResolvedCall(it)}</li>" }
} }
@JvmField val HTML_TYPE_INFERENCE_CONFLICTING_SUBSTITUTIONS_RENDERER: Renderer<InferenceErrorData> = Renderer { @JvmField val HTML_TYPE_INFERENCE_CONFLICTING_SUBSTITUTIONS_RENDERER = Renderer<InferenceErrorData> {
Renderers.renderConflictingSubstitutionsInferenceError(it, HtmlTabledDescriptorRenderer.create()).toString() Renderers.renderConflictingSubstitutionsInferenceError(it, HtmlTabledDescriptorRenderer.create()).toString()
} }
@JvmField val HTML_TYPE_INFERENCE_PARAMETER_CONSTRAINT_ERROR_RENDERER: Renderer<InferenceErrorData> = Renderer { @JvmField val HTML_TYPE_INFERENCE_PARAMETER_CONSTRAINT_ERROR_RENDERER = Renderer<InferenceErrorData> {
Renderers.renderParameterConstraintError(it, HtmlTabledDescriptorRenderer.create()).toString() Renderers.renderParameterConstraintError(it, HtmlTabledDescriptorRenderer.create()).toString()
} }
@JvmField val HTML_TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER_RENDERER: Renderer<InferenceErrorData> = Renderer { @JvmField val HTML_TYPE_INFERENCE_NO_INFORMATION_FOR_PARAMETER_RENDERER = Renderer<InferenceErrorData> {
Renderers.renderNoInformationForParameterError(it, HtmlTabledDescriptorRenderer.create()).toString() Renderers.renderNoInformationForParameterError(it, HtmlTabledDescriptorRenderer.create()).toString()
} }
@JvmField val HTML_TYPE_INFERENCE_UPPER_BOUND_VIOLATED_RENDERER: Renderer<InferenceErrorData> = Renderer { @JvmField val HTML_TYPE_INFERENCE_UPPER_BOUND_VIOLATED_RENDERER = Renderer<InferenceErrorData> {
Renderers.renderUpperBoundViolatedInferenceError(it, HtmlTabledDescriptorRenderer.create()).toString() Renderers.renderUpperBoundViolatedInferenceError(it, HtmlTabledDescriptorRenderer.create()).toString()
} }
@JvmField val HTML_RENDER_RETURN_TYPE: Renderer<CallableMemberDescriptor> = Renderer { @JvmField val HTML_RENDER_RETURN_TYPE = Renderer<CallableMemberDescriptor> {
val returnType = it.returnType!! val returnType = it.returnType!!
DescriptorRenderer.HTML.renderType(returnType) DescriptorRenderer.HTML.renderType(returnType)
} }
@JvmField val HTML_COMPACT_WITH_MODIFIERS: DescriptorRenderer = DescriptorRenderer.HTML.withOptions { @JvmField val HTML_COMPACT_WITH_MODIFIERS = DescriptorRenderer.HTML.withOptions {
withDefinedIn = false withDefinedIn = false
} }.asRenderer()
@JvmField val HTML_CONFLICTING_JVM_DECLARATIONS_DATA: Renderer<ConflictingJvmDeclarationsData> = Renderer { @JvmField val HTML_CONFLICTING_JVM_DECLARATIONS_DATA = Renderer {
data: ConflictingJvmDeclarationsData -> data: ConflictingJvmDeclarationsData ->
val conflicts = data.signatureOrigins val conflicts = data.signatureOrigins
@@ -86,7 +87,9 @@ object IdeRenderers {
"The following declarations have the same JVM signature (<code>${data.signature.name}${data.signature.desc}</code>):<br/>\n<ul>\n$conflicts</ul>" "The following declarations have the same JVM signature (<code>${data.signature.name}${data.signature.desc}</code>):<br/>\n<ul>\n$conflicts</ul>"
} }
@JvmField val HTML_THROWABLE: Renderer<Throwable> = Renderer { @JvmField val HTML_THROWABLE = Renderer<Throwable> {
Renderers.THROWABLE.render(it).replace("\n", "<br/>") Renderers.THROWABLE.render(it).replace("\n", "<br/>")
} }
@JvmField val HTML = DescriptorRenderer.HTML.asRenderer()
} }
@@ -18,9 +18,9 @@ package org.jetbrains.kotlin.js.resolve.diagnostics
import com.google.gwt.dev.js.rhino.Utils.isEndOfLine import com.google.gwt.dev.js.rhino.Utils.isEndOfLine
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.renderer.Renderer import org.jetbrains.kotlin.diagnostics.rendering.DiagnosticParameterRenderer
object RenderFirstLineOfElementText : Renderer<PsiElement> { object RenderFirstLineOfElementText : DiagnosticParameterRenderer<PsiElement> {
override fun render(element: PsiElement): String { override fun render(element: PsiElement): String {
val text = element.text val text = element.text
val index = text.indexOf('\n') val index = text.indexOf('\n')
@@ -28,7 +28,7 @@ object RenderFirstLineOfElementText : Renderer<PsiElement> {
} }
} }
abstract class JsCallDataRenderer : Renderer<JsCallData> { abstract class JsCallDataRenderer : DiagnosticParameterRenderer<JsCallData> {
protected abstract fun format(data: JsCallDataWithCode): String protected abstract fun format(data: JsCallDataWithCode): String
override fun render(data: JsCallData): String = override fun render(data: JsCallData): String =