diff --git a/idea/src/org/jetbrains/jet/plugin/highlighter/DeprecatedAnnotationVisitor.java b/idea/src/org/jetbrains/jet/plugin/highlighter/DeprecatedAnnotationVisitor.java index d3b497d3bee..f2d55eccaea 100644 --- a/idea/src/org/jetbrains/jet/plugin/highlighter/DeprecatedAnnotationVisitor.java +++ b/idea/src/org/jetbrains/jet/plugin/highlighter/DeprecatedAnnotationVisitor.java @@ -29,6 +29,7 @@ import org.jetbrains.jet.lang.descriptors.*; import org.jetbrains.jet.lang.descriptors.annotations.AnnotationDescriptor; import org.jetbrains.jet.lang.psi.*; import org.jetbrains.jet.lang.resolve.BindingContext; +import org.jetbrains.jet.lang.resolve.DescriptorUtils; import org.jetbrains.jet.lang.resolve.calls.ResolvedCall; import org.jetbrains.jet.lang.resolve.calls.VariableAsFunctionResolvedCall; import org.jetbrains.jet.lang.resolve.constants.CompileTimeConstant; @@ -37,6 +38,7 @@ import org.jetbrains.jet.lang.resolve.name.Name; import org.jetbrains.jet.lang.types.TypeUtils; import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import org.jetbrains.jet.lexer.JetTokens; +import org.jetbrains.jet.resolve.DescriptorRenderer; public class DeprecatedAnnotationVisitor extends AfterAnalysisHighlightingVisitor { @@ -204,11 +206,11 @@ public class DeprecatedAnnotationVisitor extends AfterAnalysisHighlightingVisito AnnotationDescriptor deprecated = getDeprecated(descriptor); if (deprecated != null) { if (isWarning) { - holder.createInfoAnnotation(element, getMessage(deprecated)) + holder.createInfoAnnotation(element, composeTooltipString(descriptor, deprecated)) .setTextAttributes(CodeInsightColors.WARNINGS_ATTRIBUTES); } else { - holder.createInfoAnnotation(element, getMessage(deprecated)) + holder.createInfoAnnotation(element, composeTooltipString(descriptor, deprecated)) .setTextAttributes(CodeInsightColors.DEPRECATED_ATTRIBUTES); } return true; @@ -228,7 +230,11 @@ public class DeprecatedAnnotationVisitor extends AfterAnalysisHighlightingVisito return null; } - private static String getMessage(AnnotationDescriptor descriptor) { + private static String composeTooltipString(@NotNull DeclarationDescriptor declarationDescriptor, @NotNull AnnotationDescriptor descriptor) { + return "'" + getDescriptorString(declarationDescriptor) + "' is deprecated. " + getMessageFromAnnotationDescriptor(descriptor); + } + + private static String getMessageFromAnnotationDescriptor(@NotNull AnnotationDescriptor descriptor) { ClassDescriptor classDescriptor = TypeUtils.getClassDescriptor(descriptor.getType()); assert classDescriptor != null : "ClassDescriptor for jet.deprecated mustn't be null"; ValueParameterDescriptor parameterDescriptor = @@ -238,4 +244,31 @@ public class DeprecatedAnnotationVisitor extends AfterAnalysisHighlightingVisito assert valueArgument != null : "jet.deprecated must have value argument"; return (String) valueArgument.getValue(); } + + private static String getDescriptorString(@NotNull DeclarationDescriptor descriptor) { + if (descriptor instanceof ClassDescriptor) { + return DescriptorUtils.getFQName(descriptor).getFqName(); + } + else if (descriptor instanceof ConstructorDescriptor) { + DeclarationDescriptor containingDeclaration = descriptor.getContainingDeclaration(); + assert containingDeclaration != null; + return "constructor for " + containingDeclaration.getName(); + } + else if (descriptor instanceof PropertyGetterDescriptor) { + return "getter for " + ((PropertyGetterDescriptor) descriptor).getCorrespondingProperty().getName(); + } + else if (descriptor instanceof PropertySetterDescriptor) { + return "setter for " + ((PropertySetterDescriptor) descriptor).getCorrespondingProperty().getName(); + } + else if (descriptor instanceof PropertyDescriptor) { + if (((PropertyDescriptor) descriptor).isVar()) { + return "var " + descriptor.getName(); + } + return "val " + descriptor.getName(); + } + else if (descriptor instanceof FunctionDescriptor) { + return "fun " + descriptor.getName() + DescriptorRenderer.TEXT.renderFunctionParameters((FunctionDescriptor) descriptor); + } + return DescriptorRenderer.TEXT.render(descriptor); + } } diff --git a/idea/testData/highlighter/deprecated/Class.kt b/idea/testData/highlighter/deprecated/Class.kt index cd1d2d0f57f..73728d639c7 100644 --- a/idea/testData/highlighter/deprecated/Class.kt +++ b/idea/testData/highlighter/deprecated/Class.kt @@ -2,14 +2,14 @@ package test import java.util.ArrayList -deprecated("'test.MyClass' is deprecated") open class MyClass {} +deprecated("Use A instead") open class MyClass {} fun test() { - val a : MyClass? = null - val b = MyClass() - val c = ArrayList<MyClass>() + val a : MyClass? = null + val b = MyClass() + val c = ArrayList<MyClass>() } -class Test(): MyClass() {} +class Test(): MyClass() {} -class Test2(param: MyClass) {} \ No newline at end of file +class Test2(param: MyClass) {} \ No newline at end of file diff --git a/idea/testData/highlighter/deprecated/ClassObject.kt b/idea/testData/highlighter/deprecated/ClassObject.kt index 538abdba682..dc339ad9107 100644 --- a/idea/testData/highlighter/deprecated/ClassObject.kt +++ b/idea/testData/highlighter/deprecated/ClassObject.kt @@ -1,19 +1,19 @@ fun test() { - MyClass.test + MyClass.test MyClass() val a: MyClass? = null val b: MyTrait? = null - MyTrait.test + MyTrait.test } class MyClass(): MyTrait { - deprecated("'MyClass.' is deprecated") class object { + deprecated("Use A instead") class object { val test: String = "" } } trait MyTrait { - deprecated("'MyTrait.' is deprecated") class object { + deprecated("Use A instead") class object { val test: String = "" } } \ No newline at end of file diff --git a/idea/testData/highlighter/deprecated/Function.kt b/idea/testData/highlighter/deprecated/Function.kt index a4ad1ee9744..c3eab1a3a09 100644 --- a/idea/testData/highlighter/deprecated/Function.kt +++ b/idea/testData/highlighter/deprecated/Function.kt @@ -1,18 +1,18 @@ fun test() { - test1() - MyClass().test2() - MyClass.test3() + test1() + MyClass().test2() + MyClass.test3() - test4(1, 2) + test4(1, 2) } -deprecated("'fun test1()' is deprecated") fun test1() { } -deprecated("'fun test4(x : jet.Int, y : jet.Int)' is deprecated") fun test4(x: Int, y: Int) { } +deprecated("Use A instead") fun test1() { } +deprecated("Use A instead") fun test4(x: Int, y: Int) { } class MyClass() { - deprecated("'fun test2()' is deprecated") fun test2() {} + deprecated("Use A instead") fun test2() {} class object { - deprecated("'fun test3()' is deprecated") fun test3() {} + deprecated("Use A instead") fun test3() {} } } \ No newline at end of file diff --git a/idea/testData/highlighter/deprecated/Get.kt b/idea/testData/highlighter/deprecated/Get.kt index 0168b48102f..b162a37f573 100644 --- a/idea/testData/highlighter/deprecated/Get.kt +++ b/idea/testData/highlighter/deprecated/Get.kt @@ -1,10 +1,10 @@ class MyClass {} -deprecated("'fun get(i : MyClass)' is deprecated") fun MyClass.get(i: MyClass): MyClass { return MyClass() } +deprecated("Use A instead") fun MyClass.get(i: MyClass): MyClass { return MyClass() } fun test() { val x1 = MyClass() val x2 = MyClass() - x1[x2] + x1[x2] } \ No newline at end of file diff --git a/idea/testData/highlighter/deprecated/Getter.kt b/idea/testData/highlighter/deprecated/Getter.kt index 14a54a42812..c769b5ac755 100644 --- a/idea/testData/highlighter/deprecated/Getter.kt +++ b/idea/testData/highlighter/deprecated/Getter.kt @@ -1,19 +1,19 @@ fun test() { val c = MyClass() - c.test1 - c.test2 + c.test1 + c.test2 c.test2 = "" - c.test3 + c.test3 } class MyClass() { public val test1: String = "" - [deprecated("'getter for test1' is deprecated")] get + [deprecated("Use A instead")] get public var test2: String = "" - [deprecated("'getter for test2' is deprecated")] get + [deprecated("Use A instead")] get - deprecated("'val test3' is deprecated") public val test3: String = "" - [deprecated("'getter for test3' is deprecated")] get + deprecated("Use A instead") public val test3: String = "" + [deprecated("Use A instead")] get } \ No newline at end of file diff --git a/idea/testData/highlighter/deprecated/Inc.kt b/idea/testData/highlighter/deprecated/Inc.kt index 5062a8334a0..47ff2eba1ef 100644 --- a/idea/testData/highlighter/deprecated/Inc.kt +++ b/idea/testData/highlighter/deprecated/Inc.kt @@ -1,8 +1,8 @@ class MyClass {} -deprecated("'fun inc()' is deprecated") fun MyClass.inc(): MyClass { return MyClass() } +deprecated("Use A instead") fun MyClass.inc(): MyClass { return MyClass() } fun test() { var x3 = MyClass() - x3++ + x3++ } \ No newline at end of file diff --git a/idea/testData/highlighter/deprecated/Invoke.kt b/idea/testData/highlighter/deprecated/Invoke.kt index 31ee74713c5..8680a3b9e69 100644 --- a/idea/testData/highlighter/deprecated/Invoke.kt +++ b/idea/testData/highlighter/deprecated/Invoke.kt @@ -1,9 +1,9 @@ class MyRunnable() {} -deprecated("'fun invoke()' is deprecated") fun MyRunnable.invoke() { +deprecated("Use A instead") fun MyRunnable.invoke() { } fun test() { val m = MyRunnable() - m() + m() } \ No newline at end of file diff --git a/idea/testData/highlighter/deprecated/Operation.kt b/idea/testData/highlighter/deprecated/Operation.kt index 34e40124ab3..67aee0fb785 100644 --- a/idea/testData/highlighter/deprecated/Operation.kt +++ b/idea/testData/highlighter/deprecated/Operation.kt @@ -1,36 +1,36 @@ class MyClass {} -deprecated("'fun minus(i : MyClass)' is deprecated") fun MyClass.minus(i: MyClass) { } -deprecated("'fun div(i : MyClass)' is deprecated") fun MyClass.div(i: MyClass) { } -deprecated("'fun times(i : MyClass)' is deprecated") fun MyClass.times(i: MyClass) { } +deprecated("Use A instead") fun MyClass.minus(i: MyClass) { } +deprecated("Use A instead") fun MyClass.div(i: MyClass) { } +deprecated("Use A instead") fun MyClass.times(i: MyClass) { } -deprecated("'fun not()' is deprecated") fun MyClass.not() { } -deprecated("'fun plus()' is deprecated") fun MyClass.plus() { } +deprecated("Use A instead") fun MyClass.not() { } +deprecated("Use A instead") fun MyClass.plus() { } -deprecated("'fun contains(i : MyClass)' is deprecated") fun MyClass.contains(i: MyClass): Boolean { return false } +deprecated("Use A instead") fun MyClass.contains(i: MyClass): Boolean { return false } -deprecated("'fun plusAssign(i : MyClass)' is deprecated") fun MyClass.plusAssign(i: MyClass) { } +deprecated("Use A instead") fun MyClass.plusAssign(i: MyClass) { } -deprecated("'fun equals(i : jet.Any?)' is deprecated") fun MyClass.equals(i: Any?): Boolean { return false } -deprecated("'fun compareTo(i : MyClass)' is deprecated") fun MyClass.compareTo(i: MyClass): Int { return 0 } +deprecated("Use A instead") fun MyClass.equals(i: Any?): Boolean { return false } +deprecated("Use A instead") fun MyClass.compareTo(i: MyClass): Int { return 0 } fun test() { val x1 = MyClass() val x2 = MyClass() - x1 - x2 - x1 / x2 - x1 * x2 + x1 - x2 + x1 / x2 + x1 * x2 - !x1 - +x1 + !x1 + +x1 - x1 in x2 - x1 !in x2 + x1 in x2 + x1 !in x2 - x1 += x2 + x1 += x2 - x1 == x2 - x1 != x2 - x1 > x2 + x1 == x2 + x1 != x2 + x1 > x2 } \ No newline at end of file diff --git a/idea/testData/highlighter/deprecated/Property.kt b/idea/testData/highlighter/deprecated/Property.kt index c8aadbf1b75..4023eaa37f0 100644 --- a/idea/testData/highlighter/deprecated/Property.kt +++ b/idea/testData/highlighter/deprecated/Property.kt @@ -1,22 +1,22 @@ fun test() { - test1 - MyClass().test2 - MyClass.test3 + test1 + MyClass().test2 + MyClass.test3 - test4 - MyClass().test5 - MyClass.test6 + test4 + MyClass().test5 + MyClass.test6 } -deprecated("'val test1' is deprecated") val test1: String = "" -deprecated("'var test4' is deprecated") var test4: String = "" +deprecated("Use A instead") val test1: String = "" +deprecated("Use A instead") var test4: String = "" class MyClass() { - deprecated("'val test2' is deprecated") val test2: String = "" - deprecated("'var test5' is deprecated") var test5: String = "" + deprecated("Use A instead") val test2: String = "" + deprecated("Use A instead") var test5: String = "" class object { - deprecated("'val test3' is deprecated") val test3: String = "" - deprecated("'var test6' is deprecated") var test6: String = "" + deprecated("Use A instead") val test3: String = "" + deprecated("Use A instead") var test6: String = "" } } \ No newline at end of file diff --git a/idea/testData/highlighter/deprecated/RangeTo.kt b/idea/testData/highlighter/deprecated/RangeTo.kt index 1316613a287..19adfe7fcfd 100644 --- a/idea/testData/highlighter/deprecated/RangeTo.kt +++ b/idea/testData/highlighter/deprecated/RangeTo.kt @@ -1,6 +1,6 @@ class MyClass { } -deprecated("'fun rangeTo(i : MyClass)' is deprecated") fun MyClass.rangeTo(i: MyClass): IntIterator { +deprecated("Use A instead") fun MyClass.rangeTo(i: MyClass): IntIterator { throw Exception() } @@ -8,7 +8,7 @@ fun test() { val x1 = MyClass() val x2 = MyClass() - for (i in x1..x2) { + for (i in x1..x2) { } } diff --git a/idea/testData/highlighter/deprecated/Setter.kt b/idea/testData/highlighter/deprecated/Setter.kt index 8c9ab715a07..e5cd95284fa 100644 --- a/idea/testData/highlighter/deprecated/Setter.kt +++ b/idea/testData/highlighter/deprecated/Setter.kt @@ -1,26 +1,26 @@ fun test() { MyClass().test1 - MyClass().test1 = 0 + MyClass().test1 = 0 - MyClass().test1++ - MyClass().test1-- + MyClass().test1++ + MyClass().test1-- - ++MyClass().test1 - --MyClass().test1 + ++MyClass().test1 + --MyClass().test1 - MyClass().test1 += 1 - MyClass().test1 -= 1 - MyClass().test1 /= 1 - MyClass().test1 *= 1 + MyClass().test1 += 1 + MyClass().test1 -= 1 + MyClass().test1 /= 1 + MyClass().test1 *= 1 test2 - test2 = 10 + test2 = 10 } class MyClass() { public var test1: Int = 0 - [deprecated("'setter for test1' is deprecated")] set + [deprecated("Use A instead")] set } public var test2: Int = 0 - [deprecated("'setter for test2' is deprecated")] set \ No newline at end of file + [deprecated("Use A instead")] set \ No newline at end of file diff --git a/idea/testData/highlighter/deprecated/Trait.kt b/idea/testData/highlighter/deprecated/Trait.kt index 3e3ec3c6ea0..cfa3ee69032 100644 --- a/idea/testData/highlighter/deprecated/Trait.kt +++ b/idea/testData/highlighter/deprecated/Trait.kt @@ -1,10 +1,10 @@ -deprecated("'MyTrait' is deprecated") trait MyTrait { } +deprecated("Use A instead") trait MyTrait { } fun test() { - val a: MyTrait? = null - val b: List<MyTrait>? = null + val a: MyTrait? = null + val b: List<MyTrait>? = null } -class Test(): MyTrait { } +class Test(): MyTrait { } -class Test2(param: MyTrait) {} \ No newline at end of file +class Test2(param: MyTrait) {} \ No newline at end of file