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 class State(val methodReturnType: PsiType?,
val expressionConverter: ExpressionConverter,
val statementVisitorFactory: (Converter) -> StatementVisitor,
val statementConverter: StatementConverter,
val specialContext: PsiElement?,
val importList: ImportList?,
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 importsToAdd: MutableCollection<String>? = state.importsToAdd
private val statementVisitor = state.statementVisitorFactory(this)
val annotationConverter = AnnotationConverter(this)
class object {
@@ -73,34 +71,34 @@ public class Converter private(val project: Project,
public fun create(project: Project, settings: ConverterSettings, conversionScope: ConversionScope,
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)
}
}
fun withMethodReturnType(methodReturnType: PsiType?): Converter
= 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
= 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,
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
= 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
= 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
= 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 {
try {
@@ -422,9 +420,7 @@ public class Converter private(val project: Project,
fun convertStatement(statement: PsiStatement?): Statement {
if (statement == null) return Statement.Empty
statementVisitor.reset()
statement.accept(statementVisitor)
return statementVisitor.result.assignPrototype(statement)
return state.statementConverter.convertStatement(statement, this).assignPrototype(statement)
}
fun convertExpressions(expressions: Array<PsiExpression>): List<Expression>
@@ -42,7 +42,7 @@ trait ExpressionConverter {
fun convertExpression(expression: PsiExpression, converter: Converter): Expression
}
class ExpressionVisitor : JavaElementVisitor(), ExpressionConverter {
class DefaultExpressionConverter : JavaElementVisitor(), ExpressionConverter {
private var _converter: Converter? = null
private var result: Expression = Expression.Empty
@@ -22,12 +22,24 @@ import org.jetbrains.jet.j2k.ast.*
import java.util.ArrayList
import org.jetbrains.jet.j2k.isInSingleLine
open class StatementVisitor(public val converter: Converter) : JavaElementVisitor() {
public var result: Statement = Statement.Empty
protected set
trait StatementConverter {
fun convertStatement(statement: PsiStatement, converter: Converter): Statement
}
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
statement.accept(this)
return result
}
override fun visitAssertStatement(statement: PsiAssertStatement) {