001 /*
002 * Copyright 2010-2015 JetBrains s.r.o.
003 *
004 * Licensed under the Apache License, Version 2.0 (the "License");
005 * you may not use this file except in compliance with the License.
006 * You may obtain a copy of the License at
007 *
008 * http://www.apache.org/licenses/LICENSE-2.0
009 *
010 * Unless required by applicable law or agreed to in writing, software
011 * distributed under the License is distributed on an "AS IS" BASIS,
012 * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
013 * See the License for the specific language governing permissions and
014 * limitations under the License.
015 */
016
017 package org.jetbrains.kotlin.resolve.jvm.diagnostics;
018
019 import org.jetbrains.annotations.NotNull;
020 import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
021 import org.jetbrains.kotlin.diagnostics.rendering.DefaultErrorMessages;
022 import org.jetbrains.kotlin.diagnostics.rendering.DiagnosticFactoryToRendererMap;
023 import org.jetbrains.kotlin.diagnostics.rendering.Renderers;
024 import org.jetbrains.kotlin.renderer.DescriptorRenderer;
025 import org.jetbrains.kotlin.renderer.Renderer;
026
027 import static org.jetbrains.kotlin.diagnostics.rendering.Renderers.STRING;
028
029 public class DefaultErrorMessagesJvm implements DefaultErrorMessages.Extension {
030
031 private static final Renderer<ConflictingJvmDeclarationsData> CONFLICTING_JVM_DECLARATIONS_DATA = new Renderer<ConflictingJvmDeclarationsData>() {
032 @NotNull
033 @Override
034 public String render(@NotNull ConflictingJvmDeclarationsData data) {
035 StringBuilder sb = new StringBuilder();
036 for (JvmDeclarationOrigin origin : data.getSignatureOrigins()) {
037 DeclarationDescriptor descriptor = origin.getDescriptor();
038 if (descriptor != null) {
039 sb.append(" ").append(DescriptorRenderer.COMPACT.render(descriptor)).append("\n");
040 }
041 }
042 return ("The following declarations have the same JVM signature (" + data.getSignature().getName() + data.getSignature().getDesc() + "):\n" + sb).trim();
043 }
044 };
045
046 public static final DiagnosticFactoryToRendererMap MAP = new DiagnosticFactoryToRendererMap();
047 static {
048 MAP.put(ErrorsJvm.CONFLICTING_JVM_DECLARATIONS, "Platform declaration clash: {0}", CONFLICTING_JVM_DECLARATIONS_DATA);
049 MAP.put(ErrorsJvm.ACCIDENTAL_OVERRIDE, "Accidental override: {0}", CONFLICTING_JVM_DECLARATIONS_DATA);
050 MAP.put(ErrorsJvm.JVM_STATIC_NOT_IN_OBJECT, "Only functions in named objects and companion objects of classes can be annotated with 'JvmStatic'");
051 MAP.put(ErrorsJvm.OVERRIDE_CANNOT_BE_STATIC, "Override member cannot be 'JvmStatic' in object");
052 MAP.put(ErrorsJvm.OVERLOADS_WITHOUT_DEFAULT_ARGUMENTS, "''JvmOverloads'' annotation has no effect for methods without default arguments");
053 MAP.put(ErrorsJvm.OVERLOADS_ABSTRACT, "''JvmOverloads'' annotation cannot be used on abstract methods");
054 MAP.put(ErrorsJvm.OVERLOADS_PRIVATE, "''JvmOverloads'' annotation has no effect on private and local declarations");
055 MAP.put(ErrorsJvm.INAPPLICABLE_JVM_NAME, "''JvmName'' annotation is not applicable to this declaration");
056 MAP.put(ErrorsJvm.ILLEGAL_JVM_NAME, "Illegal JVM name");
057 MAP.put(ErrorsJvm.EXTERNAL_DECLARATION_CANNOT_BE_ABSTRACT, "External declaration can not be abstract");
058 MAP.put(ErrorsJvm.EXTERNAL_DECLARATION_CANNOT_HAVE_BODY, "External declaration can not have a body");
059 MAP.put(ErrorsJvm.EXTERNAL_DECLARATION_IN_TRAIT, "Members of interfaces can not be external");
060 MAP.put(ErrorsJvm.EXTERNAL_DECLARATION_CANNOT_BE_INLINED, "Members of interfaces can not be external");
061
062 MAP.put(ErrorsJvm.POSITIONED_VALUE_ARGUMENT_FOR_JAVA_ANNOTATION, "Only named arguments are available for Java annotations");
063 MAP.put(ErrorsJvm.DEPRECATED_ANNOTATION_METHOD_CALL, "Annotation methods are deprecated. Use property instead");
064 MAP.put(ErrorsJvm.DEPRECATED_JAVA_ANNOTATION, "This annotation is deprecated in Kotlin. Use ''{0}'' instead", Renderers.TO_STRING);
065 MAP.put(ErrorsJvm.NON_SOURCE_REPEATED_ANNOTATION, "Only annotations with SOURCE retention can be repeated on JVM platform");
066
067 MAP.put(ErrorsJvm.NO_REFLECTION_IN_CLASS_PATH, "Call uses reflection API which is not found in compilation classpath. " +
068 "Make sure you have kotlin-reflect.jar in the classpath");
069
070 MAP.put(ErrorsJvm.NULLABILITY_MISMATCH_BASED_ON_JAVA_ANNOTATIONS,
071 "Expected type does not accept nulls in {0}, but the value may be null in {1}", Renderers.TO_STRING, Renderers.TO_STRING);
072
073 MAP.put(ErrorsJvm.TRAIT_CANT_CALL_DEFAULT_METHOD_VIA_SUPER, "Interfaces can't call Java default methods via super");
074
075 MAP.put(ErrorsJvm.WHEN_ENUM_CAN_BE_NULL_IN_JAVA, "Enum argument can be null in Java, but exhaustive when contains no null branch");
076
077 MAP.put(ErrorsJvm.INAPPLICABLE_PUBLIC_FIELD, "publicField annotation is not applicable to this declaration");
078
079 MAP.put(ErrorsJvm.JAVA_CLASS_ON_COMPANION,
080 "The resulting type of this ''javaClass'' call is {0} and not {1}. " +
081 "Please use the more clear ''::class.java'' syntax to avoid confusion",
082 Renderers.RENDER_TYPE, Renderers.RENDER_TYPE
083 );
084
085 MAP.put(ErrorsJvm.JAVA_TYPE_MISMATCH,
086 "Java type mismatch expected {1} but found {0}. Use explicit cast", Renderers.RENDER_TYPE, Renderers.RENDER_TYPE);
087
088 MAP.put(ErrorsJvm.DUPLICATE_CLASS_NAMES, "Duplicate JVM class name ''{0}'' generated from: {1}", Renderers.TO_STRING, Renderers.TO_STRING);
089 }
090
091 @NotNull
092 @Override
093 public DiagnosticFactoryToRendererMap getMap() {
094 return MAP;
095 }
096 }