@@ -1772,131 +1772,150 @@ CanType
1772
1772
TypeConverter::computeLoweredRValueType (TypeExpansionContext forExpansion,
1773
1773
AbstractionPattern origType,
1774
1774
CanType substType) {
1775
- // AST function types are turned into SIL function types:
1776
- // - the type is uncurried as desired
1777
- // - types are turned into their unbridged equivalents, depending
1778
- // on the abstract CC
1779
- // - ownership conventions are deduced
1780
- // - a minimal substituted generic signature is extracted to represent
1781
- // possible ABI-compatible substitutions
1782
- if (auto substFnType = dyn_cast<AnyFunctionType>(substType)) {
1783
- // If the formal type uses a C convention, it is not formally
1784
- // abstractable, and it may be subject to implicit bridging.
1785
- auto extInfo = substFnType->getExtInfo ();
1786
- if (getSILFunctionLanguage (extInfo.getSILRepresentation ())
1787
- == SILFunctionLanguage::C) {
1788
- // The importer only applies fully-reversible bridging to the
1789
- // component types of C function pointers.
1790
- auto bridging = Bridgeability::Full;
1791
- if (extInfo.getSILRepresentation ()
1792
- == SILFunctionTypeRepresentation::CFunctionPointer)
1793
- bridging = Bridgeability::None;
1794
-
1795
- // Bridge the parameters and result of the function type.
1796
- auto bridgedFnType = getBridgedFunctionType (origType, substFnType,
1797
- extInfo, bridging);
1798
- substFnType = bridgedFnType;
1799
-
1800
- // Also rewrite the type of the abstraction pattern.
1801
- auto signature = origType.getGenericSignatureOrNull ();
1802
- if (origType.isTypeParameter ()) {
1803
- origType = AbstractionPattern (signature, bridgedFnType);
1804
- } else {
1805
- origType.rewriteType (signature, bridgedFnType);
1775
+ class LoweredRValueTypeVisitor
1776
+ : public CanTypeVisitor<LoweredRValueTypeVisitor, CanType> {
1777
+ TypeConverter &TC;
1778
+ TypeExpansionContext forExpansion;
1779
+ AbstractionPattern origType;
1780
+
1781
+ public:
1782
+ LoweredRValueTypeVisitor (TypeConverter &TC,
1783
+ TypeExpansionContext forExpansion,
1784
+ AbstractionPattern origType)
1785
+ : TC(TC), forExpansion(forExpansion), origType(origType) {}
1786
+
1787
+ // AST function types are turned into SIL function types:
1788
+ // - the type is uncurried as desired
1789
+ // - types are turned into their unbridged equivalents, depending
1790
+ // on the abstract CC
1791
+ // - ownership conventions are deduced
1792
+ // - a minimal substituted generic signature is extracted to represent
1793
+ // possible ABI-compatible substitutions
1794
+ CanType visitAnyFunctionType (CanAnyFunctionType substFnType) {
1795
+ // If the formal type uses a C convention, it is not formally
1796
+ // abstractable, and it may be subject to implicit bridging.
1797
+ auto extInfo = substFnType->getExtInfo ();
1798
+ if (getSILFunctionLanguage (extInfo.getSILRepresentation ()) ==
1799
+ SILFunctionLanguage::C) {
1800
+ // The importer only applies fully-reversible bridging to the
1801
+ // component types of C function pointers.
1802
+ auto bridging = Bridgeability::Full;
1803
+ if (extInfo.getSILRepresentation () ==
1804
+ SILFunctionTypeRepresentation::CFunctionPointer)
1805
+ bridging = Bridgeability::None;
1806
+
1807
+ // Bridge the parameters and result of the function type.
1808
+ auto bridgedFnType =
1809
+ TC.getBridgedFunctionType (origType, substFnType, extInfo, bridging);
1810
+ substFnType = bridgedFnType;
1811
+
1812
+ // Also rewrite the type of the abstraction pattern.
1813
+ auto signature = origType.getGenericSignatureOrNull ();
1814
+ if (origType.isTypeParameter ()) {
1815
+ origType = AbstractionPattern (signature, bridgedFnType);
1816
+ } else {
1817
+ origType.rewriteType (signature, bridgedFnType);
1818
+ }
1806
1819
}
1820
+
1821
+ return ::getNativeSILFunctionType (TC, forExpansion, origType,
1822
+ substFnType);
1807
1823
}
1808
1824
1809
- return getNativeSILFunctionType (*this , forExpansion, origType, substFnType);
1810
- }
1825
+ // Ignore dynamic self types.
1826
+ CanType visitDynamicSelfType (CanDynamicSelfType selfType) {
1827
+ return TC.getLoweredRValueType (forExpansion, origType,
1828
+ selfType.getSelfType ());
1829
+ }
1811
1830
1812
- // Ignore dynamic self types.
1813
- if (auto selfType = dyn_cast<DynamicSelfType>(substType)) {
1814
- return getLoweredRValueType (forExpansion, origType, selfType.getSelfType ());
1815
- }
1831
+ // Static metatypes are unitary and can optimized to a "thin" empty
1832
+ // representation if the type also appears as a static metatype in the
1833
+ // original abstraction pattern.
1834
+ CanType visitMetatypeType (CanMetatypeType substMeta) {
1835
+ // If the metatype has already been lowered, it will already carry its
1836
+ // representation.
1837
+ if (substMeta->hasRepresentation ()) {
1838
+ assert (substMeta->isLegalSILType ());
1839
+ return substOpaqueTypesWithUnderlyingTypes (substMeta, forExpansion);
1840
+ }
1816
1841
1817
- // Static metatypes are unitary and can optimized to a "thin" empty
1818
- // representation if the type also appears as a static metatype in the
1819
- // original abstraction pattern.
1820
- if (auto substMeta = dyn_cast<MetatypeType>(substType)) {
1821
- // If the metatype has already been lowered, it will already carry its
1822
- // representation.
1823
- if (substMeta->hasRepresentation ()) {
1824
- assert (substMeta->isLegalSILType ());
1825
- return substOpaqueTypesWithUnderlyingTypes (substMeta, forExpansion);
1826
- }
1842
+ MetatypeRepresentation repr;
1827
1843
1828
- MetatypeRepresentation repr;
1829
-
1830
- auto origMeta = origType.getAs <MetatypeType>();
1831
- if (!origMeta) {
1832
- // If the metatype matches a dependent type, it must be thick.
1833
- assert (origType.isTypeParameterOrOpaqueArchetype ());
1834
- repr = MetatypeRepresentation::Thick;
1835
- } else {
1836
- // Otherwise, we're thin if the metatype is thinnable both
1837
- // substituted and in the abstraction pattern.
1838
- if (hasSingletonMetatype (substMeta.getInstanceType ())
1839
- && hasSingletonMetatype (origMeta.getInstanceType ()))
1840
- repr = MetatypeRepresentation::Thin;
1841
- else
1844
+ auto origMeta = origType.getAs <MetatypeType>();
1845
+ if (!origMeta) {
1846
+ // If the metatype matches a dependent type, it must be thick.
1847
+ assert (origType.isTypeParameterOrOpaqueArchetype ());
1842
1848
repr = MetatypeRepresentation::Thick;
1843
- }
1849
+ } else {
1850
+ // Otherwise, we're thin if the metatype is thinnable both
1851
+ // substituted and in the abstraction pattern.
1852
+ if (hasSingletonMetatype (substMeta.getInstanceType ()) &&
1853
+ hasSingletonMetatype (origMeta.getInstanceType ()))
1854
+ repr = MetatypeRepresentation::Thin;
1855
+ else
1856
+ repr = MetatypeRepresentation::Thick;
1857
+ }
1844
1858
1845
- CanType instanceType = substOpaqueTypesWithUnderlyingTypes (
1846
- substMeta.getInstanceType (), forExpansion);
1859
+ CanType instanceType = substOpaqueTypesWithUnderlyingTypes (
1860
+ substMeta.getInstanceType (), forExpansion);
1847
1861
1848
- // Regardless of thinness, metatypes are always trivial.
1849
- return CanMetatypeType::get (instanceType, repr);
1850
- }
1862
+ // Regardless of thinness, metatypes are always trivial.
1863
+ return CanMetatypeType::get (instanceType, repr);
1864
+ }
1851
1865
1852
- // Give existential metatypes @thick representation by default.
1853
- if (auto existMetatype = dyn_cast<ExistentialMetatypeType>(substType)) {
1854
- if (existMetatype->hasRepresentation ()) {
1855
- assert (existMetatype->isLegalSILType ());
1856
- return existMetatype;
1866
+ // Give existential metatypes @thick representation by default.
1867
+ CanType
1868
+ visitExistentialMetatypeType (CanExistentialMetatypeType existMetatype) {
1869
+ if (existMetatype->hasRepresentation ()) {
1870
+ assert (existMetatype->isLegalSILType ());
1871
+ return existMetatype;
1872
+ }
1873
+
1874
+ return CanExistentialMetatypeType::get (existMetatype.getInstanceType (),
1875
+ MetatypeRepresentation::Thick);
1857
1876
}
1858
1877
1859
- return CanExistentialMetatypeType::get (existMetatype.getInstanceType (),
1860
- MetatypeRepresentation::Thick);
1861
- }
1878
+ // Lower tuple element types.
1879
+ CanType visitTupleType (CanTupleType substTupleType) {
1880
+ return computeLoweredTupleType (TC, forExpansion, origType,
1881
+ substTupleType);
1882
+ }
1862
1883
1863
- // Lower tuple element types.
1864
- if ( auto substTupleType = dyn_cast<TupleType>(substType) ) {
1865
- return computeLoweredTupleType (* this , forExpansion, origType,
1866
- substTupleType );
1867
- }
1884
+ // Lower the referent type of reference storage types.
1885
+ CanType visitReferenceStorageType (CanReferenceStorageType substRefType ) {
1886
+ return computeLoweredReferenceStorageType (TC , forExpansion, origType,
1887
+ substRefType );
1888
+ }
1868
1889
1869
- // Lower the referent type of reference storage types.
1870
- if (auto substRefType = dyn_cast<ReferenceStorageType>(substType)) {
1871
- return computeLoweredReferenceStorageType (*this , forExpansion, origType,
1872
- substRefType);
1873
- }
1890
+ CanType visitSILFunctionType (CanSILFunctionType silFnTy) {
1891
+ if (!silFnTy->hasOpaqueArchetype () ||
1892
+ !forExpansion.shouldLookThroughOpaqueTypeArchetypes ())
1893
+ return silFnTy;
1894
+ return silFnTy->substituteOpaqueArchetypes (TC, forExpansion);
1895
+ }
1874
1896
1875
- // Lower the object type of optional types.
1876
- if (auto substObjectType = substType.getOptionalObjectType ()) {
1877
- return computeLoweredOptionalType (*this , forExpansion, origType,
1878
- substType, substObjectType);
1879
- }
1897
+ CanType visitType (CanType substType) {
1898
+ // Lower the object type of optional types.
1899
+ if (auto substObjectType = substType.getOptionalObjectType ()) {
1900
+ return computeLoweredOptionalType (TC, forExpansion, origType, substType,
1901
+ substObjectType);
1902
+ }
1880
1903
1881
- if (auto silFnTy = dyn_cast<SILFunctionType>(substType)) {
1882
- if (!substType->hasOpaqueArchetype () ||
1883
- !forExpansion.shouldLookThroughOpaqueTypeArchetypes ())
1884
- return substType;
1885
- return silFnTy->substituteOpaqueArchetypes (*this , forExpansion);
1886
- }
1904
+ // The Swift type directly corresponds to the lowered type.
1905
+ auto underlyingTy =
1906
+ substOpaqueTypesWithUnderlyingTypes (substType, forExpansion,
1907
+ /* allowLoweredTypes*/ true );
1908
+ if (underlyingTy != substType) {
1909
+ underlyingTy =
1910
+ TC.computeLoweredRValueType (forExpansion, origType, underlyingTy);
1911
+ }
1887
1912
1888
- // The Swift type directly corresponds to the lowered type.
1889
- auto underlyingTy =
1890
- substOpaqueTypesWithUnderlyingTypes (substType, forExpansion,
1891
- /* allowLoweredTypes*/ true );
1892
- if (underlyingTy != substType) {
1893
- underlyingTy = computeLoweredRValueType (
1894
- forExpansion,
1895
- origType,
1896
- underlyingTy);
1897
- }
1913
+ return underlyingTy;
1914
+ }
1915
+ };
1898
1916
1899
- return underlyingTy;
1917
+ LoweredRValueTypeVisitor visitor (*this , forExpansion, origType);
1918
+ return visitor.visit (substType);
1900
1919
}
1901
1920
1902
1921
const TypeLowering &
0 commit comments