"Convert object literal to lambda" inspection: report at INFORMATION level if object literal has 'return' #KT-27116 Fixed
This commit is contained in:
committed by
Mikhail Glukhikh
parent
23734bae3e
commit
f4a637a72e
@@ -16,6 +16,7 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.idea.intentions
|
package org.jetbrains.kotlin.idea.intentions
|
||||||
|
|
||||||
|
import com.intellij.codeInspection.ProblemHighlightType
|
||||||
import com.intellij.openapi.editor.Editor
|
import com.intellij.openapi.editor.Editor
|
||||||
import com.intellij.openapi.util.TextRange
|
import com.intellij.openapi.util.TextRange
|
||||||
import com.intellij.psi.PsiComment
|
import com.intellij.psi.PsiComment
|
||||||
@@ -48,7 +49,13 @@ import org.jetbrains.kotlin.resolve.scopes.receivers.ImplicitClassReceiver
|
|||||||
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
import org.jetbrains.kotlin.resolve.scopes.receivers.ReceiverValue
|
||||||
import org.jetbrains.kotlin.types.KotlinType
|
import org.jetbrains.kotlin.types.KotlinType
|
||||||
|
|
||||||
class ObjectLiteralToLambdaInspection : IntentionBasedInspection<KtObjectLiteralExpression>(ObjectLiteralToLambdaIntention::class)
|
class ObjectLiteralToLambdaInspection : IntentionBasedInspection<KtObjectLiteralExpression>(ObjectLiteralToLambdaIntention::class) {
|
||||||
|
override fun problemHighlightType(element: KtObjectLiteralExpression): ProblemHighlightType {
|
||||||
|
val (_, _, singleFunction) = extractData(element) ?: return super.problemHighlightType(element)
|
||||||
|
if (singleFunction.bodyExpression?.anyDescendantOfType<KtReturnExpression> { true } == true) return ProblemHighlightType.INFORMATION
|
||||||
|
return super.problemHighlightType(element)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
class ObjectLiteralToLambdaIntention : SelfTargetingRangeIntention<KtObjectLiteralExpression>(
|
class ObjectLiteralToLambdaIntention : SelfTargetingRangeIntention<KtObjectLiteralExpression>(
|
||||||
KtObjectLiteralExpression::class.java,
|
KtObjectLiteralExpression::class.java,
|
||||||
@@ -164,24 +171,24 @@ class ObjectLiteralToLambdaIntention : SelfTargetingRangeIntention<KtObjectLiter
|
|||||||
ShortenReferences.DEFAULT.process(replaced.containingKtFile, replaced.startOffset, endOffset)
|
ShortenReferences.DEFAULT.process(replaced.containingKtFile, replaced.startOffset, endOffset)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
}
|
||||||
private data class Data(
|
|
||||||
val baseTypeRef: KtTypeReference,
|
private data class Data(
|
||||||
val baseType: KotlinType,
|
val baseTypeRef: KtTypeReference,
|
||||||
val singleFunction: KtNamedFunction
|
val baseType: KotlinType,
|
||||||
)
|
val singleFunction: KtNamedFunction
|
||||||
|
)
|
||||||
private fun extractData(element: KtObjectLiteralExpression): Data? {
|
|
||||||
val objectDeclaration = element.objectDeclaration
|
private fun extractData(element: KtObjectLiteralExpression): Data? {
|
||||||
|
val objectDeclaration = element.objectDeclaration
|
||||||
val singleFunction = objectDeclaration.declarations.singleOrNull() as? KtNamedFunction ?: return null
|
|
||||||
if (!singleFunction.hasModifier(KtTokens.OVERRIDE_KEYWORD)) return null
|
val singleFunction = objectDeclaration.declarations.singleOrNull() as? KtNamedFunction ?: return null
|
||||||
|
if (!singleFunction.hasModifier(KtTokens.OVERRIDE_KEYWORD)) return null
|
||||||
val delegationSpecifier = objectDeclaration.superTypeListEntries.singleOrNull() ?: return null
|
|
||||||
val typeRef = delegationSpecifier.typeReference ?: return null
|
val delegationSpecifier = objectDeclaration.superTypeListEntries.singleOrNull() ?: return null
|
||||||
val bindingContext = typeRef.analyze(BodyResolveMode.PARTIAL)
|
val typeRef = delegationSpecifier.typeReference ?: return null
|
||||||
val baseType = bindingContext[BindingContext.TYPE, typeRef] ?: return null
|
val bindingContext = typeRef.analyze(BodyResolveMode.PARTIAL)
|
||||||
|
val baseType = bindingContext[BindingContext.TYPE, typeRef] ?: return null
|
||||||
return Data(typeRef, baseType, singleFunction)
|
|
||||||
}
|
return Data(typeRef, baseType, singleFunction)
|
||||||
}
|
}
|
||||||
@@ -1,22 +1,4 @@
|
|||||||
<problems>
|
<problems>
|
||||||
<problem>
|
|
||||||
<file>StatementAndReturn.kt</file>
|
|
||||||
<line>8</line>
|
|
||||||
<module>light_idea_test_case</module>
|
|
||||||
<entry_point TYPE="file" FQNAME="StatementAndReturn.kt" />
|
|
||||||
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Convert object literal to lambda</problem_class>
|
|
||||||
<description>Convert to lambda</description>
|
|
||||||
</problem>
|
|
||||||
|
|
||||||
<problem>
|
|
||||||
<file>SingleReturn.kt</file>
|
|
||||||
<line>8</line>
|
|
||||||
<module>light_idea_test_case</module>
|
|
||||||
<entry_point TYPE="file" FQNAME="SingleReturn.kt" />
|
|
||||||
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Convert object literal to lambda</problem_class>
|
|
||||||
<description>Convert to lambda</description>
|
|
||||||
</problem>
|
|
||||||
|
|
||||||
<problem>
|
<problem>
|
||||||
<file>Simple.kt</file>
|
<file>Simple.kt</file>
|
||||||
<line>6</line>
|
<line>6</line>
|
||||||
@@ -26,24 +8,6 @@
|
|||||||
<description>Convert to lambda</description>
|
<description>Convert to lambda</description>
|
||||||
</problem>
|
</problem>
|
||||||
|
|
||||||
<problem>
|
|
||||||
<file>ReturnNoValue.kt</file>
|
|
||||||
<line>6</line>
|
|
||||||
<module>light_idea_test_case</module>
|
|
||||||
<entry_point TYPE="file" FQNAME="ReturnNoValue.kt" />
|
|
||||||
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Convert object literal to lambda</problem_class>
|
|
||||||
<description>Convert to lambda</description>
|
|
||||||
</problem>
|
|
||||||
|
|
||||||
<problem>
|
|
||||||
<file>ReturnNotLast.kt</file>
|
|
||||||
<line>8</line>
|
|
||||||
<module>light_idea_test_case</module>
|
|
||||||
<entry_point TYPE="file" FQNAME="ReturnNotLast.kt" />
|
|
||||||
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Convert object literal to lambda</problem_class>
|
|
||||||
<description>Convert to lambda</description>
|
|
||||||
</problem>
|
|
||||||
|
|
||||||
<problem>
|
<problem>
|
||||||
<file>ParametersNotUsed.kt</file>
|
<file>ParametersNotUsed.kt</file>
|
||||||
<line>8</line>
|
<line>8</line>
|
||||||
@@ -97,24 +61,6 @@
|
|||||||
<description>Convert to lambda</description>
|
<description>Convert to lambda</description>
|
||||||
</problem>
|
</problem>
|
||||||
|
|
||||||
<problem>
|
|
||||||
<file>ReturnsInWhen.kt</file>
|
|
||||||
<line>8</line>
|
|
||||||
<module>light_idea_test_case</module>
|
|
||||||
<entry_point TYPE="file" FQNAME="ReturnsInWhen.kt" />
|
|
||||||
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Convert object literal to lambda</problem_class>
|
|
||||||
<description>Convert to lambda</description>
|
|
||||||
</problem>
|
|
||||||
|
|
||||||
<problem>
|
|
||||||
<file>ReturnsInIf.kt</file>
|
|
||||||
<line>8</line>
|
|
||||||
<module>light_idea_test_case</module>
|
|
||||||
<entry_point TYPE="file" FQNAME="ReturnsInIf.kt" />
|
|
||||||
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Convert object literal to lambda</problem_class>
|
|
||||||
<description>Convert to lambda</description>
|
|
||||||
</problem>
|
|
||||||
|
|
||||||
<problem>
|
<problem>
|
||||||
<file>NotInRange2.kt</file>
|
<file>NotInRange2.kt</file>
|
||||||
<line>7</line>
|
<line>7</line>
|
||||||
@@ -133,23 +79,6 @@
|
|||||||
<description>Convert to lambda</description>
|
<description>Convert to lambda</description>
|
||||||
</problem>
|
</problem>
|
||||||
|
|
||||||
<problem>
|
|
||||||
<file>QualifiedReturn.kt</file>
|
|
||||||
<line>6</line>
|
|
||||||
<module>light_idea_test_case</module>
|
|
||||||
<entry_point TYPE="file" FQNAME="QualifiedReturn.kt" />
|
|
||||||
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Convert object literal to lambda</problem_class>
|
|
||||||
<description>Convert to lambda</description>
|
|
||||||
</problem>
|
|
||||||
|
|
||||||
<problem>
|
|
||||||
<file>SamAdapterNeededBecauseOfLabeledReturn.kt</file>
|
|
||||||
<line>6</line>
|
|
||||||
<module>light_idea_test_case</module>
|
|
||||||
<entry_point TYPE="file" FQNAME="SamAdapterNeededBecauseOfLabeledReturn.kt" />
|
|
||||||
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Convert object literal to lambda</problem_class>
|
|
||||||
<description>Convert to lambda</description>
|
|
||||||
</problem>
|
|
||||||
<problem>
|
<problem>
|
||||||
<file>ThisReference.kt</file>
|
<file>ThisReference.kt</file>
|
||||||
<line>12</line>
|
<line>12</line>
|
||||||
|
|||||||
Reference in New Issue
Block a user