J2K: got rid from Converter.convertElement + fixed local classes conversion

#KT-5202 Fixed
This commit is contained in:
Valentin Kipyatkov
2014-07-11 20:54:40 +04:00
parent 930022aaac
commit ab3eca92db
8 changed files with 40 additions and 75 deletions
+13 -9
View File
@@ -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<Element>? = null): ReferenceElement {
@@ -61,8 +61,9 @@ class TypeParameterList(val parameters: List<TypeParameter>) : 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 {
@@ -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)
}
}
@@ -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()),
@@ -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) {
@@ -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");
@@ -1,9 +1,8 @@
//file
class C {
String foo() {
class Local {
String foo() { return null; }
};
}
new Local().foo();
return "";
}
@@ -0,0 +1,11 @@
class C {
fun foo(): String {
class Local {
fun foo(): String? {
return null
}
}
Local().foo()
return ""
}
}