comments support work in progress
This commit is contained in:
committed by
Pavel V. Talanov
parent
512603ce0c
commit
4bb3731272
@@ -47,16 +47,20 @@ public open class Converter() {
|
||||
classIdentifiers.clear()
|
||||
}
|
||||
|
||||
public open fun elementToKotlin(element: PsiElement): String =
|
||||
when(element) {
|
||||
is PsiJavaFile -> fileToFile(element).toKotlin()
|
||||
is PsiClass -> classToClass(element).toKotlin()
|
||||
is PsiMethod -> methodToFunction(element).toKotlin()
|
||||
is PsiField -> fieldToField(element, element.getContainingClass()).toKotlin()
|
||||
is PsiStatement -> statementToStatement(element).toKotlin()
|
||||
is PsiExpression -> expressionToExpression(element).toKotlin()
|
||||
else -> ""
|
||||
public open fun elementToKotlin(element: PsiElement): String {
|
||||
val kElement = topElementToElement(element)
|
||||
return kElement?.toKotlin() ?: ""
|
||||
}
|
||||
|
||||
public open fun topElementToElement(element: PsiElement?): Node? = when(element) {
|
||||
is PsiJavaFile -> fileToFile(element)
|
||||
is PsiClass -> classToClass(element)
|
||||
is PsiMethod -> methodToFunction(element)
|
||||
is PsiField -> fieldToField(element, element.getContainingClass())
|
||||
is PsiStatement -> statementToStatement(element)
|
||||
is PsiExpression -> expressionToExpression(element)
|
||||
is PsiComment -> Comment(element.getText()!!)
|
||||
else -> null
|
||||
}
|
||||
|
||||
public open fun fileToFile(javaFile: PsiJavaFile): File {
|
||||
@@ -75,29 +79,41 @@ public open class Converter() {
|
||||
importsToImportList(importList.getAllImportStatements()))
|
||||
for (i : String in additionalImports)
|
||||
imports.add(Import(i))
|
||||
return File(quoteKeywords(javaFile.getPackageName()), imports, classesToClassList(javaFile.getClasses()), createMainFunction(javaFile))
|
||||
}
|
||||
|
||||
private fun classesToClassList(classes: Array<PsiClass?>): List<Class> = classes.map { classToClass(it!!) }
|
||||
val body: ArrayList<Node> = arrayList()
|
||||
for(element in javaFile.getChildren()) {
|
||||
if (element !is PsiImportStatementBase) {
|
||||
val node = topElementToElement(element)
|
||||
if (node != null) {
|
||||
body.add(node)
|
||||
}
|
||||
}
|
||||
}
|
||||
return File(quoteKeywords(javaFile.getPackageName()), imports, body, createMainFunction(javaFile))
|
||||
}
|
||||
|
||||
public open fun anonymousClassToAnonymousClass(anonymousClass: PsiAnonymousClass): AnonymousClass {
|
||||
return AnonymousClass(this, getMembers(anonymousClass))
|
||||
return AnonymousClass(this, getMembers(anonymousClass, false))
|
||||
}
|
||||
|
||||
private fun getMembers(psiClass: PsiClass): List<Member> {
|
||||
val members: List<Member> = arrayList()
|
||||
private fun getMembers(psiClass: PsiClass, takeDocComments: Boolean): List<Node> {
|
||||
val members: List<Node> = arrayList()
|
||||
val lbraceOffset = psiClass.getLBrace()?.getTextRange()?.getStartOffset() ?: 0
|
||||
for (e : PsiElement? in psiClass.getChildren()) {
|
||||
val isDocComment = e?.getTextRange()?.getStartOffset() ?: 0 < lbraceOffset
|
||||
if (isDocComment != takeDocComments) continue
|
||||
val converted = memberToMember(e, psiClass)
|
||||
if (converted != null) members.add(converted)
|
||||
}
|
||||
return members
|
||||
}
|
||||
|
||||
private fun memberToMember(e: PsiElement?, containingClass: PsiClass): Member? = when(e) {
|
||||
private fun memberToMember(e: PsiElement?, containingClass: PsiClass): Node? = when(e) {
|
||||
is PsiMethod -> methodToFunction(e, true)
|
||||
is PsiField -> fieldToField(e, containingClass)
|
||||
is PsiClass -> classToClass(e)
|
||||
is PsiClassInitializer -> initializerToInitializer(e)
|
||||
is PsiComment -> Comment(e.getText()!!)
|
||||
else -> null
|
||||
}
|
||||
|
||||
@@ -109,7 +125,8 @@ public open class Converter() {
|
||||
val extendsTypes: List<Type> = typesToNotNullableTypeList(psiClass.getExtendsListTypes())
|
||||
val name: Identifier = Identifier(psiClass.getName()!!)
|
||||
val baseClassParams: List<Expression> = arrayList()
|
||||
val members: List<Member> = getMembers(psiClass)
|
||||
val members: List<Node> = getMembers(psiClass, false)
|
||||
val docComments = getMembers(psiClass, true)
|
||||
val visitor: SuperVisitor = SuperVisitor()
|
||||
psiClass.accept(visitor)
|
||||
val resolvedSuperCallParameters = visitor.resolvedSuperCallParameters
|
||||
@@ -166,14 +183,14 @@ public open class Converter() {
|
||||
}
|
||||
|
||||
if (psiClass.isInterface()) {
|
||||
return Trait(this, name, modifiers, typeParameters, extendsTypes, Collections.emptyList<Expression>()!!, implementsTypes, members)
|
||||
return Trait(this, name, docComments, modifiers, typeParameters, extendsTypes, Collections.emptyList<Expression>()!!, implementsTypes, members)
|
||||
}
|
||||
|
||||
if (psiClass.isEnum()) {
|
||||
return Enum(this, name, modifiers, typeParameters, Collections.emptyList<Type>()!!, Collections.emptyList<Expression>()!!, implementsTypes, members)
|
||||
return Enum(this, name, docComments, modifiers, typeParameters, Collections.emptyList<Type>()!!, Collections.emptyList<Expression>()!!, implementsTypes, members)
|
||||
}
|
||||
|
||||
return Class(this, name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, members)
|
||||
return Class(this, name, docComments, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, members)
|
||||
}
|
||||
|
||||
private fun initializerToInitializer(i: PsiClassInitializer): Initializer {
|
||||
|
||||
@@ -5,9 +5,10 @@ import org.jetbrains.jet.j2k.ast.types.Type
|
||||
import java.util.Collections
|
||||
import java.util.List
|
||||
|
||||
public open class AnonymousClass(converter : Converter, members : List<Member>)
|
||||
public open class AnonymousClass(converter : Converter, members : List<Node>)
|
||||
: Class(converter,
|
||||
Identifier("anonClass"),
|
||||
arrayList(),
|
||||
Collections.emptySet<String>()!!,
|
||||
Collections.emptyList<Element>()!!,
|
||||
Collections.emptyList<Type>()!!,
|
||||
|
||||
@@ -13,12 +13,13 @@ import java.util.ArrayList
|
||||
|
||||
public open class Class(converter : Converter,
|
||||
val name : Identifier,
|
||||
val docComments: List<Node>,
|
||||
modifiers : Set<String>,
|
||||
val typeParameters : List<Element>,
|
||||
val extendsTypes : List<Type>,
|
||||
val baseClassParams : List<Expression>,
|
||||
val implementsTypes : List<Type>,
|
||||
members : List<Member>) : Member(modifiers) {
|
||||
members : List<Node>) : Member(modifiers) {
|
||||
val members = getMembers(members, converter)
|
||||
|
||||
open val TYPE: String
|
||||
@@ -52,7 +53,7 @@ public open class Class(converter : Converter,
|
||||
return ""
|
||||
}
|
||||
|
||||
open fun membersExceptConstructors() : List<Member> = members.filterNot { it is Constructor }
|
||||
open fun membersExceptConstructors() : List<Node> = members.filterNot { it is Constructor }
|
||||
|
||||
open fun secondaryConstructorsAsStaticInitFunction() : List<Function> {
|
||||
return members.filter { it is Constructor && !it.isPrimary }.map { constructorToInit(it as Function) }
|
||||
@@ -118,13 +119,14 @@ public open class Class(converter : Converter,
|
||||
}
|
||||
|
||||
private fun classObjectToKotlin() : String {
|
||||
val staticMembers : List<Member> = arrayList()
|
||||
val staticMembers : List<Node> = arrayList()
|
||||
staticMembers.addAll(secondaryConstructorsAsStaticInitFunction())
|
||||
staticMembers.addAll(getStatic(membersExceptConstructors()))
|
||||
return staticMembers.toKotlin("\n", "class object {\n", "\n}")
|
||||
}
|
||||
|
||||
public override fun toKotlin() : String =
|
||||
docComments.toKotlin("\n", "", "\n") +
|
||||
modifiersToKotlin() +
|
||||
TYPE + " " + name.toKotlin() +
|
||||
typeParametersToKotlin() +
|
||||
@@ -134,31 +136,21 @@ public open class Class(converter : Converter,
|
||||
bodyToKotlin()
|
||||
|
||||
class object {
|
||||
open fun getMembers(members : List<Member>, converter : Converter) : List<Member> {
|
||||
open fun getMembers(members : List<Node>, converter : Converter) : List<Node> {
|
||||
if (converter.hasFlag(J2KConverterFlags.SKIP_NON_PUBLIC_MEMBERS)) {
|
||||
return members.filter { it.accessModifier() == "public" || it.accessModifier() == "protected" }
|
||||
return members.filter { it is Comment ||
|
||||
(it as Member).accessModifier() == "public" ||
|
||||
(it as Member).accessModifier() == "protected" }
|
||||
}
|
||||
return members
|
||||
}
|
||||
|
||||
private fun getStatic(members : List<out Member>) : List<Member> {
|
||||
val result : List<Member> = arrayList()
|
||||
for (m in members)
|
||||
if (m.isStatic())
|
||||
result.add(m)
|
||||
|
||||
return result
|
||||
private fun getStatic(members : List<Node>) : List<Node> {
|
||||
return members.filter { it is Member && it.isStatic() }
|
||||
}
|
||||
|
||||
private fun getNonStatic(members : List<out Member>) : List<Member> {
|
||||
val result : List<Member> = arrayList()
|
||||
for (m in members)
|
||||
if (!m.isStatic())
|
||||
{
|
||||
result.add(m)
|
||||
}
|
||||
|
||||
return result
|
||||
private fun getNonStatic(members : List<Node>) : List<Node> {
|
||||
return members.filterNot { it is Member && it.isStatic() }
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
@@ -2,9 +2,7 @@ package org.jetbrains.jet.j2k.ast
|
||||
|
||||
|
||||
public abstract class Element(): Node() {
|
||||
public open fun isEmpty(): Boolean {
|
||||
return false
|
||||
}
|
||||
public open fun isEmpty(): Boolean = false
|
||||
|
||||
class object {
|
||||
public val EMPTY_ELEMENT: Element = object : Element() {
|
||||
@@ -13,3 +11,7 @@ public abstract class Element(): Node() {
|
||||
}
|
||||
}
|
||||
}
|
||||
|
||||
public class Comment(val text: String): Element() {
|
||||
override fun toKotlin() = text
|
||||
}
|
||||
|
||||
@@ -7,19 +7,21 @@ import java.util.Set
|
||||
|
||||
public open class Enum(converter : Converter,
|
||||
name : Identifier,
|
||||
docComments: List<Node>,
|
||||
modifiers : Set<String>,
|
||||
typeParameters : List<Element>,
|
||||
extendsTypes : List<Type>,
|
||||
baseClassParams : List<Expression>,
|
||||
implementsTypes : List<Type>,
|
||||
members : List<Member>) : Class(converter, name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, members) {
|
||||
members : List<Node>) : Class(converter, name, docComments, modifiers, typeParameters,
|
||||
extendsTypes, baseClassParams, implementsTypes, members) {
|
||||
|
||||
override fun primaryConstructorSignatureToKotlin() : String {
|
||||
val s : String = super.primaryConstructorSignatureToKotlin()
|
||||
return if (s.equals("()")) "" else s
|
||||
}
|
||||
|
||||
override fun needOpenModifier() : Boolean = false
|
||||
override fun needOpenModifier() = false
|
||||
|
||||
public override fun toKotlin() : String {
|
||||
return modifiersToKotlin() +
|
||||
|
||||
@@ -4,11 +4,11 @@ import java.util.List
|
||||
|
||||
public open class File(val packageName: String,
|
||||
val imports: List<Import>,
|
||||
val classes: List<Class>,
|
||||
val body: List<Node>,
|
||||
val mainFunction: String): Node() {
|
||||
|
||||
public override fun toKotlin(): String {
|
||||
val common: String = imports.toKotlin("\n") + "\n\n" + classes.toKotlin("\n") + "\n" + mainFunction
|
||||
val common: String = imports.toKotlin("\n") + "\n\n" + body.toKotlin("\n") + "\n" + mainFunction
|
||||
if (packageName.isEmpty()) {
|
||||
return common
|
||||
}
|
||||
|
||||
@@ -1,8 +1,5 @@
|
||||
package org.jetbrains.jet.j2k.ast
|
||||
|
||||
import org.eclipse.jdt.internal.core.search.StringOperation
|
||||
import java.util.Arrays
|
||||
import java.util.HashSet
|
||||
import java.util.Set
|
||||
|
||||
public abstract class Node() {
|
||||
|
||||
@@ -7,12 +7,14 @@ import java.util.Set
|
||||
|
||||
public open class Trait(converter : Converter,
|
||||
name : Identifier,
|
||||
docComments: List<Node>,
|
||||
modifiers : Set<String>,
|
||||
typeParameters : List<Element>,
|
||||
extendsTypes : List<Type>,
|
||||
baseClassParams : List<Expression>,
|
||||
implementsTypes : List<Type>,
|
||||
members : List<Member>) : Class(converter, name, modifiers, typeParameters, extendsTypes, baseClassParams, implementsTypes, members) {
|
||||
members : List<Node>) : Class(converter, name, docComments, modifiers, typeParameters,
|
||||
extendsTypes, baseClassParams, implementsTypes, members) {
|
||||
|
||||
override val TYPE: String
|
||||
get() = "trait"
|
||||
|
||||
@@ -61,4 +61,8 @@ public open class ElementVisitor(val myConverter : Converter) : JavaElementVisit
|
||||
public override fun visitParameterList(list : PsiParameterList?) : Unit {
|
||||
myResult = ParameterList(myConverter.parametersToParameterList(list!!.getParameters()).requireNoNulls())
|
||||
}
|
||||
|
||||
public override fun visitComment(comment: PsiComment?) {
|
||||
myResult = Comment(comment?.getText()!!)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -0,0 +1,14 @@
|
||||
// This is an end-of-line comment
|
||||
|
||||
/*
|
||||
This is a block comment
|
||||
*/
|
||||
|
||||
|
||||
class C {
|
||||
// This is a comment
|
||||
|
||||
public void foo() {
|
||||
/* This is a comment */
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,4 @@
|
||||
// This is an end-of-line comment
|
||||
/*
|
||||
This is a block comment
|
||||
*/
|
||||
@@ -1,5 +1,8 @@
|
||||
package test
|
||||
import java.io.File
|
||||
/**
|
||||
* User: ignatov
|
||||
*/
|
||||
public open class Test() {
|
||||
class object {
|
||||
public open fun isDir(parent : File?) : Boolean {
|
||||
|
||||
Reference in New Issue
Block a user