@@ -2303,6 +2303,59 @@ class swift::ASTDeserializer {
2303
2303
PrivateDiscriminatorRAII &privateDiscriminatorRAII);
2304
2304
2305
2305
Expected<Decl *> getDeclCheckedImpl (DeclID DID);
2306
+
2307
+ Expected<Decl *> deserializeTypeAlias (Serialized<Decl *> &declOrOffset,
2308
+ ArrayRef<uint64_t > scratch,
2309
+ StringRef blobData) {
2310
+ IdentifierID nameID;
2311
+ DeclContextID contextID;
2312
+ TypeID underlyingTypeID, interfaceTypeID;
2313
+ bool isImplicit;
2314
+ GenericEnvironmentID genericEnvID;
2315
+ uint8_t rawAccessLevel;
2316
+ ArrayRef<uint64_t > dependencyIDs;
2317
+
2318
+ decls_block::TypeAliasLayout::readRecord (scratch, nameID, contextID,
2319
+ underlyingTypeID, interfaceTypeID,
2320
+ isImplicit, genericEnvID,
2321
+ rawAccessLevel, dependencyIDs);
2322
+
2323
+ Identifier name = MF.getIdentifier (nameID);
2324
+
2325
+ for (TypeID dependencyID : dependencyIDs) {
2326
+ auto dependency = MF.getTypeChecked (dependencyID);
2327
+ if (!dependency) {
2328
+ return llvm::make_error<TypeError>(
2329
+ name, takeErrorInfo (dependency.takeError ()));
2330
+ }
2331
+ }
2332
+
2333
+ auto DC = MF.getDeclContext (contextID);
2334
+
2335
+ auto genericParams = MF.maybeReadGenericParams (DC);
2336
+ if (declOrOffset.isComplete ())
2337
+ return declOrOffset;
2338
+
2339
+ auto alias = MF.createDecl <TypeAliasDecl>(SourceLoc (), SourceLoc (), name,
2340
+ SourceLoc (), genericParams, DC);
2341
+ declOrOffset = alias;
2342
+
2343
+ MF.configureGenericEnvironment (alias, genericEnvID);
2344
+
2345
+ alias->setUnderlyingType (MF.getType (underlyingTypeID));
2346
+
2347
+ if (auto accessLevel = getActualAccessLevel (rawAccessLevel)) {
2348
+ alias->setAccess (*accessLevel);
2349
+ } else {
2350
+ MF.error ();
2351
+ return nullptr ;
2352
+ }
2353
+
2354
+ if (isImplicit)
2355
+ alias->setImplicit ();
2356
+
2357
+ return alias;
2358
+ }
2306
2359
};
2307
2360
2308
2361
Expected<Decl *>
@@ -2663,6 +2716,16 @@ ASTDeserializer::getDeclCheckedImpl(DeclID DID) {
2663
2716
privateDiscriminatorRAII);
2664
2717
if (attrError)
2665
2718
return std::move (attrError);
2719
+ SWIFT_DEFER {
2720
+ // Record the attributes.
2721
+ auto decl = declOrOffset.get ();
2722
+ if (decl && !decl->hasValidationStarted ()) {
2723
+ if (DAttrs)
2724
+ declOrOffset.get ()->getAttrs ().setRawAttributeChain (DAttrs);
2725
+
2726
+ decl->setValidationToChecked ();
2727
+ }
2728
+ };
2666
2729
2667
2730
auto entry = MF.DeclTypeCursor .advance ();
2668
2731
if (entry.Kind != llvm::BitstreamEntry::Record) {
@@ -2680,56 +2743,8 @@ ASTDeserializer::getDeclCheckedImpl(DeclID DID) {
2680
2743
&MF, declOrOffset, DID, static_cast <decls_block::RecordKind>(recordID));
2681
2744
2682
2745
switch (recordID) {
2683
- case decls_block::TYPE_ALIAS_DECL: {
2684
- IdentifierID nameID;
2685
- DeclContextID contextID;
2686
- TypeID underlyingTypeID, interfaceTypeID;
2687
- bool isImplicit;
2688
- GenericEnvironmentID genericEnvID;
2689
- uint8_t rawAccessLevel;
2690
- ArrayRef<uint64_t > dependencyIDs;
2691
-
2692
- decls_block::TypeAliasLayout::readRecord (scratch, nameID, contextID,
2693
- underlyingTypeID, interfaceTypeID,
2694
- isImplicit, genericEnvID,
2695
- rawAccessLevel, dependencyIDs);
2696
-
2697
- Identifier name = MF.getIdentifier (nameID);
2698
-
2699
- for (TypeID dependencyID : dependencyIDs) {
2700
- auto dependency = MF.getTypeChecked (dependencyID);
2701
- if (!dependency) {
2702
- return llvm::make_error<TypeError>(
2703
- name, takeErrorInfo (dependency.takeError ()));
2704
- }
2705
- }
2706
-
2707
- auto DC = MF.getDeclContext (contextID);
2708
-
2709
- auto genericParams = MF.maybeReadGenericParams (DC);
2710
- if (declOrOffset.isComplete ())
2711
- return declOrOffset;
2712
-
2713
- auto alias = MF.createDecl <TypeAliasDecl>(SourceLoc (), SourceLoc (), name,
2714
- SourceLoc (), genericParams, DC);
2715
- declOrOffset = alias;
2716
-
2717
- MF.configureGenericEnvironment (alias, genericEnvID);
2718
-
2719
- alias->setUnderlyingType (MF.getType (underlyingTypeID));
2720
-
2721
- if (auto accessLevel = getActualAccessLevel (rawAccessLevel)) {
2722
- alias->setAccess (*accessLevel);
2723
- } else {
2724
- MF.error ();
2725
- return nullptr ;
2726
- }
2727
-
2728
- if (isImplicit)
2729
- alias->setImplicit ();
2730
-
2731
- break ;
2732
- }
2746
+ case decls_block::TypeAliasLayout::Code:
2747
+ return deserializeTypeAlias (declOrOffset, scratch, blobData);
2733
2748
2734
2749
case decls_block::GENERIC_TYPE_PARAM_DECL: {
2735
2750
IdentifierID nameID;
@@ -4120,13 +4135,7 @@ ASTDeserializer::getDeclCheckedImpl(DeclID DID) {
4120
4135
return nullptr ;
4121
4136
}
4122
4137
4123
- // Record the attributes.
4124
- if (DAttrs)
4125
- declOrOffset.get ()->getAttrs ().setRawAttributeChain (DAttrs);
4126
-
4127
- auto decl = declOrOffset.get ();
4128
- decl->setValidationToChecked ();
4129
- return decl;
4138
+ return declOrOffset.get ();
4130
4139
}
4131
4140
4132
4141
// / Translate from the Serialization function type repr enum values to the AST
0 commit comments