New J2K: do not use some keyword removing processings due to incorrect formatting after it
This commit is contained in:
@@ -8,6 +8,7 @@ package org.jetbrains.kotlin.nj2k
|
|||||||
import com.intellij.codeInspection.*
|
import com.intellij.codeInspection.*
|
||||||
import com.intellij.openapi.application.ApplicationManager
|
import com.intellij.openapi.application.ApplicationManager
|
||||||
import com.intellij.openapi.project.Project
|
import com.intellij.openapi.project.Project
|
||||||
|
import com.intellij.psi.PsiComment
|
||||||
import com.intellij.psi.PsiElement
|
import com.intellij.psi.PsiElement
|
||||||
import com.intellij.psi.search.LocalSearchScope
|
import com.intellij.psi.search.LocalSearchScope
|
||||||
import com.intellij.psi.search.searches.ReferencesSearch
|
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.analysis.analyzeInContext
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
import org.jetbrains.kotlin.idea.caches.resolve.analyze
|
||||||
import org.jetbrains.kotlin.idea.caches.resolve.resolveToDescriptorIfAny
|
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.replaced
|
||||||
import org.jetbrains.kotlin.idea.core.setVisibility
|
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.*
|
||||||
import org.jetbrains.kotlin.idea.inspections.branchedTransformations.IfThenToSafeAccessInspection
|
import org.jetbrains.kotlin.idea.inspections.branchedTransformations.IfThenToSafeAccessInspection
|
||||||
import org.jetbrains.kotlin.idea.inspections.conventionNameCalls.ReplaceGetOrSetInspection
|
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.references.readWriteAccess
|
||||||
import org.jetbrains.kotlin.idea.util.getResolutionScope
|
import org.jetbrains.kotlin.idea.util.getResolutionScope
|
||||||
import org.jetbrains.kotlin.j2k.ConverterSettings
|
import org.jetbrains.kotlin.j2k.ConverterSettings
|
||||||
|
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
|
||||||
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.nj2k.postProcessing.*
|
import org.jetbrains.kotlin.nj2k.postProcessing.*
|
||||||
import org.jetbrains.kotlin.psi.*
|
import org.jetbrains.kotlin.psi.*
|
||||||
import org.jetbrains.kotlin.psi.psiUtil.*
|
import org.jetbrains.kotlin.psi.psiUtil.*
|
||||||
import org.jetbrains.kotlin.resolve.BindingContext
|
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.calls.callUtil.getType
|
||||||
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
|
import org.jetbrains.kotlin.resolve.diagnostics.Diagnostics
|
||||||
import org.jetbrains.kotlin.resolve.lazy.BodyResolveMode
|
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.addToStdlib.safeAs
|
||||||
import org.jetbrains.kotlin.utils.mapToIndex
|
import org.jetbrains.kotlin.utils.mapToIndex
|
||||||
import java.util.*
|
import java.util.*
|
||||||
|
import kotlin.reflect.KClass
|
||||||
|
import kotlin.reflect.full.isSubclassOf
|
||||||
|
|
||||||
interface NewJ2kPostProcessing {
|
interface NewJ2kPostProcessing {
|
||||||
fun createAction(element: PsiElement, diagnostics: Diagnostics, settings: ConverterSettings?): (() -> Unit)? =
|
fun createAction(element: PsiElement, diagnostics: Diagnostics, settings: ConverterSettings?): (() -> Unit)? =
|
||||||
@@ -124,8 +130,9 @@ object NewJ2KPostProcessingRegistrar {
|
|||||||
SingleOneTimeProcessing(registerGeneralInspectionBasedProcessing(RedundantSetterInspection())),
|
SingleOneTimeProcessing(registerGeneralInspectionBasedProcessing(RedundantSetterInspection())),
|
||||||
SingleOneTimeProcessing(ConvertDataClass()),
|
SingleOneTimeProcessing(ConvertDataClass()),
|
||||||
RepeatableProcessingGroup(
|
RepeatableProcessingGroup(
|
||||||
registerGeneralInspectionBasedProcessing(RedundantModalityModifierInspection()),
|
RemoveRedundantVisibilityModifierProcessing(),
|
||||||
registerGeneralInspectionBasedProcessing(RedundantVisibilityModifierInspection()),
|
RemoveRedundantModalityModifierProcessing(),
|
||||||
|
RemoveRedundantConstructorKeywordProcessing(),
|
||||||
registerDiagnosticBasedProcessing(Errors.REDUNDANT_OPEN_IN_INTERFACE) { element: KtDeclaration, diagnostic ->
|
registerDiagnosticBasedProcessing(Errors.REDUNDANT_OPEN_IN_INTERFACE) { element: KtDeclaration, diagnostic ->
|
||||||
element.removeModifier(KtTokens.OPEN_KEYWORD)
|
element.removeModifier(KtTokens.OPEN_KEYWORD)
|
||||||
},
|
},
|
||||||
@@ -868,4 +875,62 @@ object NewJ2KPostProcessingRegistrar {
|
|||||||
override val writeActionNeeded: Boolean = true
|
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()!!)
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
}
|
}
|
||||||
Reference in New Issue
Block a user