New J2K: use mutable lists for storing comments
This commit is contained in:
@@ -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 {
|
||||
|
||||
@@ -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
@@ -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())
|
||||
|
||||
Reference in New Issue
Block a user