Slice tree: shorter container rendering for properties in primary constructor

This commit is contained in:
Valentin Kipyatkov
2020-04-14 16:08:57 +03:00
parent 23ead3c805
commit 3e5820e4c1
11 changed files with 31 additions and 22 deletions
@@ -15,6 +15,7 @@ import org.jetbrains.kotlin.descriptors.ConstructorDescriptor
import org.jetbrains.kotlin.idea.KotlinBundle import org.jetbrains.kotlin.idea.KotlinBundle
import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor import org.jetbrains.kotlin.idea.caches.resolve.unsafeResolveToDescriptor
import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
import org.jetbrains.kotlin.psi.psiUtil.parents import org.jetbrains.kotlin.psi.psiUtil.parents
import org.jetbrains.kotlin.renderer.DescriptorRenderer import org.jetbrains.kotlin.renderer.DescriptorRenderer
import org.jetbrains.kotlin.resolve.descriptorUtil.isCompanionObject import org.jetbrains.kotlin.resolve.descriptorUtil.isCompanionObject
@@ -54,7 +55,8 @@ object KotlinSliceUsageCellRenderer : SliceUsageCellRendererBase() {
} }
fun containerSuffix(sliceUsage: SliceUsage): String? { fun containerSuffix(sliceUsage: SliceUsage): String? {
val declaration = sliceUsage.element?.parents?.firstOrNull { val element = sliceUsage.element ?: return null
var declaration = element.parents.firstOrNull {
it is KtClass || it is KtClass ||
it is KtObjectDeclaration && !it.isObjectLiteral() || it is KtObjectDeclaration && !it.isObjectLiteral() ||
it is KtNamedFunction && !it.isLocal || it is KtNamedFunction && !it.isLocal ||
@@ -62,6 +64,11 @@ object KotlinSliceUsageCellRenderer : SliceUsageCellRendererBase() {
it is KtConstructor<*> it is KtConstructor<*>
} as? KtDeclaration ?: return null } as? KtDeclaration ?: return null
// for a val or var among primary constructor parameters show the class as container
if (declaration is KtPrimaryConstructor && element is KtParameter && element.hasValOrVar()) {
declaration = declaration.containingClassOrObject!!
}
return buildString { return buildString {
append(KotlinBundle.message("slicer.text.in", "")) append(KotlinBundle.message("slicer.text.in", ""))
append(" ") append(" ")
@@ -1,7 +1,7 @@
9 class C : B(<bold>1</bold>) { (in C) 9 class C : B(<bold>1</bold>) { (in C)
15 val <bold>y = b.foo</bold> (in test(A, B, C)) 15 val <bold>y = b.foo</bold> (in test(A, B, C))
15 val y = <bold>b.foo</bold> (in test(A, B, C)) 15 val y = <bold>b.foo</bold> (in test(A, B, C))
7 open class B(override val <bold>foo: Int</bold>) : A() (in B(Int)) 7 open class B(override val <bold>foo: Int</bold>) : A() (in B)
9 class C : B(<bold>1</bold>) { (in C) 9 class C : B(<bold>1</bold>) { (in C)
10 override val foo = <bold>3</bold> (in C.foo: Int) 10 override val foo = <bold>3</bold> (in C.foo: Int)
@@ -18,5 +18,5 @@
3 super(<bold>10</bold>); 3 super(<bold>10</bold>);
15 val <bold>y = b.foo</bold> (in test(A, B, C)) 15 val <bold>y = b.foo</bold> (in test(A, B, C))
15 val y = <bold>b.foo</bold> (in test(A, B, C)) 15 val y = <bold>b.foo</bold> (in test(A, B, C))
7 open class B(override val <bold>foo: Int</bold>) : A() (in B(Int)) 7 open class B(override val <bold>foo: Int</bold>) : A() (in B)
3 super(<bold>10</bold>); 3 super(<bold>10</bold>);
@@ -1,6 +1,6 @@
15 val <bold>y = b.foo</bold> (in test(A, B, C)) 15 val <bold>y = b.foo</bold> (in test(A, B, C))
15 val y = <bold>b.foo</bold> (in test(A, B, C)) 15 val y = <bold>b.foo</bold> (in test(A, B, C))
7 open class B(override val <bold>foo: Int</bold>) : A() (in B(Int)) 7 open class B(override val <bold>foo: Int</bold>) : A() (in B)
3 super(<bold>10</bold>); 3 super(<bold>10</bold>);
9 class C : B(<bold>1</bold>) { (in C) 9 class C : B(<bold>1</bold>) { (in C)
7 return <bold>5</bold>; 7 return <bold>5</bold>;
+4 -4
View File
@@ -1,16 +1,16 @@
2 D(int <bold>n</bold>) { 2 D(int <bold>n</bold>) {
3 open class A(val <bold>n: Int</bold>) (in A(Int)) 3 open class A(val <bold>n: Int</bold>) (in A)
3 super(<bold>n</bold>); 3 super(<bold>n</bold>);
2 D(int <bold>n</bold>) { 2 D(int <bold>n</bold>) {
5 class B : A(<bold>1</bold>) (in B) 5 class B : A(<bold>1</bold>) (in B)
3 open class A(val <bold>n: Int</bold>) (in A(Int)) 3 open class A(val <bold>n: Int</bold>) (in A)
5 class B : A(<bold>1</bold>) (in B) 5 class B : A(<bold>1</bold>) (in B)
8 val z = A(<bold>2</bold>).n (in test()) 8 val z = A(<bold>2</bold>).n (in test())
3 open class A(val <bold>n: Int</bold>) (in A(Int)) 3 open class A(val <bold>n: Int</bold>) (in A)
8 val z = A(<bold>2</bold>).n (in test()) 8 val z = A(<bold>2</bold>).n (in test())
7 A a = new A(<bold>3</bold>); 7 A a = new A(<bold>3</bold>);
3 open class A(val <bold>n: Int</bold>) (in A(Int)) 3 open class A(val <bold>n: Int</bold>) (in A)
7 A a = new A(<bold>3</bold>); 7 A a = new A(<bold>3</bold>);
@@ -1,3 +1,4 @@
[NotNull Values] [NotNull Values]
3 open class A(val <bold>n: Int</bold>) (in A(Int)) 3 open class A(val <bold>n: Int</bold>) (in A)
3 open class A(val <bold>n: Int</bold>) (in A(Int)) 3 open class A(val <bold>n: Int</bold>) (in A)
+1 -1
View File
@@ -1,4 +1,4 @@
3 open class A(val <bold>n: Int</bold>) (in A(Int)) 3 open class A(val <bold>n: Int</bold>) (in A)
3 super(<bold>n</bold>); 3 super(<bold>n</bold>);
2 D(int <bold>n</bold>) { 2 D(int <bold>n</bold>) {
5 class B : A(<bold>1</bold>) (in B) 5 class B : A(<bold>1</bold>) (in B)
+6 -6
View File
@@ -1,24 +1,24 @@
2 D(int <bold>n</bold>) { 2 D(int <bold>n</bold>) {
3 open class A(var <bold>n: Int</bold>) { (in A(Int)) 3 open class A(var <bold>n: Int</bold>) { (in A)
3 super(<bold>n</bold>); 3 super(<bold>n</bold>);
2 D(int <bold>n</bold>) { 2 D(int <bold>n</bold>) {
20 class B : A(<bold>1</bold>) (in B) 20 class B : A(<bold>1</bold>) (in B)
3 open class A(var <bold>n: Int</bold>) { (in A(Int)) 3 open class A(var <bold>n: Int</bold>) { (in A)
20 class B : A(<bold>1</bold>) (in B) 20 class B : A(<bold>1</bold>) (in B)
23 val z = A(<bold>2</bold>).n (in test()) 23 val z = A(<bold>2</bold>).n (in test())
3 open class A(var <bold>n: Int</bold>) { (in A(Int)) 3 open class A(var <bold>n: Int</bold>) { (in A)
23 val z = A(<bold>2</bold>).n (in test()) 23 val z = A(<bold>2</bold>).n (in test())
24 A(<bold>3</bold>).n = 2 (in test()) 24 A(<bold>3</bold>).n = 2 (in test())
3 open class A(var <bold>n: Int</bold>) { (in A(Int)) 3 open class A(var <bold>n: Int</bold>) { (in A)
24 A(<bold>3</bold>).n = 2 (in test()) 24 A(<bold>3</bold>).n = 2 (in test())
7 A a = new A(<bold>3</bold>); 7 A a = new A(<bold>3</bold>);
3 open class A(var <bold>n: Int</bold>) { (in A(Int)) 3 open class A(var <bold>n: Int</bold>) { (in A)
7 A a = new A(<bold>3</bold>); 7 A a = new A(<bold>3</bold>);
9 a.setN(<bold>4</bold>); 9 a.setN(<bold>4</bold>);
3 open class A(var <bold>n: Int</bold>) { (in A(Int)) 3 open class A(var <bold>n: Int</bold>) { (in A)
9 a.setN(<bold>4</bold>); 9 a.setN(<bold>4</bold>);
@@ -1,3 +1,4 @@
[NotNull Values] [NotNull Values]
3 open class A(var <bold>n: Int</bold>) { (in A(Int)) 3 open class A(var <bold>n: Int</bold>) { (in A)
3 open class A(var <bold>n: Int</bold>) { (in A(Int)) 3 open class A(var <bold>n: Int</bold>) { (in A)
+1 -1
View File
@@ -1,4 +1,4 @@
3 open class A(var <bold>n: Int</bold>) { (in A(Int)) 3 open class A(var <bold>n: Int</bold>) { (in A)
3 super(<bold>n</bold>); 3 super(<bold>n</bold>);
2 D(int <bold>n</bold>) { 2 D(int <bold>n</bold>) {
7 A a = new A(<bold>3</bold>); 7 A a = new A(<bold>3</bold>);
+1 -1
View File
@@ -1,4 +1,4 @@
3 class A(val <bold>n: Int</bold>) { (in A(Int)) 3 class A(val <bold>n: Int</bold>) { (in A)
3 int n = new A(1).<bold>getN</bold>(); 3 int n = new A(1).<bold>getN</bold>();
4 val x = <bold>n</bold> (in A.x: Int) 4 val x = <bold>n</bold> (in A.x: Int)
4 val <bold>x = n</bold> (in A) 4 val <bold>x = n</bold> (in A)
+1 -1
View File
@@ -1,4 +1,4 @@
3 class A(var <bold>n: Int</bold>) { (in A(Int)) 3 class A(var <bold>n: Int</bold>) { (in A)
3 int n = new A(1).<bold>getN</bold>(); 3 int n = new A(1).<bold>getN</bold>();
4 val x = <bold>n</bold> (in A.x: Int) 4 val x = <bold>n</bold> (in A.x: Int)
4 val <bold>x = n</bold> (in A) 4 val <bold>x = n</bold> (in A)