Refactor converter:
Refactor handling of doc comments
This commit is contained in:
committed by
Pavel V. Talanov
parent
f8c8e59f94
commit
9ed6fe8888
@@ -31,6 +31,7 @@ import com.intellij.psi.CommonClassNames.*
|
||||
import org.jetbrains.jet.lang.types.expressions.OperatorConventions.*
|
||||
import com.intellij.psi.util.PsiUtil
|
||||
import com.intellij.openapi.project.Project
|
||||
import com.intellij.psi.javadoc.PsiDocComment
|
||||
|
||||
public class Converter(val project: Project, val settings: ConverterSettings) {
|
||||
|
||||
@@ -86,27 +87,18 @@ public class Converter(val project: Project, val settings: ConverterSettings) {
|
||||
return AnonymousClass(this, getMembers(anonymousClass))
|
||||
}
|
||||
|
||||
private fun getMembers(psiClass: PsiClass): MutableList<Node> {
|
||||
private fun getMembers(psiClass: PsiClass): List<Node> {
|
||||
val members = ArrayList<Node>()
|
||||
val lbraceOffset = psiClass.getLBrace()?.getTextRange()?.getStartOffset() ?: 0
|
||||
for (e : PsiElement? in psiClass.getChildren()) {
|
||||
val isDocComment = e?.getTextRange()?.getStartOffset() ?: 0 < lbraceOffset
|
||||
if (isDocComment) continue
|
||||
for (e in psiClass.getChildren()) {
|
||||
val converted = memberToMember(e, psiClass)
|
||||
if (converted != null) members.add(converted)
|
||||
}
|
||||
return members
|
||||
}
|
||||
|
||||
private fun getDocComments(element: PsiElement): List<Node> {
|
||||
val comments = ArrayList<Node>()
|
||||
val textOffset = element.getTextOffset()
|
||||
for (e : PsiElement? in element.getChildren()) {
|
||||
if (e is PsiComment && e.getTextRange()?.getStartOffset() ?: 0 < textOffset) {
|
||||
comments.add(Comment(e.getText()!!));
|
||||
}
|
||||
}
|
||||
return comments
|
||||
private fun getDocComment(element: PsiDocCommentOwner): Comment? {
|
||||
val psiDocComment = element.getDocComment()
|
||||
return if (psiDocComment != null) Comment(psiDocComment.getText()!!) else null
|
||||
}
|
||||
|
||||
private fun memberToMember(e: PsiElement?, containingClass: PsiClass): Node? = when(e) {
|
||||
@@ -114,6 +106,7 @@ public class Converter(val project: Project, val settings: ConverterSettings) {
|
||||
is PsiField -> fieldToField(e, containingClass)
|
||||
is PsiClass -> classToClass(e)
|
||||
is PsiClassInitializer -> initializerToInitializer(e)
|
||||
is PsiDocComment -> null
|
||||
is PsiComment -> Comment(e.getText()!!)
|
||||
else -> null
|
||||
}
|
||||
@@ -126,8 +119,7 @@ public class Converter(val project: Project, val settings: ConverterSettings) {
|
||||
val extendsTypes: List<Type> = typesToNotNullableTypeList(psiClass.getExtendsListTypes())
|
||||
val name: Identifier = Identifier(psiClass.getName()!!)
|
||||
val baseClassParams = ArrayList<Expression>()
|
||||
val members = getMembers(psiClass)
|
||||
val docComments = getDocComments(psiClass)
|
||||
val members = ArrayList(getMembers(psiClass))
|
||||
val visitor: SuperVisitor = SuperVisitor()
|
||||
psiClass.accept(visitor)
|
||||
val resolvedSuperCallParameters = visitor.resolvedSuperCallParameters
|
||||
@@ -175,7 +167,7 @@ public class Converter(val project: Project, val settings: ConverterSettings) {
|
||||
}
|
||||
}
|
||||
}
|
||||
members.add(Constructor(this, Identifier.EMPTY_IDENTIFIER, arrayListOf(), Collections.emptySet<Modifier>(),
|
||||
members.add(Constructor(this, Identifier.EMPTY_IDENTIFIER, null, Collections.emptySet<Modifier>(),
|
||||
ClassType(name, Collections.emptyList<Element>(), false, this),
|
||||
Collections.emptyList<Element>(),
|
||||
ParameterList(createParametersFromFields(finalOrWithEmptyInitializer)),
|
||||
@@ -184,14 +176,14 @@ public class Converter(val project: Project, val settings: ConverterSettings) {
|
||||
}
|
||||
|
||||
if (psiClass.isInterface()) {
|
||||
return Trait(this, name, docComments, modifiers, typeParameters, extendsTypes, Collections.emptyList<Expression>(), implementsTypes, members)
|
||||
return Trait(this, name, getDocComment(psiClass), modifiers, typeParameters, extendsTypes, Collections.emptyList<Expression>(), implementsTypes, members)
|
||||
}
|
||||
|
||||
if (psiClass.isEnum()) {
|
||||
return Enum(this, name, docComments, modifiers, typeParameters, Collections.emptyList<Type>(), Collections.emptyList<Expression>(), implementsTypes, members)
|
||||
return Enum(this, name, getDocComment(psiClass), modifiers, typeParameters, Collections.emptyList<Type>(), Collections.emptyList<Expression>(), implementsTypes, members)
|
||||
}
|
||||
|
||||
return Class(this, name, docComments, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, members)
|
||||
return Class(this, name, getDocComment(psiClass), modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, members)
|
||||
}
|
||||
|
||||
private fun initializerToInitializer(i: PsiClassInitializer): Initializer {
|
||||
@@ -204,10 +196,9 @@ public class Converter(val project: Project, val settings: ConverterSettings) {
|
||||
|
||||
private fun fieldToField(field: PsiField, psiClass: PsiClass?): Field {
|
||||
val modifiers = modifiersListToModifiersSet(field.getModifierList())
|
||||
val docComments = getDocComments(field)
|
||||
if (field is PsiEnumConstant) {
|
||||
return EnumConstant(Identifier(field.getName()!!),
|
||||
docComments,
|
||||
getDocComment(field),
|
||||
modifiers,
|
||||
typeToType(field.getType()),
|
||||
elementToElement(field.getArgumentList()))
|
||||
@@ -219,7 +210,7 @@ public class Converter(val project: Project, val settings: ConverterSettings) {
|
||||
}
|
||||
|
||||
return Field(Identifier(field.getName()!!),
|
||||
docComments,
|
||||
getDocComment(field),
|
||||
modifiers,
|
||||
kType,
|
||||
expressionToExpression(field.getInitializer(), field.getType()),
|
||||
@@ -245,7 +236,6 @@ public class Converter(val project: Project, val settings: ConverterSettings) {
|
||||
val params: Element = createFunctionParameters(method)
|
||||
val typeParameters = elementsToElementList(method.getTypeParameters())
|
||||
val modifiers = modifiersListToModifiersSet(method.getModifierList())
|
||||
val docComments = getDocComments(method)
|
||||
if (isOverride(method)) {
|
||||
modifiers.add(Modifier.OVERRIDE)
|
||||
}
|
||||
@@ -260,11 +250,11 @@ public class Converter(val project: Project, val settings: ConverterSettings) {
|
||||
}
|
||||
|
||||
if (method.isConstructor()) {
|
||||
return Constructor(this, identifier, docComments, modifiers, returnType, typeParameters, params,
|
||||
return Constructor(this, identifier, getDocComment(method), modifiers, returnType, typeParameters, params,
|
||||
Block(body.statements), isConstructorPrimary(method))
|
||||
}
|
||||
|
||||
return Function(this, identifier, docComments, modifiers, returnType, typeParameters, params, body)
|
||||
return Function(this, identifier, getDocComment(method), modifiers, returnType, typeParameters, params, body)
|
||||
}
|
||||
|
||||
private fun createFunctionParameters(method: PsiMethod): ParameterList {
|
||||
|
||||
@@ -20,10 +20,10 @@ import org.jetbrains.jet.j2k.Converter
|
||||
import org.jetbrains.jet.j2k.ast.types.Type
|
||||
import java.util.Collections
|
||||
|
||||
public open class AnonymousClass(converter: Converter, members: List<Node>)
|
||||
public class AnonymousClass(converter: Converter, members: List<Node>)
|
||||
: Class(converter,
|
||||
Identifier("anonClass"),
|
||||
arrayList(),
|
||||
null,
|
||||
Collections.emptySet<Modifier>(),
|
||||
Collections.emptyList<Element>(),
|
||||
Collections.emptyList<Type>(),
|
||||
|
||||
@@ -24,13 +24,13 @@ import java.util.ArrayList
|
||||
|
||||
public open class Class(val converter: Converter,
|
||||
val name: Identifier,
|
||||
val docComments: List<Node>,
|
||||
docComment: Comment?,
|
||||
modifiers: Set<Modifier>,
|
||||
val typeParameters: List<Element>,
|
||||
val extendsTypes: List<Type>,
|
||||
val baseClassParams: List<Expression>,
|
||||
val implementsTypes: List<Type>,
|
||||
val members: List<Node>) : Member(modifiers) {
|
||||
val members: List<Node>) : Member(docComment, modifiers) {
|
||||
open val TYPE: String
|
||||
get() = "class"
|
||||
|
||||
@@ -77,7 +77,7 @@ public open class Class(val converter: Converter,
|
||||
val constructorTypeParameters = ArrayList<Element>()
|
||||
constructorTypeParameters.addAll(typeParameters)
|
||||
constructorTypeParameters.addAll(f.typeParameters)
|
||||
return Function(converter, Identifier("init"), arrayList(), modifiers,
|
||||
return Function(converter, Identifier("init"), null, modifiers,
|
||||
ClassType(name, constructorTypeParameters, false, converter),
|
||||
constructorTypeParameters, f.params, block)
|
||||
}
|
||||
@@ -133,7 +133,7 @@ public open class Class(val converter: Converter,
|
||||
}
|
||||
|
||||
public override fun toKotlin(): String =
|
||||
docComments.toKotlin("\n", "", "\n") +
|
||||
docCommentToKotlin() +
|
||||
modifiersToKotlin() +
|
||||
TYPE + " " + name.toKotlin() +
|
||||
typeParametersToKotlin() +
|
||||
|
||||
@@ -21,13 +21,13 @@ import org.jetbrains.jet.j2k.Converter
|
||||
|
||||
public class Constructor(converter: Converter,
|
||||
identifier: Identifier,
|
||||
docComments: List<Node>,
|
||||
docComment: Comment?,
|
||||
modifiers: Set<Modifier>,
|
||||
`type`: Type,
|
||||
typeParameters: List<Element>,
|
||||
params: Element,
|
||||
block: Block,
|
||||
val isPrimary: Boolean) : Function(converter, identifier, docComments, modifiers,
|
||||
val isPrimary: Boolean) : Function(converter, identifier, docComment, modifiers,
|
||||
`type`, typeParameters, params, block) {
|
||||
|
||||
public fun primarySignatureToKotlin(): String {
|
||||
|
||||
@@ -21,7 +21,7 @@ import org.jetbrains.jet.j2k.ast.types.Type
|
||||
|
||||
public class Enum(converter: Converter,
|
||||
name: Identifier,
|
||||
docComments: List<Node>,
|
||||
docComments: Comment?,
|
||||
modifiers: Set<Modifier>,
|
||||
typeParameters: List<Element>,
|
||||
extendsTypes: List<Type>,
|
||||
|
||||
@@ -19,10 +19,10 @@ package org.jetbrains.jet.j2k.ast
|
||||
import org.jetbrains.jet.j2k.ast.types.Type
|
||||
|
||||
public open class EnumConstant(identifier: Identifier,
|
||||
docComments: List<Node>,
|
||||
docComment: Comment?,
|
||||
modifiers: Set<Modifier>,
|
||||
`type`: Type,
|
||||
params: Element) : Field(identifier, docComments, modifiers, `type`.convertedToNotNull(), params, 0) {
|
||||
params: Element) : Field(identifier, docComment, modifiers, `type`.convertedToNotNull(), params, 0) {
|
||||
|
||||
public override fun toKotlin(): String {
|
||||
if (initializer.toKotlin().isEmpty()) {
|
||||
|
||||
@@ -21,13 +21,13 @@ import org.jetbrains.jet.j2k.*
|
||||
import java.util.ArrayList
|
||||
|
||||
public open class Field(val identifier: Identifier,
|
||||
val docComments: List<Node>,
|
||||
docComment: Comment?,
|
||||
modifiers: Set<Modifier>,
|
||||
val `type`: Type,
|
||||
val initializer: Element,
|
||||
val writingAccesses: Int) : Member(modifiers) {
|
||||
val writingAccesses: Int) : Member(docComment, modifiers) {
|
||||
|
||||
open fun modifiersToKotlin(): String {
|
||||
fun modifiersToKotlin(): String {
|
||||
val modifierList = ArrayList<Modifier>()
|
||||
if (isAbstract()) {
|
||||
modifierList.add(Modifier.ABSTRACT)
|
||||
@@ -41,11 +41,10 @@ public open class Field(val identifier: Identifier,
|
||||
return modifierList.toKotlin() + (if (isVal()) "val " else "var ")
|
||||
}
|
||||
|
||||
public open fun isVal(): Boolean = modifiers.contains(Modifier.FINAL)
|
||||
public override fun isStatic(): Boolean = modifiers.contains(Modifier.STATIC)
|
||||
public fun isVal(): Boolean = modifiers.contains(Modifier.FINAL)
|
||||
|
||||
public override fun toKotlin(): String {
|
||||
val declaration: String = docComments.toKotlin("\n", "", "\n") +
|
||||
val declaration: String = docCommentToKotlin() +
|
||||
modifiersToKotlin() + identifier.toKotlin() + " : " + `type`.toKotlin()
|
||||
if (initializer.isEmpty()) {
|
||||
return declaration + ((if (isVal() && !isStatic() && writingAccesses != 0)
|
||||
|
||||
@@ -23,12 +23,12 @@ import org.jetbrains.jet.j2k.Converter
|
||||
|
||||
public open class Function(val converter: Converter,
|
||||
val name: Identifier,
|
||||
val docComments: List<Node>,
|
||||
docComment: Comment?,
|
||||
modifiers: Set<Modifier>,
|
||||
val `type`: Type,
|
||||
val typeParameters: List<Element>,
|
||||
val params: Element,
|
||||
var block: Block?) : Member(modifiers) {
|
||||
var block: Block?) : Member(docComment, modifiers) {
|
||||
|
||||
private fun typeParametersToKotlin() = when {
|
||||
!typeParameters.isEmpty() -> typeParameters.map { it.toKotlin() }.makeString(", ", "<", "> ")
|
||||
@@ -82,7 +82,7 @@ public open class Function(val converter: Converter,
|
||||
private fun returnTypeToKotlin() = if (!`type`.isUnit()) " : " + `type`.toKotlin() + " " else " "
|
||||
|
||||
public override fun toKotlin(): String {
|
||||
return docComments.toKotlin("\n", "", "\n") +
|
||||
return docCommentToKotlin() +
|
||||
modifiersToKotlin() +
|
||||
"fun ${typeParametersToKotlin()}${name.toKotlin()}" +
|
||||
"(${params.toKotlin()})" +
|
||||
|
||||
@@ -17,7 +17,8 @@
|
||||
package org.jetbrains.jet.j2k.ast
|
||||
|
||||
|
||||
public open class Initializer(val block: Block, modifiers: Set<Modifier>) : Member(modifiers) {
|
||||
//TODO: is a member?
|
||||
public class Initializer(val block: Block, modifiers: Set<Modifier>) : Member(null, modifiers) {
|
||||
public override fun toKotlin(): String {
|
||||
return block.toKotlin()
|
||||
}
|
||||
|
||||
@@ -16,11 +16,12 @@
|
||||
|
||||
package org.jetbrains.jet.j2k.ast
|
||||
|
||||
public abstract class Member(val modifiers: Set<Modifier>) : Node {
|
||||
open fun accessModifier(): Modifier? {
|
||||
public abstract class Member(val docComment: Comment?, val modifiers: Set<Modifier>) : Node {
|
||||
fun accessModifier(): Modifier? {
|
||||
return modifiers.find { m -> m == Modifier.PUBLIC || m == Modifier.PROTECTED || m == Modifier.PRIVATE }
|
||||
}
|
||||
|
||||
public open fun isAbstract(): Boolean = modifiers.contains(Modifier.ABSTRACT)
|
||||
public open fun isStatic(): Boolean = modifiers.contains(Modifier.STATIC)
|
||||
public fun isAbstract(): Boolean = modifiers.contains(Modifier.ABSTRACT)
|
||||
public fun isStatic(): Boolean = modifiers.contains(Modifier.STATIC)
|
||||
public fun docCommentToKotlin(): String = if (docComment != null) docComment.toKotlin() + "\n" else ""
|
||||
}
|
||||
|
||||
@@ -21,13 +21,13 @@ import org.jetbrains.jet.j2k.ast.types.Type
|
||||
|
||||
public class Trait(converter: Converter,
|
||||
name: Identifier,
|
||||
docComments: List<Node>,
|
||||
docComment: Comment?,
|
||||
modifiers: Set<Modifier>,
|
||||
typeParameters: List<Element>,
|
||||
extendsTypes: List<Type>,
|
||||
baseClassParams: List<Expression>,
|
||||
implementsTypes: List<Type>,
|
||||
members: List<Node>) : Class(converter, name, docComments, modifiers, typeParameters,
|
||||
members: List<Node>) : Class(converter, name, docComment, modifiers, typeParameters,
|
||||
extendsTypes, baseClassParams, implementsTypes, members) {
|
||||
|
||||
override val TYPE: String
|
||||
|
||||
Reference in New Issue
Block a user