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