Refactor external overidability conditions

Before this change they could only negatively affect on result
Now they may force success result

Also refine overridavility condition for java fields:
two java fields having the same name are seen as overrides even
if they have different type
This commit is contained in:
Denis Zharkov
2015-12-01 23:10:48 +03:00
parent 8838e46578
commit 4f06cece37
7 changed files with 89 additions and 15 deletions
@@ -20,11 +20,16 @@ import org.jetbrains.kotlin.descriptors.CallableDescriptor
import org.jetbrains.kotlin.descriptors.PropertyDescriptor
import org.jetbrains.kotlin.load.java.lazy.descriptors.isJavaField
import org.jetbrains.kotlin.resolve.ExternalOverridabilityCondition
import org.jetbrains.kotlin.resolve.ExternalOverridabilityCondition.Result
class FieldOverridabilityCondition : ExternalOverridabilityCondition {
override fun isOverridable(superDescriptor: CallableDescriptor, subDescriptor: CallableDescriptor): Boolean {
if (subDescriptor !is PropertyDescriptor || superDescriptor !is PropertyDescriptor) return true
override fun isOverridable(superDescriptor: CallableDescriptor, subDescriptor: CallableDescriptor): Result {
if (subDescriptor !is PropertyDescriptor || superDescriptor !is PropertyDescriptor) return Result.UNKNOWN
if (subDescriptor.name != superDescriptor.name) return Result.UNKNOWN
return subDescriptor.isJavaField == superDescriptor.isJavaField
if (subDescriptor.isJavaField && superDescriptor.isJavaField) return Result.OVERRIDABLE
if (subDescriptor.isJavaField || superDescriptor.isJavaField) return Result.INCOMPATIBLE
return Result.UNKNOWN
}
}