From 27d7ee8518012b7eab6b312080b994effcdc3e2f Mon Sep 17 00:00:00 2001 From: Dmitry Gridin Date: Thu, 22 Aug 2019 18:58:37 +0700 Subject: [PATCH] TypeAccessibilityChecker: move to idea-analysis module --- .../quickfix}/TypeAccessibilityChecker.kt | 2 +- .../quickfix}/TypeAccessibilityCheckerImpl.kt | 25 +++++++++-- .../idea/refactoring/fqName/fqNameUtil.kt | 43 ++++++++----------- .../AbstractCreateDeclarationFix.kt | 1 + .../quickfix/expectactual/AddActualFix.kt | 1 + .../quickfix/expectactual/CreateActualFix.kt | 1 + .../expectactual/CreateExpectedFix.kt | 1 + .../expectactual/ExpectActualUtils.kt | 12 ++---- .../AbstractQuickFixMultiModuleTest.kt | 1 - 9 files changed, 48 insertions(+), 39 deletions(-) rename idea/{src/org/jetbrains/kotlin/idea/quickfix/expectactual => idea-analysis/src/org/jetbrains/kotlin/idea/quickfix}/TypeAccessibilityChecker.kt (96%) rename idea/{src/org/jetbrains/kotlin/idea/quickfix/expectactual => idea-analysis/src/org/jetbrains/kotlin/idea/quickfix}/TypeAccessibilityCheckerImpl.kt (90%) diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/TypeAccessibilityChecker.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/quickfix/TypeAccessibilityChecker.kt similarity index 96% rename from idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/TypeAccessibilityChecker.kt rename to idea/idea-analysis/src/org/jetbrains/kotlin/idea/quickfix/TypeAccessibilityChecker.kt index 69f02342b3d..86cf9d88b2c 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/TypeAccessibilityChecker.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/quickfix/TypeAccessibilityChecker.kt @@ -3,7 +3,7 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.kotlin.idea.quickfix.expectactual +package org.jetbrains.kotlin.idea.quickfix import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/TypeAccessibilityCheckerImpl.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/quickfix/TypeAccessibilityCheckerImpl.kt similarity index 90% rename from idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/TypeAccessibilityCheckerImpl.kt rename to idea/idea-analysis/src/org/jetbrains/kotlin/idea/quickfix/TypeAccessibilityCheckerImpl.kt index addcf9347a7..b1f68e5e4f0 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/TypeAccessibilityCheckerImpl.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/quickfix/TypeAccessibilityCheckerImpl.kt @@ -3,20 +3,20 @@ * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ -package org.jetbrains.kotlin.idea.quickfix.expectactual +package org.jetbrains.kotlin.idea.quickfix import com.intellij.openapi.module.Module import com.intellij.openapi.project.Project import com.intellij.psi.search.GlobalSearchScope -import org.jetbrains.kotlin.backend.common.descriptors.explicitParameters import org.jetbrains.kotlin.descriptors.* import org.jetbrains.kotlin.idea.caches.project.isTestModule import org.jetbrains.kotlin.idea.caches.project.toDescriptor +import org.jetbrains.kotlin.idea.refactoring.fqName.fqName import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor import org.jetbrains.kotlin.idea.stubindex.KotlinFullClassNameIndex -import org.jetbrains.kotlin.idea.util.hasPrivateModifier import org.jetbrains.kotlin.incremental.components.NoLookupLocation import org.jetbrains.kotlin.js.resolve.diagnostics.findPsi +import org.jetbrains.kotlin.lexer.KtTokens import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.psi.KtTypeParameter @@ -48,7 +48,7 @@ class TypeAccessibilityCheckerImpl( override fun incorrectTypes(type: KotlinType): Collection = incorrectTypesInSequence(type.collectAllTypes(), false) override fun checkAccessibility(declaration: KtNamedDeclaration): Boolean = - !declaration.hasPrivateModifier() && declaration.descriptor?.let { checkAccessibility(it) } == true + !declaration.hasModifier(KtTokens.PRIVATE_KEYWORD) && declaration.descriptor?.let { checkAccessibility(it) } == true override fun checkAccessibility(descriptor: DeclarationDescriptor): Boolean = incorrectTypesInDescriptor(descriptor, true).isEmpty() @@ -130,3 +130,20 @@ private fun DeclarationDescriptor.collectAllTypes(): Sequence { private fun KotlinType.collectAllTypes(): Sequence = sequenceOf(fqName) + arguments.asSequence() .map(TypeProjection::getType) .flatMap(KotlinType::collectAllTypes) + +private val CallableDescriptor.explicitParameters: List + get() { + val result = ArrayList(valueParameters.size + 2) + + this.dispatchReceiverParameter?.let { + result.add(it) + } + + this.extensionReceiverParameter?.let { + result.add(it) + } + + result.addAll(valueParameters) + + return result + } diff --git a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/refactoring/fqName/fqNameUtil.kt b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/refactoring/fqName/fqNameUtil.kt index 76234888a9e..2bfa1ce736f 100644 --- a/idea/idea-analysis/src/org/jetbrains/kotlin/idea/refactoring/fqName/fqNameUtil.kt +++ b/idea/idea-analysis/src/org/jetbrains/kotlin/idea/refactoring/fqName/fqNameUtil.kt @@ -1,17 +1,6 @@ /* - * Copyright 2010-2015 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ package org.jetbrains.kotlin.idea.refactoring.fqName @@ -24,22 +13,22 @@ import org.jetbrains.kotlin.asJava.namedUnwrappedElement import org.jetbrains.kotlin.name.FqName import org.jetbrains.kotlin.psi.KtNamedDeclaration import org.jetbrains.kotlin.resolve.ImportPath +import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull +import org.jetbrains.kotlin.types.AbbreviatedType +import org.jetbrains.kotlin.types.KotlinType /** * Returns FqName for given declaration (either Java or Kotlin) */ -fun PsiElement.getKotlinFqName(): FqName? { - val element = namedUnwrappedElement - return when (element) { - is PsiPackage -> FqName(element.qualifiedName) - is PsiClass -> element.qualifiedName?.let(::FqName) - is PsiMember -> element.getName()?.let { name -> - val prefix = element.containingClass?.qualifiedName - FqName(if (prefix != null) "$prefix.$name" else name) - } - is KtNamedDeclaration -> element.fqName - else -> null +fun PsiElement.getKotlinFqName(): FqName? = when (val element = namedUnwrappedElement) { + is PsiPackage -> FqName(element.qualifiedName) + is PsiClass -> element.qualifiedName?.let(::FqName) + is PsiMember -> element.getName()?.let { name -> + val prefix = element.containingClass?.qualifiedName + FqName(if (prefix != null) "$prefix.$name" else name) } + is KtNamedDeclaration -> element.fqName + else -> null } fun FqName.isImported(importPath: ImportPath, skipAliasedImports: Boolean = true): Boolean { @@ -59,3 +48,9 @@ private fun ImportPath.isImported(imports: Iterable): Boolean = impo fun ImportPath.isImported(imports: Iterable, excludedFqNames: Iterable): Boolean { return isImported(imports) && (isAllUnder || this.fqName !in excludedFqNames) } + +val KotlinType.fqName: FqName? + get() = when (this) { + is AbbreviatedType -> abbreviation.fqName + else -> constructor.declarationDescriptor?.fqNameOrNull() + } diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/AbstractCreateDeclarationFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/AbstractCreateDeclarationFix.kt index f9369e76694..ca7e6e73e4e 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/AbstractCreateDeclarationFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/AbstractCreateDeclarationFix.kt @@ -13,6 +13,7 @@ import com.intellij.openapi.project.Project import com.intellij.psi.codeStyle.CodeStyleManager import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction +import org.jetbrains.kotlin.idea.quickfix.TypeAccessibilityChecker import org.jetbrains.kotlin.idea.refactoring.introduce.showErrorHint import org.jetbrains.kotlin.idea.util.application.executeWriteCommand import org.jetbrains.kotlin.psi.* diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/AddActualFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/AddActualFix.kt index 6ea8430861a..686ac3d4cd7 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/AddActualFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/AddActualFix.kt @@ -29,6 +29,7 @@ import org.jetbrains.kotlin.idea.core.ShortenReferences import org.jetbrains.kotlin.idea.core.toDescriptor import org.jetbrains.kotlin.idea.quickfix.KotlinQuickFixAction import org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory +import org.jetbrains.kotlin.idea.quickfix.TypeAccessibilityChecker import org.jetbrains.kotlin.idea.util.module import org.jetbrains.kotlin.psi.* import org.jetbrains.kotlin.psi.psiUtil.createSmartPointer diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt index c86db87a9da..094c9d0f63b 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateActualFix.kt @@ -28,6 +28,7 @@ import org.jetbrains.kotlin.diagnostics.Errors import org.jetbrains.kotlin.idea.caches.project.ModuleSourceInfo import org.jetbrains.kotlin.idea.core.toDescriptor import org.jetbrains.kotlin.idea.quickfix.KotlinSingleIntentionActionFactory +import org.jetbrains.kotlin.idea.quickfix.TypeAccessibilityChecker import org.jetbrains.kotlin.idea.util.actualsForExpected import org.jetbrains.kotlin.platform.TargetPlatform import org.jetbrains.kotlin.psi.* diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateExpectedFix.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateExpectedFix.kt index 6e67333385b..bf8392a6f6f 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateExpectedFix.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/CreateExpectedFix.kt @@ -27,6 +27,7 @@ import org.jetbrains.kotlin.idea.core.toDescriptor import org.jetbrains.kotlin.idea.core.util.DescriptorMemberChooserObject import org.jetbrains.kotlin.idea.inspections.findExistingEditor import org.jetbrains.kotlin.idea.quickfix.KotlinIntentionActionsFactory +import org.jetbrains.kotlin.idea.quickfix.TypeAccessibilityChecker import org.jetbrains.kotlin.idea.refactoring.getExpressionShortText import org.jetbrains.kotlin.idea.refactoring.introduce.showErrorHint import org.jetbrains.kotlin.idea.util.application.executeWriteCommand diff --git a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt index fab2aedc8f8..c686debed84 100644 --- a/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt +++ b/idea/src/org/jetbrains/kotlin/idea/quickfix/expectactual/ExpectActualUtils.kt @@ -1,5 +1,5 @@ /* - * Copyright 2010-2018 JetBrains s.r.o. and Kotlin Programming Language contributors. + * Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors. * Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file. */ @@ -23,7 +23,9 @@ import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMemberChooserObj import org.jetbrains.kotlin.idea.core.overrideImplement.generateMember import org.jetbrains.kotlin.idea.core.overrideImplement.makeNotActual import org.jetbrains.kotlin.idea.core.toDescriptor +import org.jetbrains.kotlin.idea.quickfix.TypeAccessibilityChecker import org.jetbrains.kotlin.idea.refactoring.createKotlinFile +import org.jetbrains.kotlin.idea.refactoring.fqName.fqName import org.jetbrains.kotlin.idea.util.IdeDescriptorRenderers import org.jetbrains.kotlin.idea.util.application.runWriteAction import org.jetbrains.kotlin.idea.util.hasInlineModifier @@ -38,8 +40,6 @@ import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker import org.jetbrains.kotlin.resolve.checkers.ExperimentalUsageChecker import org.jetbrains.kotlin.resolve.descriptorUtil.fqNameOrNull import org.jetbrains.kotlin.resolve.source.KotlinSourceElement -import org.jetbrains.kotlin.types.AbbreviatedType -import org.jetbrains.kotlin.types.KotlinType import org.jetbrains.kotlin.utils.addToStdlib.safeAs fun createFileForDeclaration(module: Module, declaration: KtNamedDeclaration): KtFile? { @@ -329,9 +329,3 @@ class KotlinTypeInaccessibleException(fqNames: Collection) : Exception( fun KtNamedDeclaration.isAlwaysActual(): Boolean = safeAs()?.parent?.parent?.safeAs() ?.mustHaveValOrVar() ?: false - -val KotlinType.fqName: FqName? - get() = when (this) { - is AbbreviatedType -> abbreviation.fqName - else -> constructor.declarationDescriptor?.fqNameOrNull() - } diff --git a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiModuleTest.kt b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiModuleTest.kt index 67e89c31ff0..b57e59933cc 100644 --- a/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiModuleTest.kt +++ b/idea/tests/org/jetbrains/kotlin/idea/quickfix/AbstractQuickFixMultiModuleTest.kt @@ -14,7 +14,6 @@ import junit.framework.ComparisonFailure import junit.framework.TestCase import org.jetbrains.kotlin.idea.inspections.findExistingEditor import org.jetbrains.kotlin.idea.multiplatform.setupMppProjectFromDirStructure -import org.jetbrains.kotlin.idea.quickfix.expectactual.TypeAccessibilityChecker import org.jetbrains.kotlin.idea.stubs.AbstractMultiModuleTest import org.jetbrains.kotlin.idea.test.DirectiveBasedActionUtils import org.jetbrains.kotlin.idea.test.PluginTestCaseBase