From 582259ffdabdb3c0a25a4d4b19fbdd67aea9a6fa Mon Sep 17 00:00:00 2001 From: "Pavel V. Talanov" Date: Wed, 28 Mar 2012 14:25:09 +0400 Subject: [PATCH] Support for inline in front-end. Add SimpleFunctionDescriptor#isInline. --- .../jetbrains/jet/codegen/CodegenContext.java | 3 ++- .../jetbrains/jet/codegen/CodegenUtil.java | 5 +++- .../resolve/java/JavaDescriptorResolver.java | 3 ++- .../descriptors/SimpleFunctionDescriptor.java | 2 ++ .../SimpleFunctionDescriptorImpl.java | 27 ++++++++++++++++--- .../jet/lang/resolve/DescriptorResolver.java | 5 +++- .../jetbrains/jet/lang/types/ErrorUtils.java | 3 ++- .../ClosureExpressionsTypingVisitor.java | 10 ++++++- 8 files changed, 48 insertions(+), 10 deletions(-) diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java index fbfcd1a7441..9242a2598fd 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenContext.java @@ -242,7 +242,8 @@ public abstract class CodegenContext { fd.getValueParameters(), fd.getReturnType(), fd.getModality(), - fd.getVisibility()); + fd.getVisibility(), + /*isInline = */ false); accessor = myAccessor; } else if(descriptor instanceof PropertyDescriptor) { diff --git a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java index 7f08199388c..5e74a9ce847 100644 --- a/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java +++ b/compiler/backend/src/org/jetbrains/jet/codegen/CodegenUtil.java @@ -72,7 +72,10 @@ public class CodegenUtil { Collections.emptyList(), fd.getValueParameters(), fd.getReturnType(), - Modality.FINAL, Visibility.PUBLIC); + Modality.FINAL, + Visibility.PUBLIC, + /*isInline = */false + ); return invokeDescriptor; } diff --git a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java index a77a3a9f4d1..e64deda84ee 100644 --- a/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java +++ b/compiler/frontend.java/src/org/jetbrains/jet/lang/resolve/java/JavaDescriptorResolver.java @@ -1518,7 +1518,8 @@ public class JavaDescriptorResolver { valueParameterDescriptors.descriptors, makeReturnType(returnType, method, methodTypeVariableResolver), Modality.convertFromFlags(method.getPsiMethod().hasModifierProperty(PsiModifier.ABSTRACT), !method.isFinal()), - resolveVisibilityFromPsiModifiers(method.getPsiMethod()) + resolveVisibilityFromPsiModifiers(method.getPsiMethod()), + /*isInline = */ false ); trace.record(BindingContext.FUNCTION, method.getPsiMethod(), functionDescriptorImpl); FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptor.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptor.java index 05f756029e0..b201706e4bb 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptor.java @@ -32,4 +32,6 @@ public interface SimpleFunctionDescriptor extends FunctionDescriptor { @NotNull @Override SimpleFunctionDescriptor getOriginal(); + + boolean isInline(); } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptorImpl.java b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptorImpl.java index 9ea0394a6a8..ac23688c067 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptorImpl.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/descriptors/SimpleFunctionDescriptorImpl.java @@ -31,6 +31,8 @@ import java.util.List; */ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl implements SimpleFunctionDescriptor { + private boolean isInline = false; + public SimpleFunctionDescriptorImpl( @NotNull DeclarationDescriptor containingDeclaration, @NotNull List annotations, @@ -48,9 +50,18 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme super(containingDeclaration, original, annotations, name, kind); } - @Override - public FunctionDescriptorImpl initialize(@Nullable JetType receiverType, @NotNull ReceiverDescriptor expectedThisObject, @NotNull List typeParameters, @NotNull List unsubstitutedValueParameters, @Nullable JetType unsubstitutedReturnType, @Nullable Modality modality, @NotNull Visibility visibility) { - return super.initialize(receiverType, expectedThisObject, typeParameters, unsubstitutedValueParameters, unsubstitutedReturnType, modality, visibility); + public SimpleFunctionDescriptorImpl initialize(@Nullable JetType receiverType, + @NotNull ReceiverDescriptor expectedThisObject, + @NotNull List typeParameters, + @NotNull List unsubstitutedValueParameters, + @Nullable JetType unsubstitutedReturnType, + @Nullable Modality modality, + @NotNull Visibility visibility, + boolean isInline) { + SimpleFunctionDescriptorImpl result = (SimpleFunctionDescriptorImpl)super.initialize(receiverType, expectedThisObject, typeParameters, unsubstitutedValueParameters, + unsubstitutedReturnType, modality, visibility); + result.isInline = isInline; + return result; } @NotNull @@ -82,6 +93,14 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme @NotNull @Override public SimpleFunctionDescriptor copy(DeclarationDescriptor newOwner, boolean makeNonAbstract, Kind kind, boolean copyOverrides) { - return (SimpleFunctionDescriptor) doSubstitute(TypeSubstitutor.EMPTY, newOwner, DescriptorUtils.convertModality(modality, makeNonAbstract), false, copyOverrides, kind); + SimpleFunctionDescriptorImpl copy = (SimpleFunctionDescriptorImpl)doSubstitute(TypeSubstitutor.EMPTY, newOwner, DescriptorUtils + .convertModality(modality, makeNonAbstract), false, copyOverrides, kind); + copy.isInline = isInline; + return copy; + } + + @Override + public boolean isInline() { + return isInline; } } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java index 49720a0841e..137b9f49b84 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/resolve/DescriptorResolver.java @@ -219,6 +219,8 @@ public class DescriptorResolver { Modality defaultModality = getDefaultModality(containingDescriptor, hasBody); Modality modality = resolveModalityFromModifiers(function.getModifierList(), defaultModality); Visibility visibility = resolveVisibilityFromModifiers(function.getModifierList()); + JetModifierList modifierList = function.getModifierList(); + boolean isInline = (modifierList != null) && modifierList.hasModifier(JetTokens.INLINE_KEYWORD); functionDescriptor.initialize( receiverType, DescriptorUtils.getExpectedThisObjectIfNeeded(containingDescriptor), @@ -226,7 +228,8 @@ public class DescriptorResolver { valueParameterDescriptors, returnType, modality, - visibility); + visibility, + isInline); trace.record(BindingContext.FUNCTION, function, functionDescriptor); return functionDescriptor; diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java index 9b7af328c4a..51b8dc94514 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/ErrorUtils.java @@ -172,7 +172,8 @@ public class ErrorUtils { Collections.emptyList(), // TODO createErrorType(""), Modality.OPEN, - Visibility.INTERNAL + Visibility.INTERNAL, + /*isInline = */ false ); return function; } diff --git a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ClosureExpressionsTypingVisitor.java b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ClosureExpressionsTypingVisitor.java index 4f7bd0b124a..1edc7de6d44 100644 --- a/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ClosureExpressionsTypingVisitor.java +++ b/compiler/frontend/src/org/jetbrains/jet/lang/types/expressions/ClosureExpressionsTypingVisitor.java @@ -145,7 +145,15 @@ public class ClosureExpressionsTypingVisitor extends ExpressionTypingVisitor { else { effectiveReceiverType = context.expressionTypingServices.getTypeResolver().resolveType(context.scope, receiverTypeRef, context.trace, true); } - functionDescriptor.initialize(effectiveReceiverType, NO_RECEIVER, Collections.emptyList(), valueParameterDescriptors, null, Modality.FINAL, Visibility.LOCAL); + functionDescriptor.initialize(effectiveReceiverType, + NO_RECEIVER, + Collections.emptyList(), + valueParameterDescriptors, + /*unsubstitutedReturnType = */ null, + Modality.FINAL, + Visibility.LOCAL, + /*isInline = */ false + ); context.trace.record(BindingContext.FUNCTION, expression, functionDescriptor); return functionDescriptor; }