Minor, rename InlineUtil.getInlineType -> getInlineStrategy

This commit is contained in:
Alexander Udalov
2015-04-15 19:04:00 +03:00
parent 4a2fac6f40
commit 7cbbc5f98d
6 changed files with 35 additions and 50 deletions
@@ -113,7 +113,7 @@ public class InlineCodegen extends CallGenerator {
jvmSignature = typeMapper.mapSignature(functionDescriptor, context.getContextKind()); jvmSignature = typeMapper.mapSignature(functionDescriptor, context.getContextKind());
// TODO: implement AS_FUNCTION inline strategy // TODO: implement AS_FUNCTION inline strategy
InlineStrategy inlineStrategy = InlineUtil.getInlineType(functionDescriptor); InlineStrategy inlineStrategy = InlineUtil.getInlineStrategy(functionDescriptor);
this.asFunctionInline = false; this.asFunctionInline = false;
isSameModule = JvmCodegenUtil.isCallInsideSameModuleAsDeclared(functionDescriptor, codegen.getContext(), state.getOutDirectory()); isSameModule = JvmCodegenUtil.isCallInsideSameModuleAsDeclared(functionDescriptor, codegen.getContext(), state.getOutDirectory());
@@ -16,11 +16,9 @@
package org.jetbrains.kotlin.builtins; package org.jetbrains.kotlin.builtins;
import kotlin.KotlinPackage;
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.*;
import org.jetbrains.kotlin.descriptors.annotations.Annotated;
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;
@@ -28,7 +26,7 @@ import org.jetbrains.kotlin.resolve.constants.CompileTimeConstant;
import org.jetbrains.kotlin.resolve.constants.EnumValue; import org.jetbrains.kotlin.resolve.constants.EnumValue;
import org.jetbrains.kotlin.types.JetType; import org.jetbrains.kotlin.types.JetType;
import java.util.List; import static kotlin.KotlinPackage.firstOrNull;
public class InlineUtil { public class InlineUtil {
@@ -44,23 +42,22 @@ public class InlineUtil {
} }
public static boolean isInline(@Nullable DeclarationDescriptor descriptor) { public static boolean isInline(@Nullable DeclarationDescriptor descriptor) {
return descriptor instanceof SimpleFunctionDescriptor && getInlineType(descriptor).isInline(); return descriptor instanceof SimpleFunctionDescriptor && getInlineStrategy(descriptor).isInline();
} }
@NotNull @NotNull
public static InlineStrategy getInlineType(@NotNull DeclarationDescriptor descriptor) { public static InlineStrategy getInlineStrategy(@NotNull DeclarationDescriptor descriptor) {
ClassDescriptor inlineAnnotation = KotlinBuiltIns.getInstance().getInlineClassAnnotation(); ClassDescriptor inlineAnnotation = KotlinBuiltIns.getInstance().getInlineClassAnnotation();
AnnotationDescriptor annotation = descriptor.getAnnotations().findAnnotation(DescriptorUtils.getFqNameSafe(inlineAnnotation)); AnnotationDescriptor annotation = descriptor.getAnnotations().findAnnotation(DescriptorUtils.getFqNameSafe(inlineAnnotation));
if (annotation == null) { if (annotation == null) {
return InlineStrategy.NOT_INLINE; return InlineStrategy.NOT_INLINE;
} }
CompileTimeConstant<?> argument = getAnnotationSingleArgument(descriptor, inlineAnnotation); CompileTimeConstant<?> argument = firstOrNull(annotation.getAllValueArguments().values());
if (argument == null) { if (argument == null) {
return InlineStrategy.AS_FUNCTION; return InlineStrategy.AS_FUNCTION;
} }
assert argument instanceof EnumValue : "Inline annotation parameter should be enum entry but was: " + argument; assert argument instanceof EnumValue : "Inline annotation parameter should be enum entry but was: " + argument;
String name = ((EnumValue) argument).getValue().getName().asString(); return InlineStrategy.valueOf(((EnumValue) argument).getValue().getName().asString());
return name.equals(InlineStrategy.IN_PLACE.name()) ? InlineStrategy.IN_PLACE : InlineStrategy.AS_FUNCTION;
} }
public static boolean hasOnlyLocalContinueAndBreak(@NotNull ValueParameterDescriptor descriptor) { public static boolean hasOnlyLocalContinueAndBreak(@NotNull ValueParameterDescriptor descriptor) {
@@ -72,15 +69,14 @@ public class InlineUtil {
} }
private static boolean hasInlineOption(@NotNull ValueParameterDescriptor descriptor, @NotNull InlineOption option) { private static boolean hasInlineOption(@NotNull ValueParameterDescriptor descriptor, @NotNull InlineOption option) {
CompileTimeConstant<?> argument = AnnotationDescriptor annotation = descriptor.getAnnotations().findAnnotation(
getAnnotationSingleArgument(descriptor, KotlinBuiltIns.getInstance().getInlineOptionsClassAnnotation()); DescriptorUtils.getFqNameSafe(KotlinBuiltIns.getInstance().getInlineOptionsClassAnnotation())
);
if (argument instanceof ArrayValue) { if (annotation != null) {
List<CompileTimeConstant<?>> values = ((ArrayValue) argument).getValue(); CompileTimeConstant<?> argument = firstOrNull(annotation.getAllValueArguments().values());
if (argument instanceof ArrayValue) {
for (CompileTimeConstant<?> value : values) { for (CompileTimeConstant<?> value : ((ArrayValue) argument).getValue()) {
if (value instanceof EnumValue) { if (value instanceof EnumValue && ((EnumValue) value).getValue().getName().asString().equals(option.name())) {
if (((EnumValue) value).getValue().getName().asString().equals(option.name())) {
return true; return true;
} }
} }
@@ -89,16 +85,4 @@ public class InlineUtil {
return false; return false;
} }
@Nullable
private static CompileTimeConstant<?> getAnnotationSingleArgument(
@NotNull Annotated annotated,
@NotNull ClassDescriptor annotationClass
) {
AnnotationDescriptor annotation = annotated.getAnnotations().findAnnotation(DescriptorUtils.getFqNameSafe(annotationClass));
if (annotation != null) {
return KotlinPackage.firstOrNull(annotation.getAllValueArguments().values());
}
return null;
}
} }
@@ -408,14 +408,15 @@ public class JetPositionManager(private val myDebugProcess: DebugProcess) : Mult
val call = (parent as JetElement).getResolvedCall(context) val call = (parent as JetElement).getResolvedCall(context)
if (call == null) return false if (call == null) return false
val inlineType = InlineUtil.getInlineType(call.getResultingDescriptor()) if (!InlineUtil.isInline(call.getResultingDescriptor())) return false
if (!inlineType.isInline()) return false
for ((valueParameterDescriptor, resolvedValueArgument) in call.getValueArguments()) { for ((valueParameterDescriptor, resolvedValueArgument) in call.getValueArguments()) {
for (next in resolvedValueArgument.getArguments()) { for (next in resolvedValueArgument.getArguments()) {
val expression = next.getArgumentExpression() val expression = next.getArgumentExpression()
if (valueArgument == expression) { if (valueArgument == expression) {
return InlineAnalyzerExtension.checkInlinableParameter(valueParameterDescriptor, expression, call.getResultingDescriptor(), null) return InlineAnalyzerExtension.checkInlinableParameter(
valueParameterDescriptor, expression, call.getResultingDescriptor(), null
)
} }
} }
} }
@@ -419,7 +419,7 @@ public final class ExpressionVisitor extends TranslatorVisitor<JsNode> {
FunctionDescriptor descriptor = getFunctionDescriptor(context.bindingContext(), expression); FunctionDescriptor descriptor = getFunctionDescriptor(context.bindingContext(), expression);
JsName name = context.getNameForDescriptor(descriptor); JsName name = context.getNameForDescriptor(descriptor);
if (InlineUtil.getInlineType(descriptor).isInline()) { if (InlineUtil.isInline(descriptor)) {
MetadataPackage.setStaticRef(name, alias); MetadataPackage.setStaticRef(name, alias);
} }
@@ -17,22 +17,21 @@
package org.jetbrains.kotlin.js.translate.expression package org.jetbrains.kotlin.js.translate.expression
import com.google.dart.compiler.backend.js.ast.* import com.google.dart.compiler.backend.js.ast.*
import com.google.dart.compiler.backend.js.ast.metadata.staticRef
import com.google.dart.compiler.backend.js.ast.metadata.isLocal import com.google.dart.compiler.backend.js.ast.metadata.isLocal
import org.jetbrains.kotlin.descriptors.CallableDescriptor import com.google.dart.compiler.backend.js.ast.metadata.staticRef
import org.jetbrains.kotlin.descriptors.ReceiverParameterDescriptor import org.jetbrains.kotlin.builtins.InlineUtil
import org.jetbrains.kotlin.psi.JetDeclarationWithBody import org.jetbrains.kotlin.descriptors.*
import org.jetbrains.kotlin.js.translate.context.* import org.jetbrains.kotlin.js.inline.util.getInnerFunction
import org.jetbrains.kotlin.js.translate.context.TranslationContext
import org.jetbrains.kotlin.js.translate.context.getNameForCapturedDescriptor
import org.jetbrains.kotlin.js.translate.context.hasCapturedExceptContaining
import org.jetbrains.kotlin.js.translate.context.isCaptured
import org.jetbrains.kotlin.js.translate.general.AbstractTranslator import org.jetbrains.kotlin.js.translate.general.AbstractTranslator
import org.jetbrains.kotlin.js.translate.utils.BindingUtils.getFunctionDescriptor import org.jetbrains.kotlin.js.translate.utils.BindingUtils.getFunctionDescriptor
import org.jetbrains.kotlin.js.translate.utils.FunctionBodyTranslator.translateFunctionBody import org.jetbrains.kotlin.js.translate.utils.FunctionBodyTranslator.translateFunctionBody
import org.jetbrains.kotlin.js.translate.utils.TranslationUtils.simpleReturnFunction
import org.jetbrains.kotlin.descriptors.MemberDescriptor
import org.jetbrains.kotlin.descriptors.Visibilities
import org.jetbrains.kotlin.js.translate.utils.JsAstUtils import org.jetbrains.kotlin.js.translate.utils.JsAstUtils
import org.jetbrains.kotlin.js.inline.util.getInnerFunction import org.jetbrains.kotlin.js.translate.utils.TranslationUtils.simpleReturnFunction
import org.jetbrains.kotlin.builtins.InlineUtil import org.jetbrains.kotlin.psi.JetDeclarationWithBody
import org.jetbrains.kotlin.descriptors.FunctionDescriptor
class LiteralFunctionTranslator(context: TranslationContext) : AbstractTranslator(context) { class LiteralFunctionTranslator(context: TranslationContext) : AbstractTranslator(context) {
fun translate(declaration: JetDeclarationWithBody): JsExpression { fun translate(declaration: JetDeclarationWithBody): JsExpression {
@@ -196,5 +195,5 @@ private fun HasName.getStaticRef(): JsNode? {
private fun isLocalInlineDeclaration(descriptor: CallableDescriptor): Boolean { private fun isLocalInlineDeclaration(descriptor: CallableDescriptor): Boolean {
return descriptor is FunctionDescriptor return descriptor is FunctionDescriptor
&& descriptor.getVisibility() == Visibilities.LOCAL && descriptor.getVisibility() == Visibilities.LOCAL
&& InlineUtil.getInlineType(descriptor).isInline() && InlineUtil.isInline(descriptor)
} }
@@ -22,7 +22,10 @@ import org.jetbrains.annotations.NotNull;
import org.jetbrains.annotations.Nullable; import org.jetbrains.annotations.Nullable;
import org.jetbrains.kotlin.builtins.InlineUtil; import org.jetbrains.kotlin.builtins.InlineUtil;
import org.jetbrains.kotlin.builtins.KotlinBuiltIns; import org.jetbrains.kotlin.builtins.KotlinBuiltIns;
import org.jetbrains.kotlin.descriptors.*; import org.jetbrains.kotlin.descriptors.CallableDescriptor;
import org.jetbrains.kotlin.descriptors.FunctionDescriptor;
import org.jetbrains.kotlin.descriptors.SimpleFunctionDescriptor;
import org.jetbrains.kotlin.descriptors.ValueParameterDescriptor;
import org.jetbrains.kotlin.js.parser.ParserPackage; import org.jetbrains.kotlin.js.parser.ParserPackage;
import org.jetbrains.kotlin.js.translate.callTranslator.CallTranslator; import org.jetbrains.kotlin.js.translate.callTranslator.CallTranslator;
import org.jetbrains.kotlin.js.translate.context.TranslationContext; import org.jetbrains.kotlin.js.translate.context.TranslationContext;
@@ -80,9 +83,7 @@ public final class CallExpressionTranslator extends AbstractCallExpressionTransl
} }
if (descriptor instanceof ValueParameterDescriptor) { if (descriptor instanceof ValueParameterDescriptor) {
DeclarationDescriptor containingDescriptor = descriptor.getContainingDeclaration(); return InlineUtil.isInline(descriptor.getContainingDeclaration()) && InlineUtil.isInlineLambdaParameter(descriptor);
return InlineUtil.getInlineType(containingDescriptor).isInline()
&& InlineUtil.isInlineLambdaParameter(descriptor);
} }
return false; return false;