From 389b14f44f110c7ce3c5881d17d135332a08624e Mon Sep 17 00:00:00 2001 From: Valentin Kipyatkov Date: Thu, 23 Oct 2014 18:06:29 +0400 Subject: [PATCH] KT-6120 Java to Kotlin converter can generate mutable collection types in case if collection write methods used #KT-6120 Fixed --- .../jetbrains/jet/j2k/ClassBodyConverter.kt | 6 +- .../org/jetbrains/jet/j2k/TypeConverter.kt | 78 +++++++++++++++++-- j2k/src/org/jetbrains/jet/j2k/TypeVisitor.kt | 25 ++++-- ...otlinConverterForWebDemoTestGenerated.java | 59 +++++++++++++- ...otlinConverterSingleFileTestGenerated.java | 53 ++++++++++++- .../dropAccessors/GetterTypeNotMatch.java | 7 ++ .../dropAccessors/GetterTypeNotMatch.kt | 7 ++ .../dropAccessors/SetterTypeNotMatch.java | 11 +++ .../dropAccessors/SetterTypeNotMatch.kt | 8 ++ .../for/forThroughListIndices.kt | 2 +- .../FunctionParameters.java | 11 +++ .../mutableCollections/FunctionParameters.kt | 9 +++ .../FunctionParameters2.java | 11 +++ .../mutableCollections/FunctionParameters2.kt | 11 +++ .../FunctionReturnValue.java | 13 ++++ .../mutableCollections/FunctionReturnValue.kt | 14 ++++ .../FunctionReturnValue2.java | 21 +++++ .../FunctionReturnValue2.kt | 22 ++++++ .../mutableCollections/Recursion.java | 16 ++++ .../mutableCollections/Recursion.kt | 15 ++++ 20 files changed, 381 insertions(+), 18 deletions(-) create mode 100644 j2k/tests/testData/fileOrElement/dropAccessors/GetterTypeNotMatch.java create mode 100644 j2k/tests/testData/fileOrElement/dropAccessors/GetterTypeNotMatch.kt create mode 100644 j2k/tests/testData/fileOrElement/dropAccessors/SetterTypeNotMatch.java create mode 100644 j2k/tests/testData/fileOrElement/dropAccessors/SetterTypeNotMatch.kt create mode 100644 j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters.java create mode 100644 j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters.kt create mode 100644 j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters2.java create mode 100644 j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters2.kt create mode 100644 j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue.java create mode 100644 j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue.kt create mode 100644 j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue2.java create mode 100644 j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue2.kt create mode 100644 j2k/tests/testData/fileOrElement/mutableCollections/Recursion.java create mode 100644 j2k/tests/testData/fileOrElement/mutableCollections/Recursion.kt diff --git a/j2k/src/org/jetbrains/jet/j2k/ClassBodyConverter.kt b/j2k/src/org/jetbrains/jet/j2k/ClassBodyConverter.kt index f681f25246a..92a7b0ee812 100644 --- a/j2k/src/org/jetbrains/jet/j2k/ClassBodyConverter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/ClassBodyConverter.kt @@ -192,6 +192,8 @@ class ClassBodyConverter(private val psiClass: PsiClass, val body = method.getBody() ?: return null val returnStatement = (body.getStatements().singleOrNull() as? PsiReturnStatement) ?: return null val field = fieldByExpression(returnStatement.getReturnValue()) ?: return null + if (field.getType() != method.getReturnType()) return null + if (converter.typeConverter.variableMutability(field) != converter.typeConverter.methodMutability(method)) return null val propertyName = StringUtil.decapitalize(name.substring("get".length)) return AccessorInfo(method, field, AccessorKind.GETTER, propertyName) } @@ -201,7 +203,9 @@ class ClassBodyConverter(private val psiClass: PsiClass, val assignment = statement.getExpression() as? PsiAssignmentExpression ?: return null if (assignment.getOperationTokenType() != JavaTokenType.EQ) return null val field = fieldByExpression(assignment.getLExpression()) ?: return null - if ((assignment.getRExpression() as? PsiReferenceExpression)?.resolve() != method.getParameterList().getParameters().single()) return null + val parameter = method.getParameterList().getParameters().single() + if ((assignment.getRExpression() as? PsiReferenceExpression)?.resolve() != parameter) return null + if (field.getType() != parameter.getType()) return null val propertyName = StringUtil.decapitalize(name.substring("set".length)) return AccessorInfo(method, field, AccessorKind.SETTER, propertyName) } diff --git a/j2k/src/org/jetbrains/jet/j2k/TypeConverter.kt b/j2k/src/org/jetbrains/jet/j2k/TypeConverter.kt index 42920634644..de01722c675 100644 --- a/j2k/src/org/jetbrains/jet/j2k/TypeConverter.kt +++ b/j2k/src/org/jetbrains/jet/j2k/TypeConverter.kt @@ -29,12 +29,14 @@ import org.jetbrains.jet.j2k.ast.ClassType import org.jetbrains.jet.j2k.ast.ReferenceElement import org.jetbrains.jet.j2k.ast.Identifier import java.util.HashMap +import org.jetbrains.jet.j2k.ast.Mutability +import java.util.HashSet class TypeConverter(val converter: Converter) { - public fun convertType(type: PsiType?, nullability: Nullability = Nullability.Default): Type { + public fun convertType(type: PsiType?, nullability: Nullability = Nullability.Default, mutability: Mutability = Mutability.Default): Type { if (type == null) return ErrorType().assignNoPrototype() - val result = type.accept(TypeVisitor(converter))!!.assignNoPrototype() + val result = type.accept(TypeVisitor(converter, type, mutability))!!.assignNoPrototype() return when (nullability) { Nullability.NotNull -> result.toNotNullType() Nullability.Nullable -> result.toNullableType() @@ -52,13 +54,13 @@ class TypeConverter(val converter: Converter) { converter.settings).assignNoPrototype() } else { - convertType(variable.getType(), variableNullability(variable)) + convertType(variable.getType(), variableNullability(variable), variableMutability(variable)) } return result.assignPrototype(variable.getTypeElement()) } public fun convertMethodReturnType(method: PsiMethod): Type - = convertType(method.getReturnType(), methodNullability(method)).assignPrototype(method.getReturnTypeElement()) + = convertType(method.getReturnType(), methodNullability(method), methodMutability(method)).assignPrototype(method.getReturnTypeElement()) public fun variableNullability(variable: PsiVariable): Nullability = nullabilityFlavor.forVariableType(variable) @@ -66,6 +68,12 @@ class TypeConverter(val converter: Converter) { public fun methodNullability(method: PsiMethod): Nullability = nullabilityFlavor.forMethodReturnType(method) + public fun variableMutability(variable: PsiVariable): Mutability + = mutabilityFlavor.forVariableType(variable) + + public fun methodMutability(method: PsiMethod): Mutability + = mutabilityFlavor.forMethodReturnType(method) + private fun PsiVariable.isMainMethodParameter() = this is PsiParameter && (getDeclarationScope() as? PsiMethod)?.isMainMethod() ?: false private fun searchScope(element: PsiElement): PsiElement? { @@ -89,6 +97,7 @@ class TypeConverter(val converter: Converter) { private abstract inner class TypeFlavor(val default: T) { private val cache = HashMap() + private val typesBeingCalculated = HashSet() open val forEnumConstant: T = default open fun fromType(type: PsiType): T = default @@ -102,7 +111,7 @@ class TypeConverter(val converter: Converter) { fun forVariableType(variable: PsiVariable): T { val cached = cache[variable] if (cached != null) return cached - val value = forVariableTypeNoCache(variable) + val value = withRecursionPrevention(variable) { forVariableTypeNoCache(variable) } cache[variable] = value return value } @@ -154,7 +163,7 @@ class TypeConverter(val converter: Converter) { fun forMethodReturnType(method: PsiMethod): T { val cached = cache[method] if (cached != null) return cached - val value = forMethodReturnTypeNoCache(method) + val value = withRecursionPrevention(method) { forMethodReturnTypeNoCache(method) } cache[method] = value return value } @@ -191,6 +200,17 @@ class TypeConverter(val converter: Converter) { return default } + + private fun withRecursionPrevention(element: PsiElement, calculator: () -> T): T { + if (element in typesBeingCalculated) return default + typesBeingCalculated.add(element) + try { + return calculator() + } + finally { + typesBeingCalculated.remove(element) + } + } } private val nullabilityFlavor = object : TypeFlavor(Nullability.Default) { @@ -253,7 +273,7 @@ class TypeConverter(val converter: Converter) { } private fun isNullableFromUsage(usage: PsiExpression): Boolean { - val parent = usage.getParent() ?: return false + val parent = usage.getParent() if (parent is PsiAssignmentExpression && parent.getOperationTokenType() == JavaTokenType.EQ && usage == parent.getLExpression()) { return parent.getRExpression()?.nullability() == Nullability.Nullable } @@ -333,6 +353,46 @@ class TypeConverter(val converter: Converter) { } } + private val mutabilityFlavor = object : TypeFlavor(Mutability.Default) { + override val forEnumConstant: Mutability get() = Mutability.NonMutable + + override fun fromType(type: PsiType): Mutability { + val target = (type as? PsiClassType)?.resolve() ?: return Mutability.NonMutable + if (target.getQualifiedName() !in TypeVisitor.toKotlinMutableTypesMap.keySet()) return Mutability.NonMutable + return Mutability.Default + } + + override fun fromAnnotations(owner: PsiModifierListOwner): Mutability { + return super.fromAnnotations(owner) //TODO: ReadOnly annotation + } + + override fun fromUsage(usage: PsiExpression) + = if (isMutableFromUsage(usage)) Mutability.Mutable else Mutability.Default + + private fun isMutableFromUsage(usage: PsiExpression): Boolean { + val parent = usage.getParent() + if (parent is PsiReferenceExpression && usage == parent.getQualifierExpression() && parent.getParent() is PsiMethodCallExpression) { + return parent.getReferenceName() in modificationMethodNames + } + else if (parent is PsiExpressionList) { + val call = parent.getParent() as? PsiCall ?: return false + val method = call.resolveMethod() ?: return false + val paramIndex = parent.getExpressions().indexOf(usage) + val parameterList = method.getParameterList() + if (paramIndex >= parameterList.getParametersCount()) return false + return variableMutability(parameterList.getParameters()[paramIndex]) == Mutability.Mutable + } + else if (parent is PsiVariable && usage == parent.getInitializer()) { + return variableMutability(parent) == Mutability.Mutable + } + else if (parent is PsiAssignmentExpression && parent.getOperationTokenType() == JavaTokenType.EQ && usage == parent.getRExpression()) { + val leftSideVar = (parent.getLExpression() as? PsiReferenceExpression)?.resolve() as? PsiVariable ?: return false + return variableMutability(leftSideVar) == Mutability.Mutable + } + return false + } + } + class object { private val boxingTypes: Set = setOf( CommonClassNames.JAVA_LANG_BYTE, @@ -344,5 +404,9 @@ class TypeConverter(val converter: Converter) { CommonClassNames.JAVA_LANG_SHORT, CommonClassNames.JAVA_LANG_BOOLEAN ) + + private val modificationMethodNames = setOf( + "add", "remove", "set", "addAll", "removeAll", "retainAll", "clear", "put", "putAll" + ) } } diff --git a/j2k/src/org/jetbrains/jet/j2k/TypeVisitor.kt b/j2k/src/org/jetbrains/jet/j2k/TypeVisitor.kt index d3c2b4a0181..b7a92427473 100644 --- a/j2k/src/org/jetbrains/jet/j2k/TypeVisitor.kt +++ b/j2k/src/org/jetbrains/jet/j2k/TypeVisitor.kt @@ -24,7 +24,9 @@ import org.jetbrains.jet.lang.resolve.java.JvmPrimitiveType private val PRIMITIVE_TYPES_NAMES = JvmPrimitiveType.values().map { it.getName() } -class TypeVisitor(private val converter: Converter) : PsiTypeVisitor() { +class TypeVisitor(private val converter: Converter, + private val topLevelType: PsiType, + private val topLevelTypeMutability: Mutability) : PsiTypeVisitor() { private val typeConverter: TypeConverter = converter.typeConverter @@ -49,17 +51,19 @@ class TypeVisitor(private val converter: Converter) : PsiTypeVisitor() { } override fun visitClassType(classType: PsiClassType): Type { - val refElement = constructReferenceElement(classType) + val mutability = if (classType identityEquals topLevelType) topLevelTypeMutability else Mutability.Default + val refElement = constructReferenceElement(classType, mutability) return ClassType(refElement, Nullability.Default, converter.settings) } - private fun constructReferenceElement(classType: PsiClassType): ReferenceElement { + private fun constructReferenceElement(classType: PsiClassType, mutability: Mutability): ReferenceElement { val typeArgs = convertTypeArgs(classType) val psiClass = classType.resolve() if (psiClass != null) { val javaClassName = psiClass.getQualifiedName() - val kotlinClassName = toKotlinTypesMap[javaClassName] + val kotlinClassName = (if (mutability.isMutable(converter.settings)) toKotlinMutableTypesMap[javaClassName] else null) + ?: toKotlinTypesMap[javaClassName] if (kotlinClassName != null) { val kotlinShortName = getShortName(kotlinClassName) if (kotlinShortName == getShortName(javaClassName!!) && converter.importNames.contains(getPackageName(javaClassName) + ".*")) { @@ -81,20 +85,20 @@ class TypeVisitor(private val converter: Converter) : PsiTypeVisitor() { private fun convertTypeArgs(classType: PsiClassType): List { if (classType.getParameterCount() == 0) { - return createTypeArgsForRawTypeUsage(classType) + return createTypeArgsForRawTypeUsage(classType, Mutability.Default) } else { return typeConverter.convertTypes(classType.getParameters()) } } - private fun createTypeArgsForRawTypeUsage(classType: PsiClassType): List { + private fun createTypeArgsForRawTypeUsage(classType: PsiClassType, mutability: Mutability): List { if (classType is PsiClassReferenceType) { val targetClass = classType.getReference().resolve() as? PsiClass if (targetClass != null) { return targetClass.getTypeParameters().map { val superType = it.getSuperTypes().first() // there must be at least one super type always - ClassType(constructReferenceElement(superType), Nullability.Default, converter.settings).assignNoPrototype() + ClassType(constructReferenceElement(superType, mutability), Nullability.Default, converter.settings).assignNoPrototype() } } } @@ -131,5 +135,12 @@ class TypeVisitor(private val converter: Converter) : PsiTypeVisitor() { CommonClassNames.JAVA_UTIL_SET to "kotlin.Set", CommonClassNames.JAVA_UTIL_MAP to "kotlin.Map" ) + + public val toKotlinMutableTypesMap: Map = mapOf( + CommonClassNames.JAVA_UTIL_LIST to "kotlin.MutableList", + CommonClassNames.JAVA_UTIL_COLLECTION to "kotlin.MutableCollection", + CommonClassNames.JAVA_UTIL_SET to "kotlin.MutableSet", + CommonClassNames.JAVA_UTIL_MAP to "kotlin.MutableMap" + ) } } diff --git a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterForWebDemoTestGenerated.java b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterForWebDemoTestGenerated.java index 9ca959f0cfe..bc199e3d8d9 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterForWebDemoTestGenerated.java +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterForWebDemoTestGenerated.java @@ -30,7 +30,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("j2k/tests/testData/fileOrElement") @TestDataPath("$PROJECT_ROOT") -@InnerTestClasses({JavaToKotlinConverterForWebDemoTestGenerated.Annotations.class, JavaToKotlinConverterForWebDemoTestGenerated.AnonymousBlock.class, JavaToKotlinConverterForWebDemoTestGenerated.ArrayAccessExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.ArrayInitializerExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.ArrayType.class, JavaToKotlinConverterForWebDemoTestGenerated.AssertStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.AssignmentExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.BinaryExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.Blocks.class, JavaToKotlinConverterForWebDemoTestGenerated.BoxedType.class, JavaToKotlinConverterForWebDemoTestGenerated.BreakStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.CallChainExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.Class.class, JavaToKotlinConverterForWebDemoTestGenerated.ClassExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.Comments.class, JavaToKotlinConverterForWebDemoTestGenerated.ConditionalExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.Constructors.class, JavaToKotlinConverterForWebDemoTestGenerated.ContinueStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.DeclarationStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.DoWhileStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.DropAccessors.class, JavaToKotlinConverterForWebDemoTestGenerated.Enum.class, JavaToKotlinConverterForWebDemoTestGenerated.Equals.class, JavaToKotlinConverterForWebDemoTestGenerated.Field.class, JavaToKotlinConverterForWebDemoTestGenerated.For.class, JavaToKotlinConverterForWebDemoTestGenerated.ForeachStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.Formatting.class, JavaToKotlinConverterForWebDemoTestGenerated.Function.class, JavaToKotlinConverterForWebDemoTestGenerated.Identifier.class, JavaToKotlinConverterForWebDemoTestGenerated.IfStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.ImportStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.InProjectionType.class, JavaToKotlinConverterForWebDemoTestGenerated.Inheritance.class, JavaToKotlinConverterForWebDemoTestGenerated.IsOperator.class, JavaToKotlinConverterForWebDemoTestGenerated.Issues.class, JavaToKotlinConverterForWebDemoTestGenerated.KotlinApiAccess.class, JavaToKotlinConverterForWebDemoTestGenerated.LabelStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.List.class, JavaToKotlinConverterForWebDemoTestGenerated.LiteralExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.LocalVariable.class, JavaToKotlinConverterForWebDemoTestGenerated.MethodCallExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.Misc.class, JavaToKotlinConverterForWebDemoTestGenerated.NewClassExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.Nullability.class, JavaToKotlinConverterForWebDemoTestGenerated.ObjectLiteral.class, JavaToKotlinConverterForWebDemoTestGenerated.OutProjectionType.class, JavaToKotlinConverterForWebDemoTestGenerated.PackageStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.ParenthesizedExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.PolyadicExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.PostfixOperator.class, JavaToKotlinConverterForWebDemoTestGenerated.PrefixOperator.class, JavaToKotlinConverterForWebDemoTestGenerated.RawGenerics.class, JavaToKotlinConverterForWebDemoTestGenerated.ReturnStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.Settings.class, JavaToKotlinConverterForWebDemoTestGenerated.StarProjectionType.class, JavaToKotlinConverterForWebDemoTestGenerated.StaticMembers.class, JavaToKotlinConverterForWebDemoTestGenerated.SuperExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.Switch.class, JavaToKotlinConverterForWebDemoTestGenerated.SynchronizedStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.ThisExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.ThrowStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.ToKotlinClasses.class, JavaToKotlinConverterForWebDemoTestGenerated.Trait.class, JavaToKotlinConverterForWebDemoTestGenerated.TryStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.TryWithResource.class, JavaToKotlinConverterForWebDemoTestGenerated.TypeCastExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.TypeParameters.class, JavaToKotlinConverterForWebDemoTestGenerated.VarArg.class, JavaToKotlinConverterForWebDemoTestGenerated.WhileStatement.class}) +@InnerTestClasses({JavaToKotlinConverterForWebDemoTestGenerated.Annotations.class, JavaToKotlinConverterForWebDemoTestGenerated.AnonymousBlock.class, JavaToKotlinConverterForWebDemoTestGenerated.ArrayAccessExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.ArrayInitializerExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.ArrayType.class, JavaToKotlinConverterForWebDemoTestGenerated.AssertStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.AssignmentExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.BinaryExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.Blocks.class, JavaToKotlinConverterForWebDemoTestGenerated.BoxedType.class, JavaToKotlinConverterForWebDemoTestGenerated.BreakStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.CallChainExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.Class.class, JavaToKotlinConverterForWebDemoTestGenerated.ClassExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.Comments.class, JavaToKotlinConverterForWebDemoTestGenerated.ConditionalExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.Constructors.class, JavaToKotlinConverterForWebDemoTestGenerated.ContinueStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.DeclarationStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.DoWhileStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.DropAccessors.class, JavaToKotlinConverterForWebDemoTestGenerated.Enum.class, JavaToKotlinConverterForWebDemoTestGenerated.Equals.class, JavaToKotlinConverterForWebDemoTestGenerated.Field.class, JavaToKotlinConverterForWebDemoTestGenerated.For.class, JavaToKotlinConverterForWebDemoTestGenerated.ForeachStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.Formatting.class, JavaToKotlinConverterForWebDemoTestGenerated.Function.class, JavaToKotlinConverterForWebDemoTestGenerated.Identifier.class, JavaToKotlinConverterForWebDemoTestGenerated.IfStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.ImportStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.InProjectionType.class, JavaToKotlinConverterForWebDemoTestGenerated.Inheritance.class, JavaToKotlinConverterForWebDemoTestGenerated.IsOperator.class, JavaToKotlinConverterForWebDemoTestGenerated.Issues.class, JavaToKotlinConverterForWebDemoTestGenerated.KotlinApiAccess.class, JavaToKotlinConverterForWebDemoTestGenerated.LabelStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.List.class, JavaToKotlinConverterForWebDemoTestGenerated.LiteralExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.LocalVariable.class, JavaToKotlinConverterForWebDemoTestGenerated.MethodCallExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.Misc.class, JavaToKotlinConverterForWebDemoTestGenerated.MutableCollections.class, JavaToKotlinConverterForWebDemoTestGenerated.NewClassExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.Nullability.class, JavaToKotlinConverterForWebDemoTestGenerated.ObjectLiteral.class, JavaToKotlinConverterForWebDemoTestGenerated.OutProjectionType.class, JavaToKotlinConverterForWebDemoTestGenerated.PackageStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.ParenthesizedExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.PolyadicExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.PostfixOperator.class, JavaToKotlinConverterForWebDemoTestGenerated.PrefixOperator.class, JavaToKotlinConverterForWebDemoTestGenerated.RawGenerics.class, JavaToKotlinConverterForWebDemoTestGenerated.ReturnStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.Settings.class, JavaToKotlinConverterForWebDemoTestGenerated.StarProjectionType.class, JavaToKotlinConverterForWebDemoTestGenerated.StaticMembers.class, JavaToKotlinConverterForWebDemoTestGenerated.SuperExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.Switch.class, JavaToKotlinConverterForWebDemoTestGenerated.SynchronizedStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.ThisExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.ThrowStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.ToKotlinClasses.class, JavaToKotlinConverterForWebDemoTestGenerated.Trait.class, JavaToKotlinConverterForWebDemoTestGenerated.TryStatement.class, JavaToKotlinConverterForWebDemoTestGenerated.TryWithResource.class, JavaToKotlinConverterForWebDemoTestGenerated.TypeCastExpression.class, JavaToKotlinConverterForWebDemoTestGenerated.TypeParameters.class, JavaToKotlinConverterForWebDemoTestGenerated.VarArg.class, JavaToKotlinConverterForWebDemoTestGenerated.WhileStatement.class}) @RunWith(JUnit3RunnerWithInners.class) public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaToKotlinConverterForWebDemoTest { public void testAllFilesPresentInFileOrElement() throws Exception { @@ -1301,6 +1301,12 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo doTest(fileName); } + @TestMetadata("AccessorsImplementInterface.java") + public void testAccessorsImplementInterface() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/dropAccessors/AccessorsImplementInterface.java"); + doTest(fileName); + } + public void testAllFilesPresentInDropAccessors() throws Exception { JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/tests/testData/fileOrElement/dropAccessors"), Pattern.compile("^(.+)\\.java$"), true); } @@ -1394,6 +1400,18 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/dropAccessors/GetterSetterUsages.java"); doTest(fileName); } + + @TestMetadata("GetterTypeNotMatch.java") + public void testGetterTypeNotMatch() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/dropAccessors/GetterTypeNotMatch.java"); + doTest(fileName); + } + + @TestMetadata("SetterTypeNotMatch.java") + public void testSetterTypeNotMatch() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/dropAccessors/SetterTypeNotMatch.java"); + doTest(fileName); + } } @TestMetadata("j2k/tests/testData/fileOrElement/enum") @@ -2737,6 +2755,45 @@ public class JavaToKotlinConverterForWebDemoTestGenerated extends AbstractJavaTo } } + @TestMetadata("j2k/tests/testData/fileOrElement/mutableCollections") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class MutableCollections extends AbstractJavaToKotlinConverterForWebDemoTest { + public void testAllFilesPresentInMutableCollections() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/tests/testData/fileOrElement/mutableCollections"), Pattern.compile("^(.+)\\.java$"), true); + } + + @TestMetadata("FunctionParameters.java") + public void testFunctionParameters() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters.java"); + doTest(fileName); + } + + @TestMetadata("FunctionParameters2.java") + public void testFunctionParameters2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters2.java"); + doTest(fileName); + } + + @TestMetadata("FunctionReturnValue.java") + public void testFunctionReturnValue() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue.java"); + doTest(fileName); + } + + @TestMetadata("FunctionReturnValue2.java") + public void testFunctionReturnValue2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue2.java"); + doTest(fileName); + } + + @TestMetadata("Recursion.java") + public void testRecursion() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/mutableCollections/Recursion.java"); + doTest(fileName); + } + } + @TestMetadata("j2k/tests/testData/fileOrElement/newClassExpression") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterSingleFileTestGenerated.java b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterSingleFileTestGenerated.java index 004c618c4c6..73ec0b0bbcd 100644 --- a/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterSingleFileTestGenerated.java +++ b/j2k/tests/test/org/jetbrains/jet/j2k/test/JavaToKotlinConverterSingleFileTestGenerated.java @@ -30,7 +30,7 @@ import java.util.regex.Pattern; @SuppressWarnings("all") @TestMetadata("j2k/tests/testData/fileOrElement") @TestDataPath("$PROJECT_ROOT") -@InnerTestClasses({JavaToKotlinConverterSingleFileTestGenerated.Annotations.class, JavaToKotlinConverterSingleFileTestGenerated.AnonymousBlock.class, JavaToKotlinConverterSingleFileTestGenerated.ArrayAccessExpression.class, JavaToKotlinConverterSingleFileTestGenerated.ArrayInitializerExpression.class, JavaToKotlinConverterSingleFileTestGenerated.ArrayType.class, JavaToKotlinConverterSingleFileTestGenerated.AssertStatement.class, JavaToKotlinConverterSingleFileTestGenerated.AssignmentExpression.class, JavaToKotlinConverterSingleFileTestGenerated.BinaryExpression.class, JavaToKotlinConverterSingleFileTestGenerated.Blocks.class, JavaToKotlinConverterSingleFileTestGenerated.BoxedType.class, JavaToKotlinConverterSingleFileTestGenerated.BreakStatement.class, JavaToKotlinConverterSingleFileTestGenerated.CallChainExpression.class, JavaToKotlinConverterSingleFileTestGenerated.Class.class, JavaToKotlinConverterSingleFileTestGenerated.ClassExpression.class, JavaToKotlinConverterSingleFileTestGenerated.Comments.class, JavaToKotlinConverterSingleFileTestGenerated.ConditionalExpression.class, JavaToKotlinConverterSingleFileTestGenerated.Constructors.class, JavaToKotlinConverterSingleFileTestGenerated.ContinueStatement.class, JavaToKotlinConverterSingleFileTestGenerated.DeclarationStatement.class, JavaToKotlinConverterSingleFileTestGenerated.DoWhileStatement.class, JavaToKotlinConverterSingleFileTestGenerated.DropAccessors.class, JavaToKotlinConverterSingleFileTestGenerated.Enum.class, JavaToKotlinConverterSingleFileTestGenerated.Equals.class, JavaToKotlinConverterSingleFileTestGenerated.Field.class, JavaToKotlinConverterSingleFileTestGenerated.For.class, JavaToKotlinConverterSingleFileTestGenerated.ForeachStatement.class, JavaToKotlinConverterSingleFileTestGenerated.Formatting.class, JavaToKotlinConverterSingleFileTestGenerated.Function.class, JavaToKotlinConverterSingleFileTestGenerated.Identifier.class, JavaToKotlinConverterSingleFileTestGenerated.IfStatement.class, JavaToKotlinConverterSingleFileTestGenerated.ImportStatement.class, JavaToKotlinConverterSingleFileTestGenerated.InProjectionType.class, JavaToKotlinConverterSingleFileTestGenerated.Inheritance.class, JavaToKotlinConverterSingleFileTestGenerated.IsOperator.class, JavaToKotlinConverterSingleFileTestGenerated.Issues.class, JavaToKotlinConverterSingleFileTestGenerated.KotlinApiAccess.class, JavaToKotlinConverterSingleFileTestGenerated.LabelStatement.class, JavaToKotlinConverterSingleFileTestGenerated.List.class, JavaToKotlinConverterSingleFileTestGenerated.LiteralExpression.class, JavaToKotlinConverterSingleFileTestGenerated.LocalVariable.class, JavaToKotlinConverterSingleFileTestGenerated.MethodCallExpression.class, JavaToKotlinConverterSingleFileTestGenerated.Misc.class, JavaToKotlinConverterSingleFileTestGenerated.NewClassExpression.class, JavaToKotlinConverterSingleFileTestGenerated.Nullability.class, JavaToKotlinConverterSingleFileTestGenerated.ObjectLiteral.class, JavaToKotlinConverterSingleFileTestGenerated.OutProjectionType.class, JavaToKotlinConverterSingleFileTestGenerated.PackageStatement.class, JavaToKotlinConverterSingleFileTestGenerated.ParenthesizedExpression.class, JavaToKotlinConverterSingleFileTestGenerated.PolyadicExpression.class, JavaToKotlinConverterSingleFileTestGenerated.PostfixOperator.class, JavaToKotlinConverterSingleFileTestGenerated.PrefixOperator.class, JavaToKotlinConverterSingleFileTestGenerated.RawGenerics.class, JavaToKotlinConverterSingleFileTestGenerated.ReturnStatement.class, JavaToKotlinConverterSingleFileTestGenerated.Settings.class, JavaToKotlinConverterSingleFileTestGenerated.StarProjectionType.class, JavaToKotlinConverterSingleFileTestGenerated.StaticMembers.class, JavaToKotlinConverterSingleFileTestGenerated.SuperExpression.class, JavaToKotlinConverterSingleFileTestGenerated.Switch.class, JavaToKotlinConverterSingleFileTestGenerated.SynchronizedStatement.class, JavaToKotlinConverterSingleFileTestGenerated.ThisExpression.class, JavaToKotlinConverterSingleFileTestGenerated.ThrowStatement.class, JavaToKotlinConverterSingleFileTestGenerated.ToKotlinClasses.class, JavaToKotlinConverterSingleFileTestGenerated.Trait.class, JavaToKotlinConverterSingleFileTestGenerated.TryStatement.class, JavaToKotlinConverterSingleFileTestGenerated.TryWithResource.class, JavaToKotlinConverterSingleFileTestGenerated.TypeCastExpression.class, JavaToKotlinConverterSingleFileTestGenerated.TypeParameters.class, JavaToKotlinConverterSingleFileTestGenerated.VarArg.class, JavaToKotlinConverterSingleFileTestGenerated.WhileStatement.class}) +@InnerTestClasses({JavaToKotlinConverterSingleFileTestGenerated.Annotations.class, JavaToKotlinConverterSingleFileTestGenerated.AnonymousBlock.class, JavaToKotlinConverterSingleFileTestGenerated.ArrayAccessExpression.class, JavaToKotlinConverterSingleFileTestGenerated.ArrayInitializerExpression.class, JavaToKotlinConverterSingleFileTestGenerated.ArrayType.class, JavaToKotlinConverterSingleFileTestGenerated.AssertStatement.class, JavaToKotlinConverterSingleFileTestGenerated.AssignmentExpression.class, JavaToKotlinConverterSingleFileTestGenerated.BinaryExpression.class, JavaToKotlinConverterSingleFileTestGenerated.Blocks.class, JavaToKotlinConverterSingleFileTestGenerated.BoxedType.class, JavaToKotlinConverterSingleFileTestGenerated.BreakStatement.class, JavaToKotlinConverterSingleFileTestGenerated.CallChainExpression.class, JavaToKotlinConverterSingleFileTestGenerated.Class.class, JavaToKotlinConverterSingleFileTestGenerated.ClassExpression.class, JavaToKotlinConverterSingleFileTestGenerated.Comments.class, JavaToKotlinConverterSingleFileTestGenerated.ConditionalExpression.class, JavaToKotlinConverterSingleFileTestGenerated.Constructors.class, JavaToKotlinConverterSingleFileTestGenerated.ContinueStatement.class, JavaToKotlinConverterSingleFileTestGenerated.DeclarationStatement.class, JavaToKotlinConverterSingleFileTestGenerated.DoWhileStatement.class, JavaToKotlinConverterSingleFileTestGenerated.DropAccessors.class, JavaToKotlinConverterSingleFileTestGenerated.Enum.class, JavaToKotlinConverterSingleFileTestGenerated.Equals.class, JavaToKotlinConverterSingleFileTestGenerated.Field.class, JavaToKotlinConverterSingleFileTestGenerated.For.class, JavaToKotlinConverterSingleFileTestGenerated.ForeachStatement.class, JavaToKotlinConverterSingleFileTestGenerated.Formatting.class, JavaToKotlinConverterSingleFileTestGenerated.Function.class, JavaToKotlinConverterSingleFileTestGenerated.Identifier.class, JavaToKotlinConverterSingleFileTestGenerated.IfStatement.class, JavaToKotlinConverterSingleFileTestGenerated.ImportStatement.class, JavaToKotlinConverterSingleFileTestGenerated.InProjectionType.class, JavaToKotlinConverterSingleFileTestGenerated.Inheritance.class, JavaToKotlinConverterSingleFileTestGenerated.IsOperator.class, JavaToKotlinConverterSingleFileTestGenerated.Issues.class, JavaToKotlinConverterSingleFileTestGenerated.KotlinApiAccess.class, JavaToKotlinConverterSingleFileTestGenerated.LabelStatement.class, JavaToKotlinConverterSingleFileTestGenerated.List.class, JavaToKotlinConverterSingleFileTestGenerated.LiteralExpression.class, JavaToKotlinConverterSingleFileTestGenerated.LocalVariable.class, JavaToKotlinConverterSingleFileTestGenerated.MethodCallExpression.class, JavaToKotlinConverterSingleFileTestGenerated.Misc.class, JavaToKotlinConverterSingleFileTestGenerated.MutableCollections.class, JavaToKotlinConverterSingleFileTestGenerated.NewClassExpression.class, JavaToKotlinConverterSingleFileTestGenerated.Nullability.class, JavaToKotlinConverterSingleFileTestGenerated.ObjectLiteral.class, JavaToKotlinConverterSingleFileTestGenerated.OutProjectionType.class, JavaToKotlinConverterSingleFileTestGenerated.PackageStatement.class, JavaToKotlinConverterSingleFileTestGenerated.ParenthesizedExpression.class, JavaToKotlinConverterSingleFileTestGenerated.PolyadicExpression.class, JavaToKotlinConverterSingleFileTestGenerated.PostfixOperator.class, JavaToKotlinConverterSingleFileTestGenerated.PrefixOperator.class, JavaToKotlinConverterSingleFileTestGenerated.RawGenerics.class, JavaToKotlinConverterSingleFileTestGenerated.ReturnStatement.class, JavaToKotlinConverterSingleFileTestGenerated.Settings.class, JavaToKotlinConverterSingleFileTestGenerated.StarProjectionType.class, JavaToKotlinConverterSingleFileTestGenerated.StaticMembers.class, JavaToKotlinConverterSingleFileTestGenerated.SuperExpression.class, JavaToKotlinConverterSingleFileTestGenerated.Switch.class, JavaToKotlinConverterSingleFileTestGenerated.SynchronizedStatement.class, JavaToKotlinConverterSingleFileTestGenerated.ThisExpression.class, JavaToKotlinConverterSingleFileTestGenerated.ThrowStatement.class, JavaToKotlinConverterSingleFileTestGenerated.ToKotlinClasses.class, JavaToKotlinConverterSingleFileTestGenerated.Trait.class, JavaToKotlinConverterSingleFileTestGenerated.TryStatement.class, JavaToKotlinConverterSingleFileTestGenerated.TryWithResource.class, JavaToKotlinConverterSingleFileTestGenerated.TypeCastExpression.class, JavaToKotlinConverterSingleFileTestGenerated.TypeParameters.class, JavaToKotlinConverterSingleFileTestGenerated.VarArg.class, JavaToKotlinConverterSingleFileTestGenerated.WhileStatement.class}) @RunWith(JUnit3RunnerWithInners.class) public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaToKotlinConverterSingleFileTest { public void testAllFilesPresentInFileOrElement() throws Exception { @@ -1400,6 +1400,18 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/dropAccessors/GetterSetterUsages.java"); doTest(fileName); } + + @TestMetadata("GetterTypeNotMatch.java") + public void testGetterTypeNotMatch() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/dropAccessors/GetterTypeNotMatch.java"); + doTest(fileName); + } + + @TestMetadata("SetterTypeNotMatch.java") + public void testSetterTypeNotMatch() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/dropAccessors/SetterTypeNotMatch.java"); + doTest(fileName); + } } @TestMetadata("j2k/tests/testData/fileOrElement/enum") @@ -2743,6 +2755,45 @@ public class JavaToKotlinConverterSingleFileTestGenerated extends AbstractJavaTo } } + @TestMetadata("j2k/tests/testData/fileOrElement/mutableCollections") + @TestDataPath("$PROJECT_ROOT") + @RunWith(JUnit3RunnerWithInners.class) + public static class MutableCollections extends AbstractJavaToKotlinConverterSingleFileTest { + public void testAllFilesPresentInMutableCollections() throws Exception { + JetTestUtils.assertAllTestsPresentByMetadata(this.getClass(), new File("j2k/tests/testData/fileOrElement/mutableCollections"), Pattern.compile("^(.+)\\.java$"), true); + } + + @TestMetadata("FunctionParameters.java") + public void testFunctionParameters() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters.java"); + doTest(fileName); + } + + @TestMetadata("FunctionParameters2.java") + public void testFunctionParameters2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters2.java"); + doTest(fileName); + } + + @TestMetadata("FunctionReturnValue.java") + public void testFunctionReturnValue() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue.java"); + doTest(fileName); + } + + @TestMetadata("FunctionReturnValue2.java") + public void testFunctionReturnValue2() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue2.java"); + doTest(fileName); + } + + @TestMetadata("Recursion.java") + public void testRecursion() throws Exception { + String fileName = JetTestUtils.navigationMetadata("j2k/tests/testData/fileOrElement/mutableCollections/Recursion.java"); + doTest(fileName); + } + } + @TestMetadata("j2k/tests/testData/fileOrElement/newClassExpression") @TestDataPath("$PROJECT_ROOT") @RunWith(JUnit3RunnerWithInners.class) diff --git a/j2k/tests/testData/fileOrElement/dropAccessors/GetterTypeNotMatch.java b/j2k/tests/testData/fileOrElement/dropAccessors/GetterTypeNotMatch.java new file mode 100644 index 00000000000..4412e83995b --- /dev/null +++ b/j2k/tests/testData/fileOrElement/dropAccessors/GetterTypeNotMatch.java @@ -0,0 +1,7 @@ +class A { + private String s; + + public Object getValue() { + return s; + } +} \ No newline at end of file diff --git a/j2k/tests/testData/fileOrElement/dropAccessors/GetterTypeNotMatch.kt b/j2k/tests/testData/fileOrElement/dropAccessors/GetterTypeNotMatch.kt new file mode 100644 index 00000000000..2dd5820b06f --- /dev/null +++ b/j2k/tests/testData/fileOrElement/dropAccessors/GetterTypeNotMatch.kt @@ -0,0 +1,7 @@ +class A { + private val s: String? = null + + public fun getValue(): Any { + return s + } +} diff --git a/j2k/tests/testData/fileOrElement/dropAccessors/SetterTypeNotMatch.java b/j2k/tests/testData/fileOrElement/dropAccessors/SetterTypeNotMatch.java new file mode 100644 index 00000000000..b99788ccb97 --- /dev/null +++ b/j2k/tests/testData/fileOrElement/dropAccessors/SetterTypeNotMatch.java @@ -0,0 +1,11 @@ +class A { + private Object o; + + public Object getValue() { + return o; + } + + public void setValue(String s) { + o = s; + } +} \ No newline at end of file diff --git a/j2k/tests/testData/fileOrElement/dropAccessors/SetterTypeNotMatch.kt b/j2k/tests/testData/fileOrElement/dropAccessors/SetterTypeNotMatch.kt new file mode 100644 index 00000000000..39e94a07031 --- /dev/null +++ b/j2k/tests/testData/fileOrElement/dropAccessors/SetterTypeNotMatch.kt @@ -0,0 +1,8 @@ +class A { + public var value: Any? = null + private set + + public fun setValue(s: String) { + value = s + } +} diff --git a/j2k/tests/testData/fileOrElement/for/forThroughListIndices.kt b/j2k/tests/testData/fileOrElement/for/forThroughListIndices.kt index b848f6a1010..b1a4aa02b6a 100644 --- a/j2k/tests/testData/fileOrElement/for/forThroughListIndices.kt +++ b/j2k/tests/testData/fileOrElement/for/forThroughListIndices.kt @@ -1,7 +1,7 @@ import java.util.ArrayList class C { - fun foo1(list: List) { + fun foo1(list: MutableList) { for (i in list.indices) { list.set(i, "a") } diff --git a/j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters.java b/j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters.java new file mode 100644 index 00000000000..f2f68de4a74 --- /dev/null +++ b/j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters.java @@ -0,0 +1,11 @@ +import java.util.*; + +class A{ + void foo(Collection nonMutableCollection, + Collection mutableCollection, + Set mutableSet, + Map mutableMap) { + mutableCollection.addAll(nonMutableCollection); + mutableSet.add(mutableMap.remove("a")); + } +} \ No newline at end of file diff --git a/j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters.kt b/j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters.kt new file mode 100644 index 00000000000..fce11a3586a --- /dev/null +++ b/j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters.kt @@ -0,0 +1,9 @@ +import java.util.* +import kotlin.Collection + +class A { + fun foo(nonMutableCollection: Collection, mutableCollection: MutableCollection, mutableSet: MutableSet, mutableMap: MutableMap) { + mutableCollection.addAll(nonMutableCollection) + mutableSet.add(mutableMap.remove("a")) + } +} diff --git a/j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters2.java b/j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters2.java new file mode 100644 index 00000000000..22c739fc09a --- /dev/null +++ b/j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters2.java @@ -0,0 +1,11 @@ +import java.util.*; + +class A { + void foo(Set set) { + bar(set); + } + + void bar(Collection collection) { + collection.add("a"); + } +} \ No newline at end of file diff --git a/j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters2.kt b/j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters2.kt new file mode 100644 index 00000000000..9196cafcdec --- /dev/null +++ b/j2k/tests/testData/fileOrElement/mutableCollections/FunctionParameters2.kt @@ -0,0 +1,11 @@ +import java.util.* + +class A { + fun foo(set: MutableSet) { + bar(set) + } + + fun bar(collection: MutableCollection) { + collection.add("a") + } +} diff --git a/j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue.java b/j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue.java new file mode 100644 index 00000000000..5a823c786f4 --- /dev/null +++ b/j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue.java @@ -0,0 +1,13 @@ +import java.util.*; + +class A{ + Collection createCollection() { + return new ArrayList<>(); + } + + Collection foo() { + Collection collection = createCollection(); + collection.add("a"); + return collection; + } +} \ No newline at end of file diff --git a/j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue.kt b/j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue.kt new file mode 100644 index 00000000000..024313ab742 --- /dev/null +++ b/j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue.kt @@ -0,0 +1,14 @@ +import java.util.* +import kotlin.Collection + +class A { + fun createCollection(): MutableCollection { + return ArrayList() + } + + fun foo(): Collection { + val collection = createCollection() + collection.add("a") + return collection + } +} diff --git a/j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue2.java b/j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue2.java new file mode 100644 index 00000000000..60891a08bbd --- /dev/null +++ b/j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue2.java @@ -0,0 +1,21 @@ +import java.util.*; + +class A { + private Collection collection; + + A() { + collection = createCollection(); + } + + Collection createCollection() { + return new ArrayList<>(); + } + + public void foo() { + collection.add("1") + } + + public Collection getCollection() { + return collection; + } +} \ No newline at end of file diff --git a/j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue2.kt b/j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue2.kt new file mode 100644 index 00000000000..e69341e789d --- /dev/null +++ b/j2k/tests/testData/fileOrElement/mutableCollections/FunctionReturnValue2.kt @@ -0,0 +1,22 @@ +import java.util.* +import kotlin.Collection + +class A { + private val collection: MutableCollection + + { + collection = createCollection() + } + + fun createCollection(): MutableCollection { + return ArrayList() + } + + public fun foo() { + collection.add("1") + } + + public fun getCollection(): Collection { + return collection + } +} diff --git a/j2k/tests/testData/fileOrElement/mutableCollections/Recursion.java b/j2k/tests/testData/fileOrElement/mutableCollections/Recursion.java new file mode 100644 index 00000000000..3ffc8031c2f --- /dev/null +++ b/j2k/tests/testData/fileOrElement/mutableCollections/Recursion.java @@ -0,0 +1,16 @@ +import java.util.*; + +class A { + void foo(Collection collection) { + bar(collection); + } + + void bar(Collection collection) { + if (collection.size() < 5) { + foo(collection); + } + else { + collection.add("a") + } + } +} \ No newline at end of file diff --git a/j2k/tests/testData/fileOrElement/mutableCollections/Recursion.kt b/j2k/tests/testData/fileOrElement/mutableCollections/Recursion.kt new file mode 100644 index 00000000000..e9b690abf81 --- /dev/null +++ b/j2k/tests/testData/fileOrElement/mutableCollections/Recursion.kt @@ -0,0 +1,15 @@ +import java.util.* + +class A { + fun foo(collection: MutableCollection) { + bar(collection) + } + + fun bar(collection: MutableCollection) { + if (collection.size() < 5) { + foo(collection) + } else { + collection.add("a") + } + } +}