Minor changes

This commit is contained in:
Valentin Kipyatkov
2016-08-31 19:11:04 +03:00
parent 05fae1d4db
commit e363809b37
@@ -287,7 +287,7 @@ private class Processor(
} }
private fun addSamInterfaceToProcess(psiClass: PsiClass) { private fun addSamInterfaceToProcess(psiClass: PsiClass) {
data class SamInterfaceTask(val psiClass: PsiClass) : Task { data class ProcessSamInterfaceTask(val psiClass: PsiClass) : Task {
override fun perform() { override fun perform() {
//TODO: what about other JVM languages? //TODO: what about other JVM languages?
val scope = GlobalSearchScope.getScopeRestrictedByFileTypes(GlobalSearchScope.projectScope(project), JavaFileType.INSTANCE) val scope = GlobalSearchScope.getScopeRestrictedByFileTypes(GlobalSearchScope.projectScope(project), JavaFileType.INSTANCE)
@@ -302,7 +302,7 @@ private class Processor(
} }
} }
} }
addTask(SamInterfaceTask(psiClass)) addTask(ProcessSamInterfaceTask(psiClass))
} }
/** /**
@@ -474,28 +474,8 @@ private class Processor(
for (parent in element.parents) { for (parent in element.parents) {
when (parent) { when (parent) {
is PsiCodeBlock, is PsiCodeBlock,
is PsiExpression, is PsiExpression ->
is PsiImportStatement -> break@ParentsLoop // ignore local usages
break@ParentsLoop // ignore local usages and usages in imports
//TODO: if Java parameter has Kotlin functional type then we should process method usages
is PsiParameter -> {
if (prev == parent.typeElement) {
val method = parent.declarationScope as? PsiMethod
if (method != null && method.hasModifierProperty(PsiModifier.ABSTRACT)) {
val psiClass = method.containingClass
if (psiClass != null) {
testLog?.add("Resolved java class to descriptor: ${psiClass.qualifiedName}")
val classDescriptor = psiClass.resolveToDescriptor(target.getResolutionFacade())
if (classDescriptor != null && SingleAbstractMethodUtils.getSingleAbstractMethodOrNull(classDescriptor) != null) {
addSamInterfaceToProcess(psiClass)
}
}
}
}
break@ParentsLoop
}
is PsiMethod -> { is PsiMethod -> {
if (prev == parent.returnTypeElement && !parent.isPrivateOrLocal()) { if (prev == parent.returnTypeElement && !parent.isPrivateOrLocal()) {
@@ -520,6 +500,25 @@ private class Processor(
} }
break@ParentsLoop break@ParentsLoop
} }
//TODO: if Java parameter has Kotlin functional type then we should process method usages
is PsiParameter -> {
if (prev == parent.typeElement) {
val method = parent.declarationScope as? PsiMethod
if (method != null && method.hasModifierProperty(PsiModifier.ABSTRACT)) {
val psiClass = method.containingClass
if (psiClass != null) {
testLog?.add("Resolved java class to descriptor: ${psiClass.qualifiedName}")
val classDescriptor = psiClass.resolveToDescriptor(target.getResolutionFacade())
if (classDescriptor != null && SingleAbstractMethodUtils.getSingleAbstractMethodOrNull(classDescriptor) != null) {
addSamInterfaceToProcess(psiClass)
}
}
}
}
break@ParentsLoop
}
} }
prev = parent prev = parent
@@ -610,9 +609,9 @@ private class Processor(
} }
} }
private fun usePlainSearch(scopeElement: KtElement) { private fun usePlainSearch(scope: KtElement) {
val file = scopeElement.getContainingKtFile() val file = scope.getContainingKtFile()
val restricted = LocalSearchScope(scopeElement).intersectWith(searchScope) as LocalSearchScope val restricted = LocalSearchScope(scope).intersectWith(searchScope) as LocalSearchScope
ScopeLoop@ ScopeLoop@
for (element in restricted.scope) { for (element in restricted.scope) {
val prevElements = scopesToUsePlainSearch.getOrPut(file) { ArrayList() } val prevElements = scopesToUsePlainSearch.getOrPut(file) { ArrayList() }