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.impl.source.tree.ChildRole
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.PsiLabeledStatementImpl
import com.intellij.psi.impl.source.tree.java.PsiLiteralExpressionImpl
@@ -1038,8 +1037,8 @@ class JavaToJKTreeBuilder constructor(
private fun JKNonCodeElementsListOwner.assignNonCodeElements(psi: PsiElement?) {
if (psi == null) return
val (leftTokens, rightTokens) = psi.collectNonCodeElements()
this.leftNonCodeElements = leftTokens
this.rightNonCodeElements = rightTokens
this.leftNonCodeElements += leftTokens
this.rightNonCodeElements += rightTokens
}
private inline fun <reified T : JKNonCodeElementsListOwner> T.withAssignedNonCodeElements(psi: PsiElement?): T =
@@ -55,10 +55,10 @@ class AnnotationClassConversion(context: NewJ2kConverterContext) : RecursiveAppl
} else initializer
).also { parameter ->
if (leftNonCodeElements.any { it is JKCommentElement }) {
parameter.leftNonCodeElements = leftNonCodeElements
parameter.leftNonCodeElements += leftNonCodeElements
}
if (rightNonCodeElements.any { it is JKCommentElement }) {
parameter.rightNonCodeElements = rightNonCodeElements
parameter.rightNonCodeElements += rightNonCodeElements
}
}
@@ -6,7 +6,6 @@
package org.jetbrains.kotlin.nj2k.conversions
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
import org.jetbrains.kotlin.lexer.KtTokens
import org.jetbrains.kotlin.nj2k.*
import org.jetbrains.kotlin.nj2k.symbols.JKMethodSymbol
import org.jetbrains.kotlin.nj2k.symbols.JKUnresolvedField
@@ -32,11 +31,11 @@ class BuiltinMembersConversion(context: NewJ2kConverterContext) : RecursiveAppli
val newSelector = conversion.createBuilder().build(selector)
if (this is JKQualifiedExpression && conversion.replaceType == ReplaceType.REPLACE_WITH_QUALIFIER) {
newSelector.rightNonCodeElements =
(receiver.leftNonCodeElements +
receiver.rightNonCodeElements +
selector.leftNonCodeElements +
selector.rightNonCodeElements).dropSpacesAtBegining()
newSelector.rightNonCodeElements += receiver.leftNonCodeElements
newSelector.rightNonCodeElements += receiver.leftNonCodeElements
newSelector.rightNonCodeElements += receiver.rightNonCodeElements
newSelector.rightNonCodeElements += selector.leftNonCodeElements
newSelector.rightNonCodeElements += selector.rightNonCodeElements
}
return when (conversion.replaceType) {
@@ -469,7 +468,7 @@ class BuiltinMembersConversion(context: NewJ2kConverterContext) : RecursiveAppli
).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(
this,
JKKtQualifierImpl.DOT,
@@ -107,7 +107,7 @@ class DefaultArgumentsConversion(context: NewJ2kConverterContext) : RecursiveApp
parameter.initializer = remapParameterSymbol(defaultValue) as JKExpression
}
element.declarations -= method
calledMethod.appendNonCodeElementsFrom(method)
calledMethod.withNonCodeElementsFrom(method)
}
for (method in element.declarations) {
@@ -14,7 +14,7 @@ class NonCodeElementsConversion(context : NewJ2kConverterContext) : RecursiveApp
when (element) {
is JKClass -> {
element.name.rightNonCodeElements += element.inheritance.leftNonCodeElements
element.inheritance.leftNonCodeElements = emptyList()
element.inheritance.leftNonCodeElements.clear()
}
}
return recurse(element)
@@ -43,8 +43,8 @@ private class JKListChild<T : JKElement>(val value: Int) : ReadWriteProperty<JKB
}
abstract class JKElementBase : JKTreeElement, Cloneable {
override var leftNonCodeElements: List<JKNonCodeElement> = emptyList()
override var rightNonCodeElements: List<JKNonCodeElement> = emptyList()
override val leftNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf()
override val rightNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf()
override var parent: JKElement? = null
@@ -17,10 +17,7 @@
package org.jetbrains.kotlin.nj2k.tree.impl
import com.intellij.psi.PsiElement
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
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.tree.*
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 var rightNonCodeElements: List<JKNonCodeElement> = listOf(JKSpaceElementImpl("\n"))
override var rightNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf(JKSpaceElementImpl("\n"))
}
class JKArrayAccessExpressionImpl(
@@ -270,8 +267,8 @@ class JKStubExpressionImpl : JKStubExpression, JKElementBase(), PsiOwner by PsiO
}
object JKBodyStubImpl : JKBodyStub() {
override var leftNonCodeElements: List<JKNonCodeElement> = emptyList()//TODO fix
override var rightNonCodeElements: List<JKNonCodeElement> = emptyList()//TODO fix
override val leftNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf()
override val rightNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf()
override fun copy(): JKTreeElement = this
@@ -538,7 +535,7 @@ class JKAnnotationImpl(
override var arguments: List<JKAnnotationParameter> by children(arguments)
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(),
@@ -562,7 +559,7 @@ class JKImportStatementImpl(name: JKNameIdentifier) : JKImportStatement, JKBranc
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() {
@@ -21,8 +21,6 @@ import org.jetbrains.kotlin.lexer.KtSingleValueToken
import org.jetbrains.kotlin.nj2k.symbols.JKMethodSymbol
import org.jetbrains.kotlin.nj2k.tree.*
import org.jetbrains.kotlin.nj2k.tree.visitors.JKVisitor
import org.jetbrains.kotlin.types.expressions.OperatorConventions
import org.jetbrains.kotlin.utils.addToStdlib.cast
class JKKtPropertyImpl(
type: JKTypeElement,
@@ -50,7 +48,7 @@ class JKKtPropertyImpl(
override var modalityElement by child(modalityElement)
override var mutabilityElement by child(mutabilityElement)
override var rightNonCodeElements: List<JKNonCodeElement> = listOf(JKSpaceElementImpl("\n"))
override var rightNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf(JKSpaceElementImpl("\n"))
}
class JKKtFunctionImpl(
@@ -152,7 +150,7 @@ class JKKtAssignmentStatementImpl(
override var expression by child(expression)
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 {
@@ -9,6 +9,7 @@ import org.jetbrains.kotlin.nj2k.tree.JKCommentElement
import org.jetbrains.kotlin.nj2k.tree.JKNonCodeElement
import org.jetbrains.kotlin.nj2k.tree.JKSpaceElement
import org.jetbrains.kotlin.nj2k.tree.JKTokenElement
import org.jetbrains.kotlin.utils.SmartList
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 JKTokenElementImpl(override val text: String) : JKTokenElement {
override var leftNonCodeElements: List<JKNonCodeElement> = emptyList()
override var rightNonCodeElements: List<JKNonCodeElement> = emptyList()
override val leftNonCodeElements: MutableList<JKNonCodeElement> = SmartList()
override val rightNonCodeElements: MutableList<JKNonCodeElement> = SmartList()
}
@@ -38,7 +38,7 @@ interface PsiOwner {
}
abstract class JKDeclaration : JKTreeElement, JKBranchElementBase() {
override var rightNonCodeElements: List<JKNonCodeElement> = listOf(JKSpaceElementImpl("\n"))
override val rightNonCodeElements = mutableListOf<JKNonCodeElement>(JKSpaceElementImpl("\n"))
abstract val name: JKNameIdentifier
}
@@ -260,7 +260,7 @@ interface JKTypeElement : JKTreeElement {
}
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() {
@@ -389,7 +389,7 @@ interface JKLiteralExpression : JKExpression {
abstract class JKParameter : JKVariable(), JKModifiersListOwner {
abstract var isVarArgs: Boolean
override var rightNonCodeElements: List<JKNonCodeElement> = emptyList()
override val rightNonCodeElements: MutableList<JKNonCodeElement> = mutableListOf()
}
interface JKStringLiteralExpression : JKLiteralExpression {
@@ -22,22 +22,17 @@ fun JKCommentElement.isSingleline() =
interface JKNonCodeElementsListOwner {
var leftNonCodeElements: List<JKNonCodeElement>
var rightNonCodeElements: List<JKNonCodeElement>
val leftNonCodeElements: MutableList<JKNonCodeElement>
val rightNonCodeElements: MutableList<JKNonCodeElement>
}
fun JKNonCodeElementsListOwner.takeNonCodeElementsFrom(other: JKNonCodeElementsListOwner) {
leftNonCodeElements = other.leftNonCodeElements
rightNonCodeElements = other.rightNonCodeElements
leftNonCodeElements += other.leftNonCodeElements
rightNonCodeElements += other.rightNonCodeElements
}
fun JKNonCodeElementsListOwner.appendNonCodeElementsFrom(other: JKNonCodeElementsListOwner) {
leftNonCodeElements = other.leftNonCodeElements + leftNonCodeElements
rightNonCodeElements = rightNonCodeElements + other.rightNonCodeElements
}
fun List<JKNonCodeElement>.dropSpacesAtBegining() =
fun List<JKNonCodeElement>.dropSpacesAtBeginning() =
dropWhile { it is JKSpaceElement }
fun JKTreeElement.commentsFromInside(): List<JKCommentElement> {
@@ -62,8 +57,8 @@ inline fun <reified T : JKNonCodeElementsListOwner> List<T>.withNonCodeElementsF
}
fun JKNonCodeElementsListOwner.clearNonCodeElements() {
leftNonCodeElements = emptyList()
rightNonCodeElements = emptyList()
leftNonCodeElements.clear()
rightNonCodeElements.clear()
}
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
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
+1 -1
View File
@@ -3,7 +3,7 @@ import java.util.stream.Collectors
internal class Test {
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 }
.map { x: Int -> x + 2 }/*some comment*/.distinct/*another comment*/()/* one more comment */.sorted()/*another one comment*/
.sorted(Comparator.naturalOrder())