diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java index 27616b44e62..055b8c6d192 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/ExpressionCodegen.java @@ -32,9 +32,7 @@ import org.jetbrains.asm4.MethodVisitor; import org.jetbrains.asm4.Type; import org.jetbrains.asm4.commons.InstructionAdapter; import org.jetbrains.asm4.commons.Method; -import org.jetbrains.asm4.tree.MethodNode; import org.jetbrains.jet.codegen.asm.InlineCodegen; -import org.jetbrains.jet.codegen.asm.InlineCodegenUtil; import org.jetbrains.jet.codegen.asm.Inliner; import org.jetbrains.jet.codegen.asm.NameGenerator; import org.jetbrains.jet.codegen.binding.CalculatedClosure; @@ -2125,9 +2123,10 @@ public class ExpressionCodegen extends JetVisitor implem ) { boolean disable = false; CallableDescriptor descriptor = resolvedCall.getResultingDescriptor(); - boolean isInline = descriptor instanceof SimpleFunctionDescriptor && ((SimpleFunctionDescriptor) descriptor).isInline(); - Inliner inliner = !isInline ? Inliner.NOT_INLINE - : new InlineCodegen(this, true, state, disable, (SimpleFunctionDescriptor) unwrapFakeOverride((CallableMemberDescriptor)descriptor.getOriginal())); + boolean isInline = call != null && descriptor instanceof SimpleFunctionDescriptor && ((SimpleFunctionDescriptor) descriptor).getInlineStrategy().isInline(); + Inliner inliner = !isInline ? Inliner.NOT_INLINE : + new InlineCodegen(this, true, state, disable, (SimpleFunctionDescriptor) unwrapFakeOverride( + (CallableMemberDescriptor) descriptor.getOriginal()), call); if (resolvedCall instanceof VariableAsFunctionResolvedCall) { resolvedCall = ((VariableAsFunctionResolvedCall) resolvedCall).getFunctionCall(); diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/context/MethodContext.java b/compiler/backend/src/org/jetbrains/jet/codegen/context/MethodContext.java index b4cd2cec0ad..02dbbcdbb92 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/context/MethodContext.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/context/MethodContext.java @@ -91,7 +91,7 @@ public class MethodContext extends CodegenContext { public boolean isInlineFunction() { DeclarationDescriptor descriptor = getContextDescriptor(); if (descriptor instanceof SimpleFunctionDescriptor) { - return ((SimpleFunctionDescriptor) descriptor).isInline(); + return ((SimpleFunctionDescriptor) descriptor).getInlineStrategy().isInline(); } return false; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/FunctionAnalyzerExtension.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/FunctionAnalyzerExtension.java index 3603cd4d196..740c9157595 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/FunctionAnalyzerExtension.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/FunctionAnalyzerExtension.java @@ -21,7 +21,6 @@ import org.jetbrains.jet.lang.descriptors.FunctionDescriptor; import org.jetbrains.jet.lang.descriptors.SimpleFunctionDescriptor; import org.jetbrains.jet.lang.psi.JetNamedFunction; import org.jetbrains.jet.lang.resolve.extension.InlineAnalyzerExtension; -import org.jetbrains.jet.lang.types.lang.KotlinBuiltIns; import javax.inject.Inject; import java.util.ArrayList; @@ -60,7 +59,7 @@ public class FunctionAnalyzerExtension { private static List getExtensions(@NotNull FunctionDescriptor functionDescriptor) { List list = new ArrayList(); if (functionDescriptor instanceof SimpleFunctionDescriptor && - ((SimpleFunctionDescriptor) functionDescriptor).isInline()) { + ((SimpleFunctionDescriptor) functionDescriptor).getInlineStrategy().isInline()) { list.add(InlineAnalyzerExtension.INSTANCE); } return list; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverExtensionProvider.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverExtensionProvider.java index ae5e3c17b22..1156a0feded 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverExtensionProvider.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/CallResolverExtensionProvider.java @@ -73,7 +73,7 @@ public class CallResolverExtensionProvider { private static void appendExtensionsFor(DeclarationDescriptor declarationDescriptor, List extensions) { if (declarationDescriptor instanceof SimpleFunctionDescriptor) { SimpleFunctionDescriptor descriptor = (SimpleFunctionDescriptor) declarationDescriptor; - if (descriptor.isInline()) { + if (descriptor.getInlineStrategy().isInline()) { extensions.add(new InlineCallResolverExtension(descriptor)); } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/InlineCallResolverExtension.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/InlineCallResolverExtension.java index 060f615831d..e1a01597bce 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/InlineCallResolverExtension.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/calls/InlineCallResolverExtension.java @@ -50,7 +50,7 @@ public class InlineCallResolverExtension implements CallResolverExtension { private final boolean isEffectivelyPublicApiFunction; public InlineCallResolverExtension(@NotNull SimpleFunctionDescriptor descriptor) { - assert descriptor.isInline() : "This extension should be created only for inline functions but not " + descriptor; + assert descriptor.getInlineStrategy().isInline() : "This extension should be created only for inline functions but not " + descriptor; this.descriptor = descriptor; this.isEffectivelyPublicApiFunction = isEffectivelyPublicApi(descriptor); @@ -232,7 +232,7 @@ public class InlineCallResolverExtension implements CallResolverExtension { return isInvoke || //or inline extension - ((SimpleFunctionDescriptor) descriptor).isInline(); + ((SimpleFunctionDescriptor) descriptor).getInlineStrategy().isInline(); } private void checkVisibility(@NotNull CallableDescriptor declarationDescriptor, @NotNull JetElement expression, @NotNull BasicCallResolutionContext context){ diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/extension/InlineAnalyzerExtension.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/extension/InlineAnalyzerExtension.java index 9e27fdbf965..2b7e6bc50bc 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/extension/InlineAnalyzerExtension.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/extension/InlineAnalyzerExtension.java @@ -40,7 +40,7 @@ public class InlineAnalyzerExtension implements FunctionAnalyzerExtension.Analyz public void process( @NotNull final FunctionDescriptor descriptor, @NotNull JetNamedFunction function, @NotNull final BindingTrace trace ) { - assert descriptor instanceof SimpleFunctionDescriptor && ((SimpleFunctionDescriptor) descriptor).isInline() : + assert descriptor instanceof SimpleFunctionDescriptor && ((SimpleFunctionDescriptor) descriptor).getInlineStrategy().isInline() : "This method should be invoced on inline function: " + descriptor; checkDefaults(descriptor, function, trace); diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java index 57a501a1d28..e5655b4969c 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ExpressionTypingUtils.java @@ -159,7 +159,7 @@ public class ExpressionTypingUtils { } CallableDescriptor callable = call.getResultingDescriptor(); - if (callable instanceof SimpleFunctionDescriptor && ((SimpleFunctionDescriptor) callable).isInline()) { + if (callable instanceof SimpleFunctionDescriptor && ((SimpleFunctionDescriptor) callable).getInlineStrategy().isInline()) { DeclarationDescriptor scopeContainerParent = scopeContainer.getContainingDeclaration(); assert scopeContainerParent != null : "parent is null for " + scopeContainer; return scopeContainerParent == variableParent || isCapturedInInline(context, scopeContainerParent, variableParent); diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptor.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptor.java index 90a4e29078f..84f319e7501 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptor.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptor.java @@ -17,6 +17,7 @@ package org.jetbrains.jet.lang.descriptors; import org.jetbrains.annotations.NotNull; +import org.jetbrains.jet.lang.types.lang.InlineStrategy; /** * Simple functions are the ones with 'fun' keyword and function literals @@ -31,5 +32,6 @@ public interface SimpleFunctionDescriptor extends FunctionDescriptor { @Override SimpleFunctionDescriptor getOriginal(); - boolean isInline(); + @NotNull + InlineStrategy getInlineStrategy(); } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/SimpleFunctionDescriptorImpl.java b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/SimpleFunctionDescriptorImpl.java index c543008dd06..b12e8b52223 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/SimpleFunctionDescriptorImpl.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/descriptors/impl/SimpleFunctionDescriptorImpl.java @@ -102,12 +102,8 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme return copy; } - @Override - public boolean isInline() { - return getInlineStrategy() != InlineStrategy.NOT_INLINE; - } - @NotNull + @Override public InlineStrategy getInlineStrategy() { return inlineStrategy; } diff --git a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/InlineStrategy.java b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/InlineStrategy.java index 8f18e29eeb1..871d419a22a 100644 --- a/core/descriptors/src/org/jetbrains/jet/lang/types/lang/InlineStrategy.java +++ b/core/descriptors/src/org/jetbrains/jet/lang/types/lang/InlineStrategy.java @@ -20,4 +20,8 @@ public enum InlineStrategy { AS_FUNCTION, IN_PLACE, NOT_INLINE; + + public boolean isInline() { + return this != NOT_INLINE; + } }