New J2K: use mutable lists for storing comments

This commit is contained in:
Ilya Kirillov
2019-09-05 21:12:04 +03:00
parent 5d99419e9c
commit fd85c2bb43
14 changed files with 38 additions and 147 deletions
@@ -1,99 +0,0 @@
/*
* Copyright 2010-2019 JetBrains s.r.o. and Kotlin Programming Language contributors.
* Use of this source code is governed by the Apache 2.0 license that can be found in the license/LICENSE.txt file.
*/
import java.io.File
private val JK_ROOT = File("./nj2k/src/org/jetbrains/kotlin/nj2k/tree")
private val JK_OUT_ROOT = File(JK_ROOT, "visitors")
private val JK_KT_FILE = File(JK_ROOT, "k.kt")
private val JK_JAVA_FILE = File(JK_ROOT, "j.kt")
private val JK_COMMON_FILE = File(JK_ROOT, "jk.kt")
val interfaceRegex = "(interface|abstract class)\\s+(JK[a-zA-Z]+)\\s+?:?\\s+(JK[a-zA-Z]+)?".toRegex()
data class InterfaceData(val name: String, val extends: String?)
fun File.interfaceNames() =
sequenceOf(this)
.map { it.readText() }
.flatMap { interfaceRegex.findAll(it) }
.map { match -> InterfaceData(match.groupValues[2], match.groupValues.getOrNull(3)) }
.toList()
fun String.safeVarName() = when (this) {
"class" -> "klass"
else -> this
}
fun genVisitors(commonData: List<InterfaceData>, uncommonData: List<InterfaceData>, visitorName: String, transformerName: String) {
val interfaceData = commonData + uncommonData
val pkg = "package org.jetbrains.kotlin.nj2k.tree.visitors"
File(JK_OUT_ROOT, "$visitorName.kt").writeText(buildString {
appendln(pkg)
appendln()
appendln("import org.jetbrains.kotlin.nj2k.tree.*")
appendln()
appendln("abstract class $visitorName {")
interfaceData.joinTo(this, separator = "\n") { (name, ext) ->
val nameWithoutPrefix = name.removePrefix("JK")
val argName = nameWithoutPrefix.decapitalize().safeVarName()
val generifyCall = if (name != "JKTreeElement") "= visit${ext!!.removePrefix("JK")}($argName)" else ""
val modifier = if (name == "JKTreeElement") "abstract" else "open"
"""
| $modifier fun visit$nameWithoutPrefix($argName: $name) $generifyCall
""".trimMargin()
}
appendln()
appendln("}")
})
File(JK_OUT_ROOT, "${visitorName}WithCommentsPrinting.kt").writeText(buildString {
appendln(pkg)
appendln()
appendln("import org.jetbrains.kotlin.nj2k.tree.*")
appendln()
appendln("abstract class ${visitorName}WithCommentsPrinting : $visitorName() {")
appendln(
"""
| abstract fun printLeftNonCodeElements(element: JKNonCodeElementsListOwner)
| abstract fun printRightNonCodeElements(element: JKNonCodeElementsListOwner)
|
""".trimMargin()
)
interfaceData.joinTo(this, separator = "\n\n") { (name, ext) ->
val nameWithoutPrefix = name.removePrefix("JK")
val argName = nameWithoutPrefix.decapitalize().safeVarName()
val arg = "$argName: $name"
val rawVisitSuffix = "Raw"
val generifyCall = if (name != "JKTreeElement") "= visit${ext!!.removePrefix("JK")}$rawVisitSuffix($argName)" else ""
val modifier = if (name == "JKTreeElement") "abstract" else "open"
"""
| override fun visit$nameWithoutPrefix($arg) {
| printLeftNonCodeElements($argName)
| visit$nameWithoutPrefix$rawVisitSuffix($argName)
| printRightNonCodeElements($argName)
| }
|
| $modifier fun visit$nameWithoutPrefix$rawVisitSuffix($arg) $generifyCall
""".trimMargin()
}
appendln()
appendln("}")
})
}
genVisitors(JK_COMMON_FILE.interfaceNames(), JK_JAVA_FILE.interfaceNames() + JK_KT_FILE.interfaceNames(), "JKVisitor", "JKTransformer")
@@ -22,7 +22,6 @@ import com.intellij.psi.JavaTokenType.SUPER_KEYWORD
import com.intellij.psi.JavaTokenType.THIS_KEYWORD import com.intellij.psi.JavaTokenType.THIS_KEYWORD
import com.intellij.psi.impl.source.tree.ChildRole import com.intellij.psi.impl.source.tree.ChildRole
import com.intellij.psi.impl.source.tree.CompositeElement import com.intellij.psi.impl.source.tree.CompositeElement
import com.intellij.psi.impl.source.tree.ElementType
import com.intellij.psi.impl.source.tree.java.PsiClassObjectAccessExpressionImpl import com.intellij.psi.impl.source.tree.java.PsiClassObjectAccessExpressionImpl
import com.intellij.psi.impl.source.tree.java.PsiLabeledStatementImpl import com.intellij.psi.impl.source.tree.java.PsiLabeledStatementImpl
import com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl import com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl
@@ -1038,8 +1037,8 @@ class JavaToJKTreeBuilder constructor(
private fun JKNonCodeElementsListOwner.assignNonCodeElements(psi: PsiElement?) { private fun JKNonCodeElementsListOwner.assignNonCodeElements(psi: PsiElement?) {
if (psi == null) return if (psi == null) return
val (leftTokens, rightTokens) = psi.collectNonCodeElements() val (leftTokens, rightTokens) = psi.collectNonCodeElements()
this.leftNonCodeElements = leftTokens this.leftNonCodeElements += leftTokens
this.rightNonCodeElements = rightTokens this.rightNonCodeElements += rightTokens
} }
private inline fun <reified T : JKNonCodeElementsListOwner> T.withAssignedNonCodeElements(psi: PsiElement?): T = private inline fun <reified T : JKNonCodeElementsListOwner> T.withAssignedNonCodeElements(psi: PsiElement?): T =
@@ -55,10 +55,10 @@ class AnnotationClassConversion(context: NewJ2kConverterContext) : RecursiveAppl
} else initializer } else initializer
).also { parameter -> ).also { parameter ->
if (leftNonCodeElements.any { it is JKCommentElement }) { if (leftNonCodeElements.any { it is JKCommentElement }) {
parameter.leftNonCodeElements = leftNonCodeElements parameter.leftNonCodeElements += leftNonCodeElements
} }
if (rightNonCodeElements.any { it is JKCommentElement }) { if (rightNonCodeElements.any { it is JKCommentElement }) {
parameter.rightNonCodeElements = rightNonCodeElements parameter.rightNonCodeElements += rightNonCodeElements
} }
} }
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.nj2k.conversions package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.builtins.KotlinBuiltIns import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.nj2k.* import org.jetbrains.kotlin.nj2k.*
import org.jetbrains.kotlin.nj2k.symbols.JKMethodSymbol import org.jetbrains.kotlin.nj2k.symbols.JKMethodSymbol
import org.jetbrains.kotlin.nj2k.symbols.JKUnresolvedField import org.jetbrains.kotlin.nj2k.symbols.JKUnresolvedField
@@ -32,11 +31,11 @@ class BuiltinMembersConversion(context: NewJ2kConverterContext) : RecursiveAppli
val newSelector = conversion.createBuilder().build(selector) val newSelector = conversion.createBuilder().build(selector)
if (this is JKQualifiedExpression && conversion.replaceType == ReplaceType.REPLACE_WITH_QUALIFIER) { if (this is JKQualifiedExpression && conversion.replaceType == ReplaceType.REPLACE_WITH_QUALIFIER) {
newSelector.rightNonCodeElements = newSelector.rightNonCodeElements += receiver.leftNonCodeElements
(receiver.leftNonCodeElements + newSelector.rightNonCodeElements += receiver.leftNonCodeElements
receiver.rightNonCodeElements + newSelector.rightNonCodeElements += receiver.rightNonCodeElements
selector.leftNonCodeElements + newSelector.rightNonCodeElements += selector.leftNonCodeElements
selector.rightNonCodeElements).dropSpacesAtBegining() newSelector.rightNonCodeElements += selector.rightNonCodeElements
} }
return when (conversion.replaceType) { return when (conversion.replaceType) {
@@ -469,7 +468,7 @@ class BuiltinMembersConversion(context: NewJ2kConverterContext) : RecursiveAppli
).groupBy { it.from.fqName } ).groupBy { it.from.fqName }
private fun JKExpression. callOn(symbol: JKMethodSymbol, arguments: List<JKArgument> = emptyList()) = private fun JKExpression.callOn(symbol: JKMethodSymbol, arguments: List<JKArgument> = emptyList()) =
JKQualifiedExpressionImpl( JKQualifiedExpressionImpl(
this, this,
JKKtQualifierImpl.DOT, JKKtQualifierImpl.DOT,
@@ -107,7 +107,7 @@ class DefaultArgumentsConversion(context: NewJ2kConverterContext) : RecursiveApp
parameter.initializer = remapParameterSymbol(defaultValue) as JKExpression parameter.initializer = remapParameterSymbol(defaultValue) as JKExpression
} }
element.declarations -= method element.declarations -= method
calledMethod.appendNonCodeElementsFrom(method) calledMethod.withNonCodeElementsFrom(method)
} }
for (method in element.declarations) { for (method in element.declarations) {
@@ -14,7 +14,7 @@ class NonCodeElementsConversion(context : NewJ2kConverterContext) : RecursiveApp
when (element) { when (element) {
is JKClass -> { is JKClass -> {
element.name.rightNonCodeElements += element.inheritance.leftNonCodeElements element.name.rightNonCodeElements += element.inheritance.leftNonCodeElements
element.inheritance.leftNonCodeElements = emptyList() element.inheritance.leftNonCodeElements.clear()
} }
} }
return recurse(element) return recurse(element)
@@ -43,8 +43,8 @@ private class JKListChild<T : JKElement>(val value: Int) : ReadWriteProperty<JKB
} }
abstract class JKElementBase : JKTreeElement, Cloneable { abstract class JKElementBase : JKTreeElement, Cloneable {
override var leftNonCodeElements: List<JKNonCodeElement> = emptyList() override val leftNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf()
override var rightNonCodeElements: List<JKNonCodeElement> = emptyList() override val rightNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf()
override var parent: JKElement? = null override var parent: JKElement? = null
@@ -17,10 +17,7 @@
package org.jetbrains.kotlin.nj2k.tree.impl package org.jetbrains.kotlin.nj2k.tree.impl
import com.intellij.psi.PsiElement import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.j2k.ast.Nullability import org.jetbrains.kotlin.j2k.ast.Nullability
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.nj2k.JKSymbolProvider
import org.jetbrains.kotlin.nj2k.symbols.* import org.jetbrains.kotlin.nj2k.symbols.*
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.JKLiteralExpression.LiteralType import org.jetbrains.kotlin.nj2k.tree.JKLiteralExpression.LiteralType
@@ -168,7 +165,7 @@ class JKDeclarationStatementImpl(declaredStatements: List<JKDeclaration>) : JKDe
override fun accept(visitor: JKVisitor) = visitor.visitDeclarationStatement(this) override fun accept(visitor: JKVisitor) = visitor.visitDeclarationStatement(this)
override var rightNonCodeElements: List<JKNonCodeElement> = listOf(JKSpaceElementImpl("\n")) override var rightNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf(JKSpaceElementImpl("\n"))
} }
class JKArrayAccessExpressionImpl( class JKArrayAccessExpressionImpl(
@@ -270,8 +267,8 @@ class JKStubExpressionImpl : JKStubExpression, JKElementBase(), PsiOwner by PsiO
} }
object JKBodyStubImpl : JKBodyStub() { object JKBodyStubImpl : JKBodyStub() {
override var leftNonCodeElements: List<JKNonCodeElement> = emptyList()//TODO fix override val leftNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf()
override var rightNonCodeElements: List<JKNonCodeElement> = emptyList()//TODO fix override val rightNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf()
override fun copy(): JKTreeElement = this override fun copy(): JKTreeElement = this
@@ -538,7 +535,7 @@ class JKAnnotationImpl(
override var arguments: List<JKAnnotationParameter> by children(arguments) override var arguments: List<JKAnnotationParameter> by children(arguments)
override fun accept(visitor: JKVisitor) = visitor.visitAnnotation(this) override fun accept(visitor: JKVisitor) = visitor.visitAnnotation(this)
override var rightNonCodeElements: List<JKNonCodeElement> = listOf(JKSpaceElementImpl("\n")) override var rightNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf(JKSpaceElementImpl("\n"))
} }
class JKTypeArgumentListImpl(typeArguments: List<JKTypeElement> = emptyList()) : JKTypeArgumentList, JKBranchElementBase(), class JKTypeArgumentListImpl(typeArguments: List<JKTypeElement> = emptyList()) : JKTypeArgumentList, JKBranchElementBase(),
@@ -562,7 +559,7 @@ class JKImportStatementImpl(name: JKNameIdentifier) : JKImportStatement, JKBranc
override fun accept(visitor: JKVisitor) = visitor.visitImportStatement(this) override fun accept(visitor: JKVisitor) = visitor.visitImportStatement(this)
override var rightNonCodeElements: List<JKNonCodeElement> = listOf(JKSpaceElementImpl("\n")) override var rightNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf(JKSpaceElementImpl("\n"))
} }
class JKImportListImpl(imports: List<JKImportStatement>) : JKImportList, JKBranchElementBase() { class JKImportListImpl(imports: List<JKImportStatement>) : JKImportList, JKBranchElementBase() {
@@ -21,8 +21,6 @@ import org.jetbrains.kotlin.lexer.KtSingleValueToken
import org.jetbrains.kotlin.nj2k.symbols.JKMethodSymbol import org.jetbrains.kotlin.nj2k.symbols.JKMethodSymbol
import org.jetbrains.kotlin.nj2k.tree.* import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.visitors.JKVisitor import org.jetbrains.kotlin.nj2k.tree.visitors.JKVisitor
import org.jetbrains.kotlin.types.expressions.OperatorConventions
import org.jetbrains.kotlin.utils.addToStdlib.cast
class JKKtPropertyImpl( class JKKtPropertyImpl(
type: JKTypeElement, type: JKTypeElement,
@@ -50,7 +48,7 @@ class JKKtPropertyImpl(
override var modalityElement by child(modalityElement) override var modalityElement by child(modalityElement)
override var mutabilityElement by child(mutabilityElement) override var mutabilityElement by child(mutabilityElement)
override var rightNonCodeElements: List<JKNonCodeElement> = listOf(JKSpaceElementImpl("\n")) override var rightNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf(JKSpaceElementImpl("\n"))
} }
class JKKtFunctionImpl( class JKKtFunctionImpl(
@@ -152,7 +150,7 @@ class JKKtAssignmentStatementImpl(
override var expression by child(expression) override var expression by child(expression)
override fun accept(visitor: JKVisitor) = visitor.visitKtAssignmentStatement(this) override fun accept(visitor: JKVisitor) = visitor.visitKtAssignmentStatement(this)
override var rightNonCodeElements: List<JKNonCodeElement> = listOf(JKSpaceElementImpl("\n")) override var rightNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf(JKSpaceElementImpl("\n"))
} }
object JKContextType : JKType { object JKContextType : JKType {
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.nj2k.tree.JKCommentElement
import org.jetbrains.kotlin.nj2k.tree.JKNonCodeElement import org.jetbrains.kotlin.nj2k.tree.JKNonCodeElement
import org.jetbrains.kotlin.nj2k.tree.JKSpaceElement import org.jetbrains.kotlin.nj2k.tree.JKSpaceElement
import org.jetbrains.kotlin.nj2k.tree.JKTokenElement import org.jetbrains.kotlin.nj2k.tree.JKTokenElement
import org.jetbrains.kotlin.utils.SmartList
class JKSpaceElementImpl(override val text: String) : JKSpaceElement class JKSpaceElementImpl(override val text: String) : JKSpaceElement
@@ -16,6 +17,6 @@ class JKSpaceElementImpl(override val text: String) : JKSpaceElement
class JKCommentElementImpl(override val text: String) : JKCommentElement class JKCommentElementImpl(override val text: String) : JKCommentElement
class JKTokenElementImpl(override val text: String) : JKTokenElement { class JKTokenElementImpl(override val text: String) : JKTokenElement {
override var leftNonCodeElements: List<JKNonCodeElement> = emptyList() override val leftNonCodeElements: MutableList<JKNonCodeElement> = SmartList()
override var rightNonCodeElements: List<JKNonCodeElement> = emptyList() override val rightNonCodeElements: MutableList<JKNonCodeElement> = SmartList()
} }
@@ -38,7 +38,7 @@ interface PsiOwner {
} }
abstract class JKDeclaration : JKTreeElement, JKBranchElementBase() { abstract class JKDeclaration : JKTreeElement, JKBranchElementBase() {
override var rightNonCodeElements: List<JKNonCodeElement> = listOf(JKSpaceElementImpl("\n")) override val rightNonCodeElements = mutableListOf<JKNonCodeElement>(JKSpaceElementImpl("\n"))
abstract val name: JKNameIdentifier abstract val name: JKNameIdentifier
} }
@@ -260,7 +260,7 @@ interface JKTypeElement : JKTreeElement {
} }
abstract class JKStatement : JKTreeElement, JKBranchElementBase() { abstract class JKStatement : JKTreeElement, JKBranchElementBase() {
override var rightNonCodeElements: List<JKNonCodeElement> = listOf(JKSpaceElementImpl("\n")) override var rightNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf(JKSpaceElementImpl("\n"))
} }
abstract class JKBlock : JKTreeElement, JKBranchElementBase() { abstract class JKBlock : JKTreeElement, JKBranchElementBase() {
@@ -389,7 +389,7 @@ interface JKLiteralExpression : JKExpression {
abstract class JKParameter : JKVariable(), JKModifiersListOwner { abstract class JKParameter : JKVariable(), JKModifiersListOwner {
abstract var isVarArgs: Boolean abstract var isVarArgs: Boolean
override var rightNonCodeElements: List<JKNonCodeElement> = emptyList() override val rightNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf()
} }
interface JKStringLiteralExpression : JKLiteralExpression { interface JKStringLiteralExpression : JKLiteralExpression {
@@ -22,22 +22,17 @@ fun JKCommentElement.isSingleline() =
interface JKNonCodeElementsListOwner { interface JKNonCodeElementsListOwner {
var leftNonCodeElements: List<JKNonCodeElement> val leftNonCodeElements: MutableList<JKNonCodeElement>
var rightNonCodeElements: List<JKNonCodeElement> val rightNonCodeElements: MutableList<JKNonCodeElement>
} }
fun JKNonCodeElementsListOwner.takeNonCodeElementsFrom(other: JKNonCodeElementsListOwner) { fun JKNonCodeElementsListOwner.takeNonCodeElementsFrom(other: JKNonCodeElementsListOwner) {
leftNonCodeElements = other.leftNonCodeElements leftNonCodeElements += other.leftNonCodeElements
rightNonCodeElements = other.rightNonCodeElements rightNonCodeElements += other.rightNonCodeElements
} }
fun JKNonCodeElementsListOwner.appendNonCodeElementsFrom(other: JKNonCodeElementsListOwner) { fun List<JKNonCodeElement>.dropSpacesAtBeginning() =
leftNonCodeElements = other.leftNonCodeElements + leftNonCodeElements
rightNonCodeElements = rightNonCodeElements + other.rightNonCodeElements
}
fun List<JKNonCodeElement>.dropSpacesAtBegining() =
dropWhile { it is JKSpaceElement } dropWhile { it is JKSpaceElement }
fun JKTreeElement.commentsFromInside(): List<JKCommentElement> { fun JKTreeElement.commentsFromInside(): List<JKCommentElement> {
@@ -62,8 +57,8 @@ inline fun <reified T : JKNonCodeElementsListOwner> List<T>.withNonCodeElementsF
} }
fun JKNonCodeElementsListOwner.clearNonCodeElements() { fun JKNonCodeElementsListOwner.clearNonCodeElements() {
leftNonCodeElements = emptyList() leftNonCodeElements.clear()
rightNonCodeElements = emptyList() rightNonCodeElements.clear()
} }
interface JKTokenElement : JKNonCodeElementsListOwner { interface JKTokenElement : JKNonCodeElementsListOwner {
+3 -2
View File
@@ -5,10 +5,11 @@ internal class A // end of primary constructor body
// this is a secondary constructor 2 // this is a secondary constructor 2
constructor(s: String) : this(s.length) {} // end of secondary constructor 2 body constructor(s: String) : this(s.length) {} // end of secondary constructor 2 body
// this is a secondary constructor 1
// this is a primary constructor
// this is a primary constructor // this is a secondary constructor 1
// end of secondary constructor 1 body // end of secondary constructor 1 body
+1 -1
View File
@@ -3,7 +3,7 @@ import java.util.stream.Collectors
internal class Test { internal class Test {
fun main(lst: List<Int>) { fun main(lst: List<Int>) {
val newLst = /*before list*/lst/*after list*/.stream/*before stream*/()/* after stream*/ val newLst = /*before list*/ lst/*after list*/.stream/*before stream*/()/* after stream*/
.filter { x: Int -> x > 10 } .filter { x: Int -> x > 10 }
.map { x: Int -> x + 2 }/*some comment*/.distinct/*another comment*/()/* one more comment */.sorted()/*another one comment*/ .map { x: Int -> x + 2 }/*some comment*/.distinct/*another comment*/()/* one more comment */.sorted()/*another one comment*/
.sorted(Comparator.naturalOrder()) .sorted(Comparator.naturalOrder())