-
Notifications
You must be signed in to change notification settings - Fork 1.7k
/
Copy pathExprTranslator.h
153 lines (140 loc) · 8.93 KB
/
ExprTranslator.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
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
#pragma once
#include "swift/extractor/translators/TranslatorBase.h"
#include "swift/extractor/trap/generated/expr/TrapClasses.h"
namespace codeql {
class ExprTranslator : public AstTranslatorBase<ExprTranslator> {
public:
static constexpr std::string_view name = "expr";
using AstTranslatorBase<ExprTranslator>::AstTranslatorBase;
codeql::IntegerLiteralExpr translateIntegerLiteralExpr(const swift::IntegerLiteralExpr& expr);
codeql::FloatLiteralExpr translateFloatLiteralExpr(const swift::FloatLiteralExpr& expr);
codeql::BooleanLiteralExpr translateBooleanLiteralExpr(const swift::BooleanLiteralExpr& expr);
codeql::MagicIdentifierLiteralExpr translateMagicIdentifierLiteralExpr(
const swift::MagicIdentifierLiteralExpr& expr);
codeql::StringLiteralExpr translateStringLiteralExpr(const swift::StringLiteralExpr& expr);
codeql::InterpolatedStringLiteralExpr translateInterpolatedStringLiteralExpr(
const swift::InterpolatedStringLiteralExpr& expr);
codeql::NilLiteralExpr translateNilLiteralExpr(const swift::NilLiteralExpr& expr);
codeql::CallExpr translateCallExpr(const swift::CallExpr& expr);
codeql::PrefixUnaryExpr translatePrefixUnaryExpr(const swift::PrefixUnaryExpr& expr);
codeql::PostfixUnaryExpr translatePostfixUnaryExpr(const swift::PostfixUnaryExpr& expr);
codeql::DeclRefExpr translateDeclRefExpr(const swift::DeclRefExpr& expr);
codeql::AssignExpr translateAssignExpr(const swift::AssignExpr& expr);
codeql::BindOptionalExpr translateBindOptionalExpr(const swift::BindOptionalExpr& expr);
codeql::CaptureListExpr translateCaptureListExpr(const swift::CaptureListExpr& expr);
codeql::BinaryExpr translateBinaryExpr(const swift::BinaryExpr& expr);
codeql::TupleExpr translateTupleExpr(const swift::TupleExpr& expr);
codeql::DefaultArgumentExpr translateDefaultArgumentExpr(const swift::DefaultArgumentExpr& expr);
codeql::DotSyntaxBaseIgnoredExpr translateDotSyntaxBaseIgnoredExpr(
const swift::DotSyntaxBaseIgnoredExpr& expr);
codeql::DynamicTypeExpr translateDynamicTypeExpr(const swift::DynamicTypeExpr& expr);
codeql::EnumIsCaseExpr translateEnumIsCaseExpr(const swift::EnumIsCaseExpr& expr);
codeql::MakeTemporarilyEscapableExpr translateMakeTemporarilyEscapableExpr(
const swift::MakeTemporarilyEscapableExpr& expr);
codeql::ObjCSelectorExpr translateObjCSelectorExpr(const swift::ObjCSelectorExpr& expr);
codeql::OneWayExpr translateOneWayExpr(const swift::OneWayExpr& expr);
codeql::OpenExistentialExpr translateOpenExistentialExpr(const swift::OpenExistentialExpr& expr);
codeql::OptionalEvaluationExpr translateOptionalEvaluationExpr(
const swift::OptionalEvaluationExpr& expr);
codeql::RebindSelfInInitializerExpr translateRebindSelfInConstructorExpr(
const swift::RebindSelfInConstructorExpr& expr);
codeql::SuperRefExpr translateSuperRefExpr(const swift::SuperRefExpr& expr);
codeql::DotSyntaxCallExpr translateDotSyntaxCallExpr(const swift::DotSyntaxCallExpr& expr);
codeql::VarargExpansionExpr translateVarargExpansionExpr(const swift::VarargExpansionExpr& expr);
codeql::ArrayExpr translateArrayExpr(const swift::ArrayExpr& expr);
template <typename E>
TrapClassOf<E> translateImplicitConversionExpr(const E& expr) {
auto entry = createExprEntry(expr);
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
return entry;
}
codeql::TypeExpr translateTypeExpr(const swift::TypeExpr& expr);
template <typename E>
TrapClassOf<E> translateIdentityExpr(const E& expr) {
auto entry = createExprEntry(expr);
fillIdentityExpr(expr, entry);
return entry;
}
codeql::InOutExpr translateInOutExpr(const swift::InOutExpr& expr);
codeql::OpaqueValueExpr translateOpaqueValueExpr(const swift::OpaqueValueExpr& expr);
codeql::TapExpr translateTapExpr(const swift::TapExpr& expr);
codeql::TupleElementExpr translateTupleElementExpr(const swift::TupleElementExpr& expr);
codeql::TryExpr translateTryExpr(const swift::TryExpr& expr);
codeql::ForceTryExpr translateForceTryExpr(const swift::ForceTryExpr& expr);
codeql::OptionalTryExpr translateOptionalTryExpr(const swift::OptionalTryExpr& expr);
codeql::InitializerRefCallExpr translateConstructorRefCallExpr(
const swift::ConstructorRefCallExpr& expr);
codeql::DiscardAssignmentExpr translateDiscardAssignmentExpr(
const swift::DiscardAssignmentExpr& expr);
codeql::ExplicitClosureExpr translateClosureExpr(const swift::ClosureExpr& expr);
codeql::AutoClosureExpr translateAutoClosureExpr(const swift::AutoClosureExpr& expr);
codeql::CoerceExpr translateCoerceExpr(const swift::CoerceExpr& expr);
codeql::ConditionalCheckedCastExpr translateConditionalCheckedCastExpr(
const swift::ConditionalCheckedCastExpr& expr);
codeql::ForcedCheckedCastExpr translateForcedCheckedCastExpr(
const swift::ForcedCheckedCastExpr& expr);
codeql::IsExpr translateIsExpr(const swift::IsExpr& expr);
codeql::SubscriptExpr translateSubscriptExpr(const swift::SubscriptExpr& expr);
codeql::DictionaryExpr translateDictionaryExpr(const swift::DictionaryExpr& expr);
codeql::MemberRefExpr translateMemberRefExpr(const swift::MemberRefExpr& expr);
codeql::KeyPathExpr translateKeyPathExpr(const swift::KeyPathExpr& expr);
codeql::LazyInitializationExpr translateLazyInitializerExpr(
const swift::LazyInitializerExpr& expr);
codeql::ForceValueExpr translateForceValueExpr(const swift::ForceValueExpr& expr);
codeql::IfExpr translateTernaryExpr(const swift::TernaryExpr& expr);
codeql::KeyPathDotExpr translateKeyPathDotExpr(const swift::KeyPathDotExpr& expr);
codeql::KeyPathApplicationExpr translateKeyPathApplicationExpr(
const swift::KeyPathApplicationExpr& expr);
codeql::OtherInitializerRefExpr translateOtherConstructorDeclRefExpr(
const swift::OtherConstructorDeclRefExpr& expr);
codeql::UnresolvedDeclRefExpr translateUnresolvedDeclRefExpr(
const swift::UnresolvedDeclRefExpr& expr);
codeql::UnresolvedDotExpr translateUnresolvedDotExpr(const swift::UnresolvedDotExpr& expr);
codeql::UnresolvedMemberExpr translateUnresolvedMemberExpr(
const swift::UnresolvedMemberExpr& expr);
codeql::SequenceExpr translateSequenceExpr(const swift::SequenceExpr& expr);
codeql::ErrorExpr translateErrorExpr(const swift::ErrorExpr& expr);
codeql::UnresolvedPatternExpr translateUnresolvedPatternExpr(
const swift::UnresolvedPatternExpr& expr);
codeql::ObjectLiteralExpr translateObjectLiteralExpr(const swift::ObjectLiteralExpr& expr);
codeql::OverloadedDeclRefExpr translateOverloadedDeclRefExpr(
const swift::OverloadedDeclRefExpr& expr);
codeql::DynamicMemberRefExpr translateDynamicMemberRefExpr(
const swift::DynamicMemberRefExpr& expr);
codeql::DynamicSubscriptExpr translateDynamicSubscriptExpr(
const swift::DynamicSubscriptExpr& expr);
codeql::UnresolvedSpecializeExpr translateUnresolvedSpecializeExpr(
const swift::UnresolvedSpecializeExpr& expr);
codeql::PropertyWrapperValuePlaceholderExpr translatePropertyWrapperValuePlaceholderExpr(
const swift::PropertyWrapperValuePlaceholderExpr& expr);
codeql::AppliedPropertyWrapperExpr translateAppliedPropertyWrapperExpr(
const swift::AppliedPropertyWrapperExpr& expr);
codeql::RegexLiteralExpr translateRegexLiteralExpr(const swift::RegexLiteralExpr& expr);
codeql::SingleValueStmtExpr translateSingleValueStmtExpr(const swift::SingleValueStmtExpr& expr);
codeql::PackExpansionExpr translatePackExpansionExpr(const swift::PackExpansionExpr& expr);
codeql::PackElementExpr translatePackElementExpr(const swift::PackElementExpr& expr);
codeql::CopyExpr translateCopyExpr(const swift::CopyExpr& expr);
codeql::ConsumeExpr translateConsumeExpr(const swift::ConsumeExpr& expr);
codeql::MaterializePackExpr translateMaterializePackExpr(const swift::MaterializePackExpr& expr);
codeql::ExtractFunctionIsolationExpr translateExtractFunctionIsolationExpr(
const swift::ExtractFunctionIsolationExpr& expr);
private:
void fillClosureExpr(const swift::AbstractClosureExpr& expr, codeql::ClosureExpr& entry);
TrapLabel<ArgumentTag> emitArgument(const swift::Argument& arg);
TrapLabel<KeyPathComponentTag> emitKeyPathComponent(const swift::KeyPathExpr::Component& expr);
void fillExplicitCastExpr(const swift::ExplicitCastExpr& expr, codeql::ExplicitCastExpr& entry);
void fillIdentityExpr(const swift::IdentityExpr& expr, codeql::IdentityExpr& entry);
void fillAnyTryExpr(const swift::AnyTryExpr& expr, codeql::AnyTryExpr& entry);
void fillApplyExpr(const swift::ApplyExpr& expr, codeql::ApplyExpr& entry);
void fillSelfApplyExpr(const swift::SelfApplyExpr& expr, codeql::SelfApplyExpr& entry);
void fillLookupExpr(const swift::LookupExpr& expr, codeql::LookupExpr& entry);
template <typename T>
void fillAccessorSemantics(const T& ast, TrapClassOf<T>& entry);
template <typename T>
TrapClassOf<T> createExprEntry(const T& expr) {
auto entry = dispatcher.createEntry(expr);
entry.type = dispatcher.fetchOptionalLabel(expr.getType());
return entry;
}
};
} // namespace codeql