-
Notifications
You must be signed in to change notification settings - Fork 10.5k
/
Copy pathJSON.cpp
103 lines (94 loc) · 3.34 KB
/
JSON.cpp
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
//===--- JSON.cpp - Symbol Graph JSON Helpers -----------------------------===//
//
// This source file is part of the Swift.org open source project
//
// Copyright (c) 2014 - 2017 Apple Inc. and the Swift project authors
// Licensed under Apache License v2.0 with Runtime Library Exception
//
// See https://swift.org/LICENSE.txt for license information
// See https://swift.org/CONTRIBUTORS.txt for the list of Swift project authors
//
//===----------------------------------------------------------------------===//
// Adds Symbol Graph JSON serialization to other types.
//===----------------------------------------------------------------------===//
#include "swift/AST/Decl.h"
#include "swift/AST/Module.h"
#include "JSON.h"
void swift::symbolgraphgen::serialize(const llvm::VersionTuple &VT,
llvm::json::OStream &OS) {
OS.object([&](){
OS.attribute("major", VT.getMajor());
if (VT.getMinor()) {
OS.attribute("minor", *VT.getMinor());
}
if (VT.getSubminor()) {
OS.attribute("patch", *VT.getSubminor());
}
// Despite the name,
// this is not Semantic Versioning "build metadata"
if (VT.getBuild()) {
OS.attribute("prerelease", *VT.getBuild());
}
});
}
void swift::symbolgraphgen::serialize(const llvm::Triple &T,
llvm::json::OStream &OS) {
OS.object([&](){
OS.attribute("architecture", T.getArchName());
if (!T.getEnvironmentName().empty()) {
OS.attribute("environment", T.getEnvironmentName());
}
OS.attribute("vendor", T.getVendorName());
OS.attributeObject("operatingSystem", [&](){
OS.attribute("name", T.getOSTypeName(T.getOS()));
unsigned Major;
unsigned Minor;
unsigned Patch;
T.getOSVersion(Major, Minor, Patch);
llvm::VersionTuple OSVersion(Major, Minor, Patch);
OS.attributeBegin("minimumVersion");
serialize(OSVersion, OS);
OS.attributeEnd();
});
});
}
void swift::symbolgraphgen::serialize(const ExtensionDecl *Extension,
llvm::json::OStream &OS) {
OS.attributeObject("swiftExtension", [&](){
if (const auto *ExtendedNominal = Extension->getExtendedNominal()) {
if (const auto *ExtendedModule = ExtendedNominal->getModuleContext()) {
OS.attribute("extendedModule", ExtendedModule->getNameStr());
}
}
auto Generics = Extension->getGenericSignature();
if (Generics && !Generics->getRequirements().empty()) {
OS.attributeArray("constraints", [&](){
for (const auto &Requirement : Generics->getRequirements()) {
serialize(Requirement, OS);
}
}); // end constraints:
}
}); // end swiftExtension:
}
void swift::symbolgraphgen::serialize(const Requirement &Req,
llvm::json::OStream &OS) {
StringRef Kind;
switch (Req.getKind()) {
case swift::RequirementKind::Conformance:
Kind = "conformance";
break;
case swift::RequirementKind::Superclass:
Kind = "superclass";
break;
case swift::RequirementKind::SameType:
Kind = "sameType";
break;
case swift::RequirementKind::Layout:
return;
}
OS.object([&](){
OS.attribute("kind", Kind);
OS.attribute("lhs", Req.getFirstType()->getString());
OS.attribute("rhs", Req.getSecondType()->getString());
});
}