;
39voidserializeObject(Object &
Paren, StringRef Key,
40std::optional<Object> &&Obj) {
42 Paren[Key] = std::move(*Obj);
47voidserializeArray(Object &
Paren, StringRef Key,
48std::optional<Array> &&Array) {
50 Paren[Key] = std::move(*Array);
55template<
typenameContainerTy>
56voidserializeArray(Object &
Paren, StringRef Key, ContainerTy &&
C) {
76std::optional<Object> serializeSemanticVersion(
constVersionTuple &
V) {
81Version[
"major"] =
V.getMajor();
82Version[
"minor"] =
V.getMinor().value_or(0);
83Version[
"patch"] =
V.getSubminor().value_or(0);
91ObjectserializeOperatingSystem(
constTriple &
T) {
93OS[
"name"] =
T.getOSTypeName(
T.getOS());
94serializeObject(OS,
"minimumVersion",
95serializeSemanticVersion(
T.getMinimumSupportedOSVersion()));
103ObjectserializePlatform(
constTriple &
T) {
105Platform[
"architecture"] =
T.getArchName();
106Platform[
"vendor"] =
T.getVendorName();
108 if(!
T.getEnvironmentName().empty())
109Platform[
"environment"] =
T.getEnvironmentName();
111Platform[
"operatingSystem"] = serializeOperatingSystem(
T);
117assert(
Loc.
isValid() &&
"invalid source position");
120SourcePosition[
"line"] =
Loc.getLine() - 1;
121SourcePosition[
"character"] =
Loc.getColumn() - 1;
123 returnSourcePosition;
132 boolIncludeFileURI =
false) {
136 if(IncludeFileURI) {
137std::string FileURI =
"file://";
139FileURI += sys::path::convert_to_slash(
Loc.getFilename());
150serializeObject(
SourceRange,
"start", serializeSourcePosition(BeginLoc));
151serializeObject(
SourceRange,
"end", serializeSourcePosition(EndLoc));
166std::optional<Array> serializeAvailability(
const AvailabilityInfo&Avail) {
170Array AvailabilityArray;
173 ObjectUnconditionallyDeprecated;
174UnconditionallyDeprecated[
"domain"] =
"*";
175UnconditionallyDeprecated[
"isUnconditionallyDeprecated"] =
true;
176AvailabilityArray.emplace_back(std::move(UnconditionallyDeprecated));
179 if(Avail.
Domain.str() !=
"") {
181Availability[
"domain"] = Avail.
Domain;
184Availability[
"isUnconditionallyUnavailable"] =
true;
186serializeObject(Availability,
"introduced",
187serializeSemanticVersion(Avail.
Introduced));
188serializeObject(Availability,
"deprecated",
189serializeSemanticVersion(Avail.
Deprecated));
190serializeObject(Availability,
"obsoleted",
191serializeSemanticVersion(Avail.
Obsoleted));
194AvailabilityArray.emplace_back(std::move(Availability));
197 returnAvailabilityArray;
206 return "objective-c";
209 caseLanguage::ObjCXX:
210 return "objective-c++";
213 caseLanguage::OpenCL:
214 caseLanguage::OpenCLCXX:
220 caseLanguage::Unknown:
222 caseLanguage::LLVM_IR:
224llvm_unreachable(
"Unsupported language kind");
227llvm_unreachable(
"Unhandled language kind");
258std::optional<Object> serializeDocComment(
const DocComment&Comment) {
265 for(
const auto&CommentLine : Comment) {
267Line[
"text"] = CommentLine.Text;
268serializeObject(Line,
"range",
269serializeSourceRange(CommentLine.Begin, CommentLine.End));
270LinesArray.emplace_back(std::move(Line));
273serializeArray(
DocComment,
"lines", std::move(LinesArray));
320Fragment[
"spelling"] = F.Spelling;
322 if(!F.PreciseIdentifier.empty())
323Fragment[
"preciseIdentifier"] = F.PreciseIdentifier;
324Fragments.emplace_back(std::move(Fragment));
341Names[
"title"] =
Record->Name;
343serializeArray(Names,
"subHeading",
344serializeDeclarationFragments(
Record->SubHeading));
347DeclarationFragments::FragmentKind::Identifier,
349serializeArray(Names,
"navigator",
350serializeDeclarationFragments(NavigatorFragments));
356 autoAddLangPrefix = [&
Lang](StringRef S) -> std::string {
363 Kind[
"identifier"] = AddLangPrefix(
"unknown");
364 Kind[
"displayName"] =
"Unknown";
367 Kind[
"identifier"] = AddLangPrefix(
"namespace");
368 Kind[
"displayName"] =
"Namespace";
371 Kind[
"identifier"] = AddLangPrefix(
"func");
372 Kind[
"displayName"] =
"Function";
375 Kind[
"identifier"] = AddLangPrefix(
"func");
376 Kind[
"displayName"] =
"Function Template";
379 Kind[
"identifier"] = AddLangPrefix(
"func");
380 Kind[
"displayName"] =
"Function Template Specialization";
383 Kind[
"identifier"] = AddLangPrefix(
"var");
384 Kind[
"displayName"] =
"Global Variable Template";
387 Kind[
"identifier"] = AddLangPrefix(
"var");
388 Kind[
"displayName"] =
"Global Variable Template Specialization";
391 Kind[
"identifier"] = AddLangPrefix(
"var");
392 Kind[
"displayName"] =
"Global Variable Template Partial Specialization";
395 Kind[
"identifier"] = AddLangPrefix(
"var");
396 Kind[
"displayName"] =
"Global Variable";
399 Kind[
"identifier"] = AddLangPrefix(
"enum.case");
400 Kind[
"displayName"] =
"Enumeration Case";
403 Kind[
"identifier"] = AddLangPrefix(
"enum");
404 Kind[
"displayName"] =
"Enumeration";
407 Kind[
"identifier"] = AddLangPrefix(
"property");
408 Kind[
"displayName"] =
"Instance Property";
411 Kind[
"identifier"] = AddLangPrefix(
"struct");
412 Kind[
"displayName"] =
"Structure";
415 Kind[
"identifier"] = AddLangPrefix(
"property");
416 Kind[
"displayName"] =
"Instance Property";
419 Kind[
"identifier"] = AddLangPrefix(
"union");
420 Kind[
"displayName"] =
"Union";
423 Kind[
"identifier"] = AddLangPrefix(
"property");
424 Kind[
"displayName"] =
"Instance Property";
427 Kind[
"identifier"] = AddLangPrefix(
"type.property");
428 Kind[
"displayName"] =
"Type Property";
434 Kind[
"identifier"] = AddLangPrefix(
"class");
435 Kind[
"displayName"] =
"Class";
438 Kind[
"identifier"] = AddLangPrefix(
"method");
439 Kind[
"displayName"] =
"Method Template";
442 Kind[
"identifier"] = AddLangPrefix(
"method");
443 Kind[
"displayName"] =
"Method Template Specialization";
446 Kind[
"identifier"] = AddLangPrefix(
"property");
447 Kind[
"displayName"] =
"Template Property";
450 Kind[
"identifier"] = AddLangPrefix(
"concept");
451 Kind[
"displayName"] =
"Concept";
454 Kind[
"identifier"] = AddLangPrefix(
"type.method");
455 Kind[
"displayName"] =
"Static Method";
458 Kind[
"identifier"] = AddLangPrefix(
"method");
459 Kind[
"displayName"] =
"Instance Method";
462 Kind[
"identifier"] = AddLangPrefix(
"method");
463 Kind[
"displayName"] =
"Constructor";
466 Kind[
"identifier"] = AddLangPrefix(
"method");
467 Kind[
"displayName"] =
"Destructor";
470 Kind[
"identifier"] = AddLangPrefix(
"ivar");
471 Kind[
"displayName"] =
"Instance Variable";
474 Kind[
"identifier"] = AddLangPrefix(
"method");
475 Kind[
"displayName"] =
"Instance Method";
478 Kind[
"identifier"] = AddLangPrefix(
"type.method");
479 Kind[
"displayName"] =
"Type Method";
482 Kind[
"identifier"] = AddLangPrefix(
"property");
483 Kind[
"displayName"] =
"Instance Property";
486 Kind[
"identifier"] = AddLangPrefix(
"type.property");
487 Kind[
"displayName"] =
"Type Property";
490 Kind[
"identifier"] = AddLangPrefix(
"class");
491 Kind[
"displayName"] =
"Class";
494 Kind[
"identifier"] = AddLangPrefix(
"class.extension");
495 Kind[
"displayName"] =
"Class Extension";
498 Kind[
"identifier"] = AddLangPrefix(
"protocol");
499 Kind[
"displayName"] =
"Protocol";
502 Kind[
"identifier"] = AddLangPrefix(
"macro");
503 Kind[
"displayName"] =
"Macro";
506 Kind[
"identifier"] = AddLangPrefix(
"typealias");
507 Kind[
"displayName"] =
"Type Alias";
510llvm_unreachable(
"API Record with uninstantiable kind");
522 returnserializeSymbolKind(
Record.KindForDisplay, Lang);
532template<
typenameRecordTy>
533voidserializeFunctionSignatureMixin(Object &
Paren,
constRecordTy &
Record) {
534 const auto&FS =
Record.Signature;
539serializeArray(Signature,
"returns",
540serializeDeclarationFragments(FS.getReturnType()));
543 for(
const auto&
P: FS.getParameters()) {
546serializeArray(
Parameter,
"declarationFragments",
547serializeDeclarationFragments(
P.Fragments));
552Signature[
"parameters"] = std::move(Parameters);
554serializeObject(
Paren,
"functionSignature", std::move(Signature));
557template<
typenameRecordTy>
558voidserializeTemplateMixin(Object &
Paren,
constRecordTy &
Record) {
564Array GenericParameters;
570GenericParameters.emplace_back(std::move(
Parameter));
572 if(!GenericParameters.empty())
573Generics[
"parameters"] = std::move(GenericParameters);
575Array GenericConstraints;
578Constraint[
"kind"] = Constr.Kind;
579Constraint[
"lhs"] = Constr.LHS;
580Constraint[
"rhs"] = Constr.RHS;
581GenericConstraints.emplace_back(std::move(Constraint));
584 if(!GenericConstraints.empty())
585Generics[
"constraints"] = std::move(GenericConstraints);
587serializeObject(
Paren,
"swiftGenerics", Generics);
592Array ParentContexts;
594 for(
const auto&
Parent: Parents) {
596Elem[
"usr"] =
Parent.USR;
597Elem[
"name"] =
Parent.Name;
599Elem[
"kind"] = serializeSymbolKind(
Parent.Record->KindForDisplay,
600Lang)[
"identifier"];
604ParentContexts.emplace_back(std::move(Elem));
607 returnParentContexts;
615 for(
const auto*Current =
Record; Current !=
nullptr;
616Current = Current->Parent.Record)
617ReverseHierarchy.emplace_back(Current);
620std::make_move_iterator(ReverseHierarchy.rbegin()),
621std::make_move_iterator(ReverseHierarchy.rend()));
628 if(
auto*CategoryRecord = dyn_cast_or_null<ObjCCategoryRecord>(
Record)) {
629 returnCategoryRecord->Interface;
640 Symbols.emplace_back(std::move(Symbol));
641 return Symbols.back().getAsObject();
649constVersionTuple SymbolGraphSerializer::FormatVersion{0, 5, 3};
651Object SymbolGraphSerializer::serializeMetadata()
const{
653serializeObject(Metadata,
"formatVersion",
654serializeSemanticVersion(FormatVersion));
660SymbolGraphSerializer::serializeModuleObject(StringRef ModuleName)
const{
662 Module[
"name"] = ModuleName;
667boolSymbolGraphSerializer::shouldSkip(
const APIRecord*
Record)
const{
672 if(
Record->Availability.isUnconditionallyUnavailable())
677 if(
Record->Name.starts_with(
"_"))
687ExtendedModule&SymbolGraphSerializer::getModuleForCurrentSymbol() {
688 if(!ForceEmitToMainModule && ModuleForCurrentSymbol)
689 return*ModuleForCurrentSymbol;
694Array SymbolGraphSerializer::serializePathComponents(
696 returnArray(map_range(Hierarchy, [](
autoElt) {
returnElt.Name; }));
699StringRef SymbolGraphSerializer::getRelationshipString(RelationshipKind Kind) {
701 caseRelationshipKind::MemberOf:
703 caseRelationshipKind::InheritsFrom:
704 return "inheritsFrom";
705 caseRelationshipKind::ConformsTo:
706 return "conformsTo";
707 caseRelationshipKind::ExtensionTo:
708 return "extensionTo";
710llvm_unreachable(
"Unhandled relationship kind");
713voidSymbolGraphSerializer::serializeRelationship(RelationshipKind Kind,
719 if(EmitSymbolLabelsForTesting) {
720llvm::raw_svector_ostream OS(TestRelLabel);
721OS << SymbolGraphSerializer::getRelationshipString(Kind) <<
" $ " 722<< Source.
USR<<
" $ ";
727Relationship[
"!testRelLabel"] = TestRelLabel;
729Relationship[
"source"] = Source.
USR;
730Relationship[
"target"] =
Target.USR;
731Relationship[
"targetFallback"] =
Target.Name;
732Relationship[
"kind"] = SymbolGraphSerializer::getRelationshipString(Kind);
734 if(ForceEmitToMainModule)
740StringRef SymbolGraphSerializer::getConstraintString(ConstraintKind Kind) {
742 caseConstraintKind::Conformance:
743 return "conformance";
744 caseConstraintKind::ConditionalConformance:
745 return "conditionalConformance";
747llvm_unreachable(
"Unhandled constraint kind");
750voidSymbolGraphSerializer::serializeAPIRecord(
const APIRecord*
Record) {
755 if(EmitSymbolLabelsForTesting)
756Obj[
"!testLabel"] =
Record->USR;
758serializeObject(Obj,
"identifier",
761serializeObject(Obj,
"names", serializeNames(
Record));
764serializeSourceLocation(
Record->Location,
true));
765serializeArray(Obj,
"availability",
766serializeAvailability(
Record->Availability));
767serializeObject(Obj,
"docComment", serializeDocComment(
Record->Comment));
768serializeArray(Obj,
"declarationFragments",
769serializeDeclarationFragments(
Record->Declaration));
771Obj[
"pathComponents"] = serializePathComponents(
Record);
772Obj[
"accessLevel"] =
Record->Access.getAccess();
776 if(Hierarchy.size() >= 2)
777serializeRelationship(MemberOf, Hierarchy.back(),
778Hierarchy[Hierarchy.size() - 2],
Module);
780CurrentSymbol =
Module.addSymbol(std::move(Obj));
788Hierarchy.push_back(getHierarchyReference(
Record,
API));
791Hierarchy.pop_back();
796serializeAPIRecord(
Record);
805serializeFunctionSignatureMixin(*CurrentSymbol, *
Record);
814serializeRelationship(RelationshipKind::InheritsFrom,
Record,
Base,
815getModuleForCurrentSymbol());
824serializeTemplateMixin(*CurrentSymbol, *
Record);
833serializeTemplateMixin(*CurrentSymbol, *
Record);
842serializeFunctionSignatureMixin(*CurrentSymbol, *
Record);
851serializeTemplateMixin(*CurrentSymbol, *
Record);
860serializeTemplateMixin(*CurrentSymbol, *
Record);
868serializeTemplateMixin(*CurrentSymbol, *
Record);
877serializeTemplateMixin(*CurrentSymbol, *
Record);
887serializeTemplateMixin(*CurrentSymbol, *
Record);
896serializeTemplateMixin(*CurrentSymbol, *
Record);
905 for(
const auto&Protocol :
Record->Protocols)
906serializeRelationship(ConformsTo,
Record, Protocol,
907getModuleForCurrentSymbol());
917 if(!
Record->SuperClass.empty())
918serializeRelationship(InheritsFrom,
Record,
Record->SuperClass,
919getModuleForCurrentSymbol());
925 if(SkipSymbolsInCategoriesToExternalTypes &&
929 auto*CurrentModule = ModuleForCurrentSymbol;
930 if(
autoModuleExtendedByRecord =
Record->getExtendedExternalModule())
931ModuleForCurrentSymbol = &ExtendedModules[*ModuleExtendedByRecord];
937ModuleForCurrentSymbol = CurrentModule;
951 for(
const auto&Protocol :
Record->Protocols)
952serializeRelationship(ConformsTo,
Record->Interface, Protocol,
953getModuleForCurrentSymbol());
963serializeFunctionSignatureMixin(*CurrentSymbol, *
Record);
984 boolShouldDrop =
Record->UnderlyingType.Name.empty();
987ShouldDrop |= (
Record->UnderlyingType.Name ==
Record->Name);
992serializeAPIRecord(
Record);
996(*CurrentSymbol)[
"type"] =
Record->UnderlyingType.USR;
1001voidSymbolGraphSerializer::serializeSingleRecord(
const APIRecord*
Record) {
1002 switch(
Record->getKind()) {
1004#define CONCRETE_RECORD(CLASS, BASE, KIND) \ 1005 case APIRecord::KIND: { \ 1006 walkUpFrom##CLASS(static_cast<const CLASS *>(Record)); \ 1015llvm_unreachable(
"API Record with uninstantiable kind");
1019Object SymbolGraphSerializer::serializeGraph(StringRef ModuleName,
1022serializeObject(Root,
"metadata", serializeMetadata());
1023serializeObject(Root,
"module", serializeModuleObject(ModuleName));
1025Root[
"symbols"] = std::move(EM.Symbols);
1026Root[
"relationships"] = std::move(EM.Relationships);
1031voidSymbolGraphSerializer::serializeGraphToStream(
1034 ObjectRoot = serializeGraph(ModuleName, std::move(EM));
1035 if(Options.Compact)
1036OS << formatv(
"{0}", json::Value(std::move(Root))) <<
"\n";
1038OS << formatv(
"{0:2}", json::Value(std::move(Root))) <<
"\n";
1045 API, IgnoresList, Options.EmitSymbolLabelsForTesting,
1050Serializer.serializeGraphToStream(OS, Options,
API.
ProductName,
1051std::move(Serializer.MainModule));
1056raw_ostream &MainOutput,
const APISet&API,
1058llvm::function_ref<std::unique_ptr<llvm::raw_pwrite_stream>(Twine BaseName)>
1062Options.EmitSymbolLabelsForTesting);
1065Serializer.serializeGraphToStream(MainOutput, Options,
API.
ProductName,
1066std::move(Serializer.MainModule));
1068 for(
auto&ExtensionSGF : Serializer.ExtendedModules) {
1069 if(
autoExtensionOS =
1070CreateOutputStream(
API.
ProductName+
"@"+ ExtensionSGF.getKey()))
1071Serializer.serializeGraphToStream(*ExtensionOS, Options,
API.
ProductName,
1072std::move(ExtensionSGF.getValue()));
1076std::optional<Object>
1090Serializer.Hierarchy = generateHierarchyFromRecord(
Record);
1092Serializer.serializeSingleRecord(
Record);
1093serializeObject(Root,
"symbolGraph",
1095std::move(Serializer.MainModule)));
1098serializeArray(Root,
"parentContexts",
1099generateParentContexts(Serializer.Hierarchy, Lang));
1101Array RelatedSymbols;
1103 for(
const auto&Fragment :
Record->Declaration.getFragments()) {
1105 if(Fragment.PreciseIdentifier.empty())
1114Object RelatedSymbol;
1115RelatedSymbol[
"usr"] = RelatedRecord->
USR;
1116RelatedSymbol[
"declarationLanguage"] = getLanguageName(Lang);
1117RelatedSymbol[
"accessLevel"] = RelatedRecord->
Access.
getAccess();
1122serializeArray(RelatedSymbol,
"parentContexts",
1123generateParentContexts(
1124generateHierarchyFromRecord(RelatedRecord), Lang));
1126RelatedSymbols.push_back(std::move(RelatedSymbol));
1129serializeArray(Root,
"relatedSymbols", RelatedSymbols);
This file defines the APIRecord-based structs and the APISet class.
This file defines the Declaration Fragments related classes.
llvm::MachO::Target Target
llvm::MachO::Record Record
Defines the clang::SourceLocation class and associated facilities.
This file defines the SymbolGraphSerializer class.
Defines version macros and version-related utility functions for Clang.
Describes a module or submodule.
Represents an unpacked "presumed" location which can be presented to the user.
const char * getFilename() const
Return the presumed filename of this location.
Encodes a location in the source.
bool isValid() const
Return true if this is a valid SourceLocation object.
A trivial tuple used to represent a source range.
StringRef getLanguageName(FormatStyle::LanguageKind Language)
The JSON file list parser is used to communicate input to InstallAPI.
Language
The language for the input, used to select and validate the language standard and possible actions.
@ Parameter
The parameter type of a method or function.
const FunctionProtoType * T
std::string getClangFullVersion()
Retrieves a string representing the complete clang version, which includes the clang version number,...
Diagnostic wrappers for TextAPI types for error reporting.
Storage of availability attributes for a declaration.
bool isUnconditionallyDeprecated() const
Check if the symbol is unconditionally deprecated.
llvm::SmallString< 32 > Domain
The domain is the platform for which this availability info applies to.
bool isDefault() const
Determine if this AvailabilityInfo represents the default availability.
bool isUnavailable() const
Check if the symbol is unavailable unconditionally or on the active platform and os version.
RetroSearch is an open source project built by @garambo | Open a GitHub Issue
Search and Browse the WWW like it's 1997 | Search results from DuckDuckGo
HTML:
3.2
| Encoding:
UTF-8
| Version:
0.7.4