@@ -5557,6 +5557,19 @@ class ProtocolDecl final : public NominalTypeDecl {
5557
5557
EffectKind kind) const ;
5558
5558
bool hasPolymorphicEffect (EffectKind kind) const ;
5559
5559
5560
+ // / Returns `true` if this protocol contains requirements which have known
5561
+ // / 'ad-hoc' requirements. For example, the protocol contains an associated
5562
+ // / type which is used to constrain generic types of some of its members.
5563
+ // /
5564
+ // / Currently the only instance of such requirement is
5565
+ // / 'SerializationRequirement' in the 'Distributed' module's protocols.
5566
+ bool hasMembersWithAdHocRequirements () const {
5567
+ return isSpecificProtocol (KnownProtocolKind::DistributedActorSystem) ||
5568
+ isSpecificProtocol (KnownProtocolKind::DistributedTargetInvocationEncoder) ||
5569
+ isSpecificProtocol (KnownProtocolKind::DistributedTargetInvocationDecoder) ||
5570
+ isSpecificProtocol (KnownProtocolKind::DistributedTargetInvocationResultHandler);
5571
+ }
5572
+
5560
5573
// / Determine whether this is a "marker" protocol, meaning that is indicates
5561
5574
// / semantics but has no corresponding witness table.
5562
5575
bool isMarkerProtocol () const ;
@@ -7960,7 +7973,7 @@ class AbstractFunctionDecl : public GenericContext, public ValueDecl {
7960
7973
// / Determines whether this function is a 'remoteCall' function,
7961
7974
// / which is used as ad-hoc protocol requirement by the
7962
7975
// / 'DistributedActorSystem' protocol.
7963
- bool isDistributedActorSystemRemoteCall (bool isVoidReturn) const ;
7976
+ bool isDistributedActorSystemRemoteCall (bool isVoidReturn, bool allowRequirement ) const ;
7964
7977
7965
7978
// / Determines whether this function is a 'makeInvocationEncoder' function,
7966
7979
// / which is used as ad-hoc protocol requirement by the
@@ -7970,42 +7983,42 @@ class AbstractFunctionDecl : public GenericContext, public ValueDecl {
7970
7983
// / Determines if this function is a 'recordGenericSubstitution' function,
7971
7984
// / which is used as ad-hoc protocol requirement by the
7972
7985
// / 'DistributedTargetInvocationEncoder' protocol.
7973
- bool isDistributedTargetInvocationEncoderRecordGenericSubstitution () const ;
7986
+ bool isDistributedTargetInvocationEncoderRecordGenericSubstitution (bool allowRequirement ) const ;
7974
7987
7975
7988
// / Determines if this function is a 'recordArgument' function,
7976
7989
// / which is used as ad-hoc protocol requirement by the
7977
7990
// / 'DistributedTargetInvocationEncoder' protocol.
7978
- bool isDistributedTargetInvocationEncoderRecordArgument () const ;
7991
+ bool isDistributedTargetInvocationEncoderRecordArgument (bool allowRequirement ) const ;
7979
7992
7980
7993
// / Determines if this function is a 'recordReturnType' function,
7981
7994
// / which is used as ad-hoc protocol requirement by the
7982
7995
// / 'DistributedTargetInvocationEncoder' protocol.
7983
- bool isDistributedTargetInvocationEncoderRecordReturnType () const ;
7996
+ bool isDistributedTargetInvocationEncoderRecordReturnType (bool allowRequirement ) const ;
7984
7997
7985
7998
// / Determines if this function is a 'recordErrorType' function,
7986
7999
// / which is used as ad-hoc protocol requirement by the
7987
8000
// / 'DistributedTargetInvocationEncoder' protocol.
7988
- bool isDistributedTargetInvocationEncoderRecordErrorType () const ;
8001
+ bool isDistributedTargetInvocationEncoderRecordErrorType (bool allowRequirement ) const ;
7989
8002
7990
8003
// / Determines if this function is a 'decodeNextArgument' function,
7991
8004
// / which is used as ad-hoc protocol requirement by the
7992
8005
// / 'DistributedTargetInvocationDecoder' protocol.
7993
- bool isDistributedTargetInvocationDecoderDecodeNextArgument () const ;
8006
+ bool isDistributedTargetInvocationDecoderDecodeNextArgument (bool allowRequirement ) const ;
7994
8007
7995
8008
// / Determines if this function is a 'onReturn' function,
7996
8009
// / which is used as ad-hoc protocol requirement by the
7997
8010
// / 'DistributedTargetInvocationResultHandler' protocol.
7998
- bool isDistributedTargetInvocationResultHandlerOnReturn () const ;
8011
+ bool isDistributedTargetInvocationResultHandlerOnReturn (bool allowRequirement ) const ;
7999
8012
8000
8013
// / Determines whether this declaration is a witness to a
8001
8014
// / protocol requirement with ad-hoc `SerializationRequirement`
8002
8015
// / conformance.
8003
- bool isDistributedWitnessWithAdHocSerializationRequirement () const {
8004
- return isDistributedActorSystemRemoteCall (/* isVoidResult=*/ false ) ||
8005
- isDistributedTargetInvocationEncoderRecordArgument () ||
8006
- isDistributedTargetInvocationEncoderRecordReturnType () ||
8007
- isDistributedTargetInvocationDecoderDecodeNextArgument () ||
8008
- isDistributedTargetInvocationResultHandlerOnReturn ();
8016
+ bool isDistributedWitnessWithAdHocSerializationRequirement (bool allowRequirement ) const {
8017
+ return isDistributedActorSystemRemoteCall (/* isVoidResult=*/ false , allowRequirement ) ||
8018
+ isDistributedTargetInvocationEncoderRecordArgument (allowRequirement ) ||
8019
+ isDistributedTargetInvocationEncoderRecordReturnType (allowRequirement ) ||
8020
+ isDistributedTargetInvocationDecoderDecodeNextArgument (allowRequirement ) ||
8021
+ isDistributedTargetInvocationResultHandlerOnReturn (allowRequirement );
8009
8022
}
8010
8023
8011
8024
// / For a method of a class, checks whether it will require a new entry in the
0 commit comments