Analyze Data Flow: Support cross-language analysis

#KT-16833 Fixed
This commit is contained in:
Alexey Sedunov
2017-11-22 18:09:21 +03:00
parent 6cb68531ae
commit c6a9c36275
125 changed files with 1109 additions and 108 deletions
+6
View File
@@ -0,0 +1,6 @@
class J {
void foo(int n) {
int y = n;
new K().bar(y);
}
}
+11
View File
@@ -0,0 +1,11 @@
// FLOW: OUT
class K {
fun bar(m: Int) {
val z = m
}
fun test() {
val x = <caret>1
J().foo(x)
}
}
@@ -0,0 +1,10 @@
8 val x = <bold>1</bold>
8 val <bold>x = 1</bold>
9 J().foo(<bold>x</bold>)
2 void foo(int <bold>n</bold>) {
3 int y = <bold>n</bold>;
3 int <bold>y = n;</bold>
4 new K().bar(<bold>y</bold>);
3 fun bar(<bold>m: Int</bold>) {
4 val z = <bold>m</bold>
4 val <bold>z = m</bold>
@@ -0,0 +1,13 @@
class J extends A {
J() {
}
J(int n) {
super();
}
void test() {
A a = new A();
}
}
@@ -0,0 +1,15 @@
// FLOW: OUT
open class A<caret>() {
constructor(n: Int) : this()
}
class B : A()
class C : A {
constructor() : super()
}
fun test() {
val x = A()
}
@@ -0,0 +1,9 @@
3 open class A<bold>()</bold> {
7 class B : <bold>A()</bold>
14 val x = <bold>A()</bold>
14 val <bold>x = A()</bold>
2 <bold>J() {</bold>
7 <bold>super</bold>();
4 constructor(n: Int) : <bold>this()</bold>
10 constructor() : <bold>super()</bold>
11 A a = new <bold>A</bold>();
@@ -0,0 +1,13 @@
interface A {
public int foo();
}
class B implements A {
public int foo() {
return 2;
}
}
interface C extends A {
public int foo();
}
@@ -0,0 +1,12 @@
// FLOW: OUT
class D : B(), C {
override fun foo() = <caret>4
}
fun test(a: A, b: B, c: C, d: D) {
val x = a.foo()
val y = b.foo()
val z = c.foo()
val u = d.foo()
}
@@ -0,0 +1,22 @@
4 override fun foo() = <bold>4</bold>
4 override fun <bold>foo() = 4</bold>
11 val u = d.<bold>foo()</bold>
11 val <bold>u = d.foo()</bold>
2 public int <bold>foo();</bold>
8 val x = a.<bold>foo()</bold>
8 val <bold>x = a.foo()</bold>
9 val y = b.<bold>foo()</bold>
9 val <bold>y = b.foo()</bold>
10 val z = c.<bold>foo()</bold>
10 val <bold>z = c.foo()</bold>
11 DUPLICATE: val u = d.<bold>foo()</bold>
6 public int <bold>foo() {</bold>
9 DUPLICATE: val y = b.<bold>foo()</bold>
11 DUPLICATE: val u = d.<bold>foo()</bold>
8 DUPLICATE: val x = a.<bold>foo()</bold>
10 DUPLICATE: val z = c.<bold>foo()</bold>
12 public int <bold>foo();</bold>
10 DUPLICATE: val z = c.<bold>foo()</bold>
11 DUPLICATE: val u = d.<bold>foo()</bold>
8 DUPLICATE: val x = a.<bold>foo()</bold>
9 DUPLICATE: val y = b.<bold>foo()</bold>
@@ -0,0 +1,15 @@
// FLOW: OUT
interface A {
public int foo();
}
interface C extends A {
public int foo();
}
class D extends B implements C {
public int foo() {
return 4;
}
}
@@ -0,0 +1,12 @@
// FLOW: OUT
open class B : A {
override fun foo() = <caret>2
}
fun test(a: A, b: B, c: C, d: D) {
val x = a.foo()
val y = b.foo()
val z = c.foo()
val u = d.foo()
}
@@ -0,0 +1,12 @@
4 override fun foo() = <bold>2</bold>
4 override fun <bold>foo() = 2</bold>
9 val y = b.<bold>foo()</bold>
9 val <bold>y = b.foo()</bold>
4 public int <bold>foo();</bold>
8 val x = a.<bold>foo()</bold>
8 val <bold>x = a.foo()</bold>
10 val z = c.<bold>foo()</bold>
10 val <bold>z = c.foo()</bold>
11 val u = d.<bold>foo()</bold>
11 val <bold>u = d.foo()</bold>
9 DUPLICATE: val y = b.<bold>foo()</bold>
@@ -0,0 +1,15 @@
interface A {
public int foo();
}
class B extends A {
public int foo() {
return 2;
}
}
class D extends B implements C {
public int foo() {
return 4;
}
}
@@ -0,0 +1,12 @@
// FLOW: OUT
interface C : A {
override fun foo() = <caret>3
}
fun test(a: A, b: B, c: C, d: D) {
val x = a.foo()
val y = b.foo()
val z = c.foo()
val u = d.foo()
}
@@ -0,0 +1,12 @@
4 override fun foo() = <bold>3</bold>
4 override fun <bold>foo() = 3</bold>
10 val z = c.<bold>foo()</bold>
10 val <bold>z = c.foo()</bold>
2 public int <bold>foo();</bold>
8 val x = a.<bold>foo()</bold>
8 val <bold>x = a.foo()</bold>
9 val y = b.<bold>foo()</bold>
9 val <bold>y = b.foo()</bold>
11 val u = d.<bold>foo()</bold>
11 val <bold>u = d.foo()</bold>
10 DUPLICATE: val z = c.<bold>foo()</bold>
+5
View File
@@ -0,0 +1,5 @@
class J {
void test() {
int x = FunctionCallsKt.foo(2);
}
}
+1 -3
View File
@@ -1,8 +1,6 @@
// FLOW: OUT
fun <caret>foo(n: Int) {
}
fun <caret>foo(n: Int) = n + 1
fun test(m: Int) {
val x = foo(1)
+4 -3
View File
@@ -1,3 +1,4 @@
3 fun <bold>foo(n: Int) {</bold>
8 val x = <bold>foo(1)</bold>
8 val <bold>x = foo(1)</bold>
3 fun <bold>foo(n: Int) = n + 1</bold>
3 int x = FunctionCallsKt.<bold>foo</bold>(2);
6 val x = <bold>foo(1)</bold>
6 val <bold>x = foo(1)</bold>
@@ -0,0 +1,5 @@
class J {
void test() {
int x = new A().x;
}
}
@@ -0,0 +1,5 @@
// FLOW: OUT
class A {
@JvmField val <caret>x = 1
}
@@ -0,0 +1,3 @@
4 @JvmField val <bold>x = 1</bold>
3 int x = new A().<bold>x</bold>;
3 int <bold>x = new A().x;</bold>
@@ -0,0 +1,5 @@
class J {
void test() {
int x = new A().getX();
}
}
@@ -1,4 +1,5 @@
4 val <bold>x = 1</bold>
3 int x = new A().<bold>getX</bold>();
6 val y = <bold>x</bold>
6 val <bold>y = x</bold>
11 z = <bold>x</bold>
@@ -0,0 +1,11 @@
class A {
int foo() {
return 1;
}
}
class C extends B {
int foo() {
return 3;
}
}
@@ -0,0 +1,11 @@
// FLOW: OUT
open class B : A() {
override fun foo() = <caret>2
}
fun test(a: A, b: B, c: C) {
val x = a.foo()
val y = b.foo()
val z = c.foo()
}
@@ -0,0 +1,10 @@
4 override fun foo() = <bold>2</bold>
4 override fun <bold>foo() = 2</bold>
9 val y = b.<bold>foo()</bold>
9 val <bold>y = b.foo()</bold>
2 int <bold>foo() {</bold>
8 val x = a.<bold>foo()</bold>
8 val <bold>x = a.foo()</bold>
10 val z = c.<bold>foo()</bold>
10 val <bold>z = c.foo()</bold>
9 DUPLICATE: val y = b.<bold>foo()</bold>
@@ -0,0 +1,9 @@
class J extends A {
J() {
super(1);
}
void test() {
A a = new A(1);
}
}
@@ -2,5 +2,7 @@
7 class B : <bold>A(1)</bold>
14 val x = <bold>A(1)</bold>
14 val <bold>x = A(1)</bold>
3 <bold>super</bold>(1);
4 constructor() : <bold>this(1)</bold>
10 constructor() : <bold>super(1)</bold>
7 A a = new <bold>A</bold>(1);
@@ -0,0 +1,9 @@
class J extends A {
J() {
super(1);
}
void test() {
A a = new A(1);
}
}
@@ -2,5 +2,7 @@
9 class B : <bold>A(1)</bold>
16 val x = <bold>A(1)</bold>
16 val <bold>x = A(1)</bold>
3 <bold>super</bold>(1);
6 constructor() : <bold>this(1)</bold>
12 constructor() : <bold>super(1)</bold>
7 A a = new <bold>A</bold>(1);
@@ -0,0 +1,5 @@
class J {
void test() {
int x = TopLevelPropertyUsagesKt.getX();
}
}
@@ -1,4 +1,5 @@
3 val <bold>x = 1</bold>
3 int x = TopLevelPropertyUsagesKt.<bold>getX</bold>();
5 val y = <bold>x</bold>
5 val <bold>y = x</bold>
8 val y = <bold>x</bold>
+5
View File
@@ -0,0 +1,5 @@
class J {
void test() {
int n = new A(1).getN();
}
}
+1
View File
@@ -1,4 +1,5 @@
3 class A(val <bold>n: Int</bold>) {
3 int n = new A(1).<bold>getN</bold>();
4 val x = <bold>n</bold>
4 val <bold>x = n</bold>
9 y = <bold>n</bold>
+6
View File
@@ -0,0 +1,6 @@
class J {
void test() {
int n = new A(1).getN();
new A(1).setN(2);
}
}
+1
View File
@@ -1,4 +1,5 @@
3 class A(var <bold>n: Int</bold>) {
3 int n = new A(1).<bold>getN</bold>();
4 val x = <bold>n</bold>
4 val <bold>x = n</bold>
9 y = <bold>n</bold>