Minor. Rename isTrait -> isInterface
This commit is contained in:
@@ -56,7 +56,7 @@ private data class DescriptorBasedFunctionHandle(val descriptor: FunctionDescrip
|
|||||||
|
|
||||||
override val isAbstract: Boolean =
|
override val isAbstract: Boolean =
|
||||||
descriptor.getModality() == Modality.ABSTRACT ||
|
descriptor.getModality() == Modality.ABSTRACT ||
|
||||||
DescriptorUtils.isTrait(descriptor.getContainingDeclaration())
|
DescriptorUtils.isInterface(descriptor.getContainingDeclaration())
|
||||||
|
|
||||||
override fun getOverridden() = overridden
|
override fun getOverridden() = overridden
|
||||||
}
|
}
|
||||||
@@ -74,7 +74,7 @@ public fun findTraitImplementation(descriptor: CallableMemberDescriptor): Callab
|
|||||||
val implementation = findImplementationFromInterface(descriptor) ?: return null
|
val implementation = findImplementationFromInterface(descriptor) ?: return null
|
||||||
val immediateConcreteSuper = firstSuperMethodFromKotlin(descriptor, implementation) ?: return null
|
val immediateConcreteSuper = firstSuperMethodFromKotlin(descriptor, implementation) ?: return null
|
||||||
|
|
||||||
if (!DescriptorUtils.isTrait(immediateConcreteSuper.getContainingDeclaration())) {
|
if (!DescriptorUtils.isInterface(immediateConcreteSuper.getContainingDeclaration())) {
|
||||||
// If this implementation is already generated into the superclass, we need not generate it again, it'll be inherited
|
// If this implementation is already generated into the superclass, we need not generate it again, it'll be inherited
|
||||||
return null
|
return null
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -778,7 +778,7 @@ public class AsmUtil {
|
|||||||
DeclarationDescriptor propertyContainer = propertyDescriptor.getContainingDeclaration();
|
DeclarationDescriptor propertyContainer = propertyDescriptor.getContainingDeclaration();
|
||||||
return !propertyDescriptor.isVar()
|
return !propertyDescriptor.isVar()
|
||||||
&& !isExtensionProperty
|
&& !isExtensionProperty
|
||||||
&& isCompanionObject(propertyContainer) && isTrait(propertyContainer.getContainingDeclaration())
|
&& isCompanionObject(propertyContainer) && isInterface(propertyContainer.getContainingDeclaration())
|
||||||
&& areBothAccessorDefault(propertyDescriptor)
|
&& areBothAccessorDefault(propertyDescriptor)
|
||||||
&& getVisibilityForSpecialPropertyBackingField(propertyDescriptor, false) == ACC_PUBLIC;
|
&& getVisibilityForSpecialPropertyBackingField(propertyDescriptor, false) == ACC_PUBLIC;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -66,7 +66,7 @@ public abstract class ClassBodyCodegen extends MemberCodegen<JetClassOrObject> {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!DescriptorUtils.isTrait(descriptor)) {
|
if (!DescriptorUtils.isInterface(descriptor)) {
|
||||||
for (DeclarationDescriptor memberDescriptor : descriptor.getDefaultType().getMemberScope().getAllDescriptors()) {
|
for (DeclarationDescriptor memberDescriptor : descriptor.getDefaultType().getMemberScope().getAllDescriptors()) {
|
||||||
if (memberDescriptor instanceof FunctionDescriptor) {
|
if (memberDescriptor instanceof FunctionDescriptor) {
|
||||||
FunctionDescriptor member = (FunctionDescriptor) memberDescriptor;
|
FunctionDescriptor member = (FunctionDescriptor) memberDescriptor;
|
||||||
|
|||||||
@@ -109,7 +109,7 @@ public class ClosureCodegen extends MemberCodegen<JetElement> {
|
|||||||
JetType superClassType = null;
|
JetType superClassType = null;
|
||||||
for (JetType supertype : classDescriptor.getTypeConstructor().getSupertypes()) {
|
for (JetType supertype : classDescriptor.getTypeConstructor().getSupertypes()) {
|
||||||
ClassifierDescriptor classifier = supertype.getConstructor().getDeclarationDescriptor();
|
ClassifierDescriptor classifier = supertype.getConstructor().getDeclarationDescriptor();
|
||||||
if (DescriptorUtils.isTrait(classifier)) {
|
if (DescriptorUtils.isInterface(classifier)) {
|
||||||
superInterfaceTypes.add(supertype);
|
superInterfaceTypes.add(supertype);
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
|
|||||||
@@ -142,7 +142,7 @@ public class FunctionCodegen {
|
|||||||
@NotNull FunctionGenerationStrategy strategy
|
@NotNull FunctionGenerationStrategy strategy
|
||||||
) {
|
) {
|
||||||
OwnerKind contextKind = methodContext.getContextKind();
|
OwnerKind contextKind = methodContext.getContextKind();
|
||||||
if (isTrait(functionDescriptor.getContainingDeclaration()) &&
|
if (isInterface(functionDescriptor.getContainingDeclaration()) &&
|
||||||
functionDescriptor.getVisibility() == Visibilities.PRIVATE &&
|
functionDescriptor.getVisibility() == Visibilities.PRIVATE &&
|
||||||
contextKind != OwnerKind.DEFAULT_IMPLS) {
|
contextKind != OwnerKind.DEFAULT_IMPLS) {
|
||||||
return;
|
return;
|
||||||
@@ -505,7 +505,7 @@ public class FunctionCodegen {
|
|||||||
public void generateBridges(@NotNull FunctionDescriptor descriptor) {
|
public void generateBridges(@NotNull FunctionDescriptor descriptor) {
|
||||||
if (descriptor instanceof ConstructorDescriptor) return;
|
if (descriptor instanceof ConstructorDescriptor) return;
|
||||||
if (owner.getContextKind() == OwnerKind.DEFAULT_IMPLS) return;
|
if (owner.getContextKind() == OwnerKind.DEFAULT_IMPLS) return;
|
||||||
if (isTrait(descriptor.getContainingDeclaration())) return;
|
if (isInterface(descriptor.getContainingDeclaration())) return;
|
||||||
|
|
||||||
// equals(Any?), hashCode(), toString() never need bridges
|
// equals(Any?), hashCode(), toString() never need bridges
|
||||||
if (isMethodOfAny(descriptor)) return;
|
if (isMethodOfAny(descriptor)) return;
|
||||||
@@ -585,7 +585,7 @@ public class FunctionCodegen {
|
|||||||
) {
|
) {
|
||||||
DeclarationDescriptor contextClass = owner.getContextDescriptor().getContainingDeclaration();
|
DeclarationDescriptor contextClass = owner.getContextDescriptor().getContainingDeclaration();
|
||||||
|
|
||||||
if (kind != OwnerKind.DEFAULT_IMPLS && isTrait(contextClass)) {
|
if (kind != OwnerKind.DEFAULT_IMPLS && isInterface(contextClass)) {
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -1035,7 +1035,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void generatePrimaryConstructor(final DelegationFieldsInfo delegationFieldsInfo) {
|
private void generatePrimaryConstructor(final DelegationFieldsInfo delegationFieldsInfo) {
|
||||||
if (isTrait(descriptor) || isAnnotationClass(descriptor)) return;
|
if (isInterface(descriptor) || isAnnotationClass(descriptor)) return;
|
||||||
|
|
||||||
ConstructorDescriptor constructorDescriptor = descriptor.getUnsubstitutedPrimaryConstructor();
|
ConstructorDescriptor constructorDescriptor = descriptor.getUnsubstitutedPrimaryConstructor();
|
||||||
if (constructorDescriptor == null) return;
|
if (constructorDescriptor == null) return;
|
||||||
@@ -1393,7 +1393,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
}
|
}
|
||||||
|
|
||||||
private void generateTraitMethods() {
|
private void generateTraitMethods() {
|
||||||
if (isTrait(descriptor)) return;
|
if (isInterface(descriptor)) return;
|
||||||
|
|
||||||
for (Map.Entry<FunctionDescriptor, FunctionDescriptor> entry : CodegenUtil.getTraitMethods(descriptor).entrySet()) {
|
for (Map.Entry<FunctionDescriptor, FunctionDescriptor> entry : CodegenUtil.getTraitMethods(descriptor).entrySet()) {
|
||||||
FunctionDescriptor traitFun = entry.getKey();
|
FunctionDescriptor traitFun = entry.getKey();
|
||||||
@@ -1412,7 +1412,7 @@ public class ImplementationBodyCodegen extends ClassBodyCodegen {
|
|||||||
@Override
|
@Override
|
||||||
public void doGenerateBody(@NotNull ExpressionCodegen codegen, @NotNull JvmMethodSignature signature) {
|
public void doGenerateBody(@NotNull ExpressionCodegen codegen, @NotNull JvmMethodSignature signature) {
|
||||||
DeclarationDescriptor containingDeclaration = traitFun.getContainingDeclaration();
|
DeclarationDescriptor containingDeclaration = traitFun.getContainingDeclaration();
|
||||||
if (!DescriptorUtils.isTrait(containingDeclaration)) return;
|
if (!DescriptorUtils.isInterface(containingDeclaration)) return;
|
||||||
|
|
||||||
DeclarationDescriptor declarationInheritedFun = inheritedFun.getContainingDeclaration();
|
DeclarationDescriptor declarationInheritedFun = inheritedFun.getContainingDeclaration();
|
||||||
PsiElement classForInheritedFun = descriptorToDeclaration(declarationInheritedFun);
|
PsiElement classForInheritedFun = descriptorToDeclaration(declarationInheritedFun);
|
||||||
|
|||||||
@@ -57,7 +57,7 @@ import static org.jetbrains.kotlin.codegen.AsmUtil.*;
|
|||||||
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvmInterface;
|
import static org.jetbrains.kotlin.codegen.JvmCodegenUtil.isJvmInterface;
|
||||||
import static org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.*;
|
import static org.jetbrains.kotlin.codegen.serialization.JvmSerializationBindings.*;
|
||||||
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isCompanionObject;
|
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isCompanionObject;
|
||||||
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isTrait;
|
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isInterface;
|
||||||
import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.PROPERTY_METADATA_TYPE;
|
import static org.jetbrains.kotlin.resolve.jvm.AsmTypes.PROPERTY_METADATA_TYPE;
|
||||||
import static org.jetbrains.kotlin.resolve.jvm.diagnostics.DiagnosticsPackage.OtherOrigin;
|
import static org.jetbrains.kotlin.resolve.jvm.diagnostics.DiagnosticsPackage.OtherOrigin;
|
||||||
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
|
import static org.jetbrains.org.objectweb.asm.Opcodes.*;
|
||||||
@@ -250,7 +250,7 @@ public class PropertyCodegen {
|
|||||||
String name = JvmAbi.getSyntheticMethodNameForAnnotatedProperty(descriptor.getName());
|
String name = JvmAbi.getSyntheticMethodNameForAnnotatedProperty(descriptor.getName());
|
||||||
String desc = receiver == null ? "()V" : "(" + typeMapper.mapType(receiver.getType()) + ")V";
|
String desc = receiver == null ? "()V" : "(" + typeMapper.mapType(receiver.getType()) + ")V";
|
||||||
|
|
||||||
if (!isTrait(context.getContextDescriptor()) || kind == OwnerKind.DEFAULT_IMPLS) {
|
if (!isInterface(context.getContextDescriptor()) || kind == OwnerKind.DEFAULT_IMPLS) {
|
||||||
int flags = ACC_DEPRECATED | ACC_FINAL | ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC;
|
int flags = ACC_DEPRECATED | ACC_FINAL | ACC_PRIVATE | ACC_STATIC | ACC_SYNTHETIC;
|
||||||
MethodVisitor mv = v.newMethod(OtherOrigin(descriptor), flags, name, desc, null, null);
|
MethodVisitor mv = v.newMethod(OtherOrigin(descriptor), flags, name, desc, null, null);
|
||||||
AnnotationCodegen.forMethod(mv, typeMapper)
|
AnnotationCodegen.forMethod(mv, typeMapper)
|
||||||
|
|||||||
@@ -595,7 +595,7 @@ public class InlineCodegen extends CallGenerator {
|
|||||||
CodegenContext parent = getContext(descriptor.getContainingDeclaration(), state);
|
CodegenContext parent = getContext(descriptor.getContainingDeclaration(), state);
|
||||||
|
|
||||||
if (descriptor instanceof ClassDescriptor) {
|
if (descriptor instanceof ClassDescriptor) {
|
||||||
OwnerKind kind = DescriptorUtils.isTrait(descriptor) ? OwnerKind.DEFAULT_IMPLS : OwnerKind.IMPLEMENTATION;
|
OwnerKind kind = DescriptorUtils.isInterface(descriptor) ? OwnerKind.DEFAULT_IMPLS : OwnerKind.IMPLEMENTATION;
|
||||||
return parent.intoClass((ClassDescriptor) descriptor, kind, state);
|
return parent.intoClass((ClassDescriptor) descriptor, kind, state);
|
||||||
}
|
}
|
||||||
else if (descriptor instanceof ScriptDescriptor) {
|
else if (descriptor instanceof ScriptDescriptor) {
|
||||||
|
|||||||
@@ -61,7 +61,7 @@ import java.util.ListIterator;
|
|||||||
|
|
||||||
import static kotlin.KotlinPackage.substringAfterLast;
|
import static kotlin.KotlinPackage.substringAfterLast;
|
||||||
import static org.jetbrains.kotlin.resolve.DescriptorUtils.getFqName;
|
import static org.jetbrains.kotlin.resolve.DescriptorUtils.getFqName;
|
||||||
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isTrait;
|
import static org.jetbrains.kotlin.resolve.DescriptorUtils.isInterface;
|
||||||
|
|
||||||
public class InlineCodegenUtil {
|
public class InlineCodegenUtil {
|
||||||
public static final boolean GENERATE_SMAP = true;
|
public static final boolean GENERATE_SMAP = true;
|
||||||
@@ -193,7 +193,7 @@ public class InlineCodegenUtil {
|
|||||||
}
|
}
|
||||||
if (containerDescriptor instanceof ClassDescriptor) {
|
if (containerDescriptor instanceof ClassDescriptor) {
|
||||||
ClassId classId = DescriptorUtilPackage.getClassId((ClassDescriptor) containerDescriptor);
|
ClassId classId = DescriptorUtilPackage.getClassId((ClassDescriptor) containerDescriptor);
|
||||||
if (isTrait(containerDescriptor)) {
|
if (isInterface(containerDescriptor)) {
|
||||||
FqName relativeClassName = classId.getRelativeClassName();
|
FqName relativeClassName = classId.getRelativeClassName();
|
||||||
//TODO test nested trait fun inlining
|
//TODO test nested trait fun inlining
|
||||||
classId = new ClassId(classId.getPackageFqName(), Name.identifier(relativeClassName.shortName().asString() + JvmAbi.DEFAULT_IMPLS_SUFFIX));
|
classId = new ClassId(classId.getPackageFqName(), Name.identifier(relativeClassName.shortName().asString() + JvmAbi.DEFAULT_IMPLS_SUFFIX));
|
||||||
|
|||||||
@@ -54,7 +54,7 @@ public class NativeFunChecker : DeclarationChecker {
|
|||||||
) {
|
) {
|
||||||
if (!descriptor.hasNativeAnnotation()) return
|
if (!descriptor.hasNativeAnnotation()) return
|
||||||
|
|
||||||
if (DescriptorUtils.isTrait(descriptor.getContainingDeclaration())) {
|
if (DescriptorUtils.isInterface(descriptor.getContainingDeclaration())) {
|
||||||
diagnosticHolder.report(ErrorsJvm.EXTERNAL_DECLARATION_IN_TRAIT.on(declaration))
|
diagnosticHolder.report(ErrorsJvm.EXTERNAL_DECLARATION_IN_TRAIT.on(declaration))
|
||||||
}
|
}
|
||||||
else if (descriptor is CallableMemberDescriptor &&
|
else if (descriptor is CallableMemberDescriptor &&
|
||||||
|
|||||||
+2
-2
@@ -36,11 +36,11 @@ public class TraitDefaultMethodCallChecker : CallChecker {
|
|||||||
val targetDescriptor = resolvedCall.getResultingDescriptor().getOriginal()
|
val targetDescriptor = resolvedCall.getResultingDescriptor().getOriginal()
|
||||||
val containerDescriptor = targetDescriptor.getContainingDeclaration()
|
val containerDescriptor = targetDescriptor.getContainingDeclaration()
|
||||||
|
|
||||||
if (containerDescriptor is JavaClassDescriptor && DescriptorUtils.isTrait(containerDescriptor)) {
|
if (containerDescriptor is JavaClassDescriptor && DescriptorUtils.isInterface(containerDescriptor)) {
|
||||||
//is java interface default method called from trait
|
//is java interface default method called from trait
|
||||||
val classifier = DescriptorUtils.getParentOfType(context.scope.ownerDescriptor, javaClass<ClassifierDescriptor>())
|
val classifier = DescriptorUtils.getParentOfType(context.scope.ownerDescriptor, javaClass<ClassifierDescriptor>())
|
||||||
|
|
||||||
if (classifier != null && DescriptorUtils.isTrait(classifier)) {
|
if (classifier != null && DescriptorUtils.isInterface(classifier)) {
|
||||||
context.trace.report(
|
context.trace.report(
|
||||||
ErrorsJvm.TRAIT_CANT_CALL_DEFAULT_METHOD_VIA_SUPER.on(
|
ErrorsJvm.TRAIT_CANT_CALL_DEFAULT_METHOD_VIA_SUPER.on(
|
||||||
PsiTreeUtil.getParentOfType(resolvedCall.getCall().getCallElement(), javaClass<JetExpression>())
|
PsiTreeUtil.getParentOfType(resolvedCall.getCall().getCallElement(), javaClass<JetExpression>())
|
||||||
|
|||||||
@@ -550,9 +550,9 @@ public class DeclarationsChecker {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else {
|
else {
|
||||||
assert DescriptorUtils.isTrait(declaration) : "Enum entry should be declared in enum class: " +
|
assert DescriptorUtils.isInterface(declaration) : "Enum entry should be declared in enum class: " +
|
||||||
classDescriptor + " " +
|
classDescriptor + " " +
|
||||||
classDescriptor.getKind();
|
classDescriptor.getKind();
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -16,7 +16,6 @@
|
|||||||
|
|
||||||
package org.jetbrains.kotlin.resolve;
|
package org.jetbrains.kotlin.resolve;
|
||||||
|
|
||||||
import com.google.common.collect.Lists;
|
|
||||||
import com.google.common.collect.Maps;
|
import com.google.common.collect.Maps;
|
||||||
import com.google.common.collect.Sets;
|
import com.google.common.collect.Sets;
|
||||||
import com.intellij.psi.PsiElement;
|
import com.intellij.psi.PsiElement;
|
||||||
@@ -78,7 +77,7 @@ public class ModifiersChecker {
|
|||||||
DeclarationDescriptor containingDeclaration = classDescriptor.getContainingDeclaration();
|
DeclarationDescriptor containingDeclaration = classDescriptor.getContainingDeclaration();
|
||||||
if (!(containingDeclaration instanceof ClassDescriptor)) return InnerModifierCheckResult.ILLEGAL_POSITION;
|
if (!(containingDeclaration instanceof ClassDescriptor)) return InnerModifierCheckResult.ILLEGAL_POSITION;
|
||||||
|
|
||||||
if (DescriptorUtils.isTrait(containingDeclaration)) {
|
if (DescriptorUtils.isInterface(containingDeclaration)) {
|
||||||
return InnerModifierCheckResult.IN_TRAIT;
|
return InnerModifierCheckResult.IN_TRAIT;
|
||||||
}
|
}
|
||||||
else if (DescriptorUtils.isObject(containingDeclaration)) {
|
else if (DescriptorUtils.isObject(containingDeclaration)) {
|
||||||
|
|||||||
+1
-1
@@ -279,7 +279,7 @@ public open class LazyClassMemberScope(
|
|||||||
val classOrObject = ownerInfo.getCorrespondingClassOrObject() ?: return null
|
val classOrObject = ownerInfo.getCorrespondingClassOrObject() ?: return null
|
||||||
|
|
||||||
val hasPrimaryConstructor = classOrObject.hasExplicitPrimaryConstructor()
|
val hasPrimaryConstructor = classOrObject.hasExplicitPrimaryConstructor()
|
||||||
if (DescriptorUtils.isTrait(thisDescriptor) && !hasPrimaryConstructor) return null
|
if (DescriptorUtils.isInterface(thisDescriptor) && !hasPrimaryConstructor) return null
|
||||||
|
|
||||||
if (DescriptorUtils.canHaveDeclaredConstructors(thisDescriptor) || hasPrimaryConstructor) {
|
if (DescriptorUtils.canHaveDeclaredConstructors(thisDescriptor) || hasPrimaryConstructor) {
|
||||||
val constructor = c.functionDescriptorResolver.resolvePrimaryConstructorDescriptor(
|
val constructor = c.functionDescriptorResolver.resolvePrimaryConstructorDescriptor(
|
||||||
|
|||||||
+1
-1
@@ -421,7 +421,7 @@ public class BasicExpressionTypingVisitor extends ExpressionTypingVisitor {
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
if (result != null) {
|
if (result != null) {
|
||||||
if (DescriptorUtils.isTrait(thisType.getConstructor().getDeclarationDescriptor())) {
|
if (DescriptorUtils.isInterface(thisType.getConstructor().getDeclarationDescriptor())) {
|
||||||
if (DescriptorUtils.isClass(result.getConstructor().getDeclarationDescriptor())) {
|
if (DescriptorUtils.isClass(result.getConstructor().getDeclarationDescriptor())) {
|
||||||
context.trace.report(SUPERCLASS_NOT_ACCESSIBLE_FROM_TRAIT.on(expression));
|
context.trace.report(SUPERCLASS_NOT_ACCESSIBLE_FROM_TRAIT.on(expression));
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -329,7 +329,7 @@ public class DescriptorUtils {
|
|||||||
return isKindOf(descriptor, ClassKind.ANNOTATION_CLASS);
|
return isKindOf(descriptor, ClassKind.ANNOTATION_CLASS);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean isTrait(@Nullable DeclarationDescriptor descriptor) {
|
public static boolean isInterface(@Nullable DeclarationDescriptor descriptor) {
|
||||||
return isKindOf(descriptor, ClassKind.INTERFACE);
|
return isKindOf(descriptor, ClassKind.INTERFACE);
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -538,7 +538,7 @@ public class DescriptorUtils {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public static boolean canHaveDeclaredConstructors(@NotNull ClassDescriptor classDescriptor) {
|
public static boolean canHaveDeclaredConstructors(@NotNull ClassDescriptor classDescriptor) {
|
||||||
return !isSingletonOrAnonymousObject(classDescriptor) && !isTrait(classDescriptor);
|
return !isSingletonOrAnonymousObject(classDescriptor) && !isInterface(classDescriptor);
|
||||||
}
|
}
|
||||||
|
|
||||||
public static boolean hasDefaultConstructor(@NotNull ClassDescriptor classDescriptor) {
|
public static boolean hasDefaultConstructor(@NotNull ClassDescriptor classDescriptor) {
|
||||||
|
|||||||
Reference in New Issue
Block a user