-
Notifications
You must be signed in to change notification settings - Fork 10.4k
/
Copy pathDeclarationFragmentPrinter.h
123 lines (97 loc) · 3.05 KB
/
DeclarationFragmentPrinter.h
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
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
//===--- DeclarationFragmentPrinter.h - Declaration Fragment Printer ------===//
//
// 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
//
//===----------------------------------------------------------------------===//
#ifndef SWIFT_SYMBOLGRAPHGEN_DECLARATIONFRAGMENTPRINTER_H
#define SWIFT_SYMBOLGRAPHGEN_DECLARATIONFRAGMENTPRINTER_H
#include "llvm/Support/JSON.h"
#include "swift/AST/ASTPrinter.h"
#include "swift/Basic/LLVM.h"
namespace swift {
class Decl;
class Type;
class TypeDecl;
namespace symbolgraphgen {
struct SymbolGraph;
/// Prints AST nodes as a stream of tagged fragments for syntax highlighting.
///
/// These fragments are meant to display a somewhat abbreviated part of the
/// declaration for display in documentation, ignoring things like member and
/// function bodies.
///
/// For example, a function:
///
/// ```swift
/// func foo() {
/// print("Hello, world!")
/// }
/// ```
///
/// Will have fragments representing the `func foo()` part.
class DeclarationFragmentPrinter : public ASTPrinter {
enum class FragmentKind {
None,
Keyword,
Attribute,
NumberLiteral,
StringLiteral,
Identifier,
TypeIdentifier,
GenericParameter,
Text,
};
/// The output stream to print fragment objects to.
llvm::json::OStream &OS;
/// The current fragment being considered.
FragmentKind Kind;
/// The actual source text of the fragment.
SmallString<256> Spelling;
SmallString<256> USR;
StringRef getKindSpelling(FragmentKind Kind) const;
/// Open a new kind of fragment without committing its spelling.
void openFragment(FragmentKind Kind);
/// Close the current fragment if there is one, and commit it for display.
void closeFragment();
unsigned NumFragments;
public:
DeclarationFragmentPrinter(llvm::json::OStream &OS,
Optional<StringRef> Key = None)
: OS(OS),
Kind(FragmentKind::None),
NumFragments(0) {
if (Key) {
OS.attributeBegin(*Key);
OS.arrayBegin();
} else {
OS.arrayBegin();
}
}
void printDeclLoc(const Decl *D) override;
void printDeclNameEndLoc(const Decl *D) override {
closeFragment();
}
void printNamePre(PrintNameContext Context) override;
void printStructurePre(PrintStructureKind Kind, const Decl *D) override;
void printNamePost(PrintNameContext Context) override {
closeFragment();
}
void printTypeRef(Type T, const TypeDecl *RefTo, Identifier Name,
PrintNameContext NameContext) override;
void printText(StringRef Text) override;
~DeclarationFragmentPrinter() {
closeFragment();
OS.arrayEnd();
OS.attributeEnd();
assert(NumFragments);
}
};
} // end namespace symbolgraphgen
} // end namespace swift
#endif // SWIFT_SYMBOLGRAPHGEN_DECLARATIONFRAGMENTPRINTER_H