comments support work in progress

This commit is contained in:
Dmitry Jemerov
2012-05-31 21:48:51 +02:00
committed by Pavel V. Talanov
parent 512603ce0c
commit 4bb3731272
12 changed files with 91 additions and 53 deletions
+37 -20
View File
@@ -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 -21
View File
@@ -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() }
}
}
}
+5 -3
View File
@@ -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
}
+4 -2
View File
@@ -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() +
+2 -2
View File
@@ -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
}
-3
View File
@@ -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() {
+3 -1
View File
@@ -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 {