Secondary constructors delegation calls and body resolve

This commit is contained in:
Denis Zharkov
2015-02-03 14:14:37 +03:00
parent b2cecf1dd0
commit 1555eec954
71 changed files with 1093 additions and 50 deletions
@@ -301,6 +301,18 @@ public class DescriptorUtils {
return superClassDescriptors;
}
@Nullable
public static JetType getSuperClassType(@NotNull ClassDescriptor classDescriptor) {
Collection<JetType> superclassTypes = classDescriptor.getTypeConstructor().getSupertypes();
for (JetType type : superclassTypes) {
ClassDescriptor superClassDescriptor = getClassDescriptorForType(type);
if (!isAny(superClassDescriptor) && superClassDescriptor.getKind() != ClassKind.TRAIT) {
return type;
}
}
return null;
}
@NotNull
public static ClassDescriptor getClassDescriptorForType(@NotNull JetType type) {
return getClassDescriptorForTypeConstructor(type.getConstructor());
@@ -21,6 +21,7 @@ import org.jetbrains.kotlin.resolve.DescriptorUtils
import org.jetbrains.kotlin.descriptors.ClassKind.*
import org.jetbrains.kotlin.name.FqName
import org.jetbrains.kotlin.name.ClassId
import org.jetbrains.kotlin.builtins.KotlinBuiltIns
public fun ClassDescriptor.getClassObjectReferenceTarget(): ClassDescriptor = getDefaultObjectDescriptor() ?: this
@@ -81,4 +82,17 @@ public val DeclarationDescriptorWithVisibility.isEffectivelyPublicApi: Boolean
}
return true
}
}
public fun ClassDescriptor.getSuperClassNotAny(): ClassDescriptor? {
for (supertype in getDefaultType().getConstructor().getSupertypes()) {
val superClassifier = supertype.getConstructor().getDeclarationDescriptor()
if (!KotlinBuiltIns.isAnyOrNullableAny(supertype) &&
(DescriptorUtils.isClass(superClassifier) || DescriptorUtils.isEnumClass(superClassifier))) {
return superClassifier as ClassDescriptor
}
}
return null
}
public fun ClassDescriptor.getSuperClassOrAny(): ClassDescriptor = getSuperClassNotAny() ?: KotlinBuiltIns.getInstance().getAny()