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