Skip to content

Commit 1e1f0a5

Browse files
committed
[Serialization] Implementation serialization of clang::SwiftAttrAttr
This is an attribute that is attached to `AttributedType` to support concurrency annotations in type context.
1 parent 6a39870 commit 1e1f0a5

File tree

3 files changed

+65
-0
lines changed

3 files changed

+65
-0
lines changed

lib/ClangImporter/Serializability.cpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -315,6 +315,8 @@ namespace {
315315
if (loc.isValid())
316316
IsSerializable = false;
317317
}
318+
319+
void writeAttr(const clang::Attr *attr) {}
318320
};
319321
}
320322

lib/Serialization/Deserialization.cpp

Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@
4040
#include "swift/ClangImporter/SwiftAbstractBasicReader.h"
4141
#include "swift/Serialization/SerializedModuleLoader.h"
4242
#include "clang/AST/DeclTemplate.h"
43+
#include "clang/AST/Attr.h"
4344
#include "clang/Basic/SourceManager.h"
45+
#include "clang/Basic/AttributeCommonInfo.h"
4446
#include "llvm/ADT/Statistic.h"
4547
#include "llvm/Support/Compiler.h"
4648
#include "llvm/Support/Debug.h"
@@ -7620,6 +7622,44 @@ class SwiftToClangBasicReader :
76207622
// Unknown kind?
76217623
return nullptr;
76227624
}
7625+
7626+
const clang::Attr *readAttr() {
7627+
auto rawKind = readUInt32();
7628+
if (!rawKind)
7629+
return nullptr;
7630+
7631+
clang::attr::Kind attrKind = static_cast<clang::attr::Kind>(rawKind - 1);
7632+
auto name = readIdentifier();
7633+
auto scopeName = readIdentifier();
7634+
7635+
auto rangeStart = readSourceLocation();
7636+
auto rangeEnd = readSourceLocation();
7637+
auto scopeLoc = readSourceLocation();
7638+
7639+
auto parsedKind = readEnum<clang::AttributeCommonInfo::Kind>();
7640+
auto syntax = readEnum<clang::AttributeCommonInfo::Syntax>();
7641+
unsigned spellingListIndex = readUInt64();
7642+
7643+
bool isRegularKeywordAttribute = readBool();
7644+
7645+
clang::AttributeCommonInfo info(
7646+
name, scopeName, {rangeStart, rangeEnd}, scopeLoc, parsedKind,
7647+
{syntax, spellingListIndex, /*IsAlignas=*/false,
7648+
isRegularKeywordAttribute});
7649+
7650+
bool isInherited = readBool();
7651+
bool isImplicit = readBool();
7652+
bool isPackExpansion = readBool();
7653+
StringRef attribute = MF.getIdentifierText(readUInt64());
7654+
7655+
auto *attr =
7656+
clang::SwiftAttrAttr::Create(getASTContext(), attribute.str(), info);
7657+
cast<clang::InheritableAttr>(attr)->setInherited(isInherited);
7658+
attr->setImplicit(isImplicit);
7659+
attr->setPackExpansion(isPackExpansion);
7660+
7661+
return attr;
7662+
}
76237663
};
76247664

76257665
} // end anonymous namespace

lib/Serialization/Serialization.cpp

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5765,6 +5765,29 @@ class ClangToSwiftBasicWriter :
57655765
Record.push_back(S.addDeclBaseNameRef(elt.second));
57665766
}
57675767
}
5768+
5769+
void writeAttr(const clang::Attr *attr) {
5770+
auto *swiftAttr = dyn_cast_or_null<clang::SwiftAttrAttr>(attr);
5771+
if (!swiftAttr) {
5772+
writeUInt32(/*no attribute*/0);
5773+
return;
5774+
}
5775+
5776+
writeEnum(swiftAttr->getKind() + 1);
5777+
writeIdentifier(swiftAttr->getAttrName());
5778+
writeIdentifier(swiftAttr->getScopeName());
5779+
writeSourceLocation(swiftAttr->getRange().getBegin());
5780+
writeSourceLocation(swiftAttr->getRange().getEnd());
5781+
writeSourceLocation(swiftAttr->getScopeLoc());
5782+
writeEnum(swiftAttr->getParsedKind());
5783+
writeEnum(swiftAttr->getSyntax());
5784+
writeUInt64(swiftAttr->getAttributeSpellingListIndex());
5785+
writeBool(swiftAttr->isRegularKeywordAttribute());
5786+
writeBool(swiftAttr->isInherited());
5787+
writeBool(swiftAttr->isImplicit());
5788+
writeBool(swiftAttr->isPackExpansion());
5789+
writeUInt64(S.addUniquedStringRef(swiftAttr->getAttribute()));
5790+
}
57685791
};
57695792

57705793
}

0 commit comments

Comments
 (0)