New J2K: do not print modifiers which are going to be removed in postprocessing

This commit is contained in:
Ilya Kirillov
2019-06-26 17:45:49 +03:00
parent 0b7b16162d
commit 3e04bfb156
34 changed files with 233 additions and 198 deletions
@@ -37,11 +37,15 @@ class FieldToPropertyProcessing(
if (field.name != propertyName || replaceReadWithFieldReference || replaceWriteWithFieldReference) MyConvertedCodeProcessor() else null
override var javaCodeProcessors =
when {
field.hasModifierProperty(PsiModifier.PRIVATE) -> emptyList()
field.name != propertyName -> listOf(ElementRenamedCodeProcessor(propertyName), UseAccessorsJavaCodeProcessor())
else -> listOf(UseAccessorsJavaCodeProcessor())
}
when {
field.hasModifierProperty(PsiModifier.PRIVATE) -> emptyList()
field.name != propertyName ->
listOf(
ElementRenamedCodeProcessor(propertyName),
UseAccessorsJavaCodeProcessor(PsiElementFactory.SERVICE.getInstance(field.project), propertyName)
)
else -> listOf(UseAccessorsJavaCodeProcessor(PsiElementFactory.SERVICE.getInstance(field.project), propertyName))
}
override val kotlinCodeProcessors =
if (field.name != propertyName)
@@ -77,86 +81,91 @@ class FieldToPropertyProcessing(
}
}
}
}
private inner class UseAccessorsJavaCodeProcessor : ExternalCodeProcessor {
private val factory = PsiElementFactory.SERVICE.getInstance(field.project)
class UseAccessorsJavaCodeProcessor(private val factory: PsiElementFactory, private val propertyName: String) : ExternalCodeProcessor {
override fun processUsage(reference: PsiReference): Array<PsiReference>? {
val refExpr = reference.element as? PsiReferenceExpression ?: return null
val qualifier = refExpr.qualifierExpression
override fun processUsage(reference: PsiReference): Array<PsiReference>? {
val refExpr = reference.element as? PsiReferenceExpression ?: return null
val qualifier = refExpr.qualifierExpression
val parent = refExpr.parent
when (parent) {
is PsiAssignmentExpression -> {
if (refExpr == parent.lExpression) {
if (parent.operationTokenType == JavaTokenType.EQ) {
val callExpr = parent.replace(generateSetterCall(qualifier, parent.rExpression ?: return null)) as PsiMethodCallExpression
return arrayOf(callExpr.methodExpression)
}
else {
val assignmentOpText = parent.operationSign.text
assert(assignmentOpText.endsWith("="))
val opText = assignmentOpText.substring(0, assignmentOpText.length - 1)
return parent.replaceWithModificationCalls(qualifier, opText, parent.rExpression ?: return null)
}
}
}
is PsiPrefixExpression, is PsiPostfixExpression -> {
//TODO: what if it's used as value?
val operationType = (parent as? PsiPrefixExpression)?.operationTokenType
?: (parent as PsiPostfixExpression).operationTokenType
val opText = when (operationType) {
JavaTokenType.PLUSPLUS -> "+"
JavaTokenType.MINUSMINUS -> "-"
else -> null
}
if (opText != null) {
return (parent as PsiExpression).replaceWithModificationCalls(qualifier, opText, factory.createExpressionFromText("1", null))
when (val parent = refExpr.parent) {
is PsiAssignmentExpression -> {
if (refExpr == parent.lExpression) {
if (parent.operationTokenType == JavaTokenType.EQ) {
val callExpr =
parent.replace(generateSetterCall(qualifier, parent.rExpression ?: return null)) as PsiMethodCallExpression
return arrayOf(callExpr.methodExpression)
} else {
val assignmentOpText = parent.operationSign.text
assert(assignmentOpText.endsWith("="))
val opText = assignmentOpText.substring(0, assignmentOpText.length - 1)
return parent.replaceWithModificationCalls(qualifier, opText, parent.rExpression ?: return null)
}
}
}
val callExpr = refExpr.replace(generateGetterCall(qualifier)) as PsiMethodCallExpression
return arrayOf(callExpr.methodExpression)
is PsiPrefixExpression, is PsiPostfixExpression -> {
//TODO: what if it's used as value?
val operationType = (parent as? PsiPrefixExpression)?.operationTokenType
?: (parent as PsiPostfixExpression).operationTokenType
val opText = when (operationType) {
JavaTokenType.PLUSPLUS -> "+"
JavaTokenType.MINUSMINUS -> "-"
else -> null
}
if (opText != null) {
return (parent as PsiExpression).replaceWithModificationCalls(
qualifier,
opText,
factory.createExpressionFromText("1", null)
)
}
}
}
//TODO: what if qualifier has side effects?
private fun PsiExpression.replaceWithModificationCalls(qualifier: PsiExpression?, op: String, value: PsiExpression): Array<PsiReference> {
var getCall = generateGetterCall(qualifier)
var binary = factory.createExpressionFromText("x $op y", null) as PsiBinaryExpression
binary.lOperand.replace(getCall)
binary.rOperand!!.replace(value)
var setCall = generateSetterCall(qualifier, binary) as PsiMethodCallExpression
setCall = this.replace(setCall) as PsiMethodCallExpression
binary = setCall.argumentList.expressions.single() as PsiBinaryExpression
getCall = binary.lOperand as PsiMethodCallExpression
return arrayOf(getCall.methodExpression, setCall.methodExpression)
}
private fun generateGetterCall(qualifier: PsiExpression?): PsiMethodCallExpression {
val text = accessorName(AccessorKind.GETTER) + "()"
val expressionText = if (qualifier != null)
"${qualifier.text}.$text"
else
text
return factory.createExpressionFromText(expressionText, null) as PsiMethodCallExpression
}
private fun generateSetterCall(qualifier: PsiExpression?, value: PsiExpression): PsiExpression {
val text = accessorName(AccessorKind.SETTER) + "(" + value.text + ")"
val expressionText = if (qualifier != null)
"${qualifier.text}.$text"
else
text
return factory.createExpressionFromText(expressionText, null)
}
val callExpr = refExpr.replace(generateGetterCall(qualifier)) as PsiMethodCallExpression
return arrayOf(callExpr.methodExpression)
}
private fun accessorName(kind: AccessorKind)
= (if (kind == AccessorKind.GETTER) "get" else "set") + propertyName.capitalize()
//TODO: what if qualifier has side effects?
private fun PsiExpression.replaceWithModificationCalls(
qualifier: PsiExpression?,
op: String,
value: PsiExpression
): Array<PsiReference> {
var getCall = generateGetterCall(qualifier)
var binary = factory.createExpressionFromText("x $op y", null) as PsiBinaryExpression
binary.lOperand.replace(getCall)
binary.rOperand!!.replace(value)
var setCall = generateSetterCall(qualifier, binary) as PsiMethodCallExpression
setCall = this.replace(setCall) as PsiMethodCallExpression
binary = setCall.argumentList.expressions.single() as PsiBinaryExpression
getCall = binary.lOperand as PsiMethodCallExpression
return arrayOf(getCall.methodExpression, setCall.methodExpression)
}
private fun generateGetterCall(qualifier: PsiExpression?): PsiMethodCallExpression {
val text = accessorName(AccessorKind.GETTER) + "()"
val expressionText = if (qualifier != null)
"${qualifier.text}.$text"
else
text
return factory.createExpressionFromText(expressionText, null) as PsiMethodCallExpression
}
private fun generateSetterCall(qualifier: PsiExpression?, value: PsiExpression): PsiExpression {
val text = accessorName(AccessorKind.SETTER) + "(" + value.text + ")"
val expressionText = if (qualifier != null)
"${qualifier.text}.$text"
else
text
return factory.createExpressionFromText(expressionText, null)
}
private fun accessorName(kind: AccessorKind) =
(if (kind == AccessorKind.GETTER) "get" else "set") + propertyName.capitalize()
}
@@ -23,6 +23,7 @@ import org.jetbrains.kotlin.idea.references.KtSimpleNameReference
import org.jetbrains.kotlin.idea.references.mainReference
import org.jetbrains.kotlin.idea.references.readWriteAccess
import org.jetbrains.kotlin.idea.util.CommentSaver
import org.jetbrains.kotlin.lexer.KtModifierKeywordToken
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.asGetterName
@@ -170,11 +171,14 @@ class ConvertGettersAndSettersToPropertyProcessing : ElementsBasedPostProcessing
factory.createExpression(KtTokens.FIELD_KEYWORD.value),
true
)
val modifiers = setter.modifiersText?.takeIf { it.isNotEmpty() }
?: setter.safeAs<RealSetter>()?.function?.visibilityModifierTypeOrDefault()?.value
?: property.visibilityModifierTypeOrDefault().value
val ktSetter = factory.createSetter(
body,
setter.parameterName,
setter.modifiersText?.takeIf { it.isNotEmpty() } ?: property.visibilityModifierTypeOrDefault().value
modifiers
)
ktSetter.filterModifiers()
if (setter is RealSetter) {
@@ -16,7 +16,6 @@
package org.jetbrains.kotlin.nj2k
import com.intellij.lang.jvm.JvmAnnotatedElement
import com.intellij.lang.jvm.JvmModifier
import com.intellij.psi.*
import com.intellij.psi.JavaTokenType.SUPER_KEYWORD
@@ -532,7 +531,7 @@ class JavaToJKTreeBuilder constructor(
typeParameterList?.toJK() ?: JKTypeParameterListImpl(),
createClassBody(),
annotationList(this),
extraModifiers(),
otherModifiers(),
visibility(),
modality()
).also { jkClassImpl ->
@@ -600,20 +599,20 @@ class JavaToJKTreeBuilder constructor(
fun PsiMember.modality() =
modality({ ast, psi -> ast.assignNonCodeElements(psi) })
fun PsiMember.extraModifiers() =
fun PsiMember.otherModifiers() =
modifierList?.children?.mapNotNull { child ->
if (child !is PsiKeyword) return@mapNotNull null
when (child.text) {
PsiModifier.NATIVE -> ExtraModifier.NATIVE
PsiModifier.STATIC -> ExtraModifier.STATIC
PsiModifier.STRICTFP -> ExtraModifier.STRICTFP
PsiModifier.SYNCHRONIZED -> ExtraModifier.SYNCHRONIZED
PsiModifier.TRANSIENT -> ExtraModifier.TRANSIENT
PsiModifier.VOLATILE -> ExtraModifier.VOLATILE
PsiModifier.NATIVE -> OtherModifier.NATIVE
PsiModifier.STATIC -> OtherModifier.STATIC
PsiModifier.STRICTFP -> OtherModifier.STRICTFP
PsiModifier.SYNCHRONIZED -> OtherModifier.SYNCHRONIZED
PsiModifier.TRANSIENT -> OtherModifier.TRANSIENT
PsiModifier.VOLATILE -> OtherModifier.VOLATILE
else -> null
}?.let {
JKExtraModifierElementImpl(it).withAssignedNonCodeElements(child)
JKOtherModifierElementImpl(it).withAssignedNonCodeElements(child)
}
}.orEmpty()
@@ -627,7 +626,7 @@ class JavaToJKTreeBuilder constructor(
nameIdentifier.toJK(),
with(expressionTreeMapper) { initializer.toJK() },
annotationList(this),
extraModifiers(),
otherModifiers(),
visibility(),
modality(),
JKMutabilityModifierElementImpl(Mutability.UNKNOWN)
@@ -718,7 +717,7 @@ class JavaToJKTreeBuilder constructor(
typeParameterList?.toJK() ?: JKTypeParameterListImpl(),
annotationList(this),
throwsList.referencedTypes.map { JKTypeElementImpl(it.toJK(symbolProvider)) },
extraModifiers(),
otherModifiers(),
visibility(),
modality()
).also { jkMethod ->
@@ -93,7 +93,9 @@ class NewCodeBuilder(context: NewJ2kConverterContext) {
}
override fun visitModifierElementRaw(modifierElement: JKModifierElement) {
printer.printWithNoIndent(modifierElement.modifier.text)
if (modifierElement.modifier != Modality.FINAL) {
printer.printWithNoIndent(modifierElement.modifier.text)
}
}
private fun renderExtraTypeParametersUpperBounds(typeParameterList: JKTypeParameterList) {
@@ -212,8 +214,20 @@ class NewCodeBuilder(context: NewJ2kConverterContext) {
}
private fun renderModifiersList(modifiersList: JKModifiersListOwner) {
renderList(modifiersList.modifierElements(), " ") {
it.accept(this)
val hasOverrideModifier = modifiersList.safeAs<JKOtherModifiersOwner>()
?.otherModifierElements
?.any { it.otherModifier == OtherModifier.OVERRIDE } == true
renderList(modifiersList.modifierElements(), " ") { modifierElement ->
if (modifierElement.modifier == Modality.FINAL || modifierElement.modifier == Visibility.PUBLIC) {
if (hasOverrideModifier) {
modifierElement.accept(this)
} else {
printLeftNonCodeElements(modifierElement)
printRightNonCodeElements(modifierElement)
}
} else {
modifierElement.accept(this)
}
}
}
@@ -50,7 +50,7 @@ class ClassToObjectPromotionConversion(private val context: NewJ2kConverterConte
}.map { it.detached(element.classBody) }
},
JKAnnotationListImpl(),
element.extraModifierElements,
element.otherModifierElements,
element.visibilityElement,
JKModalityModifierElementImpl(Modality.FINAL)
).withNonCodeElementsFrom(element)
@@ -25,7 +25,7 @@ class ConstructorConversion(private val context: NewJ2kConverterContext) : Recur
element.block,
delegationCall,
element.annotationList,
element.extraModifierElements,
element.otherModifierElements,
element.visibilityElement,
element.modalityElement
).also {
@@ -17,12 +17,11 @@ class DefaultArgumentsConversion(private val context: NewJ2kConverterContext) :
name.value.asGetterName() != null
|| name.value.asSetterName() != null
private fun JKMethod.canNotBeMerged(): Boolean =
modality == Modality.ABSTRACT
|| modality == Modality.OVERRIDE
|| hasExtraModifier(ExtraModifier.NATIVE)
|| hasExtraModifier(ExtraModifier.SYNCHRONIZED)
|| hasOtherModifier(OtherModifier.OVERRIDE)
|| hasOtherModifier(OtherModifier.NATIVE)
|| hasOtherModifier(OtherModifier.SYNCHRONIZED)
|| context.converter.converterServices.oldServices.referenceSearcher.hasOverrides(psi()!!)
|| annotationList.annotations.isNotEmpty()
|| canBeGetterOrSetter()
@@ -23,7 +23,7 @@ class FieldToPropertyConversion : RecursiveApplicableConversionBase() {
JKKtEmptyGetterOrSetterImpl(),
JKKtEmptyGetterOrSetterImpl(),
element.annotationList,
element.extraModifierElements,
element.otherModifierElements,
element.visibilityElement,
JKModalityModifierElementImpl(Modality.FINAL),
JKMutabilityModifierElementImpl(mutability).withNonCodeElementsFrom(element.modalityElement)
@@ -5,10 +5,10 @@
package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.nj2k.tree.ExtraModifier
import org.jetbrains.kotlin.nj2k.tree.OtherModifier
import org.jetbrains.kotlin.nj2k.tree.JKClass
import org.jetbrains.kotlin.nj2k.tree.JKTreeElement
import org.jetbrains.kotlin.nj2k.tree.impl.JKExtraModifierElementImpl
import org.jetbrains.kotlin.nj2k.tree.impl.JKOtherModifierElementImpl
import org.jetbrains.kotlin.nj2k.tree.isLocalClass
class InnerClassConversion : RecursiveApplicableConversionBase() {
@@ -26,14 +26,14 @@ class InnerClassConversion : RecursiveApplicableConversionBase() {
if (element.classKind == JKClass.ClassKind.COMPANION) return recurseArmed(element, outer)
if (element.isLocalClass()) return recurseArmed(element, outer)
val static = element.extraModifierElements.find { it.extraModifier == ExtraModifier.STATIC }
val static = element.otherModifierElements.find { it.otherModifier == OtherModifier.STATIC }
if (static != null) {
element.extraModifierElements -= static
element.otherModifierElements -= static
} else if (element.classKind != JKClass.ClassKind.INTERFACE &&
outer.classKind != JKClass.ClassKind.INTERFACE &&
element.classKind != JKClass.ClassKind.ENUM
) {
element.extraModifierElements += JKExtraModifierElementImpl(ExtraModifier.INNER)
element.otherModifierElements += JKOtherModifierElementImpl(OtherModifier.INNER)
}
return recurseArmed(element, element)
}
@@ -43,7 +43,7 @@ class JavaMethodToKotlinFunctionConversion(private val context: NewJ2kConverterC
)
}
},
element.extraModifierElements,
element.otherModifierElements,
element.visibilityElement,
element.modalityElement
).also {
@@ -19,33 +19,33 @@ class JavaModifiersConversion(private val context: NewJ2kConverterContext) : Rec
//TODO change modality to OVERRIDE???
}
}
if (element is JKExtraModifiersOwner && element is JKAnnotationListOwner) {
element.elementByModifier(ExtraModifier.VOLATILE)?.also { modifierElement ->
element.extraModifierElements -= modifierElement
if (element is JKOtherModifiersOwner && element is JKAnnotationListOwner) {
element.elementByModifier(OtherModifier.VOLATILE)?.also { modifierElement ->
element.otherModifierElements -= modifierElement
element.annotationList.annotations +=
jvmAnnotation("Volatile", context.symbolProvider).withNonCodeElementsFrom(modifierElement)
}
element.elementByModifier(ExtraModifier.TRANSIENT)?.also { modifierElement ->
element.extraModifierElements -= modifierElement
element.elementByModifier(OtherModifier.TRANSIENT)?.also { modifierElement ->
element.otherModifierElements -= modifierElement
element.annotationList.annotations +=
jvmAnnotation("Transient", context.symbolProvider).withNonCodeElementsFrom(modifierElement)
}
element.elementByModifier(ExtraModifier.STRICTFP)?.also { modifierElement ->
element.extraModifierElements -= modifierElement
element.elementByModifier(OtherModifier.STRICTFP)?.also { modifierElement ->
element.otherModifierElements -= modifierElement
element.annotationList.annotations +=
jvmAnnotation("Strictfp", context.symbolProvider).withNonCodeElementsFrom(modifierElement)
}
element.elementByModifier(ExtraModifier.SYNCHRONIZED)?.also { modifierElement ->
element.extraModifierElements -= modifierElement
element.elementByModifier(OtherModifier.SYNCHRONIZED)?.also { modifierElement ->
element.otherModifierElements -= modifierElement
element.annotationList.annotations +=
jvmAnnotation("Synchronized", context.symbolProvider).withNonCodeElementsFrom(modifierElement)
}
element.elementByModifier(ExtraModifier.NATIVE)?.also { modifierElement ->
modifierElement.extraModifier = ExtraModifier.EXTERNAL
element.elementByModifier(OtherModifier.NATIVE)?.also { modifierElement ->
modifierElement.otherModifier = OtherModifier.EXTERNAL
}
}
return recurse(element)
@@ -65,10 +65,11 @@ class JavaStandardMethodsConversion(private val context: NewJ2kConverterContext)
if (method.name.value != "finalize") return false
if (method.parameters.isNotEmpty()) return false
if (method.returnType.type != JKJavaVoidType) return false
if (method.modality == Modality.OVERRIDE) {
if (method.hasOtherModifier(OtherModifier.OVERRIDE)) {
method.modality =
if (containingClass.modality == Modality.OPEN) Modality.OPEN
else Modality.FINAL
method.otherModifierElements -= method.otherModifierElements.first { it.otherModifier == OtherModifier.OVERRIDE }
}
return true
}
@@ -9,6 +9,7 @@ import com.intellij.psi.PsiClass
import com.intellij.psi.PsiMethod
import org.jetbrains.kotlin.nj2k.NewJ2kConverterContext
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.impl.JKOtherModifierElementImpl
import org.jetbrains.kotlin.nj2k.tree.impl.psi
class ModalityConversion(private val context: NewJ2kConverterContext) : RecursiveApplicableConversionBase() {
@@ -38,18 +39,27 @@ class ModalityConversion(private val context: NewJ2kConverterContext) : Recursiv
private fun processMethod(method: JKJavaMethod) {
val psi = method.psi<PsiMethod>() ?: return
val containingClass = method.parentOfType<JKClass>() ?: return
method.modality = when {
when {
method.modality != Modality.ABSTRACT
&& psi.findSuperMethods().isNotEmpty() -> Modality.OVERRIDE
&& psi.findSuperMethods().isNotEmpty() -> {
method.modality = Modality.FINAL
if (!method.hasOtherModifier(OtherModifier.OVERRIDE)) {
method.otherModifierElements += JKOtherModifierElementImpl(OtherModifier.OVERRIDE)
}
}
method.modality == Modality.OPEN
&& context.converter.settings.openByDefault
&& containingClass.modality == Modality.OPEN
&& method.visibility != Visibility.PRIVATE -> Modality.OPEN
&& method.visibility != Visibility.PRIVATE -> {
method.modality = Modality.OPEN
}
method.modality == Modality.OPEN
&& containingClass.classKind != JKClass.ClassKind.INTERFACE
&& !context.converter.converterServices.oldServices.referenceSearcher.hasOverrides(psi) -> Modality.FINAL
else -> method.modality
&& !context.converter.converterServices.oldServices.referenceSearcher.hasOverrides(psi) -> {
method.modality = Modality.FINAL
}
else -> method.modality = method.modality
}
}
@@ -49,7 +49,7 @@ class PrimaryConstructorDetectConversion(private val context: NewJ2kConverterCon
primaryConstructorCandidate.parameters,
primaryConstructorCandidate.delegationCall,
primaryConstructorCandidate.annotationList,
primaryConstructorCandidate.extraModifierElements,
primaryConstructorCandidate.otherModifierElements,
primaryConstructorCandidate.visibilityElement,
primaryConstructorCandidate.modalityElement
).withNonCodeElementsFrom(primaryConstructorCandidate)
@@ -9,10 +9,10 @@ import org.jetbrains.kotlin.nj2k.tree.*
class RemoveWrongExtraModifiersForSingleFunctionsConversion : RecursiveApplicableConversionBase() {
override fun applyToElement(element: JKTreeElement): JKTreeElement {
if (element !is JKExtraModifiersOwner) return recurse(element)
if (element !is JKOtherModifiersOwner) return recurse(element)
if (element.parentOfType<JKClass>() == null) {
element.elementByModifier(ExtraModifier.STATIC)?.also { modifierElement ->
element.extraModifierElements -= modifierElement
element.elementByModifier(OtherModifier.STATIC)?.also { modifierElement ->
element.otherModifierElements -= modifierElement
}
}
return recurse(element)
@@ -53,7 +53,7 @@ class StaticMemberAccessConversion(private val context: NewJ2kConverterContext)
?.safeAs<KtObjectDeclaration>()
?.isCompanion() == true
is JKTreeElement ->
target.safeAs<JKExtraModifiersOwner>()?.hasExtraModifier(ExtraModifier.STATIC) == true
target.safeAs<JKOtherModifiersOwner>()?.hasOtherModifier(OtherModifier.STATIC) == true
|| target.parentOfType<JKClass>()?.classKind == JKClass.ClassKind.OBJECT
else -> false
}
@@ -13,15 +13,16 @@ class StaticsToCompanionExtractConversion : RecursiveApplicableConversionBase()
if (element !is JKClass) return recurse(element)
if (element.classKind == JKClass.ClassKind.COMPANION || element.classKind == JKClass.ClassKind.OBJECT) return element
val statics = element.declarationList.filter { declaration ->
declaration is JKExtraModifiersOwner && declaration.hasExtraModifier(ExtraModifier.STATIC)
declaration is JKOtherModifiersOwner && declaration.hasOtherModifier(OtherModifier.STATIC)
}
if (statics.isEmpty()) return recurse(element)
val companion = element.getOrCreateCompanionObject()
element.classBody.declarations -= statics
companion.classBody.declarations += statics.onEach { declaration ->
(declaration as JKExtraModifiersOwner)
declaration.extraModifierElements -= declaration.elementByModifier(ExtraModifier.STATIC)!!
if (declaration is JKOtherModifiersOwner) {
declaration.otherModifierElements -= declaration.elementByModifier(OtherModifier.STATIC)!!
}
}
return recurse(element)
}
@@ -31,7 +31,7 @@ class JKJavaFieldImpl(
name: JKNameIdentifier,
initializer: JKExpression,
annotationList: JKAnnotationList,
extraModifierElements: List<JKExtraModifierElement>,
otherModifierElements: List<JKOtherModifierElement>,
visibilityElement: JKVisibilityModifierElement,
modalityElement: JKModalityModifierElement,
mutabilityElement: JKMutabilityModifierElement
@@ -43,7 +43,7 @@ class JKJavaFieldImpl(
override var type by child(type)
override var name: JKNameIdentifier by child(name)
override var extraModifierElements by children(extraModifierElements)
override var otherModifierElements by children(otherModifierElements)
override var visibilityElement by child(visibilityElement)
override var modalityElement by child(modalityElement)
override var mutabilityElement by child(mutabilityElement)
@@ -57,7 +57,7 @@ class JKJavaMethodImpl(
typeParameterList: JKTypeParameterList,
annotationList: JKAnnotationList,
throwsList: List<JKTypeElement>,
extraModifierElements: List<JKExtraModifierElement>,
otherModifierElements: List<JKOtherModifierElement>,
visibilityElement: JKVisibilityModifierElement,
modalityElement: JKModalityModifierElement
) : JKJavaMethod(), PsiOwner by PsiOwnerImpl() {
@@ -71,7 +71,7 @@ class JKJavaMethodImpl(
override var annotationList: JKAnnotationList by child(annotationList)
override var throwsList: List<JKTypeElement> by children(throwsList)
override var extraModifierElements by children(extraModifierElements)
override var otherModifierElements by children(otherModifierElements)
override var visibilityElement by child(visibilityElement)
override var modalityElement by child(modalityElement)
}
@@ -54,7 +54,7 @@ class JKClassImpl(
typeParameterList: JKTypeParameterList,
classBody: JKClassBody,
annotationList: JKAnnotationList,
extraModifierElements: List<JKExtraModifierElement>,
otherModifierElements: List<JKOtherModifierElement>,
visibilityElement: JKVisibilityModifierElement,
modalityElement: JKModalityModifierElement
) : JKClass(), PsiOwner by PsiOwnerImpl() {
@@ -66,7 +66,7 @@ class JKClassImpl(
override var classBody: JKClassBody by child(classBody)
override var annotationList: JKAnnotationList by child(annotationList)
override var extraModifierElements by children(extraModifierElements)
override var otherModifierElements by children(otherModifierElements)
override var visibilityElement by child(visibilityElement)
override var modalityElement by child(modalityElement)
}
@@ -636,7 +636,7 @@ class JKVisibilityModifierElementImpl(override var visibility: Visibility) : JKV
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitVisibilityModifierElement(this, data)
}
class JKExtraModifierElementImpl(override var extraModifier: ExtraModifier) : JKExtraModifierElement() {
class JKOtherModifierElementImpl(override var otherModifier: OtherModifier) : JKOtherModifierElement() {
override fun <R, D> accept(visitor: JKVisitor<R, D>, data: D): R = visitor.visitExtraModifierElement(this, data)
}
@@ -30,7 +30,7 @@ class JKKtPropertyImpl(
getter: JKKtGetterOrSetter,
setter: JKKtGetterOrSetter,
annotationList: JKAnnotationList,
extraModifierElements: List<JKExtraModifierElement>,
otherModifierElements: List<JKOtherModifierElement>,
visibilityElement: JKVisibilityModifierElement,
modalityElement: JKModalityModifierElement,
mutabilityElement: JKMutabilityModifierElement
@@ -44,7 +44,7 @@ class JKKtPropertyImpl(
override var getter: JKKtGetterOrSetter by child(getter)
override var setter: JKKtGetterOrSetter by child(setter)
override var extraModifierElements by children(extraModifierElements)
override var otherModifierElements by children(otherModifierElements)
override var visibilityElement by child(visibilityElement)
override var modalityElement by child(modalityElement)
override var mutabilityElement by child(mutabilityElement)
@@ -59,7 +59,7 @@ class JKKtFunctionImpl(
block: JKBlock,
typeParameterList: JKTypeParameterList,
annotationList: JKAnnotationList,
extraModifierElements: List<JKExtraModifierElement>,
otherModifierElements: List<JKOtherModifierElement>,
visibilityElement: JKVisibilityModifierElement,
modalityElement: JKModalityModifierElement
) : JKKtFunction(), PsiOwner by PsiOwnerImpl() {
@@ -73,7 +73,7 @@ class JKKtFunctionImpl(
override var annotationList: JKAnnotationList by child(annotationList)
override var extraModifierElements by children(extraModifierElements)
override var otherModifierElements by children(otherModifierElements)
override var visibilityElement by child(visibilityElement)
override var modalityElement by child(modalityElement)
}
@@ -178,7 +178,7 @@ class JKKtConstructorImpl(
block: JKBlock,
delegationCall: JKExpression,
annotationList: JKAnnotationList,
extraModifierElements: List<JKExtraModifierElement>,
otherModifierElements: List<JKOtherModifierElement>,
visibilityElement: JKVisibilityModifierElement,
modalityElement: JKModalityModifierElement
) : JKKtConstructor() {
@@ -191,7 +191,7 @@ class JKKtConstructorImpl(
override var typeParameterList: JKTypeParameterList by child(JKTypeParameterListImpl())
override var annotationList: JKAnnotationList by child(annotationList)
override var extraModifierElements by children(extraModifierElements)
override var otherModifierElements by children(otherModifierElements)
override var visibilityElement by child(visibilityElement)
override var modalityElement by child(modalityElement)
@@ -203,7 +203,7 @@ class JKKtPrimaryConstructorImpl(
parameters: List<JKParameter>,
delegationCall: JKExpression,
annotationList: JKAnnotationList,
extraModifierElements: List<JKExtraModifierElement>,
otherModifierElements: List<JKOtherModifierElement>,
visibilityElement: JKVisibilityModifierElement,
modalityElement: JKModalityModifierElement
) : JKKtPrimaryConstructor() {
@@ -216,7 +216,7 @@ class JKKtPrimaryConstructorImpl(
override var typeParameterList: JKTypeParameterList by child(JKTypeParameterListImpl())
override var annotationList: JKAnnotationList by child(annotationList)
override var extraModifierElements by children(extraModifierElements)
override var otherModifierElements by children(otherModifierElements)
override var visibilityElement by child(visibilityElement)
override var modalityElement by child(modalityElement)
@@ -56,7 +56,7 @@ abstract class JKUniverseSymbol<T : JKTreeElement> : JKNamedSymbol {
fun JKSymbol.getDisplayName(): String {
if (this !is JKUniverseSymbol<*>) return fqName
return generateSequence(declaredIn as? JKUniverseClassSymbol) { symbol ->
symbol.declaredIn.safeAs<JKUniverseClassSymbol>()?.takeIf { !it.target.hasExtraModifier(ExtraModifier.INNER) }
symbol.declaredIn.safeAs<JKUniverseClassSymbol>()?.takeIf { !it.target.hasOtherModifier(OtherModifier.INNER) }
}.fold(name) { acc, symbol -> "${symbol.name}.$acc" }
}
+2 -2
View File
@@ -18,7 +18,7 @@ package org.jetbrains.kotlin.nj2k.tree
import org.jetbrains.kotlin.nj2k.tree.impl.*
abstract class JKField : JKVariable(), JKVisibilityOwner, JKMutabilityOwner, JKModalityOwner, JKExtraModifiersOwner, JKAnnotationListOwner
abstract class JKField : JKVariable(), JKVisibilityOwner, JKMutabilityOwner, JKModalityOwner, JKOtherModifiersOwner, JKAnnotationListOwner
abstract class JKJavaField : JKField()
@@ -142,7 +142,7 @@ abstract class JKJavaSynchronizedStatement : JKStatement(), JKBranchElement {
abstract class JKJavaAnnotationMethod : JKMethod(), JKBranchElement {
abstract val defaultValue: JKAnnotationMemberValue
override var extraModifierElements by children<JKExtraModifierElement>()
override var otherModifierElements by children<JKOtherModifierElement>()
override var visibilityElement by child(JKVisibilityModifierElementImpl(Visibility.PUBLIC))
override var modalityElement by child(JKModalityModifierElementImpl(Modality.FINAL))
}
+14 -14
View File
@@ -58,7 +58,7 @@ interface JKFile : JKTreeElement, JKBranchElement {
var declarationList: List<JKDeclaration>
}
abstract class JKClass : JKDeclaration(), JKVisibilityOwner, JKExtraModifiersOwner, JKModalityOwner, JKTypeParameterListOwner,
abstract class JKClass : JKDeclaration(), JKVisibilityOwner, JKOtherModifiersOwner, JKModalityOwner, JKTypeParameterListOwner,
JKAnnotationListOwner,
JKBranchElement {
abstract val name: JKNameIdentifier
@@ -109,7 +109,7 @@ interface JKAnnotationListOwner : JKTreeElement {
var annotationList: JKAnnotationList
}
abstract class JKMethod : JKDeclaration(), JKVisibilityOwner, JKModalityOwner, JKExtraModifiersOwner, JKTypeParameterListOwner,
abstract class JKMethod : JKDeclaration(), JKVisibilityOwner, JKModalityOwner, JKOtherModifiersOwner, JKTypeParameterListOwner,
JKAnnotationListOwner {
abstract val name: JKNameIdentifier
abstract var parameters: List<JKParameter>
@@ -138,7 +138,7 @@ val JKModifierElement.modifier: Modifier
is JKMutabilityModifierElement -> mutability
is JKModalityModifierElement -> modality
is JKVisibilityModifierElement -> visibility
is JKExtraModifierElement -> extraModifier
is JKOtherModifierElement -> otherModifier
else -> error("")
}
@@ -154,25 +154,26 @@ abstract class JKVisibilityModifierElement : JKModifierElement() {
abstract var visibility: Visibility
}
abstract class JKExtraModifierElement : JKModifierElement() {
abstract var extraModifier: ExtraModifier
abstract class JKOtherModifierElement : JKModifierElement() {
abstract var otherModifier: OtherModifier
}
interface Modifier {
val text: String
}
interface JKExtraModifiersOwner : JKModifiersListOwner {
var extraModifierElements: List<JKExtraModifierElement>
interface JKOtherModifiersOwner : JKModifiersListOwner {
var otherModifierElements: List<JKOtherModifierElement>
}
fun JKExtraModifiersOwner.elementByModifier(modifier: ExtraModifier): JKExtraModifierElement? =
extraModifierElements.firstOrNull { it.extraModifier == modifier }
fun JKOtherModifiersOwner.elementByModifier(modifier: OtherModifier): JKOtherModifierElement? =
otherModifierElements.firstOrNull { it.otherModifier == modifier }
fun JKExtraModifiersOwner.hasExtraModifier(modifier: ExtraModifier): Boolean =
extraModifierElements.any { it.extraModifier == modifier }
fun JKOtherModifiersOwner.hasOtherModifier(modifier: OtherModifier): Boolean =
otherModifierElements.any { it.otherModifier == modifier }
enum class ExtraModifier(override val text: String) : Modifier {
enum class OtherModifier(override val text: String) : Modifier {
OVERRIDE("override"),
ACTUAL("actual"),
ANNOTATION("annotation"),
COMPANION("companion"),
@@ -228,7 +229,6 @@ enum class Modality(override val text: String) : Modifier {
OPEN("open"),
FINAL("final"),
ABSTRACT("abstract"),
OVERRIDE("override")
}
var JKModalityOwner.modality: Modality
@@ -257,7 +257,7 @@ interface JKModifiersListOwner : JKTreeElement
fun JKModifiersListOwner.modifierElements(): List<JKModifierElement> =
listOfNotNull((this as? JKVisibilityOwner)?.visibilityElement) +
(this as? JKExtraModifiersOwner)?.extraModifierElements.orEmpty() +
(this as? JKOtherModifiersOwner)?.otherModifierElements.orEmpty() +
listOfNotNull((this as? JKModalityOwner)?.modalityElement) +
listOfNotNull((this as? JKMutabilityOwner)?.mutabilityElement)
+1 -1
View File
@@ -35,7 +35,7 @@ abstract class JKKtProperty : JKField(), PsiOwner {
abstract class JKKtFunction : JKMethod(), PsiOwner
abstract class JKKtConstructor : JKMethod(), JKExtraModifiersOwner {
abstract class JKKtConstructor : JKMethod(), JKOtherModifiersOwner {
abstract var delegationCall: JKExpression
}
@@ -32,11 +32,11 @@ interface JKVisitor<out R, in D> {
fun visitVisibilityModifierElement(visibilityModifierElement: JKVisibilityModifierElement, data: D): R =
visitModifierElement(visibilityModifierElement, data)
fun visitExtraModifierElement(extraModifierElement: JKExtraModifierElement, data: D): R =
visitModifierElement(extraModifierElement, data)
fun visitExtraModifierElement(otherModifierElement: JKOtherModifierElement, data: D): R =
visitModifierElement(otherModifierElement, data)
fun visitExtraModifiersOwner(extraModifiersOwner: JKExtraModifiersOwner, data: D): R =
visitModifiersListOwner(extraModifiersOwner, data)
fun visitExtraModifiersOwner(otherModifiersOwner: JKOtherModifiersOwner, data: D): R =
visitModifiersListOwner(otherModifiersOwner, data)
fun visitVisibilityOwner(visibilityOwner: JKVisibilityOwner, data: D): R = visitModifiersListOwner(visibilityOwner, data)
fun visitModalityOwner(modalityOwner: JKModalityOwner, data: D): R = visitModifiersListOwner(modalityOwner, data)
@@ -65,13 +65,13 @@ interface JKVisitorVoid : JKVisitor<Unit, Nothing?> {
override fun visitVisibilityModifierElement(visibilityModifierElement: JKVisibilityModifierElement, data: Nothing?) =
visitVisibilityModifierElement(visibilityModifierElement)
fun visitExtraModifierElement(extraModifierElement: JKExtraModifierElement) = visitModifierElement(extraModifierElement, null)
override fun visitExtraModifierElement(extraModifierElement: JKExtraModifierElement, data: Nothing?) =
visitExtraModifierElement(extraModifierElement)
fun visitExtraModifierElement(otherModifierElement: JKOtherModifierElement) = visitModifierElement(otherModifierElement, null)
override fun visitExtraModifierElement(otherModifierElement: JKOtherModifierElement, data: Nothing?) =
visitExtraModifierElement(otherModifierElement)
fun visitExtraModifiersOwner(extraModifiersOwner: JKExtraModifiersOwner) = visitModifiersListOwner(extraModifiersOwner, null)
override fun visitExtraModifiersOwner(extraModifiersOwner: JKExtraModifiersOwner, data: Nothing?) =
visitExtraModifiersOwner(extraModifiersOwner)
fun visitExtraModifiersOwner(otherModifiersOwner: JKOtherModifiersOwner) = visitModifiersListOwner(otherModifiersOwner, null)
override fun visitExtraModifiersOwner(otherModifiersOwner: JKOtherModifiersOwner, data: Nothing?) =
visitExtraModifiersOwner(otherModifiersOwner)
fun visitVisibilityOwner(visibilityOwner: JKVisibilityOwner) = visitModifiersListOwner(visibilityOwner, null)
override fun visitVisibilityOwner(visibilityOwner: JKVisibilityOwner, data: Nothing?) = visitVisibilityOwner(visibilityOwner)
@@ -178,21 +178,21 @@ interface JKVisitorWithCommentsPrinting : JKVisitorVoid {
fun visitVisibilityModifierElementRaw(visibilityModifierElement: JKVisibilityModifierElement) =
visitModifierElementRaw(visibilityModifierElement)
override fun visitExtraModifierElement(extraModifierElement: JKExtraModifierElement) {
printLeftNonCodeElements(extraModifierElement)
visitExtraModifierElementRaw(extraModifierElement)
printRightNonCodeElements(extraModifierElement)
override fun visitExtraModifierElement(otherModifierElement: JKOtherModifierElement) {
printLeftNonCodeElements(otherModifierElement)
visitExtraModifierElementRaw(otherModifierElement)
printRightNonCodeElements(otherModifierElement)
}
fun visitExtraModifierElementRaw(extraModifierElement: JKExtraModifierElement) = visitModifierElementRaw(extraModifierElement)
fun visitExtraModifierElementRaw(otherModifierElement: JKOtherModifierElement) = visitModifierElementRaw(otherModifierElement)
override fun visitExtraModifiersOwner(extraModifiersOwner: JKExtraModifiersOwner) {
printLeftNonCodeElements(extraModifiersOwner)
visitExtraModifiersOwnerRaw(extraModifiersOwner)
printRightNonCodeElements(extraModifiersOwner)
override fun visitExtraModifiersOwner(otherModifiersOwner: JKOtherModifiersOwner) {
printLeftNonCodeElements(otherModifiersOwner)
visitExtraModifiersOwnerRaw(otherModifiersOwner)
printRightNonCodeElements(otherModifiersOwner)
}
fun visitExtraModifiersOwnerRaw(extraModifiersOwner: JKExtraModifiersOwner) = visitModifiersListOwnerRaw(extraModifiersOwner)
fun visitExtraModifiersOwnerRaw(otherModifiersOwner: JKOtherModifiersOwner) = visitModifiersListOwnerRaw(otherModifiersOwner)
override fun visitVisibilityOwner(visibilityOwner: JKVisibilityOwner) {
printLeftNonCodeElements(visibilityOwner)
+4 -4
View File
@@ -13,9 +13,9 @@ internal class A {
fun /* we return int*/ foo( /*int*/ p: Int/* parameter p */): Int { /* body is empty */
}
private/*it's private*/ val field = 0
/*it's public*/ fun foo(s: String?): Char {}
protected/*it's protected*/ fun foo(c: Char) {}
private/*it's private*/ val field = 0
/*it's public*/ fun foo(s: String?): Char {}
protected/*it's protected*/ fun foo(c: Char) {}
/**
* Method description.
* Multi-line method description.
@@ -29,6 +29,6 @@ internal class A {
fun foo(param1: String?, param2: String?, param3: String?) {}
companion object {
/*it's public*/const /*and static*/ val/*and final*/ C = 1
/*it's public*/ /*and static*/ const val/*and final*/ C = 1
}
}
+2 -2
View File
@@ -1,7 +1,7 @@
internal class A(// comment for field2 setter
// comment for field2 getter
// comment for field2
var field2: Int) {
var field2 // comment for field2
: Int) {
/**
* Comment for field1 setter
*/
+1 -1
View File
@@ -3,5 +3,5 @@ internal open class A {
}
internal class B : A() {
override fun a() {}
public override fun a() {}
}
+1 -1
View File
@@ -3,7 +3,7 @@ internal open class A {
}
internal open class B : A() {
override fun foo() {}
public override fun foo() {}
}
internal class C : B() {
+2 -3
View File
@@ -31,9 +31,8 @@ internal abstract class E {
}
internal class F : E() {
override fun f1() {}
override fun f2() {
public override fun f1() {}
public override fun f2() {
super.f2()
}
}
+1 -1
View File
@@ -16,7 +16,7 @@ internal open class Base {
}
internal class Child : Base() {
override fun test() {}
public override fun test() {}
override fun toString(): String {
return "Child"
}
+1 -2
View File
@@ -5,8 +5,7 @@ internal open class B(i: Int) {
}
internal class A : B(10) {
override fun call(): Int {
public override fun call(): Int {
return super.call()
}
}