Analyze Data Flow to Here: Java super-methods supported
This commit is contained in:
@@ -80,25 +80,6 @@ private fun KtDeclaration.processHierarchyUpward(scope: AnalysisScope, processor
|
|||||||
.forEach(processor)
|
.forEach(processor)
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun KtFunction.processCalls(scope: SearchScope, exactFunctionOnly: Boolean, processor: (UsageInfo) -> Unit) {
|
|
||||||
val options = KotlinFunctionFindUsagesOptions(project).apply {
|
|
||||||
isSearchForTextOccurrences = false
|
|
||||||
isSkipImportStatements = true
|
|
||||||
searchScope = scope.intersectWith(useScope)
|
|
||||||
}
|
|
||||||
if (exactFunctionOnly) {
|
|
||||||
processAllExactUsages(options, processor)
|
|
||||||
} else {
|
|
||||||
val descriptor = unsafeResolveToDescriptor() as? CallableMemberDescriptor ?: return
|
|
||||||
for (superDescriptor in descriptor.getDeepestSuperDeclarations()) {
|
|
||||||
when (val declaration = superDescriptor.originalSource.getPsi()) {
|
|
||||||
is KtDeclaration -> declaration.processAllUsages(options, processor)
|
|
||||||
else -> {} //TODO
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
private enum class AccessKind {
|
private enum class AccessKind {
|
||||||
READ_ONLY, WRITE_ONLY, WRITE_WITH_OPTIONAL_READ, READ_OR_WRITE
|
READ_ONLY, WRITE_ONLY, WRITE_WITH_OPTIONAL_READ, READ_OR_WRITE
|
||||||
}
|
}
|
||||||
@@ -150,6 +131,28 @@ abstract class Slicer(
|
|||||||
}
|
}
|
||||||
|
|
||||||
abstract fun processChildren()
|
abstract fun processChildren()
|
||||||
|
|
||||||
|
protected fun KtFunction.processCalls(scope: SearchScope, exactFunctionOnly: Boolean, usageProcessor: (UsageInfo) -> Unit) {
|
||||||
|
val options = KotlinFunctionFindUsagesOptions(project).apply {
|
||||||
|
isSearchForTextOccurrences = false
|
||||||
|
isSkipImportStatements = true
|
||||||
|
searchScope = scope.intersectWith(useScope)
|
||||||
|
}
|
||||||
|
if (exactFunctionOnly) {
|
||||||
|
processAllExactUsages(options, usageProcessor)
|
||||||
|
} else {
|
||||||
|
val descriptor = unsafeResolveToDescriptor() as? CallableMemberDescriptor ?: return
|
||||||
|
for (superDescriptor in descriptor.getDeepestSuperDeclarations()) {
|
||||||
|
val declaration = superDescriptor.originalSource.getPsi() ?: continue
|
||||||
|
when (declaration) {
|
||||||
|
is KtDeclaration -> declaration.processAllUsages(options, usageProcessor)
|
||||||
|
// todo: work around the bug in JavaSliceProvider.transform()
|
||||||
|
is PsiMethod -> processor.process(JavaSliceUsage.createRootUsage(declaration, parentUsage.params))
|
||||||
|
else -> declaration.passToProcessor()
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
class InflowSlicer(
|
class InflowSlicer(
|
||||||
|
|||||||
@@ -0,0 +1,3 @@
|
|||||||
|
interface JavaInterface {
|
||||||
|
void foo(int p);
|
||||||
|
}
|
||||||
+5
-1
@@ -4,7 +4,7 @@ interface I {
|
|||||||
fun foo(p: Int)
|
fun foo(p: Int)
|
||||||
}
|
}
|
||||||
|
|
||||||
class C : I {
|
class C : I, JavaInterface {
|
||||||
override fun foo(p: Int) {
|
override fun foo(p: Int) {
|
||||||
println(<caret>p)
|
println(<caret>p)
|
||||||
}
|
}
|
||||||
@@ -17,3 +17,7 @@ class C : I {
|
|||||||
fun f(i: I) {
|
fun f(i: I) {
|
||||||
i.foo(2)
|
i.foo(2)
|
||||||
}
|
}
|
||||||
|
|
||||||
|
fun g(i: JavaInterface) {
|
||||||
|
i.foo(3)
|
||||||
|
}
|
||||||
|
|||||||
@@ -1,3 +1,8 @@
|
|||||||
|
2 void <bold>foo(int p);</bold>
|
||||||
|
9 println(<bold>p</bold>)
|
||||||
|
8 override fun foo(<bold>p: Int</bold>) {
|
||||||
|
2 void <bold>foo(int p);</bold>
|
||||||
|
|
||||||
13 foo(<bold>1</bold>)
|
13 foo(<bold>1</bold>)
|
||||||
9 println(<bold>p</bold>)
|
9 println(<bold>p</bold>)
|
||||||
8 override fun foo(<bold>p: Int</bold>) {
|
8 override fun foo(<bold>p: Int</bold>) {
|
||||||
|
|||||||
@@ -1,4 +1,5 @@
|
|||||||
9 println(<bold>p</bold>)
|
9 println(<bold>p</bold>)
|
||||||
8 override fun foo(<bold>p: Int</bold>) {
|
8 override fun foo(<bold>p: Int</bold>) {
|
||||||
|
2 void <bold>foo(int p);</bold>
|
||||||
13 foo(<bold>1</bold>)
|
13 foo(<bold>1</bold>)
|
||||||
18 i.foo(<bold>2</bold>)
|
18 i.foo(<bold>2</bold>)
|
||||||
|
|||||||
Reference in New Issue
Block a user