Minor, simplify some checks in InlineUtil

This commit is contained in:
Alexander Udalov
2015-04-15 22:33:48 +03:00
parent 7cbbc5f98d
commit d93a7a9547
3 changed files with 16 additions and 21 deletions
@@ -24,6 +24,7 @@ import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.backend.common.CodegenUtil;
import org.jetbrains.kotlin.builtins.InlineStrategy;
import org.jetbrains.kotlin.builtins.InlineUtil;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.codegen.*;
import org.jetbrains.kotlin.codegen.context.CodegenContext;
import org.jetbrains.kotlin.codegen.context.FieldOwnerContext;
@@ -468,7 +469,7 @@ public class InlineCodegen extends CallGenerator {
}
//TODO: check type of context
return !(codegen.getContext().isInliningLambda() && descriptor != null && !InlineUtil.hasNoinlineAnnotation(descriptor));
return !(codegen.getContext().isInliningLambda() && descriptor != null && !KotlinBuiltIns.isNoinline(descriptor));
}
private void putParameterOnStack(ParameterInfo... infos) {
@@ -18,7 +18,10 @@ package org.jetbrains.kotlin.builtins;
import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.descriptors.*;
import org.jetbrains.kotlin.descriptors.CallableDescriptor;
import org.jetbrains.kotlin.descriptors.DeclarationDescriptor;
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor;
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor;
import org.jetbrains.kotlin.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.constants.ArrayValue;
@@ -30,14 +33,10 @@ import static kotlin.KotlinPackage.firstOrNull;
public class InlineUtil {
public static boolean hasNoinlineAnnotation(@NotNull CallableDescriptor valueParameterOrReceiver) {
return KotlinBuiltIns.containsAnnotation(valueParameterOrReceiver, KotlinBuiltIns.getNoinlineClassAnnotationFqName());
}
public static boolean isInlineLambdaParameter(@NotNull CallableDescriptor valueParameterOrReceiver) {
JetType type = valueParameterOrReceiver.getOriginal().getReturnType();
return !hasNoinlineAnnotation(valueParameterOrReceiver) &&
type != null &&
return type != null &&
!KotlinBuiltIns.isNoinline(valueParameterOrReceiver) &&
KotlinBuiltIns.isExactFunctionOrExtensionFunctionType(type);
}
@@ -47,8 +46,7 @@ public class InlineUtil {
@NotNull
public static InlineStrategy getInlineStrategy(@NotNull DeclarationDescriptor descriptor) {
ClassDescriptor inlineAnnotation = KotlinBuiltIns.getInstance().getInlineClassAnnotation();
AnnotationDescriptor annotation = descriptor.getAnnotations().findAnnotation(DescriptorUtils.getFqNameSafe(inlineAnnotation));
AnnotationDescriptor annotation = descriptor.getAnnotations().findAnnotation(KotlinBuiltIns.FQ_NAMES.inline);
if (annotation == null) {
return InlineStrategy.NOT_INLINE;
}
@@ -159,6 +159,7 @@ public class KotlinBuiltIns {
public final FqName data = fqName("data");
public final FqName deprecated = fqName("deprecated");
public final FqName tailRecursive = fqName("tailRecursive");
public final FqName inline = fqName("inline");
public final FqName noinline = fqName("noinline");
public final FqNameUnsafe kClass = new FqName("kotlin.reflect.KClass").toUnsafe();
@@ -347,16 +348,6 @@ public class KotlinBuiltIns {
return getBuiltInClassByName("data");
}
@NotNull
public static FqName getNoinlineClassAnnotationFqName() {
return FQ_NAMES.noinline;
}
@NotNull
public ClassDescriptor getInlineClassAnnotation() {
return getBuiltInClassByName("inline");
}
@NotNull
public ClassDescriptor getInlineOptionsClassAnnotation() {
return getBuiltInClassByName("inlineOptions");
@@ -879,11 +870,16 @@ public class KotlinBuiltIns {
return containsAnnotation(declarationDescriptor, FQ_NAMES.tailRecursive);
}
/** Checks that the symbol represented by the descriptor is annotated with the {@code kotlin.noinline} annotation */
public static boolean isNoinline(@NotNull DeclarationDescriptor descriptor) {
return containsAnnotation(descriptor, FQ_NAMES.noinline);
}
public static boolean isSuppressAnnotation(@NotNull AnnotationDescriptor annotationDescriptor) {
return isConstructedFromGivenClass(annotationDescriptor.getType(), FQ_NAMES.suppress);
}
static boolean containsAnnotation(DeclarationDescriptor descriptor, FqName annotationClassFqName) {
private static boolean containsAnnotation(DeclarationDescriptor descriptor, FqName annotationClassFqName) {
return descriptor.getOriginal().getAnnotations().findAnnotation(annotationClassFqName) != null;
}