Create expect: remove false positive in inaccessible type detector
This commit is contained in:
@@ -19,16 +19,20 @@ import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMemberChooserObj
|
|||||||
import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMemberChooserObject.BodyType.NO_BODY
|
import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMemberChooserObject.BodyType.NO_BODY
|
||||||
import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMemberChooserObject.Companion.create
|
import org.jetbrains.kotlin.idea.core.overrideImplement.OverrideMemberChooserObject.Companion.create
|
||||||
import org.jetbrains.kotlin.idea.core.toDescriptor
|
import org.jetbrains.kotlin.idea.core.toDescriptor
|
||||||
|
import org.jetbrains.kotlin.idea.project.platform
|
||||||
import org.jetbrains.kotlin.idea.refactoring.createKotlinFile
|
import org.jetbrains.kotlin.idea.refactoring.createKotlinFile
|
||||||
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
import org.jetbrains.kotlin.idea.util.application.runWriteAction
|
||||||
import org.jetbrains.kotlin.idea.util.hasDeclarationOf
|
import org.jetbrains.kotlin.idea.util.hasDeclarationOf
|
||||||
import org.jetbrains.kotlin.idea.util.isEffectivelyActual
|
import org.jetbrains.kotlin.idea.util.isEffectivelyActual
|
||||||
|
import org.jetbrains.kotlin.idea.util.module
|
||||||
import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
|
import org.jetbrains.kotlin.js.descriptorUtils.getJetTypeFqName
|
||||||
import org.jetbrains.kotlin.lexer.KtTokens
|
import org.jetbrains.kotlin.lexer.KtTokens
|
||||||
import org.jetbrains.kotlin.name.FqName
|
import org.jetbrains.kotlin.name.FqName
|
||||||
|
import org.jetbrains.kotlin.platform.impl.isCommon
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier
|
import org.jetbrains.kotlin.psi.psiUtil.hasActualModifier
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
import org.jetbrains.kotlin.resolve.BindingContext
|
||||||
|
import org.jetbrains.kotlin.resolve.DescriptorToSourceUtils
|
||||||
import org.jetbrains.kotlin.resolve.MultiTargetPlatform
|
import org.jetbrains.kotlin.resolve.MultiTargetPlatform
|
||||||
import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker
|
import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker
|
||||||
import org.jetbrains.kotlin.resolve.checkers.ExperimentalUsageChecker
|
import org.jetbrains.kotlin.resolve.checkers.ExperimentalUsageChecker
|
||||||
@@ -287,7 +291,12 @@ private fun KotlinType.checkAccessibility(accessibleClasses: List<KtClassOrObjec
|
|||||||
val classifierDescriptor = constructor.declarationDescriptor as? ClassifierDescriptorWithTypeParameters ?: return
|
val classifierDescriptor = constructor.declarationDescriptor as? ClassifierDescriptorWithTypeParameters ?: return
|
||||||
val moduleDescriptor = classifierDescriptor.module
|
val moduleDescriptor = classifierDescriptor.module
|
||||||
if (moduleDescriptor.getMultiTargetPlatform() == MultiTargetPlatform.Common) {
|
if (moduleDescriptor.getMultiTargetPlatform() == MultiTargetPlatform.Common) {
|
||||||
// Common classes are Ok
|
// Common classes are Ok; unfortunately this check does not work correctly for simple (non-expect) classes from common module
|
||||||
|
return
|
||||||
|
}
|
||||||
|
val declaration = DescriptorToSourceUtils.descriptorToDeclaration(classifierDescriptor)
|
||||||
|
if (declaration?.module?.platform?.kind?.isCommon == true) {
|
||||||
|
// Common classes are Ok again
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
val implementedDescriptors = moduleDescriptor.implementedDescriptors
|
val implementedDescriptors = moduleDescriptor.implementedDescriptors
|
||||||
|
|||||||
+1
@@ -0,0 +1 @@
|
|||||||
|
class My
|
||||||
Vendored
+3
@@ -0,0 +1,3 @@
|
|||||||
|
class My
|
||||||
|
|
||||||
|
expect fun foo(my: My)
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
// "Create expected function in common module testModule_Common" "true"
|
||||||
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
|
actual fun <caret>foo(my: My) {}
|
||||||
+4
@@ -0,0 +1,4 @@
|
|||||||
|
// "Create expected function in common module testModule_Common" "true"
|
||||||
|
// DISABLE-ERRORS
|
||||||
|
|
||||||
|
actual fun foo(my: My) {}
|
||||||
+5
@@ -349,6 +349,11 @@ public class QuickFixMultiModuleTestGenerated extends AbstractQuickFixMultiModul
|
|||||||
runTest("idea/testData/multiModuleQuickFix/expectFunWithAccessibleParameter/");
|
runTest("idea/testData/multiModuleQuickFix/expectFunWithAccessibleParameter/");
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@TestMetadata("expectFunWithAccessibleTypeFromCommon")
|
||||||
|
public void testExpectFunWithAccessibleTypeFromCommon() throws Exception {
|
||||||
|
runTest("idea/testData/multiModuleQuickFix/expectFunWithAccessibleTypeFromCommon/");
|
||||||
|
}
|
||||||
|
|
||||||
@TestMetadata("expectFunWithInaccessibleBounds")
|
@TestMetadata("expectFunWithInaccessibleBounds")
|
||||||
public void testExpectFunWithInaccessibleBounds() throws Exception {
|
public void testExpectFunWithInaccessibleBounds() throws Exception {
|
||||||
runTest("idea/testData/multiModuleQuickFix/expectFunWithInaccessibleBounds/");
|
runTest("idea/testData/multiModuleQuickFix/expectFunWithInaccessibleBounds/");
|
||||||
|
|||||||
Reference in New Issue
Block a user