KT-6120 Java to Kotlin converter can generate mutable collection types in case if collection write methods used
#KT-6120 Fixed
This commit is contained in:
committed by
valentin
parent
1af63cb3be
commit
389b14f44f
@@ -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)
|
||||
}
|
||||
|
||||
@@ -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<Type>(TypeVisitor(converter))!!.assignNoPrototype()
|
||||
val result = type.accept<Type>(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<T>(val default: T) {
|
||||
private val cache = HashMap<PsiElement, T>()
|
||||
private val typesBeingCalculated = HashSet<PsiElement>()
|
||||
|
||||
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>(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>(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<TypeFlavor>.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<String> = 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"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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<Type>() {
|
||||
class TypeVisitor(private val converter: Converter,
|
||||
private val topLevelType: PsiType,
|
||||
private val topLevelTypeMutability: Mutability) : PsiTypeVisitor<Type>() {
|
||||
|
||||
private val typeConverter: TypeConverter = converter.typeConverter
|
||||
|
||||
@@ -49,17 +51,19 @@ class TypeVisitor(private val converter: Converter) : PsiTypeVisitor<Type>() {
|
||||
}
|
||||
|
||||
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<Type>() {
|
||||
|
||||
private fun convertTypeArgs(classType: PsiClassType): List<Type> {
|
||||
if (classType.getParameterCount() == 0) {
|
||||
return createTypeArgsForRawTypeUsage(classType)
|
||||
return createTypeArgsForRawTypeUsage(classType, Mutability.Default)
|
||||
}
|
||||
else {
|
||||
return typeConverter.convertTypes(classType.getParameters())
|
||||
}
|
||||
}
|
||||
|
||||
private fun createTypeArgsForRawTypeUsage(classType: PsiClassType): List<Type> {
|
||||
private fun createTypeArgsForRawTypeUsage(classType: PsiClassType, mutability: Mutability): List<Type> {
|
||||
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<Type>() {
|
||||
CommonClassNames.JAVA_UTIL_SET to "kotlin.Set",
|
||||
CommonClassNames.JAVA_UTIL_MAP to "kotlin.Map"
|
||||
)
|
||||
|
||||
public val toKotlinMutableTypesMap: Map<String, String> = 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"
|
||||
)
|
||||
}
|
||||
}
|
||||
|
||||
+58
-1
@@ -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)
|
||||
|
||||
+52
-1
@@ -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)
|
||||
|
||||
@@ -0,0 +1,7 @@
|
||||
class A {
|
||||
private String s;
|
||||
|
||||
public Object getValue() {
|
||||
return s;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,7 @@
|
||||
class A {
|
||||
private val s: String? = null
|
||||
|
||||
public fun getValue(): Any {
|
||||
return s
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
class A {
|
||||
private Object o;
|
||||
|
||||
public Object getValue() {
|
||||
return o;
|
||||
}
|
||||
|
||||
public void setValue(String s) {
|
||||
o = s;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,8 @@
|
||||
class A {
|
||||
public var value: Any? = null
|
||||
private set
|
||||
|
||||
public fun setValue(s: String) {
|
||||
value = s
|
||||
}
|
||||
}
|
||||
@@ -1,7 +1,7 @@
|
||||
import java.util.ArrayList
|
||||
|
||||
class C {
|
||||
fun foo1(list: List<String>) {
|
||||
fun foo1(list: MutableList<String>) {
|
||||
for (i in list.indices) {
|
||||
list.set(i, "a")
|
||||
}
|
||||
|
||||
@@ -0,0 +1,11 @@
|
||||
import java.util.*;
|
||||
|
||||
class A<T>{
|
||||
void foo(Collection<String> nonMutableCollection,
|
||||
Collection<String> mutableCollection,
|
||||
Set<T> mutableSet,
|
||||
Map<String, T> mutableMap) {
|
||||
mutableCollection.addAll(nonMutableCollection);
|
||||
mutableSet.add(mutableMap.remove("a"));
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,9 @@
|
||||
import java.util.*
|
||||
import kotlin.Collection
|
||||
|
||||
class A<T> {
|
||||
fun foo(nonMutableCollection: Collection<String>, mutableCollection: MutableCollection<String>, mutableSet: MutableSet<T>, mutableMap: MutableMap<String, T>) {
|
||||
mutableCollection.addAll(nonMutableCollection)
|
||||
mutableSet.add(mutableMap.remove("a"))
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
import java.util.*;
|
||||
|
||||
class A {
|
||||
void foo(Set<String> set) {
|
||||
bar(set);
|
||||
}
|
||||
|
||||
void bar(Collection<String> collection) {
|
||||
collection.add("a");
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,11 @@
|
||||
import java.util.*
|
||||
|
||||
class A {
|
||||
fun foo(set: MutableSet<String>) {
|
||||
bar(set)
|
||||
}
|
||||
|
||||
fun bar(collection: MutableCollection<String>) {
|
||||
collection.add("a")
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,13 @@
|
||||
import java.util.*;
|
||||
|
||||
class A{
|
||||
Collection<String> createCollection() {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
Collection<String> foo() {
|
||||
Collection<String> collection = createCollection();
|
||||
collection.add("a");
|
||||
return collection;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,14 @@
|
||||
import java.util.*
|
||||
import kotlin.Collection
|
||||
|
||||
class A {
|
||||
fun createCollection(): MutableCollection<String> {
|
||||
return ArrayList()
|
||||
}
|
||||
|
||||
fun foo(): Collection<String> {
|
||||
val collection = createCollection()
|
||||
collection.add("a")
|
||||
return collection
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,21 @@
|
||||
import java.util.*;
|
||||
|
||||
class A {
|
||||
private Collection<String> collection;
|
||||
|
||||
A() {
|
||||
collection = createCollection();
|
||||
}
|
||||
|
||||
Collection<String> createCollection() {
|
||||
return new ArrayList<>();
|
||||
}
|
||||
|
||||
public void foo() {
|
||||
collection.add("1")
|
||||
}
|
||||
|
||||
public Collection<String> getCollection() {
|
||||
return collection;
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,22 @@
|
||||
import java.util.*
|
||||
import kotlin.Collection
|
||||
|
||||
class A {
|
||||
private val collection: MutableCollection<String>
|
||||
|
||||
{
|
||||
collection = createCollection()
|
||||
}
|
||||
|
||||
fun createCollection(): MutableCollection<String> {
|
||||
return ArrayList()
|
||||
}
|
||||
|
||||
public fun foo() {
|
||||
collection.add("1")
|
||||
}
|
||||
|
||||
public fun getCollection(): Collection<String> {
|
||||
return collection
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,16 @@
|
||||
import java.util.*;
|
||||
|
||||
class A {
|
||||
void foo(Collection<String> collection) {
|
||||
bar(collection);
|
||||
}
|
||||
|
||||
void bar(Collection<String> collection) {
|
||||
if (collection.size() < 5) {
|
||||
foo(collection);
|
||||
}
|
||||
else {
|
||||
collection.add("a")
|
||||
}
|
||||
}
|
||||
}
|
||||
@@ -0,0 +1,15 @@
|
||||
import java.util.*
|
||||
|
||||
class A {
|
||||
fun foo(collection: MutableCollection<String>) {
|
||||
bar(collection)
|
||||
}
|
||||
|
||||
fun bar(collection: MutableCollection<String>) {
|
||||
if (collection.size() < 5) {
|
||||
foo(collection)
|
||||
} else {
|
||||
collection.add("a")
|
||||
}
|
||||
}
|
||||
}
|
||||
Reference in New Issue
Block a user