提交 582259ff 编写于 作者: P Pavel V. Talanov

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

上级 55def7f8
......@@ -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) {
......
......@@ -72,7 +72,10 @@ public class CodegenUtil {
Collections.<TypeParameterDescriptor>emptyList(),
fd.getValueParameters(),
fd.getReturnType(),
Modality.FINAL, Visibility.PUBLIC);
Modality.FINAL,
Visibility.PUBLIC,
/*isInline = */false
);
return invokeDescriptor;
}
......
......@@ -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;
......
......@@ -32,4 +32,6 @@ public interface SimpleFunctionDescriptor extends FunctionDescriptor {
@NotNull
@Override
SimpleFunctionDescriptor getOriginal();
boolean isInline();
}
......@@ -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<AnnotationDescriptor> 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<TypeParameterDescriptor> typeParameters, @NotNull List<ValueParameterDescriptor> 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<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
......@@ -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;
}
}
......@@ -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;
......
......@@ -172,7 +172,8 @@ public class ErrorUtils {
Collections.<ValueParameterDescriptor>emptyList(), // TODO
createErrorType("<ERROR FUNCTION RETURN TYPE>"),
Modality.OPEN,
Visibility.INTERNAL
Visibility.INTERNAL,
/*isInline = */ false
);
return function;
}
......
......@@ -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.<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);
return functionDescriptor;
}
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册