NFC: Add GenericSignature::getCanonicalSignature. (#29105)

Motivation: `GenericSignatureImpl::getCanonicalSignature` crashes for
`GenericSignature` with underlying `nullptr`. This led to verbose workarounds
when computing `CanGenericSignature` from `GenericSignature`.

Solution: `GenericSignature::getCanonicalSignature` is a wrapper around
`GenericSignatureImpl::getCanonicalSignature` that returns the canonical
signature, or `nullptr` if the underlying pointer is `nullptr`.

Rewrite all verbose workarounds using `GenericSignature::getCanonicalSignature`.
This commit is contained in:
Dan Zheng
2020-01-12 12:17:41 -08:00
committed by GitHub
parent 0d87a14785
commit 1486d6b346
42 changed files with 184 additions and 189 deletions

View File

@@ -167,12 +167,12 @@ GenericSignatureBuilder *GenericSignatureImpl::getGenericSignatureBuilder() {
}
bool GenericSignatureImpl::isEqual(GenericSignature Other) {
return getCanonicalSignature() == Other.getPointer()->getCanonicalSignature();
return getCanonicalSignature() == Other.getCanonicalSignature();
}
bool GenericSignatureImpl::isCanonical() const {
if (CanonicalSignatureOrASTContext.is<ASTContext*>()) return true;
if (CanonicalSignatureOrASTContext.is<ASTContext *>())
return true;
return getCanonicalSignature().getPointer() == this;
}
@@ -310,6 +310,14 @@ CanGenericSignature::getCanonical(TypeArrayView<GenericTypeParamType> params,
return CanGenericSignature(canSig);
}
CanGenericSignature GenericSignature::getCanonicalSignature() const {
// If the underlying pointer is null, return `CanGenericSignature()`.
if (isNull())
return CanGenericSignature();
// Otherwise, return the canonical signature of the underlying pointer.
return getPointer()->getCanonicalSignature();
}
CanGenericSignature GenericSignatureImpl::getCanonicalSignature() const {
// If we haven't computed the canonical signature yet, do so now.
if (CanonicalSignatureOrASTContext.isNull()) {