//===--- Edge.cpp - Symbol Graph Edge -------------------------------------===// // // 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 // //===----------------------------------------------------------------------===// #include "swift/AST/Module.h" #include "Edge.h" #include "Symbol.h" #include "SymbolGraphASTWalker.h" using namespace swift; using namespace symbolgraphgen; void Edge::serialize(llvm::json::OStream &OS) const { OS.object([&](){ OS.attribute("kind", Kind.Name); SmallString<256> SourceUSR, TargetUSR; Source.getUSR(SourceUSR); OS.attribute("source", SourceUSR.str()); Target.getUSR(TargetUSR); OS.attribute("target", TargetUSR.str()); // In case a dependent module isn't available, serialize a fallback name. auto TargetModuleName = Target.getSymbolDecl() ->getModuleContext()->getName().str(); if (TargetModuleName != Graph->M.getName().str()) { SmallString<128> Scratch(TargetModuleName); llvm::raw_svector_ostream PathOS(Scratch); PathOS << '.'; Target.printPath(PathOS); OS.attribute("targetFallback", Scratch.str()); } if (ConformanceExtension) { if (const auto *Generics = ConformanceExtension->getAsGenericContext()) { SmallVector FilteredRequirements; filterGenericRequirements(Generics->getGenericRequirements(), ConformanceExtension->getExtendedNominal() ->getDeclContext()->getSelfNominalTypeDecl(), FilteredRequirements); if (!FilteredRequirements.empty()) { OS.attributeArray("swiftConstraints", [&](){ for (const auto &Req : ConformanceExtension->getGenericRequirements()) { ::serialize(Req, OS); } }); } } } }); }