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.backend.common.CodegenUtil;
import org.jetbrains.kotlin.builtins.InlineStrategy; import org.jetbrains.kotlin.builtins.InlineStrategy;
import org.jetbrains.kotlin.builtins.InlineUtil; import org.jetbrains.kotlin.builtins.InlineUtil;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.codegen.*; import org.jetbrains.kotlin.codegen.*;
import org.jetbrains.kotlin.codegen.context.CodegenContext; import org.jetbrains.kotlin.codegen.context.CodegenContext;
import org.jetbrains.kotlin.codegen.context.FieldOwnerContext; import org.jetbrains.kotlin.codegen.context.FieldOwnerContext;
@@ -468,7 +469,7 @@ public class InlineCodegen extends CallGenerator {
} }
//TODO: check type of context //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) { private void putParameterOnStack(ParameterInfo... infos) {
@@ -18,7 +18,10 @@ package org.jetbrains.kotlin.builtins;
import org.jetbrains.annotations.NotNull; import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; 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.descriptors.annotations.AnnotationDescriptor;
import org.jetbrains.kotlin.resolve.DescriptorUtils; import org.jetbrains.kotlin.resolve.DescriptorUtils;
import org.jetbrains.kotlin.resolve.constants.ArrayValue; import org.jetbrains.kotlin.resolve.constants.ArrayValue;
@@ -30,14 +33,10 @@ import static kotlin.KotlinPackage.firstOrNull;
public class InlineUtil { public class InlineUtil {
public static boolean hasNoinlineAnnotation(@NotNull CallableDescriptor valueParameterOrReceiver) {
return KotlinBuiltIns.containsAnnotation(valueParameterOrReceiver, KotlinBuiltIns.getNoinlineClassAnnotationFqName());
}
public static boolean isInlineLambdaParameter(@NotNull CallableDescriptor valueParameterOrReceiver) { public static boolean isInlineLambdaParameter(@NotNull CallableDescriptor valueParameterOrReceiver) {
JetType type = valueParameterOrReceiver.getOriginal().getReturnType(); JetType type = valueParameterOrReceiver.getOriginal().getReturnType();
return !hasNoinlineAnnotation(valueParameterOrReceiver) && return type != null &&
type != null && !KotlinBuiltIns.isNoinline(valueParameterOrReceiver) &&
KotlinBuiltIns.isExactFunctionOrExtensionFunctionType(type); KotlinBuiltIns.isExactFunctionOrExtensionFunctionType(type);
} }
@@ -47,8 +46,7 @@ public class InlineUtil {
@NotNull @NotNull
public static InlineStrategy getInlineStrategy(@NotNull DeclarationDescriptor descriptor) { public static InlineStrategy getInlineStrategy(@NotNull DeclarationDescriptor descriptor) {
ClassDescriptor inlineAnnotation = KotlinBuiltIns.getInstance().getInlineClassAnnotation(); AnnotationDescriptor annotation = descriptor.getAnnotations().findAnnotation(KotlinBuiltIns.FQ_NAMES.inline);
AnnotationDescriptor annotation = descriptor.getAnnotations().findAnnotation(DescriptorUtils.getFqNameSafe(inlineAnnotation));
if (annotation == null) { if (annotation == null) {
return InlineStrategy.NOT_INLINE; return InlineStrategy.NOT_INLINE;
} }
@@ -159,6 +159,7 @@ public class KotlinBuiltIns {
public final FqName data = fqName("data"); public final FqName data = fqName("data");
public final FqName deprecated = fqName("deprecated"); public final FqName deprecated = fqName("deprecated");
public final FqName tailRecursive = fqName("tailRecursive"); public final FqName tailRecursive = fqName("tailRecursive");
public final FqName inline = fqName("inline");
public final FqName noinline = fqName("noinline"); public final FqName noinline = fqName("noinline");
public final FqNameUnsafe kClass = new FqName("kotlin.reflect.KClass").toUnsafe(); public final FqNameUnsafe kClass = new FqName("kotlin.reflect.KClass").toUnsafe();
@@ -347,16 +348,6 @@ public class KotlinBuiltIns {
return getBuiltInClassByName("data"); return getBuiltInClassByName("data");
} }
@NotNull
public static FqName getNoinlineClassAnnotationFqName() {
return FQ_NAMES.noinline;
}
@NotNull
public ClassDescriptor getInlineClassAnnotation() {
return getBuiltInClassByName("inline");
}
@NotNull @NotNull
public ClassDescriptor getInlineOptionsClassAnnotation() { public ClassDescriptor getInlineOptionsClassAnnotation() {
return getBuiltInClassByName("inlineOptions"); return getBuiltInClassByName("inlineOptions");
@@ -879,11 +870,16 @@ public class KotlinBuiltIns {
return containsAnnotation(declarationDescriptor, FQ_NAMES.tailRecursive); 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) { public static boolean isSuppressAnnotation(@NotNull AnnotationDescriptor annotationDescriptor) {
return isConstructedFromGivenClass(annotationDescriptor.getType(), FQ_NAMES.suppress); 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; return descriptor.getOriginal().getAnnotations().findAnnotation(annotationClassFqName) != null;
} }