TypeAccessibilityCheckerImpl: move visibility check for KtNamedDeclaration to outside
This commit is contained in:
+1
-2
@@ -16,7 +16,6 @@ import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
|
|||||||
import org.jetbrains.kotlin.idea.stubindex.KotlinFullClassNameIndex
|
import org.jetbrains.kotlin.idea.stubindex.KotlinFullClassNameIndex
|
||||||
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
import org.jetbrains.kotlin.incremental.components.NoLookupLocation
|
||||||
import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi
|
import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
import org.jetbrains.kotlin.psi.KtNamedDeclaration
|
import org.jetbrains.kotlin.psi.KtNamedDeclaration
|
||||||
import org.jetbrains.kotlin.psi.KtTypeParameter
|
import org.jetbrains.kotlin.psi.KtTypeParameter
|
||||||
@@ -48,7 +47,7 @@ class TypeAccessibilityCheckerImpl(
|
|||||||
override fun incorrectTypes(type: KotlinType): Collection<FqName?> = incorrectTypesInSequence(type.collectAllTypes(), false)
|
override fun incorrectTypes(type: KotlinType): Collection<FqName?> = incorrectTypesInSequence(type.collectAllTypes(), false)
|
||||||
|
|
||||||
override fun checkAccessibility(declaration: KtNamedDeclaration): Boolean =
|
override fun checkAccessibility(declaration: KtNamedDeclaration): Boolean =
|
||||||
!declaration.hasModifier(KtTokens.PRIVATE_KEYWORD) && declaration.descriptor?.let { checkAccessibility(it) } == true
|
declaration.descriptor?.let { checkAccessibility(it) } == true
|
||||||
|
|
||||||
override fun checkAccessibility(descriptor: DeclarationDescriptor): Boolean = incorrectTypesInDescriptor(descriptor, true).isEmpty()
|
override fun checkAccessibility(descriptor: DeclarationDescriptor): Boolean = incorrectTypesInDescriptor(descriptor, true).isEmpty()
|
||||||
|
|
||||||
|
|||||||
@@ -30,6 +30,7 @@ import org.jetbrains.kotlin.idea.quickfix.TypeAccessibilityChecker
|
|||||||
import org.jetbrains.kotlin.idea.refactoring.getExpressionShortText
|
import org.jetbrains.kotlin.idea.refactoring.getExpressionShortText
|
||||||
import org.jetbrains.kotlin.idea.refactoring.introduce.showErrorHint
|
import org.jetbrains.kotlin.idea.refactoring.introduce.showErrorHint
|
||||||
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
import org.jetbrains.kotlin.idea.util.application.executeWriteCommand
|
||||||
|
import org.jetbrains.kotlin.idea.util.hasPrivateModifier
|
||||||
import org.jetbrains.kotlin.idea.util.liftToExpected
|
import org.jetbrains.kotlin.idea.util.liftToExpected
|
||||||
import org.jetbrains.kotlin.idea.util.module
|
import org.jetbrains.kotlin.idea.util.module
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
@@ -117,13 +118,13 @@ class CreateExpectedClassFix(
|
|||||||
) : CreateExpectedFix<KtClassOrObject>(klass, outerExpectedClass, commonModule, block@{ project, checker, element ->
|
) : CreateExpectedFix<KtClassOrObject>(klass, outerExpectedClass, commonModule, block@{ project, checker, element ->
|
||||||
val originalElements = element.collectDeclarations(withSelf = false).toList()
|
val originalElements = element.collectDeclarations(withSelf = false).toList()
|
||||||
val existingClasses = checker.findAndApplyExistingClasses(originalElements + klass)
|
val existingClasses = checker.findAndApplyExistingClasses(originalElements + klass)
|
||||||
if (!checker.checkAccessibility(element)) {
|
if (!checker.isCorrectAndHaveNonPrivate(element)) {
|
||||||
showUnknownTypesError(element)
|
showUnknownTypesError(element)
|
||||||
return@block null
|
return@block null
|
||||||
}
|
}
|
||||||
|
|
||||||
val (members, declarationsWithNonExistentClasses) = originalElements.partition {
|
val (members, declarationsWithNonExistentClasses) = originalElements.partition {
|
||||||
checker.checkAccessibility(it)
|
checker.isCorrectAndHaveNonPrivate(it)
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!showUnknownTypesDialog(project, declarationsWithNonExistentClasses)) return@block null
|
if (!showUnknownTypesDialog(project, declarationsWithNonExistentClasses)) return@block null
|
||||||
@@ -143,13 +144,13 @@ class CreateExpectedClassFix(
|
|||||||
|
|
||||||
val selectedClasses = checker.findAndApplyExistingClasses(selectedElements)
|
val selectedClasses = checker.findAndApplyExistingClasses(selectedElements)
|
||||||
val resultDeclarations = if (selectedClasses != existingClasses) {
|
val resultDeclarations = if (selectedClasses != existingClasses) {
|
||||||
if (!checker.checkAccessibility(element)) {
|
if (!checker.isCorrectAndHaveNonPrivate(element)) {
|
||||||
showUnknownTypesError(element)
|
showUnknownTypesError(element)
|
||||||
return@block null
|
return@block null
|
||||||
}
|
}
|
||||||
|
|
||||||
val (resultDeclarations, withErrors) = selectedElements.partition {
|
val (resultDeclarations, withErrors) = selectedElements.partition {
|
||||||
checker.checkAccessibility(it)
|
checker.isCorrectAndHaveNonPrivate(it)
|
||||||
}
|
}
|
||||||
if (!showUnknownTypesDialog(project, withErrors)) return@block null
|
if (!showUnknownTypesDialog(project, withErrors)) return@block null
|
||||||
resultDeclarations
|
resultDeclarations
|
||||||
@@ -168,7 +169,7 @@ private tailrec fun TypeAccessibilityChecker.findAndApplyExistingClasses(element
|
|||||||
val existingNames = classes.mapNotNull { it.fqName?.asString() }.toHashSet()
|
val existingNames = classes.mapNotNull { it.fqName?.asString() }.toHashSet()
|
||||||
existingFqNames = existingNames
|
existingFqNames = existingNames
|
||||||
|
|
||||||
val newExistingClasses = classes.filter { checkAccessibility(it) }
|
val newExistingClasses = classes.filter { isCorrectAndHaveNonPrivate(it) }
|
||||||
return if (classes.size == newExistingClasses.size) existingNames
|
return if (classes.size == newExistingClasses.size) existingNames
|
||||||
else findAndApplyExistingClasses(newExistingClasses)
|
else findAndApplyExistingClasses(newExistingClasses)
|
||||||
}
|
}
|
||||||
@@ -296,7 +297,7 @@ class CreateExpectedCallableMemberFix(
|
|||||||
targetExpectedClass: KtClassOrObject?,
|
targetExpectedClass: KtClassOrObject?,
|
||||||
commonModule: Module
|
commonModule: Module
|
||||||
) : CreateExpectedFix<KtNamedDeclaration>(declaration, targetExpectedClass, commonModule, block@{ project, checker, element ->
|
) : CreateExpectedFix<KtNamedDeclaration>(declaration, targetExpectedClass, commonModule, block@{ project, checker, element ->
|
||||||
if (!checker.checkAccessibility(element)) {
|
if (!checker.isCorrectAndHaveNonPrivate(element)) {
|
||||||
showUnknownTypesError(element)
|
showUnknownTypesError(element)
|
||||||
return@block null
|
return@block null
|
||||||
}
|
}
|
||||||
@@ -314,3 +315,5 @@ class CreateExpectedCallableMemberFix(
|
|||||||
}
|
}
|
||||||
})
|
})
|
||||||
|
|
||||||
|
private fun TypeAccessibilityChecker.isCorrectAndHaveNonPrivate(declaration: KtNamedDeclaration): Boolean =
|
||||||
|
!declaration.hasPrivateModifier() && checkAccessibility(declaration)
|
||||||
Reference in New Issue
Block a user