diff --git a/j2k/src/org/jetbrains/kotlin/j2k/propertyDetection.kt b/j2k/src/org/jetbrains/kotlin/j2k/propertyDetection.kt index 231730ea060..dae908fc9d9 100644 --- a/j2k/src/org/jetbrains/kotlin/j2k/propertyDetection.kt +++ b/j2k/src/org/jetbrains/kotlin/j2k/propertyDetection.kt @@ -109,41 +109,14 @@ private class PropertyDetector( methodsToCheck.add(method to (superInfo as SuperInfo.Property?)) } - val propertyNamesWithConflict = HashSet() val prohibitedPropertyNames = psiClass.fields.map { it.name }.toMutableSet() //TODO: fields from base - val propertyNameToGetterInfo = LinkedHashMap() - for ((method, superInfo) in methodsToCheck) { - val info = getGetterInfo(method, superInfo) ?: continue + val propertyNameToGetterInfo = detectGetters(methodsToCheck, prohibitedPropertyNames, propertyNamesWithConflict) - val prevInfo = propertyNameToGetterInfo[info.propertyName] - if (prevInfo != null) { - propertyNamesWithConflict.add(info.propertyName) - continue - } + val propertyNameToSetterInfo = detectSetters(methodsToCheck, prohibitedPropertyNames, propertyNameToGetterInfo.keySet(), propertyNamesWithConflict) - propertyNameToGetterInfo[info.propertyName] = info - info.field?.let { prohibitedPropertyNames.remove(it.name) } - } - - var propertyNames: Set = propertyNameToGetterInfo.keySet() - - val propertyNameToSetterInfo = LinkedHashMap() - for ((method, superInfo) in methodsToCheck) { - val info = getSetterInfo(method, superInfo, propertyNames) ?: continue - - val prevInfo = propertyNameToSetterInfo[info.propertyName] - if (prevInfo != null) { - propertyNamesWithConflict.add(info.propertyName) - continue - } - - propertyNameToSetterInfo[info.propertyName] = info - info.field?.let { prohibitedPropertyNames.remove(it.name) } - } - - propertyNames = propertyNames + propertyNameToSetterInfo.keySet() + val propertyNames = propertyNameToGetterInfo.keySet() + propertyNameToSetterInfo.keySet() val memberToPropertyInfo = HashMap() for (propertyName in propertyNames) { @@ -230,6 +203,49 @@ private class PropertyDetector( return memberToPropertyInfo } + private fun detectGetters( + methodsToCheck: List>, + prohibitedPropertyNames: MutableSet, + propertyNamesWithConflict: HashSet + ): Map { + val propertyNameToGetterInfo = LinkedHashMap() + for ((method, superInfo) in methodsToCheck) { + val info = getGetterInfo(method, superInfo) ?: continue + + val prevInfo = propertyNameToGetterInfo[info.propertyName] + if (prevInfo != null) { + propertyNamesWithConflict.add(info.propertyName) + continue + } + + propertyNameToGetterInfo[info.propertyName] = info + info.field?.let { prohibitedPropertyNames.remove(it.name) } + } + return propertyNameToGetterInfo + } + + private fun detectSetters( + methodsToCheck: List>, + prohibitedPropertyNames: MutableSet, + propertyNamesFromGetters: Set, + propertyNamesWithConflict: HashSet + ): Map { + val propertyNameToSetterInfo = LinkedHashMap() + for ((method, superInfo) in methodsToCheck) { + val info = getSetterInfo(method, superInfo, propertyNamesFromGetters) ?: continue + + val prevInfo = propertyNameToSetterInfo[info.propertyName] + if (prevInfo != null) { + propertyNamesWithConflict.add(info.propertyName) + continue + } + + propertyNameToSetterInfo[info.propertyName] = info + info.field?.let { prohibitedPropertyNames.remove(it.name) } + } + return propertyNameToSetterInfo + } + private fun dropPropertiesWithConflictingAccessors(memberToPropertyInfo: MutableMap) { val propertyInfos = memberToPropertyInfo.values().distinct()