Fix function, expected declaration can be without expect modifier

For example, for nested classes of expected class
This commit is contained in:
Mikhail Zarechenskiy
2017-10-02 01:34:20 +03:00
parent 4b2fc9a325
commit 68a2ba4918
2 changed files with 17 additions and 16 deletions
@@ -1,5 +1,5 @@
/*
* Copyright 2010-2016 JetBrains s.r.o.
* Copyright 2010-2017 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.
@@ -23,6 +23,8 @@ import org.jetbrains.kotlin.idea.caches.resolve.ModuleTestSourceInfo
import org.jetbrains.kotlin.idea.caches.resolve.findModuleDescriptor
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.core.toDescriptor
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
import org.jetbrains.kotlin.psi.KtClassOrObject
import org.jetbrains.kotlin.psi.KtDeclaration
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier
@@ -31,6 +33,7 @@ import org.jetbrains.kotlin.resolve.MultiTargetPlatform
import org.jetbrains.kotlin.resolve.checkers.ExpectedActualDeclarationChecker
import org.jetbrains.kotlin.resolve.descriptorUtil.module
import org.jetbrains.kotlin.resolve.getMultiTargetPlatform
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
val ModuleDescriptor.sourceKind: SourceKind
get() = when (getCapability(ModuleInfo.Capability)) {
@@ -76,8 +79,17 @@ internal fun KtDeclaration.expectedDeclarationIfAny(): KtDeclaration? {
return DescriptorToSourceUtils.descriptorToDeclaration(expectedDescriptor) as? KtDeclaration
}
internal fun KtDeclaration.isExpectedOrExpectedClassMember() =
hasExpectModifier() || (containingClassOrObject?.hasExpectModifier() ?: false)
internal fun KtDeclaration.isExpectedOrExpectedClassMember(): Boolean {
if (hasExpectModifier()) return true
if (this is KtClassOrObject) return this.isExpected()
return containingClassOrObject?.isExpected() == true
}
internal fun KtClassOrObject.isExpected(): Boolean {
return this.hasExpectModifier() ||
this.descriptor.safeAs<ClassDescriptor>()?.isExpect == true
}
internal fun DeclarationDescriptor.liftToExpected(): DeclarationDescriptor? {
if (this is MemberDescriptor) {
@@ -19,14 +19,10 @@ package org.jetbrains.kotlin.idea.intentions
import com.intellij.codeInspection.CleanupLocalInspectionTool
import com.intellij.codeInspection.ProblemHighlightType
import com.intellij.openapi.editor.Editor
import org.jetbrains.kotlin.descriptors.ClassDescriptor
import org.jetbrains.kotlin.idea.highlighter.markers.isExpectedOrExpectedClassMember
import org.jetbrains.kotlin.idea.inspections.IntentionBasedInspection
import org.jetbrains.kotlin.idea.search.usagesSearch.descriptor
import org.jetbrains.kotlin.psi.KtPrimaryConstructor
import org.jetbrains.kotlin.psi.psiUtil.containingClass
import org.jetbrains.kotlin.psi.psiUtil.containingClassOrObject
import org.jetbrains.kotlin.psi.psiUtil.hasExpectModifier
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
class RemoveEmptyPrimaryConstructorInspection : IntentionBasedInspection<KtPrimaryConstructor>(
RemoveEmptyPrimaryConstructorIntention::class
@@ -44,14 +40,7 @@ class RemoveEmptyPrimaryConstructorIntention : SelfTargetingOffsetIndependentInt
element.annotations.isNotEmpty() -> false
element.modifierList?.text?.isBlank() == false -> false
element.containingClass()?.secondaryConstructors?.isNotEmpty() == true -> false
element.isConstructorOfExpectClass() -> false
element.isExpectedOrExpectedClassMember() -> false
else -> true
}
private fun KtPrimaryConstructor.isConstructorOfExpectClass(): Boolean {
val containingClass = containingClassOrObject ?: return false
if (containingClass.hasExpectModifier()) return true
return containingClass.descriptor.safeAs<ClassDescriptor>()?.isExpect ?: false
}
}