Support local suspend functions

Treat them like lambdas. This means:
1) Like local suspend lambdas, which become "non-suspend" after creating
jvmSuspendView, they do this as well
2) They both are generated with the same codegen.
3) They are treated differently only on front-end side.
 #KT-20364: Fixed
This commit is contained in:
Ilmir Usmanov
2018-04-02 21:50:56 +03:00
parent 5a752da9e9
commit bd0ad26dcf
29 changed files with 797 additions and 29 deletions
@@ -144,6 +144,9 @@ public interface FunctionDescriptor extends CallableMemberDescriptor {
@NotNull
CopyBuilder<D> setDropOriginalInContainingParts();
@NotNull
CopyBuilder<D> setDropSuspend();
@NotNull
CopyBuilder<D> setHiddenToOvercomeSignatureClash();
@@ -372,6 +372,7 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
private Map<UserDataKey<?>, Object> userDataMap = new LinkedHashMap<UserDataKey<?>, Object>();
private Boolean newHasSynthesizedParameterNames = null;
protected boolean justForTypeSubstitution = false;
private boolean dropSuspend = false;
public CopyConfiguration(
@NotNull TypeSubstitution substitution,
@@ -500,6 +501,13 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
return this;
}
@Override
@NotNull
public CopyConfiguration setDropSuspend() {
this.dropSuspend = true;
return this;
}
@Override
@NotNull
public CopyConfiguration setHiddenToOvercomeSignatureClash() {
@@ -664,7 +672,11 @@ public abstract class FunctionDescriptorImpl extends DeclarationDescriptorNonRoo
substitutedDescriptor.setExternal(isExternal);
substitutedDescriptor.setInline(isInline);
substitutedDescriptor.setTailrec(isTailrec);
substitutedDescriptor.setSuspend(isSuspend);
if (configuration.dropSuspend) {
substitutedDescriptor.setSuspend(false);
} else {
substitutedDescriptor.setSuspend(isSuspend);
}
substitutedDescriptor.setExpect(isExpect);
substitutedDescriptor.setActual(isActual);
substitutedDescriptor.setHasStableParameterNames(hasStableParameterNames);
@@ -168,6 +168,12 @@ public class ErrorSimpleFunctionDescriptorImpl extends SimpleFunctionDescriptorI
return this;
}
@NotNull
@Override
public CopyBuilder<SimpleFunctionDescriptor> setDropSuspend() {
return this;
}
@NotNull
@Override
public CopyBuilder<SimpleFunctionDescriptor> setHiddenToOvercomeSignatureClash() {