Refactoring code

This commit is contained in:
Valentin Kipyatkov
2020-02-10 11:26:24 +02:00
parent f60d24c621
commit 3897f51f8e
2 changed files with 25 additions and 20 deletions
@@ -6,6 +6,7 @@ import com.intellij.psi.search.LocalSearchScope
import com.intellij.psi.search.SearchScope
import com.intellij.psi.search.searches.ReferencesSearch
import com.intellij.slicer.SliceUsage
import com.intellij.usageView.UsageInfo
import com.intellij.util.Processor
import org.jetbrains.kotlin.asJava.namedUnwrappedElement
import org.jetbrains.kotlin.builtins.functions.FunctionInvokeDescriptor
@@ -107,16 +108,16 @@ class InflowSlicer(
val parameterDescriptor = parameter.resolveToParameterDescriptorIfAny(BodyResolveMode.FULL) ?: return
(function as? KtFunction)?.processCalls(analysisScope, includeOverriders) body@{
val refElement = it.element ?: return@body
fun processCall(usageInfo: UsageInfo) {
val refElement = usageInfo.element ?: return
val refParent = refElement.parent
val argumentExpression = when {
refElement is KtExpression -> {
val callElement = refElement.getParentOfTypeAndBranch<KtCallElement> { calleeExpression } ?: return@body
val resolvedCall = callElement.resolveToCall() ?: return@body
val callElement = refElement.getParentOfTypeAndBranch<KtCallElement> { calleeExpression } ?: return
val resolvedCall = callElement.resolveToCall() ?: return
val callParameterDescriptor = resolvedCall.resultingDescriptor.valueParameters[parameterDescriptor.index]
val resolvedArgument = resolvedCall.valueArguments[callParameterDescriptor] ?: return@body
val resolvedArgument = resolvedCall.valueArguments[callParameterDescriptor] ?: return
when (resolvedArgument) {
is DefaultValueArgument -> parameter.defaultValue
is ExpressionValueArgument -> resolvedArgument.valueArgument?.getArgumentExpression()
@@ -131,6 +132,8 @@ class InflowSlicer(
argumentExpression?.passToProcessorAsValue()
}
(function as? KtFunction)?.processCalls(analysisScope, includeOverriders, ::processCall)
if (parameter.valOrVarKeyword.toValVar() == KotlinValVar.Var) {
processAssignments(parameter, analysisScope)
}
@@ -211,8 +214,8 @@ class InflowSlicer(
}
private fun processAssignments(variable: KtCallableDeclaration, accessSearchScope: SearchScope) {
processVariableAccesses(variable, accessSearchScope, AccessKind.WRITE_WITH_OPTIONAL_READ) body@{
val refElement = it.element ?: return@body
fun processVariableAccess(usageInfo: UsageInfo) {
val refElement = usageInfo.element ?: return
val refParent = refElement.parent
val rhsValue = when {
@@ -231,6 +234,8 @@ class InflowSlicer(
}
rhsValue?.passToProcessorAsValue()
}
processVariableAccesses(variable, accessSearchScope, AccessKind.WRITE_WITH_OPTIONAL_READ, ::processVariableAccess)
}
private fun KtPropertyAccessor.processBackingFieldAssignments() {
@@ -4,6 +4,7 @@ import com.intellij.codeInsight.highlighting.ReadWriteAccessDetector
import com.intellij.psi.PsiElement
import com.intellij.psi.impl.light.LightMemberReference
import com.intellij.slicer.SliceUsage
import com.intellij.usageView.UsageInfo
import com.intellij.util.Processor
import org.jetbrains.kotlin.cfg.pseudocode.PseudoValue
import org.jetbrains.kotlin.cfg.pseudocode.instructions.Instruction
@@ -39,15 +40,12 @@ class OutflowSlicer(
val withDereferences = parentUsage.params.showInstanceDereferences
val accessKind = if (withDereferences) AccessKind.READ_OR_WRITE else AccessKind.READ_ONLY
processVariableAccesses(
variable,
analysisScope,
accessKind
) body@{
val refElement = it.element
fun processVariableAccess(usageInfo: UsageInfo) {
val refElement = usageInfo.element ?: return
if (refElement !is KtExpression) {
refElement?.passToProcessor()
return@body
refElement.passToProcessor()
return
}
val refExpression = KtPsiUtil.safeDeparenthesize(refElement)
@@ -58,13 +56,15 @@ class OutflowSlicer(
refExpression.passToProcessor()
}
}
processVariableAccesses(variable, analysisScope, accessKind, ::processVariableAccess)
}
private fun processFunction(function: KtFunction) {
if (function is KtConstructor<*> || function is KtNamedFunction && function.name != null) {
function.processCalls(analysisScope, includeOverriders = false) {
when (val refElement = it.element) {
null -> (it.reference as? LightMemberReference)?.element?.passToProcessor()
function.processCalls(analysisScope, includeOverriders = false) { usageInfo ->
when (val refElement = usageInfo.element) {
null -> (usageInfo.reference as? LightMemberReference)?.element?.passToProcessor()
is KtExpression -> {
refElement.getCallElementForExactCallee()?.passToProcessor()
refElement.getCallableReferenceForExactCallee()?.passToProcessor(parentUsage.lambdaLevel + 1)
@@ -75,12 +75,12 @@ class OutflowSlicer(
return
}
val funExpression = when (function) {
val funExpression: PsiElement = when (function) {
is KtFunctionLiteral -> function.parent as? KtLambdaExpression
is KtNamedFunction -> function
else -> null
} ?: return
(funExpression as PsiElement).passToProcessor(parentUsage.lambdaLevel + 1, true)
funExpression.passToProcessor(parentUsage.lambdaLevel + 1, true)
}
private fun processExpression(expression: KtExpression) {