Refactored StatementVisitor to StatementConverter (similar to ExpressionConverter before) + renamed ExpressionVisitor

This commit is contained in:
Valentin Kipyatkov
2014-10-14 17:47:54 +04:00
parent a84b32af98
commit 3b85839bf3
3 changed files with 27 additions and 19 deletions
+10 -14
View File
@@ -52,7 +52,7 @@ public class Converter private(val project: Project,
private val state: Converter.State) { private val state: Converter.State) {
private class State(val methodReturnType: PsiType?, private class State(val methodReturnType: PsiType?,
val expressionConverter: ExpressionConverter, val expressionConverter: ExpressionConverter,
val statementVisitorFactory: (Converter) -> StatementVisitor, val statementConverter: StatementConverter,
val specialContext: PsiElement?, val specialContext: PsiElement?,
val importList: ImportList?, val importList: ImportList?,
val importsToAdd: MutableCollection<String>?) val importsToAdd: MutableCollection<String>?)
@@ -64,8 +64,6 @@ public class Converter private(val project: Project,
val importNames: Set<String> = state.importList?.imports?.mapTo(HashSet<String>()) { it.name } ?: setOf() val importNames: Set<String> = state.importList?.imports?.mapTo(HashSet<String>()) { it.name } ?: setOf()
val importsToAdd: MutableCollection<String>? = state.importsToAdd val importsToAdd: MutableCollection<String>? = state.importsToAdd
private val statementVisitor = state.statementVisitorFactory(this)
val annotationConverter = AnnotationConverter(this) val annotationConverter = AnnotationConverter(this)
class object { class object {
@@ -73,34 +71,34 @@ public class Converter private(val project: Project,
public fun create(project: Project, settings: ConverterSettings, conversionScope: ConversionScope, public fun create(project: Project, settings: ConverterSettings, conversionScope: ConversionScope,
referenceSearcher: ReferenceSearcher, postProcessor: PostProcessor?): Converter { referenceSearcher: ReferenceSearcher, postProcessor: PostProcessor?): Converter {
val state = State(null, ExpressionVisitor(), { StatementVisitor(it) }, null, null, null) val state = State(null, DefaultExpressionConverter(), DefaultStatementConverter(), null, null, null)
return Converter(project, settings, conversionScope, referenceSearcher, postProcessor, state) return Converter(project, settings, conversionScope, referenceSearcher, postProcessor, state)
} }
} }
fun withMethodReturnType(methodReturnType: PsiType?): Converter fun withMethodReturnType(methodReturnType: PsiType?): Converter
= Converter(project, settings, conversionScope, referenceSearcher, postProcessor, = Converter(project, settings, conversionScope, referenceSearcher, postProcessor,
State(methodReturnType, state.expressionConverter, state.statementVisitorFactory, state.specialContext, state.importList, state.importsToAdd)) State(methodReturnType, state.expressionConverter, state.statementConverter, state.specialContext, state.importList, state.importsToAdd))
fun withExpressionConverter(factory: (prevConverter: ExpressionConverter) -> ExpressionConverter): Converter fun withExpressionConverter(factory: (prevConverter: ExpressionConverter) -> ExpressionConverter): Converter
= Converter(project, settings, conversionScope, referenceSearcher, postProcessor, = Converter(project, settings, conversionScope, referenceSearcher, postProcessor,
State(state.methodReturnType, factory(state.expressionConverter), state.statementVisitorFactory, state.specialContext, state.importList, state.importsToAdd)) State(state.methodReturnType, factory(state.expressionConverter), state.statementConverter, state.specialContext, state.importList, state.importsToAdd))
fun withStatementVisitor(factory: (Converter) -> StatementVisitor): Converter fun withStatementConverter(factory: (prevConverter: StatementConverter) -> StatementConverter): Converter
= Converter(project, settings, conversionScope, referenceSearcher, postProcessor, = Converter(project, settings, conversionScope, referenceSearcher, postProcessor,
State(state.methodReturnType, state.expressionConverter, factory, state.specialContext, state.importList, state.importsToAdd)) State(state.methodReturnType, state.expressionConverter, factory(state.statementConverter), state.specialContext, state.importList, state.importsToAdd))
fun withSpecialContext(context: PsiElement): Converter fun withSpecialContext(context: PsiElement): Converter
= Converter(project, settings, conversionScope, referenceSearcher, postProcessor, = Converter(project, settings, conversionScope, referenceSearcher, postProcessor,
State(state.methodReturnType, state.expressionConverter, state.statementVisitorFactory, context, state.importList, state.importsToAdd)) State(state.methodReturnType, state.expressionConverter, state.statementConverter, context, state.importList, state.importsToAdd))
private fun withImportList(importList: ImportList): Converter private fun withImportList(importList: ImportList): Converter
= Converter(project, settings, conversionScope, referenceSearcher, postProcessor, = Converter(project, settings, conversionScope, referenceSearcher, postProcessor,
State(state.methodReturnType, state.expressionConverter, state.statementVisitorFactory, state.specialContext, importList, state.importsToAdd)) State(state.methodReturnType, state.expressionConverter, state.statementConverter, state.specialContext, importList, state.importsToAdd))
private fun withImportsToAdd(importsToAdd: MutableCollection<String>): Converter private fun withImportsToAdd(importsToAdd: MutableCollection<String>): Converter
= Converter(project, settings, conversionScope, referenceSearcher, postProcessor, = Converter(project, settings, conversionScope, referenceSearcher, postProcessor,
State(state.methodReturnType, state.expressionConverter, state.statementVisitorFactory, state.specialContext, state.importList, importsToAdd)) State(state.methodReturnType, state.expressionConverter, state.statementConverter, state.specialContext, state.importList, importsToAdd))
public fun elementToKotlin(element: PsiElement): String { public fun elementToKotlin(element: PsiElement): String {
try { try {
@@ -422,9 +420,7 @@ public class Converter private(val project: Project,
fun convertStatement(statement: PsiStatement?): Statement { fun convertStatement(statement: PsiStatement?): Statement {
if (statement == null) return Statement.Empty if (statement == null) return Statement.Empty
statementVisitor.reset() return state.statementConverter.convertStatement(statement, this).assignPrototype(statement)
statement.accept(statementVisitor)
return statementVisitor.result.assignPrototype(statement)
} }
fun convertExpressions(expressions: Array<PsiExpression>): List<Expression> fun convertExpressions(expressions: Array<PsiExpression>): List<Expression>
@@ -42,7 +42,7 @@ trait ExpressionConverter {
fun convertExpression(expression: PsiExpression, converter: Converter): Expression fun convertExpression(expression: PsiExpression, converter: Converter): Expression
} }
class ExpressionVisitor : JavaElementVisitor(), ExpressionConverter { class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
private var _converter: Converter? = null private var _converter: Converter? = null
private var result: Expression = Expression.Empty private var result: Expression = Expression.Empty
@@ -22,12 +22,24 @@ import org.jetbrains.jet.j2k.ast.*
import java.util.ArrayList import java.util.ArrayList
import org.jetbrains.jet.j2k.isInSingleLine import org.jetbrains.jet.j2k.isInSingleLine
open class StatementVisitor(public val converter: Converter) : JavaElementVisitor() { trait StatementConverter {
public var result: Statement = Statement.Empty fun convertStatement(statement: PsiStatement, converter: Converter): Statement
protected set }
public fun reset() { class DefaultStatementConverter : JavaElementVisitor(), StatementConverter {
private var _converter: Converter? = null
private var result: Statement = Statement.Empty
private val converter: Converter get() {
return _converter!!
}
override fun convertStatement(statement: PsiStatement, converter: Converter): Statement {
this._converter = converter
result = Statement.Empty result = Statement.Empty
statement.accept(this)
return result
} }
override fun visitAssertStatement(statement: PsiAssertStatement) { override fun visitAssertStatement(statement: PsiAssertStatement) {