(1.1 only) Var can be val: correct handling of delegated local variables #KT-14409 Fixed
This commit is contained in:
@@ -49,7 +49,10 @@ class CanBeValInspection : AbstractKotlinInspection() {
|
|||||||
|
|
||||||
when (declaration) {
|
when (declaration) {
|
||||||
is KtProperty -> {
|
is KtProperty -> {
|
||||||
if (declaration.isVar && declaration.isLocal && canBeVal(declaration, declaration.hasInitializer(), listOf(declaration))) {
|
if (declaration.isVar && declaration.isLocal &&
|
||||||
|
canBeVal(declaration,
|
||||||
|
declaration.hasInitializer() || declaration.hasDelegateExpression(),
|
||||||
|
listOf(declaration))) {
|
||||||
reportCanBeVal(declaration)
|
reportCanBeVal(declaration)
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
@@ -63,13 +66,17 @@ class CanBeValInspection : AbstractKotlinInspection() {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private fun canBeVal(declaration: KtVariableDeclaration, hasInitializer: Boolean, allDeclarations: Collection<KtVariableDeclaration>): Boolean {
|
private fun canBeVal(
|
||||||
|
declaration: KtVariableDeclaration,
|
||||||
|
hasInitializerOrDelegate: Boolean,
|
||||||
|
allDeclarations: Collection<KtVariableDeclaration>
|
||||||
|
): Boolean {
|
||||||
if (allDeclarations.all { ReferencesSearch.search(it, it.useScope).none() }) {
|
if (allDeclarations.all { ReferencesSearch.search(it, it.useScope).none() }) {
|
||||||
// do not report for unused var's (otherwise we'll get it highlighted immediately after typing the declaration
|
// do not report for unused var's (otherwise we'll get it highlighted immediately after typing the declaration
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
if (hasInitializer) {
|
if (hasInitializerOrDelegate) {
|
||||||
val hasWriteUsages = ReferencesSearch.search(declaration, declaration.useScope).any {
|
val hasWriteUsages = ReferencesSearch.search(declaration, declaration.useScope).any {
|
||||||
(it as? KtSimpleNameReference)?.element?.readWriteAccess(useResolveForReadWrite = true)?.isWrite == true
|
(it as? KtSimpleNameReference)?.element?.readWriteAccess(useResolveForReadWrite = true)?.isWrite == true
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -79,4 +79,13 @@
|
|||||||
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Local 'var' is never modified and can be declared as 'val'</problem_class>
|
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Local 'var' is never modified and can be declared as 'val'</problem_class>
|
||||||
<description>Variable is never modified and can be declared immutable using 'val'</description>
|
<description>Variable is never modified and can be declared immutable using 'val'</description>
|
||||||
</problem>
|
</problem>
|
||||||
|
|
||||||
|
<problem>
|
||||||
|
<file>withReadOnlyDelegate.kt</file>
|
||||||
|
<line>4</line>
|
||||||
|
<module>light_idea_test_case</module>
|
||||||
|
<entry_point TYPE="file" FQNAME="withReadOnlyDelegate.kt" />
|
||||||
|
<problem_class severity="WARNING" attribute_key="WARNING_ATTRIBUTES">Local 'var' is never modified and can be declared as 'val'</problem_class>
|
||||||
|
<description>Variable is never modified and can be declared immutable using 'val'</description>
|
||||||
|
</problem>
|
||||||
</problems>
|
</problems>
|
||||||
|
|||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
var s: String by Delegates.notNull()
|
||||||
|
s = ""
|
||||||
|
}
|
||||||
@@ -0,0 +1,6 @@
|
|||||||
|
// WITH_RUNTIME
|
||||||
|
|
||||||
|
fun foo() {
|
||||||
|
var s: String by lazy { "Hello!" }
|
||||||
|
s.hashCode()
|
||||||
|
}
|
||||||
Reference in New Issue
Block a user