From ab3eca92dbb33327133eb3cfb3470f873d15d4ad Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Fri, 11 Jul 2014 20:54:40 +0400 Subject: [PATCH] J2K: got rid from Converter.convertElement + fixed local classes conversion #KT-5202 Fixed --- j2k/src/org/jetbrains/jet/j2k/Converter.kt | 22 ++++--- .../jetbrains/jet/j2k/ast/TypeParameters.kt | 5 +- .../jet/j2k/visitors/ElementVisitor.kt | 57 ------------------- .../jet/j2k/visitors/ExpressionVisitor.kt | 4 -- .../jet/j2k/visitors/StatementVisitor.kt | 8 ++- .../JavaToKotlinConverterTestGenerated.java | 5 ++ ...odo => MethodReturnsNullInLocalClass.java} | 3 +- .../MethodReturnsNullInLocalClass.kt | 11 ++++ 8 files changed, 40 insertions(+), 75 deletions(-) delete mode 100644 j2k/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.kt rename j2k/tests/testData/ast/nullability/{MethodReturnsNullInLocalClass.java.todo => MethodReturnsNullInLocalClass.java} (89%) create mode 100644 j2k/tests/testData/ast/nullability/MethodReturnsNullInLocalClass.kt diff --git a/j2k/src/org/jetbrains/jet/j2k/Converter.kt b/j2k/src/org/jetbrains/jet/j2k/Converter.kt index fdab1aa2afe..befb2521bab 100644 --- a/j2k/src/org/jetbrains/jet/j2k/Converter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/Converter.kt @@ -218,7 +218,7 @@ public class Converter private(val project: Project, val settings: ConverterSett else -> throw IllegalArgumentException("Unknown member: $member") } - private fun convertClass(psiClass: PsiClass): Class { + fun convertClass(psiClass: PsiClass): Class { val annotations = convertAnnotations(psiClass) var modifiers = convertModifiers(psiClass) val typeParameters = convertTypeParameterList(psiClass.getTypeParameterList()) @@ -258,11 +258,12 @@ public class Converter private(val project: Project, val settings: ConverterSett val modifiers = convertModifiers(field) val name = field.declarationIdentifier() val converted = if (field is PsiEnumConstant) { + val argumentList = field.getArgumentList() EnumConstant(name, annotations, modifiers, typeConverter.convertType(field.getType(), Nullability.NotNull), - convertElement(field.getArgumentList())) + ExpressionList(convertExpressions(argumentList?.getExpressions())).assignPrototype(argumentList)) } else { val isVal = isVal(field) @@ -418,13 +419,16 @@ public class Converter private(val project: Project, val settings: ConverterSett return expressionVisitor.result.assignPrototype(expression) } - //TODO: drop this method - it has unclear semantics - fun convertElement(element: PsiElement?): Element { - if (element == null) return Element.Empty - - val elementVisitor = ElementVisitor(this) - element.accept(elementVisitor) - return elementVisitor.result.assignPrototype(element) + fun convertLocalVariable(variable: PsiLocalVariable): LocalVariable { + val isVal = variable.hasModifierProperty(PsiModifier.FINAL) || + variable.getInitializer() == null/* we do not know actually and prefer val until we have better analysis*/ || + !variable.hasWriteAccesses(variable.getContainingMethod()) + return LocalVariable(variable.declarationIdentifier(), + convertAnnotations(variable), + convertModifiers(variable), + variableTypeToDeclare(variable, settings.specifyLocalVariableTypeByDefault, isVal), + convertExpression(variable.getInitializer(), variable.getType()), + isVal).assignPrototype(variable) } fun convertCodeReferenceElement(element: PsiJavaCodeReferenceElement, hasExternalQualifier: Boolean, typeArgsConverted: List? = null): ReferenceElement { diff --git a/j2k/src/org/jetbrains/jet/j2k/ast/TypeParameters.kt b/j2k/src/org/jetbrains/jet/j2k/ast/TypeParameters.kt index bcf79534282..3247ad06855 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ast/TypeParameters.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ast/TypeParameters.kt @@ -61,8 +61,9 @@ class TypeParameterList(val parameters: List) : Element() { } } -fun Converter.convertTypeParameter(psiTypeParameter: PsiTypeParameter): TypeParameter { - return convertElement(psiTypeParameter) as TypeParameter +private fun Converter.convertTypeParameter(typeParameter: PsiTypeParameter): TypeParameter { + return TypeParameter(typeParameter.declarationIdentifier(), + typeParameter.getExtendsListTypes().map { typeConverter.convertType(it) }).assignPrototype(typeParameter) } fun Converter.convertTypeParameterList(typeParameterList: PsiTypeParameterList?): TypeParameterList { diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.kt b/j2k/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.kt deleted file mode 100644 index 2e971a8196d..00000000000 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/ElementVisitor.kt +++ /dev/null @@ -1,57 +0,0 @@ -/* - * Copyright 2010-2013 JetBrains s.r.o. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package org.jetbrains.jet.j2k.visitors - -import com.intellij.psi.* -import org.jetbrains.jet.j2k.* -import org.jetbrains.jet.j2k.ast.* - -class ElementVisitor(private val converter: Converter) : JavaElementVisitor() { - private val typeConverter = converter.typeConverter - - public var result: Element = Element.Empty - protected set - - override fun visitLocalVariable(variable: PsiLocalVariable) { - val isVal = variable.hasModifierProperty(PsiModifier.FINAL) || - variable.getInitializer() == null/* we do not know actually and prefer val until we have better analysis*/ || - !variable.hasWriteAccesses(variable.getContainingMethod()) - result = LocalVariable(variable.declarationIdentifier(), - converter.convertAnnotations(variable), - converter.convertModifiers(variable), - converter.variableTypeToDeclare(variable, converter.settings.specifyLocalVariableTypeByDefault, isVal), - converter.convertExpression(variable.getInitializer(), variable.getType()), - isVal) - } - - override fun visitExpressionList(list: PsiExpressionList) { - result = ExpressionList(converter.convertExpressions(list.getExpressions())) - } - - override fun visitTypeElement(`type`: PsiTypeElement) { - result = TypeElement(typeConverter.convertType(`type`.getType())) - } - - override fun visitTypeParameter(classParameter: PsiTypeParameter) { - result = TypeParameter(classParameter.declarationIdentifier(), - classParameter.getExtendsListTypes().map { typeConverter.convertType(it) }) - } - - override fun visitParameterList(list: PsiParameterList) { - result = converter.convertParameterList(list) - } -} diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt index 63ccb01eadc..1ea80bc6291 100644 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt +++ b/j2k/src/org/jetbrains/jet/j2k/visitors/ExpressionVisitor.kt @@ -122,10 +122,6 @@ open class ExpressionVisitor(private val converter: Converter) : JavaElementVisi expression.isInSingleLine()) } - override fun visitExpressionList(list: PsiExpressionList) { - result = ExpressionList(converter.convertExpressions(list.getExpressions())) - } - override fun visitInstanceOfExpression(expression: PsiInstanceOfExpression) { val checkType = expression.getCheckType() result = IsOperator(converter.convertExpression(expression.getOperand()), diff --git a/j2k/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.kt b/j2k/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.kt index 9a5922c1d41..04a2d4b4641 100644 --- a/j2k/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.kt +++ b/j2k/src/org/jetbrains/jet/j2k/visitors/StatementVisitor.kt @@ -73,7 +73,13 @@ open class StatementVisitor(public val converter: Converter) : JavaElementVisito } override fun visitDeclarationStatement(statement: PsiDeclarationStatement) { - result = DeclarationStatement(statement.getDeclaredElements().map { converter.convertElement(it) }) + result = DeclarationStatement(statement.getDeclaredElements().map { + when (it) { + is PsiLocalVariable -> converter.convertLocalVariable(it) + is PsiClass -> converter.convertClass(it) + else -> Element.Empty //what else can be here? + } + }) } override fun visitDoWhileStatement(statement: PsiDoWhileStatement) { diff --git a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java index 5c7acbdb325..93979347a88 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterTestGenerated.java @@ -2364,6 +2364,11 @@ public class JavaToKotlinConverterTestGenerated extends AbstractJavaToKotlinConv doTest("j2k/tests/testData/ast/nullability/MethodReturnsNullInAnonymousClass.java"); } + @TestMetadata("MethodReturnsNullInLocalClass.java") + public void testMethodReturnsNullInLocalClass() throws Exception { + doTest("j2k/tests/testData/ast/nullability/MethodReturnsNullInLocalClass.java"); + } + @TestMetadata("MethodReturnsTernaryNull.java") public void testMethodReturnsTernaryNull() throws Exception { doTest("j2k/tests/testData/ast/nullability/MethodReturnsTernaryNull.java"); diff --git a/j2k/tests/testData/ast/nullability/MethodReturnsNullInLocalClass.java.todo b/j2k/tests/testData/ast/nullability/MethodReturnsNullInLocalClass.java similarity index 89% rename from j2k/tests/testData/ast/nullability/MethodReturnsNullInLocalClass.java.todo rename to j2k/tests/testData/ast/nullability/MethodReturnsNullInLocalClass.java index a9de5ccb741..7e65e9a0fa6 100644 --- a/j2k/tests/testData/ast/nullability/MethodReturnsNullInLocalClass.java.todo +++ b/j2k/tests/testData/ast/nullability/MethodReturnsNullInLocalClass.java @@ -1,9 +1,8 @@ -//file class C { String foo() { class Local { String foo() { return null; } - }; + } new Local().foo(); return ""; } diff --git a/j2k/tests/testData/ast/nullability/MethodReturnsNullInLocalClass.kt b/j2k/tests/testData/ast/nullability/MethodReturnsNullInLocalClass.kt new file mode 100644 index 00000000000..6f6e19d1ae4 --- /dev/null +++ b/j2k/tests/testData/ast/nullability/MethodReturnsNullInLocalClass.kt @@ -0,0 +1,11 @@ +class C { + fun foo(): String { + class Local { + fun foo(): String? { + return null + } + } + Local().foo() + return "" + } +} \ No newline at end of file