Support for inline in front-end. Add SimpleFunctionDescriptor#isInline.

This commit is contained in:
Pavel V. Talanov
2012-03-28 14:25:09 +04:00
parent 55def7f8ff
commit 582259ffda
8 changed files with 48 additions and 10 deletions
@@ -242,7 +242,8 @@ public abstract class CodegenContext {
fd.getValueParameters(), fd.getValueParameters(),
fd.getReturnType(), fd.getReturnType(),
fd.getModality(), fd.getModality(),
fd.getVisibility()); fd.getVisibility(),
/*isInline = */ false);
accessor = myAccessor; accessor = myAccessor;
} }
else if(descriptor instanceof PropertyDescriptor) { else if(descriptor instanceof PropertyDescriptor) {
@@ -72,7 +72,10 @@ public class CodegenUtil {
Collections.<TypeParameterDescriptor>emptyList(), Collections.<TypeParameterDescriptor>emptyList(),
fd.getValueParameters(), fd.getValueParameters(),
fd.getReturnType(), fd.getReturnType(),
Modality.FINAL, Visibility.PUBLIC); Modality.FINAL,
Visibility.PUBLIC,
/*isInline = */false
);
return invokeDescriptor; return invokeDescriptor;
} }
@@ -1518,7 +1518,8 @@ public class JavaDescriptorResolver {
valueParameterDescriptors.descriptors, valueParameterDescriptors.descriptors,
makeReturnType(returnType, method, methodTypeVariableResolver), makeReturnType(returnType, method, methodTypeVariableResolver),
Modality.convertFromFlags(method.getPsiMethod().hasModifierProperty(PsiModifier.ABSTRACT), !method.isFinal()), Modality.convertFromFlags(method.getPsiMethod().hasModifierProperty(PsiModifier.ABSTRACT), !method.isFinal()),
resolveVisibilityFromPsiModifiers(method.getPsiMethod()) resolveVisibilityFromPsiModifiers(method.getPsiMethod()),
/*isInline = */ false
); );
trace.record(BindingContext.FUNCTION, method.getPsiMethod(), functionDescriptorImpl); trace.record(BindingContext.FUNCTION, method.getPsiMethod(), functionDescriptorImpl);
FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl; FunctionDescriptor substitutedFunctionDescriptor = functionDescriptorImpl;
@@ -32,4 +32,6 @@ public interface SimpleFunctionDescriptor extends FunctionDescriptor {
@NotNull @NotNull
@Override @Override
SimpleFunctionDescriptor getOriginal(); SimpleFunctionDescriptor getOriginal();
boolean isInline();
} }
@@ -31,6 +31,8 @@ import java.util.List;
*/ */
public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl implements SimpleFunctionDescriptor { public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl implements SimpleFunctionDescriptor {
private boolean isInline = false;
public SimpleFunctionDescriptorImpl( public SimpleFunctionDescriptorImpl(
@NotNull DeclarationDescriptor containingDeclaration, @NotNull DeclarationDescriptor containingDeclaration,
@NotNull List<AnnotationDescriptor> annotations, @NotNull List<AnnotationDescriptor> annotations,
@@ -48,9 +50,18 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
super(containingDeclaration, original, annotations, name, kind); super(containingDeclaration, original, annotations, name, kind);
} }
@Override public SimpleFunctionDescriptorImpl initialize(@Nullable JetType receiverType,
public FunctionDescriptorImpl initialize(@Nullable JetType receiverType, @NotNull ReceiverDescriptor expectedThisObject, @NotNull List<TypeParameterDescriptor> typeParameters, @NotNull List<ValueParameterDescriptor> unsubstitutedValueParameters, @Nullable JetType unsubstitutedReturnType, @Nullable Modality modality, @NotNull Visibility visibility) { @NotNull ReceiverDescriptor expectedThisObject,
return super.initialize(receiverType, expectedThisObject, typeParameters, unsubstitutedValueParameters, unsubstitutedReturnType, modality, visibility); @NotNull List<TypeParameterDescriptor> typeParameters,
@NotNull List<ValueParameterDescriptor> 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 @NotNull
@@ -82,6 +93,14 @@ public class SimpleFunctionDescriptorImpl extends FunctionDescriptorImpl impleme
@NotNull @NotNull
@Override @Override
public SimpleFunctionDescriptor copy(DeclarationDescriptor newOwner, boolean makeNonAbstract, Kind kind, boolean copyOverrides) { 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;
} }
} }
@@ -219,6 +219,8 @@ public class DescriptorResolver {
Modality defaultModality = getDefaultModality(containingDescriptor, hasBody); Modality defaultModality = getDefaultModality(containingDescriptor, hasBody);
Modality modality = resolveModalityFromModifiers(function.getModifierList(), defaultModality); Modality modality = resolveModalityFromModifiers(function.getModifierList(), defaultModality);
Visibility visibility = resolveVisibilityFromModifiers(function.getModifierList()); Visibility visibility = resolveVisibilityFromModifiers(function.getModifierList());
JetModifierList modifierList = function.getModifierList();
boolean isInline = (modifierList != null) && modifierList.hasModifier(JetTokens.INLINE_KEYWORD);
functionDescriptor.initialize( functionDescriptor.initialize(
receiverType, receiverType,
DescriptorUtils.getExpectedThisObjectIfNeeded(containingDescriptor), DescriptorUtils.getExpectedThisObjectIfNeeded(containingDescriptor),
@@ -226,7 +228,8 @@ public class DescriptorResolver {
valueParameterDescriptors, valueParameterDescriptors,
returnType, returnType,
modality, modality,
visibility); visibility,
isInline);
trace.record(BindingContext.FUNCTION, function, functionDescriptor); trace.record(BindingContext.FUNCTION, function, functionDescriptor);
return functionDescriptor; return functionDescriptor;
@@ -172,7 +172,8 @@ public class ErrorUtils {
Collections.<ValueParameterDescriptor>emptyList(), // TODO Collections.<ValueParameterDescriptor>emptyList(), // TODO
createErrorType("<ERROR FUNCTION RETURN TYPE>"), createErrorType("<ERROR FUNCTION RETURN TYPE>"),
Modality.OPEN, Modality.OPEN,
Visibility.INTERNAL Visibility.INTERNAL,
/*isInline = */ false
); );
return function; return function;
} }
@@ -145,7 +145,15 @@ public class ClosureExpressionsTypingVisitor extends ExpressionTypingVisitor {
else { else {
effectiveReceiverType = context.expressionTypingServices.getTypeResolver().resolveType(context.scope, receiverTypeRef, context.trace, true); effectiveReceiverType = context.expressionTypingServices.getTypeResolver().resolveType(context.scope, receiverTypeRef, context.trace, true);
} }
functionDescriptor.initialize(effectiveReceiverType, NO_RECEIVER, Collections.<TypeParameterDescriptor>emptyList(), valueParameterDescriptors, null, Modality.FINAL, Visibility.LOCAL); functionDescriptor.initialize(effectiveReceiverType,
NO_RECEIVER,
Collections.<TypeParameterDescriptor>emptyList(),
valueParameterDescriptors,
/*unsubstitutedReturnType = */ null,
Modality.FINAL,
Visibility.LOCAL,
/*isInline = */ false
);
context.trace.record(BindingContext.FUNCTION, expression, functionDescriptor); context.trace.record(BindingContext.FUNCTION, expression, functionDescriptor);
return functionDescriptor; return functionDescriptor;
} }