getMethodAsmFlags extracted
This commit is contained in:
@@ -103,25 +103,14 @@ public class FunctionCodegen extends GenerationStateAware {
|
|||||||
|
|
||||||
List<ValueParameterDescriptor> paramDescrs = functionDescriptor.getValueParameters();
|
List<ValueParameterDescriptor> paramDescrs = functionDescriptor.getValueParameters();
|
||||||
|
|
||||||
int flags = getVisibilityAccessFlag(functionDescriptor);
|
|
||||||
|
|
||||||
if (!functionDescriptor.getValueParameters().isEmpty()
|
|
||||||
&& functionDescriptor.getValueParameters().get(functionDescriptor.getValueParameters().size() - 1)
|
|
||||||
.getVarargElementType() != null) {
|
|
||||||
flags |= ACC_VARARGS;
|
|
||||||
}
|
|
||||||
|
|
||||||
Modality modality = functionDescriptor.getModality();
|
|
||||||
if (modality == Modality.FINAL) {
|
|
||||||
DeclarationDescriptor containingDeclaration = functionDescriptor.getContainingDeclaration();
|
|
||||||
if (!(containingDeclaration instanceof ClassDescriptor) ||
|
|
||||||
((ClassDescriptor) containingDeclaration).getKind() != ClassKind.TRAIT) {
|
|
||||||
flags |= ACC_FINAL;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
OwnerKind kind = context.getContextKind();
|
OwnerKind kind = context.getContextKind();
|
||||||
|
|
||||||
|
boolean isStatic = isStatic(kind);
|
||||||
|
|
||||||
|
boolean isAbstract = isAbstract(functionDescriptor, kind);
|
||||||
|
|
||||||
|
int flags = getMethodAsmFlags(functionDescriptor, kind);
|
||||||
|
|
||||||
if (kind == OwnerKind.TRAIT_IMPL) {
|
if (kind == OwnerKind.TRAIT_IMPL) {
|
||||||
needJetAnnotations = false;
|
needJetAnnotations = false;
|
||||||
}
|
}
|
||||||
@@ -130,17 +119,6 @@ public class FunctionCodegen extends GenerationStateAware {
|
|||||||
ReceiverDescriptor receiverParameter = functionDescriptor.getReceiverParameter();
|
ReceiverDescriptor receiverParameter = functionDescriptor.getReceiverParameter();
|
||||||
|
|
||||||
if (kind != OwnerKind.TRAIT_IMPL || bodyExpressions != null) {
|
if (kind != OwnerKind.TRAIT_IMPL || bodyExpressions != null) {
|
||||||
boolean isStatic = kind == OwnerKind.NAMESPACE || kind instanceof OwnerKind.StaticDelegateKind;
|
|
||||||
if (isStatic || kind == OwnerKind.TRAIT_IMPL) {
|
|
||||||
flags |= ACC_STATIC;
|
|
||||||
}
|
|
||||||
|
|
||||||
boolean isAbstract = (
|
|
||||||
modality == Modality.ABSTRACT
|
|
||||||
|| isInterface(functionDescriptor.getContainingDeclaration())
|
|
||||||
) && !isStatic && kind != OwnerKind.TRAIT_IMPL;
|
|
||||||
if (isAbstract) flags |= ACC_ABSTRACT;
|
|
||||||
|
|
||||||
final MethodVisitor mv =
|
final MethodVisitor mv =
|
||||||
v.newMethod(fun, flags, jvmSignature.getAsmMethod().getName(), jvmSignature.getAsmMethod().getDescriptor(),
|
v.newMethod(fun, flags, jvmSignature.getAsmMethod().getName(), jvmSignature.getAsmMethod().getDescriptor(),
|
||||||
jvmSignature.getGenericsSignature(), null);
|
jvmSignature.getGenericsSignature(), null);
|
||||||
@@ -301,6 +279,46 @@ public class FunctionCodegen extends GenerationStateAware {
|
|||||||
generateDefaultIfNeeded(context, state, v, jvmSignature.getAsmMethod(), functionDescriptor, kind);
|
generateDefaultIfNeeded(context, state, v, jvmSignature.getAsmMethod(), functionDescriptor, kind);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private static boolean isAbstract(FunctionDescriptor functionDescriptor, OwnerKind kind) {
|
||||||
|
return (functionDescriptor.getModality() == Modality.ABSTRACT
|
||||||
|
|| isInterface(functionDescriptor.getContainingDeclaration())
|
||||||
|
)
|
||||||
|
&& !isStatic(kind)
|
||||||
|
&& kind != OwnerKind.TRAIT_IMPL;
|
||||||
|
}
|
||||||
|
|
||||||
|
public static int getMethodAsmFlags(FunctionDescriptor functionDescriptor, OwnerKind kind) {
|
||||||
|
boolean isStatic = isStatic(kind);
|
||||||
|
boolean isAbstract = isAbstract(functionDescriptor, kind);
|
||||||
|
|
||||||
|
int flags = getVisibilityAccessFlag(functionDescriptor);
|
||||||
|
|
||||||
|
if (!functionDescriptor.getValueParameters().isEmpty()
|
||||||
|
&& functionDescriptor.getValueParameters().get(functionDescriptor.getValueParameters().size() - 1)
|
||||||
|
.getVarargElementType() != null) {
|
||||||
|
flags |= ACC_VARARGS;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (functionDescriptor.getModality() == Modality.FINAL) {
|
||||||
|
DeclarationDescriptor containingDeclaration = functionDescriptor.getContainingDeclaration();
|
||||||
|
if (!(containingDeclaration instanceof ClassDescriptor) ||
|
||||||
|
((ClassDescriptor) containingDeclaration).getKind() != ClassKind.TRAIT) {
|
||||||
|
flags |= ACC_FINAL;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isStatic || kind == OwnerKind.TRAIT_IMPL) {
|
||||||
|
flags |= ACC_STATIC;
|
||||||
|
}
|
||||||
|
|
||||||
|
if (isAbstract) flags |= ACC_ABSTRACT;
|
||||||
|
return flags;
|
||||||
|
}
|
||||||
|
|
||||||
|
private static boolean isStatic(OwnerKind kind) {
|
||||||
|
return kind == OwnerKind.NAMESPACE || kind instanceof OwnerKind.StaticDelegateKind;
|
||||||
|
}
|
||||||
|
|
||||||
public static void genJetAnnotations(
|
public static void genJetAnnotations(
|
||||||
@NotNull GenerationState state,
|
@NotNull GenerationState state,
|
||||||
@NotNull FunctionDescriptor functionDescriptor,
|
@NotNull FunctionDescriptor functionDescriptor,
|
||||||
@@ -465,7 +483,7 @@ public class FunctionCodegen extends GenerationStateAware {
|
|||||||
|
|
||||||
ReceiverDescriptor receiverParameter = functionDescriptor.getReceiverParameter();
|
ReceiverDescriptor receiverParameter = functionDescriptor.getReceiverParameter();
|
||||||
boolean hasReceiver = receiverParameter.exists();
|
boolean hasReceiver = receiverParameter.exists();
|
||||||
boolean isStatic = kind == OwnerKind.NAMESPACE || kind instanceof OwnerKind.StaticDelegateKind;
|
boolean isStatic = isStatic(kind);
|
||||||
|
|
||||||
if (kind == OwnerKind.TRAIT_IMPL) {
|
if (kind == OwnerKind.TRAIT_IMPL) {
|
||||||
String correctedDescr = "(" + jvmSignature.getDescriptor().substring(jvmSignature.getDescriptor().indexOf(";") + 1);
|
String correctedDescr = "(" + jvmSignature.getDescriptor().substring(jvmSignature.getDescriptor().indexOf(";") + 1);
|
||||||
|
|||||||
Reference in New Issue
Block a user