diff --git a/j2k/src/org/jetbrains/jet/j2k/Converter.kt b/j2k/src/org/jetbrains/jet/j2k/Converter.kt index 09ff3452a70..f6b4899497a 100644 --- a/j2k/src/org/jetbrains/jet/j2k/Converter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/Converter.kt @@ -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?) @@ -64,8 +64,6 @@ public class Converter private(val project: Project, val importNames: Set = state.importList?.imports?.mapTo(HashSet()) { it.name } ?: setOf() val importsToAdd: MutableCollection? = 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): 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): List diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionConverter.kt similarity index 99% rename from j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt rename to j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionConverter.kt index b8ef5e83522..f24a6e0056f 100644 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt +++ b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionConverter.kt @@ -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 diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.kt b/j2k/src/org/jetbrains/jet/j2k/visitors/StatementConverter.kt similarity index 95% rename from j2k/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.kt rename to j2k/src/org/jetbrains/jet/j2k/visitors/StatementConverter.kt index 88ef2014327..aa640bd4ca5 100644 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.kt +++ b/j2k/src/org/jetbrains/jet/j2k/visitors/StatementConverter.kt @@ -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) {