From 9ed6fe888851e8583f7b63ad454e0e02dded05d8 Mon Sep 17 00:00:00 2001 From: Pavel Talanov Date: Sun, 1 Dec 2013 00:29:20 +0400 Subject: [PATCH] Refactor converter: Refactor handling of doc comments --- j2k/src/org/jetbrains/jet/j2k/Converter.kt | 42 +++++++------------ .../jetbrains/jet/j2k/ast/AnonymousClass.kt | 4 +- j2k/src/org/jetbrains/jet/j2k/ast/Class.kt | 8 ++-- .../org/jetbrains/jet/j2k/ast/Constructor.kt | 4 +- j2k/src/org/jetbrains/jet/j2k/ast/Enum.kt | 2 +- .../org/jetbrains/jet/j2k/ast/EnumConstant.kt | 4 +- j2k/src/org/jetbrains/jet/j2k/ast/Field.kt | 11 +++-- j2k/src/org/jetbrains/jet/j2k/ast/Function.kt | 6 +-- .../org/jetbrains/jet/j2k/ast/Initializer.kt | 3 +- j2k/src/org/jetbrains/jet/j2k/ast/Member.kt | 9 ++-- j2k/src/org/jetbrains/jet/j2k/ast/Trait.kt | 4 +- 11 files changed, 44 insertions(+), 53 deletions(-) diff --git a/j2k/src/org/jetbrains/jet/j2k/Converter.kt b/j2k/src/org/jetbrains/jet/j2k/Converter.kt index 9d4a63df253..0a95248b242 100644 --- a/j2k/src/org/jetbrains/jet/j2k/Converter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/Converter.kt @@ -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 { + private fun getMembers(psiClass: PsiClass): List { val members = ArrayList() - 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 { - val comments = ArrayList() - 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 = typesToNotNullableTypeList(psiClass.getExtendsListTypes()) val name: Identifier = Identifier(psiClass.getName()!!) val baseClassParams = ArrayList() - 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(), + members.add(Constructor(this, Identifier.EMPTY_IDENTIFIER, null, Collections.emptySet(), ClassType(name, Collections.emptyList(), false, this), Collections.emptyList(), 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(), implementsTypes, members) + return Trait(this, name, getDocComment(psiClass), modifiers, typeParameters, extendsTypes, Collections.emptyList(), implementsTypes, members) } if (psiClass.isEnum()) { - return Enum(this, name, docComments, modifiers, typeParameters, Collections.emptyList(), Collections.emptyList(), implementsTypes, members) + return Enum(this, name, getDocComment(psiClass), modifiers, typeParameters, Collections.emptyList(), Collections.emptyList(), 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 { diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/AnonymousClass.kt b/j2k/src/org/jetbrains/jet/j2k/ast/AnonymousClass.kt index 1e8598c6082..8607be55edf 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/AnonymousClass.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/AnonymousClass.kt @@ -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) +public class AnonymousClass(converter: Converter, members: List) : Class(converter, Identifier("anonClass"), - arrayList(), + null, Collections.emptySet(), Collections.emptyList(), Collections.emptyList(), diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Class.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Class.kt index a008e2588c1..1b8d01192b8 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Class.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Class.kt @@ -24,13 +24,13 @@ import java.util.ArrayList public open class Class(val converter: Converter, val name: Identifier, - val docComments: List, + docComment: Comment?, modifiers: Set, val typeParameters: List, val extendsTypes: List, val baseClassParams: List, val implementsTypes: List, - val members: List) : Member(modifiers) { + val members: List) : Member(docComment, modifiers) { open val TYPE: String get() = "class" @@ -77,7 +77,7 @@ public open class Class(val converter: Converter, val constructorTypeParameters = ArrayList() 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() + diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Constructor.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Constructor.kt index 1b294a7703b..36d9b079b81 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Constructor.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Constructor.kt @@ -21,13 +21,13 @@ import org.jetbrains.jet.j2k.Converter public class Constructor(converter: Converter, identifier: Identifier, - docComments: List, + docComment: Comment?, modifiers: Set, `type`: Type, typeParameters: List, 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 { diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Enum.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Enum.kt index 3316d44ba91..39e9c8c569f 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Enum.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Enum.kt @@ -21,7 +21,7 @@ import org.jetbrains.jet.j2k.ast.types.Type public class Enum(converter: Converter, name: Identifier, - docComments: List, + docComments: Comment?, modifiers: Set, typeParameters: List, extendsTypes: List, diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/EnumConstant.kt b/j2k/src/org/jetbrains/jet/j2k/ast/EnumConstant.kt index a19c4997fd4..28425be8e70 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/EnumConstant.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/EnumConstant.kt @@ -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, + docComment: Comment?, modifiers: Set, `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()) { diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Field.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Field.kt index 6ed6cf44ef9..fa8b39a0956 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Field.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Field.kt @@ -21,13 +21,13 @@ import org.jetbrains.jet.j2k.* import java.util.ArrayList public open class Field(val identifier: Identifier, - val docComments: List, + docComment: Comment?, modifiers: Set, 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() 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) diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Function.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Function.kt index 05fa5d4a366..d052f440e4c 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Function.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Function.kt @@ -23,12 +23,12 @@ import org.jetbrains.jet.j2k.Converter public open class Function(val converter: Converter, val name: Identifier, - val docComments: List, + docComment: Comment?, modifiers: Set, val `type`: Type, val typeParameters: List, 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()})" + diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Initializer.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Initializer.kt index 44d1b8bf4c6..53d6c80484b 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Initializer.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Initializer.kt @@ -17,7 +17,8 @@ package org.jetbrains.jet.j2k.ast -public open class Initializer(val block: Block, modifiers: Set) : Member(modifiers) { +//TODO: is a member? +public class Initializer(val block: Block, modifiers: Set) : Member(null, modifiers) { public override fun toKotlin(): String { return block.toKotlin() } diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Member.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Member.kt index 1eff869a9e5..ff5770be714 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Member.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Member.kt @@ -16,11 +16,12 @@ package org.jetbrains.jet.j2k.ast -public abstract class Member(val modifiers: Set) : Node { - open fun accessModifier(): Modifier? { +public abstract class Member(val docComment: Comment?, val modifiers: Set) : 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 "" } diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/Trait.kt b/j2k/src/org/jetbrains/jet/j2k/ast/Trait.kt index cbd7a199bb9..55d151dec65 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/Trait.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/Trait.kt @@ -21,13 +21,13 @@ import org.jetbrains.jet.j2k.ast.types.Type public class Trait(converter: Converter, name: Identifier, - docComments: List, + docComment: Comment?, modifiers: Set, typeParameters: List, extendsTypes: List, baseClassParams: List, implementsTypes: List, - members: List) : Class(converter, name, docComments, modifiers, typeParameters, + members: List) : Class(converter, name, docComment, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, members) { override val TYPE: String