New J2K: do not use some keyword removing processings due to incorrect formatting after it

This commit is contained in:
Ilya Kirillov
2019-04-08 19:33:46 +03:00
parent 54d6fc846b
commit 008e7a5add
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.nj2k
import com.intellij.codeInspection.*
import com.intellij.openapi.application.ApplicationManager
import com.intellij.openapi.project.Project
import com.intellij.psi.PsiComment
import com.intellij.psi.PsiElement
import com.intellij.psi.search.LocalSearchScope
import com.intellij.psi.search.searches.ReferencesSearch
@@ -22,8 +23,11 @@ import org.jetbrains.kotlin.diagnostics.Errors
import org.jetbrains.kotlin.idea.analysis.analyzeInContext
import org.jetbrains.kotlin.idea.caches.resolve.analyze
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
import org.jetbrains.kotlin.idea.core.implicitModality
import org.jetbrains.kotlin.idea.core.implicitVisibility
import org.jetbrains.kotlin.idea.core.replaced
import org.jetbrains.kotlin.idea.core.setVisibility
import org.jetbrains.kotlin.idea.formatter.commitAndUnblockDocument
import org.jetbrains.kotlin.idea.inspections.*
import org.jetbrains.kotlin.idea.inspections.branchedTransformations.IfThenToSafeAccessInspection
import org.jetbrains.kotlin.idea.inspections.conventionNameCalls.ReplaceGetOrSetInspection
@@ -40,13 +44,13 @@ import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.idea.references.readWriteAccess
import org.jetbrains.kotlin.idea.util.getResolutionScope
import org.jetbrains.kotlin.j2k.ConverterSettings
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.nj2k.postProcessing.*
import org.jetbrains.kotlin.psi.*
import org.jetbrains.kotlin.psi.psiUtil.*
import org.jetbrains.kotlin.resolve.BindingContext
import org.jetbrains.kotlin.resolve.calls.callUtil.getCalleeExpressionIfAny
import org.jetbrains.kotlin.resolve.calls.callUtil.getType
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
@@ -57,6 +61,8 @@ import org.jetbrains.kotlin.types.typeUtil.makeNotNullable
import org.jetbrains.kotlin.utils.addToStdlib.safeAs
import org.jetbrains.kotlin.utils.mapToIndex
import java.util.*
import kotlin.reflect.KClass
import kotlin.reflect.full.isSubclassOf
interface NewJ2kPostProcessing {
fun createAction(element: PsiElement, diagnostics: Diagnostics, settings: ConverterSettings?): (() -> Unit)? =
@@ -124,8 +130,9 @@ object NewJ2KPostProcessingRegistrar {
SingleOneTimeProcessing(registerGeneralInspectionBasedProcessing(RedundantSetterInspection())),
SingleOneTimeProcessing(ConvertDataClass()),
RepeatableProcessingGroup(
registerGeneralInspectionBasedProcessing(RedundantModalityModifierInspection()),
registerGeneralInspectionBasedProcessing(RedundantVisibilityModifierInspection()),
RemoveRedundantVisibilityModifierProcessing(),
RemoveRedundantModalityModifierProcessing(),
RemoveRedundantConstructorKeywordProcessing(),
registerDiagnosticBasedProcessing(Errors.REDUNDANT_OPEN_IN_INTERFACE) { element: KtDeclaration, diagnostic ->
element.removeModifier(KtTokens.OPEN_KEYWORD)
},
@@ -868,4 +875,62 @@ object NewJ2KPostProcessingRegistrar {
override val writeActionNeeded: Boolean = true
}
private class RemoveRedundantConstructorKeywordProcessing : CheckableProcessing<KtPrimaryConstructor>(KtPrimaryConstructor::class) {
override fun check(element: KtPrimaryConstructor): Boolean =
element.containingClassOrObject is KtClass
&& element.getConstructorKeyword() != null
&& element.annotationEntries.isEmpty()
&& element.visibilityModifier() == null
override fun action(element: KtPrimaryConstructor) {
element.removeRedundantConstructorKeywordAndSpace()
}
}
private class RemoveRedundantModalityModifierProcessing : CheckableProcessing<KtDeclaration>(KtDeclaration::class) {
override fun check(element: KtDeclaration): Boolean {
val modalityModifier = element.modalityModifier() ?: return false
val modalityModifierType = modalityModifier.node.elementType
val implicitModality = element.implicitModality()
return modalityModifierType == implicitModality
}
override fun action(element: KtDeclaration) {
element.removeModifierSmart(element.modalityModifierType()!!)
}
}
//hack until KT-30804 is fixed
private fun KtModifierListOwner.removeModifierSmart(modifierToken: KtModifierKeywordToken) {
val modifier = modifierList?.getModifier(modifierToken)
val comment = modifier?.getPrevSiblingIgnoringWhitespace() as? PsiComment
comment?.also {
it.parent.addAfter(KtPsiFactory(this).createNewLine(), it)
}
val newElement = copy() as KtModifierListOwner
newElement.removeModifier(modifierToken)
replace(newElement)
containingFile.commitAndUnblockDocument()
}
private class RemoveRedundantVisibilityModifierProcessing : CheckableProcessing<KtDeclaration>(KtDeclaration::class) {
override fun check(element: KtDeclaration): Boolean {
val visibilityModifier = element.visibilityModifier() ?: return false
val implicitVisibility = element.implicitVisibility()
return when {
visibilityModifier.node.elementType == implicitVisibility ->
true
element.hasModifier(KtTokens.INTERNAL_KEYWORD) && element.containingClassOrObject?.isLocal == true ->
true
else -> false
}
}
override fun action(element: KtDeclaration) {
element.removeModifierSmart(element.visibilityModifierType()!!)
}
}
}