mirror of
https://github.com/github/codeql.git
synced 2025-12-16 16:53:25 +01:00
701 lines
24 KiB
C++
701 lines
24 KiB
C++
#include "swift/extractor/translators/ExprTranslator.h"
|
|
|
|
#include <swift/AST/ParameterList.h>
|
|
|
|
namespace codeql {
|
|
|
|
template <typename T>
|
|
void ExprTranslator::fillAccessorSemantics(const T& ast, TrapClassOf<T>& entry) {
|
|
switch (ast.getAccessSemantics()) {
|
|
case swift::AccessSemantics::DirectToStorage:
|
|
entry.has_direct_to_storage_semantics = true;
|
|
break;
|
|
case swift::AccessSemantics::DirectToImplementation:
|
|
entry.has_direct_to_implementation_semantics = true;
|
|
break;
|
|
case swift::AccessSemantics::Ordinary:
|
|
entry.has_ordinary_semantics = true;
|
|
break;
|
|
case swift::AccessSemantics::DistributedThunk:
|
|
entry.has_distributed_thunk_semantics = true;
|
|
break;
|
|
}
|
|
}
|
|
|
|
codeql::IntegerLiteralExpr ExprTranslator::translateIntegerLiteralExpr(
|
|
const swift::IntegerLiteralExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.string_value = (expr.isNegative() ? "-" : "") + expr.getDigitsText().str();
|
|
return entry;
|
|
}
|
|
|
|
codeql::FloatLiteralExpr ExprTranslator::translateFloatLiteralExpr(
|
|
const swift::FloatLiteralExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.string_value = (expr.isNegative() ? "-" : "") + expr.getDigitsText().str();
|
|
return entry;
|
|
}
|
|
|
|
codeql::BooleanLiteralExpr ExprTranslator::translateBooleanLiteralExpr(
|
|
const swift::BooleanLiteralExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.value = expr.getValue();
|
|
return entry;
|
|
}
|
|
|
|
codeql::MagicIdentifierLiteralExpr ExprTranslator::translateMagicIdentifierLiteralExpr(
|
|
const swift::MagicIdentifierLiteralExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.kind = swift::MagicIdentifierLiteralExpr::getKindString(expr.getKind()).str();
|
|
return entry;
|
|
}
|
|
|
|
codeql::StringLiteralExpr ExprTranslator::translateStringLiteralExpr(
|
|
const swift::StringLiteralExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.value = expr.getValue().str();
|
|
return entry;
|
|
}
|
|
|
|
codeql::InterpolatedStringLiteralExpr ExprTranslator::translateInterpolatedStringLiteralExpr(
|
|
const swift::InterpolatedStringLiteralExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.interpolation_expr = dispatcher.fetchOptionalLabel(expr.getInterpolationExpr());
|
|
entry.appending_expr = dispatcher.fetchOptionalLabel(expr.getAppendingExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::NilLiteralExpr ExprTranslator::translateNilLiteralExpr(const swift::NilLiteralExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
return entry;
|
|
}
|
|
|
|
codeql::CallExpr ExprTranslator::translateCallExpr(const swift::CallExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillApplyExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
|
|
codeql::PrefixUnaryExpr ExprTranslator::translatePrefixUnaryExpr(
|
|
const swift::PrefixUnaryExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillApplyExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
|
|
codeql::PostfixUnaryExpr ExprTranslator::translatePostfixUnaryExpr(
|
|
const swift::PostfixUnaryExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillApplyExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
|
|
codeql::DeclRefExpr ExprTranslator::translateDeclRefExpr(const swift::DeclRefExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.decl = dispatcher.fetchLabel(expr.getDecl());
|
|
fillAccessorSemantics(expr, entry);
|
|
entry.replacement_types =
|
|
dispatcher.fetchRepeatedLabels(expr.getDeclRef().getSubstitutions().getReplacementTypes());
|
|
return entry;
|
|
}
|
|
|
|
codeql::AssignExpr ExprTranslator::translateAssignExpr(const swift::AssignExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.dest = dispatcher.fetchLabel(expr.getDest());
|
|
entry.source = dispatcher.fetchLabel(expr.getSrc());
|
|
return entry;
|
|
}
|
|
|
|
codeql::BindOptionalExpr ExprTranslator::translateBindOptionalExpr(
|
|
const swift::BindOptionalExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::CaptureListExpr ExprTranslator::translateCaptureListExpr(
|
|
const swift::CaptureListExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.closure_body = dispatcher.fetchLabel(expr.getClosureBody());
|
|
for (const auto& item : const_cast<swift::CaptureListExpr&>(expr).getCaptureList()) {
|
|
entry.binding_decls.push_back(dispatcher.fetchLabel(item.PBD));
|
|
}
|
|
return entry;
|
|
}
|
|
|
|
codeql::BinaryExpr ExprTranslator::translateBinaryExpr(const swift::BinaryExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillApplyExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
|
|
codeql::TupleExpr ExprTranslator::translateTupleExpr(const swift::TupleExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.elements = dispatcher.fetchRepeatedLabels(expr.getElements());
|
|
return entry;
|
|
}
|
|
|
|
codeql::DefaultArgumentExpr ExprTranslator::translateDefaultArgumentExpr(
|
|
const swift::DefaultArgumentExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.param_decl = dispatcher.fetchLabel(expr.getParamDecl());
|
|
entry.param_index = expr.getParamIndex();
|
|
if (expr.isCallerSide()) {
|
|
entry.caller_side_default = dispatcher.fetchLabel(expr.getCallerSideDefaultExpr());
|
|
}
|
|
return entry;
|
|
}
|
|
|
|
codeql::DotSyntaxBaseIgnoredExpr ExprTranslator::translateDotSyntaxBaseIgnoredExpr(
|
|
const swift::DotSyntaxBaseIgnoredExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.qualifier = dispatcher.fetchLabel(expr.getLHS());
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getRHS());
|
|
return entry;
|
|
}
|
|
|
|
codeql::DynamicTypeExpr ExprTranslator::translateDynamicTypeExpr(
|
|
const swift::DynamicTypeExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.base = dispatcher.fetchLabel(expr.getBase());
|
|
return entry;
|
|
}
|
|
|
|
codeql::EnumIsCaseExpr ExprTranslator::translateEnumIsCaseExpr(const swift::EnumIsCaseExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
entry.element = dispatcher.fetchLabel(expr.getEnumElement());
|
|
return entry;
|
|
}
|
|
|
|
codeql::MakeTemporarilyEscapableExpr ExprTranslator::translateMakeTemporarilyEscapableExpr(
|
|
const swift::MakeTemporarilyEscapableExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.escaping_closure = dispatcher.fetchLabel(expr.getOpaqueValue());
|
|
entry.nonescaping_closure = dispatcher.fetchLabel(expr.getNonescapingClosureValue());
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::ObjCSelectorExpr ExprTranslator::translateObjCSelectorExpr(
|
|
const swift::ObjCSelectorExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
entry.method = dispatcher.fetchLabel(expr.getMethod());
|
|
return entry;
|
|
}
|
|
|
|
codeql::OneWayExpr ExprTranslator::translateOneWayExpr(const swift::OneWayExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::OpenExistentialExpr ExprTranslator::translateOpenExistentialExpr(
|
|
const swift::OpenExistentialExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
entry.existential = dispatcher.fetchLabel(expr.getExistentialValue());
|
|
entry.opaque_expr = dispatcher.fetchLabel(expr.getOpaqueValue());
|
|
return entry;
|
|
}
|
|
|
|
codeql::OptionalEvaluationExpr ExprTranslator::translateOptionalEvaluationExpr(
|
|
const swift::OptionalEvaluationExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::RebindSelfInInitializerExpr ExprTranslator::translateRebindSelfInConstructorExpr(
|
|
const swift::RebindSelfInConstructorExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
entry.self = dispatcher.fetchLabel(expr.getSelf());
|
|
return entry;
|
|
}
|
|
|
|
codeql::SuperRefExpr ExprTranslator::translateSuperRefExpr(const swift::SuperRefExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.self = dispatcher.fetchLabel(expr.getSelf());
|
|
return entry;
|
|
}
|
|
|
|
codeql::DotSyntaxCallExpr ExprTranslator::translateDotSyntaxCallExpr(
|
|
const swift::DotSyntaxCallExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillSelfApplyExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
|
|
codeql::VarargExpansionExpr ExprTranslator::translateVarargExpansionExpr(
|
|
const swift::VarargExpansionExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::ArrayExpr ExprTranslator::translateArrayExpr(const swift::ArrayExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.elements = dispatcher.fetchRepeatedLabels(expr.getElements());
|
|
return entry;
|
|
}
|
|
|
|
codeql::TypeExpr ExprTranslator::translateTypeExpr(const swift::TypeExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
if (expr.getTypeRepr() && expr.getInstanceType()) {
|
|
entry.type_repr = dispatcher.fetchLabel(expr.getTypeRepr(), expr.getInstanceType());
|
|
}
|
|
return entry;
|
|
}
|
|
|
|
codeql::InOutExpr ExprTranslator::translateInOutExpr(const swift::InOutExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::OpaqueValueExpr ExprTranslator::translateOpaqueValueExpr(
|
|
const swift::OpaqueValueExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
return entry;
|
|
}
|
|
|
|
codeql::TapExpr ExprTranslator::translateTapExpr(const swift::TapExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.var = dispatcher.fetchLabel(expr.getVar());
|
|
entry.body = dispatcher.fetchLabel(expr.getBody());
|
|
entry.sub_expr = dispatcher.fetchOptionalLabel(expr.getSubExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::TupleElementExpr ExprTranslator::translateTupleElementExpr(
|
|
const swift::TupleElementExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getBase());
|
|
entry.index = expr.getFieldNumber();
|
|
return entry;
|
|
}
|
|
|
|
codeql::TryExpr ExprTranslator::translateTryExpr(const swift::TryExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillAnyTryExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
|
|
codeql::ForceTryExpr ExprTranslator::translateForceTryExpr(const swift::ForceTryExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillAnyTryExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
|
|
codeql::OptionalTryExpr ExprTranslator::translateOptionalTryExpr(
|
|
const swift::OptionalTryExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillAnyTryExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
|
|
codeql::InitializerRefCallExpr ExprTranslator::translateConstructorRefCallExpr(
|
|
const swift::ConstructorRefCallExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillSelfApplyExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
|
|
codeql::DiscardAssignmentExpr ExprTranslator::translateDiscardAssignmentExpr(
|
|
const swift::DiscardAssignmentExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
return entry;
|
|
}
|
|
|
|
codeql::ExplicitClosureExpr ExprTranslator::translateClosureExpr(const swift::ClosureExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillClosureExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
|
|
codeql::AutoClosureExpr ExprTranslator::translateAutoClosureExpr(
|
|
const swift::AutoClosureExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillClosureExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
|
|
codeql::CoerceExpr ExprTranslator::translateCoerceExpr(const swift::CoerceExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillExplicitCastExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
|
|
codeql::ConditionalCheckedCastExpr ExprTranslator::translateConditionalCheckedCastExpr(
|
|
const swift::ConditionalCheckedCastExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillExplicitCastExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
|
|
codeql::ForcedCheckedCastExpr ExprTranslator::translateForcedCheckedCastExpr(
|
|
const swift::ForcedCheckedCastExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillExplicitCastExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
|
|
codeql::IsExpr ExprTranslator::translateIsExpr(const swift::IsExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillExplicitCastExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
|
|
codeql::SubscriptExpr ExprTranslator::translateSubscriptExpr(const swift::SubscriptExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillAccessorSemantics(expr, entry);
|
|
fillLookupExpr(expr, entry);
|
|
CODEQL_EXPECT_OR(return entry, expr.getArgs(), "SubscriptExpr has null getArgs");
|
|
for (const auto& arg : *expr.getArgs()) {
|
|
entry.arguments.push_back(emitArgument(arg));
|
|
}
|
|
return entry;
|
|
}
|
|
|
|
codeql::DictionaryExpr ExprTranslator::translateDictionaryExpr(const swift::DictionaryExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.elements = dispatcher.fetchRepeatedLabels(expr.getElements());
|
|
return entry;
|
|
}
|
|
|
|
codeql::MemberRefExpr ExprTranslator::translateMemberRefExpr(const swift::MemberRefExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillAccessorSemantics(expr, entry);
|
|
fillLookupExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
|
|
codeql::KeyPathExpr ExprTranslator::translateKeyPathExpr(const swift::KeyPathExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
if (!expr.isObjC()) {
|
|
for (const auto& component : expr.getComponents()) {
|
|
entry.components.push_back(emitKeyPathComponent(component));
|
|
}
|
|
if (auto rootTypeRepr = expr.getExplicitRootType()) {
|
|
entry.root = dispatcher.fetchLabel(rootTypeRepr, expr.getRootType());
|
|
}
|
|
}
|
|
return entry;
|
|
}
|
|
|
|
codeql::LazyInitializationExpr ExprTranslator::translateLazyInitializerExpr(
|
|
const swift::LazyInitializerExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::ForceValueExpr ExprTranslator::translateForceValueExpr(const swift::ForceValueExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::IfExpr ExprTranslator::translateTernaryExpr(const swift::TernaryExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.condition = dispatcher.fetchLabel(expr.getCondExpr());
|
|
entry.then_expr = dispatcher.fetchLabel(expr.getThenExpr());
|
|
entry.else_expr = dispatcher.fetchLabel(expr.getElseExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::KeyPathDotExpr ExprTranslator::translateKeyPathDotExpr(const swift::KeyPathDotExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
return entry;
|
|
}
|
|
|
|
codeql::KeyPathApplicationExpr ExprTranslator::translateKeyPathApplicationExpr(
|
|
const swift::KeyPathApplicationExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.base = dispatcher.fetchLabel(expr.getBase());
|
|
entry.key_path = dispatcher.fetchLabel(expr.getKeyPath());
|
|
return entry;
|
|
}
|
|
|
|
codeql::OtherInitializerRefExpr ExprTranslator::translateOtherConstructorDeclRefExpr(
|
|
const swift::OtherConstructorDeclRefExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.initializer = dispatcher.fetchLabel(expr.getDecl());
|
|
return entry;
|
|
}
|
|
|
|
codeql::UnresolvedDeclRefExpr ExprTranslator::translateUnresolvedDeclRefExpr(
|
|
const swift::UnresolvedDeclRefExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
if (expr.hasName()) {
|
|
llvm::SmallVector<char> scratch;
|
|
entry.name = expr.getName().getString(scratch).str();
|
|
}
|
|
return entry;
|
|
}
|
|
|
|
codeql::UnresolvedDotExpr ExprTranslator::translateUnresolvedDotExpr(
|
|
const swift::UnresolvedDotExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.base = dispatcher.fetchLabel(expr.getBase());
|
|
llvm::SmallVector<char> scratch;
|
|
entry.name = expr.getName().getString(scratch).str();
|
|
return entry;
|
|
}
|
|
|
|
codeql::UnresolvedMemberExpr ExprTranslator::translateUnresolvedMemberExpr(
|
|
const swift::UnresolvedMemberExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
llvm::SmallVector<char> scratch;
|
|
entry.name = expr.getName().getString(scratch).str();
|
|
return entry;
|
|
}
|
|
|
|
codeql::SequenceExpr ExprTranslator::translateSequenceExpr(const swift::SequenceExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
// SequenceExpr represents a flat tree of expressions with elements at odd indices being the
|
|
// parents of the elements with even indices, so we only extract the "parent" elements here. In
|
|
// case there is a single child, we extract it as a parent. See
|
|
// https://github.com/github/codeql/pull/14119 and commit message for more details.
|
|
if (expr.getNumElements() == 1) {
|
|
entry.elements = dispatcher.fetchRepeatedLabels(expr.getElements());
|
|
} else {
|
|
for (int i = 1; i < expr.getNumElements(); i += 2) {
|
|
entry.elements.emplace_back(dispatcher.fetchLabel(expr.getElement(i)));
|
|
}
|
|
}
|
|
return entry;
|
|
}
|
|
|
|
codeql::ErrorExpr ExprTranslator::translateErrorExpr(const swift::ErrorExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
return entry;
|
|
}
|
|
|
|
void ExprTranslator::fillClosureExpr(const swift::AbstractClosureExpr& expr,
|
|
codeql::ClosureExpr& entry) {
|
|
entry.body = dispatcher.fetchLabel(expr.getBody());
|
|
if (expr.getCaptureInfo().hasBeenComputed()) {
|
|
entry.captures = dispatcher.fetchRepeatedLabels(expr.getCaptureInfo().getCaptures());
|
|
} else {
|
|
LOG_ERROR("Unable to get CaptureInfo");
|
|
}
|
|
CODEQL_EXPECT_OR(return, expr.getParameters(), "AbstractClosureExpr has null getParameters()");
|
|
entry.params = dispatcher.fetchRepeatedLabels(*expr.getParameters());
|
|
}
|
|
|
|
TrapLabel<ArgumentTag> ExprTranslator::emitArgument(const swift::Argument& arg) {
|
|
auto entry = dispatcher.createUncachedEntry(arg);
|
|
entry.label = arg.getLabel().str().str();
|
|
entry.expr = dispatcher.fetchLabel(arg.getExpr());
|
|
dispatcher.emit(entry);
|
|
return entry.id;
|
|
}
|
|
|
|
TrapLabel<KeyPathComponentTag> ExprTranslator::emitKeyPathComponent(
|
|
const swift::KeyPathExpr::Component& component) {
|
|
auto entry = dispatcher.createUncachedEntry(component);
|
|
entry.kind = static_cast<int>(component.getKind());
|
|
if (auto subscript_args = component.getSubscriptArgs()) {
|
|
for (const auto& arg : *subscript_args) {
|
|
entry.subscript_arguments.push_back(emitArgument(arg));
|
|
}
|
|
}
|
|
if (component.getKind() == swift::KeyPathExpr::Component::Kind::TupleElement) {
|
|
entry.tuple_index = static_cast<int>(component.getTupleIndex());
|
|
}
|
|
if (component.hasDeclRef()) {
|
|
entry.decl_ref = dispatcher.fetchLabel(component.getDeclRef().getDecl());
|
|
}
|
|
entry.component_type = dispatcher.fetchLabel(component.getComponentType());
|
|
dispatcher.emit(entry);
|
|
return entry.id;
|
|
}
|
|
|
|
void ExprTranslator::fillExplicitCastExpr(const swift::ExplicitCastExpr& expr,
|
|
codeql::ExplicitCastExpr& entry) {
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
}
|
|
|
|
void ExprTranslator::fillIdentityExpr(const swift::IdentityExpr& expr,
|
|
codeql::IdentityExpr& entry) {
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
}
|
|
|
|
void ExprTranslator::fillAnyTryExpr(const swift::AnyTryExpr& expr, codeql::AnyTryExpr& entry) {
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
}
|
|
|
|
void ExprTranslator::fillApplyExpr(const swift::ApplyExpr& expr, codeql::ApplyExpr& entry) {
|
|
entry.function = dispatcher.fetchLabel(expr.getFn());
|
|
CODEQL_EXPECT_OR(return, expr.getArgs(), "ApplyExpr has null getArgs");
|
|
for (const auto& arg : *expr.getArgs()) {
|
|
entry.arguments.push_back(emitArgument(arg));
|
|
}
|
|
}
|
|
|
|
void ExprTranslator::fillSelfApplyExpr(const swift::SelfApplyExpr& expr,
|
|
codeql::SelfApplyExpr& entry) {
|
|
entry.base = dispatcher.fetchLabel(expr.getBase());
|
|
fillApplyExpr(expr, entry);
|
|
}
|
|
|
|
void ExprTranslator::fillLookupExpr(const swift::LookupExpr& expr, codeql::LookupExpr& entry) {
|
|
entry.base = dispatcher.fetchLabel(expr.getBase());
|
|
if (expr.hasDecl()) {
|
|
entry.member = dispatcher.fetchLabel(expr.getDecl().getDecl());
|
|
}
|
|
}
|
|
|
|
codeql::UnresolvedPatternExpr ExprTranslator::translateUnresolvedPatternExpr(
|
|
const swift::UnresolvedPatternExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_pattern = dispatcher.fetchLabel(expr.getSubPattern());
|
|
return entry;
|
|
}
|
|
|
|
codeql::ObjectLiteralExpr ExprTranslator::translateObjectLiteralExpr(
|
|
const swift::ObjectLiteralExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.kind = static_cast<int>(expr.getLiteralKind());
|
|
if (auto args = expr.getArgs()) {
|
|
for (const auto& arg : *args) {
|
|
entry.arguments.push_back(emitArgument(arg));
|
|
}
|
|
}
|
|
return entry;
|
|
}
|
|
codeql::OverloadedDeclRefExpr ExprTranslator::translateOverloadedDeclRefExpr(
|
|
const swift::OverloadedDeclRefExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.possible_declarations = dispatcher.fetchRepeatedLabels(expr.getDecls());
|
|
return entry;
|
|
}
|
|
|
|
codeql::DynamicMemberRefExpr ExprTranslator::translateDynamicMemberRefExpr(
|
|
const swift::DynamicMemberRefExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillLookupExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
|
|
codeql::DynamicSubscriptExpr ExprTranslator::translateDynamicSubscriptExpr(
|
|
const swift::DynamicSubscriptExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
fillLookupExpr(expr, entry);
|
|
return entry;
|
|
}
|
|
codeql::UnresolvedSpecializeExpr ExprTranslator::translateUnresolvedSpecializeExpr(
|
|
const swift::UnresolvedSpecializeExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::PropertyWrapperValuePlaceholderExpr
|
|
ExprTranslator::translatePropertyWrapperValuePlaceholderExpr(
|
|
const swift::PropertyWrapperValuePlaceholderExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.wrapped_value = dispatcher.fetchOptionalLabel(expr.getOriginalWrappedValue());
|
|
entry.placeholder = dispatcher.fetchLabel(expr.getOpaqueValuePlaceholder());
|
|
return entry;
|
|
}
|
|
|
|
static int translatePropertyWrapperValueKind(swift::AppliedPropertyWrapperExpr::ValueKind kind) {
|
|
using K = swift::AppliedPropertyWrapperExpr::ValueKind;
|
|
switch (kind) {
|
|
case K::WrappedValue:
|
|
return 1;
|
|
case K::ProjectedValue:
|
|
return 2;
|
|
default:
|
|
return 0;
|
|
}
|
|
}
|
|
|
|
codeql::AppliedPropertyWrapperExpr ExprTranslator::translateAppliedPropertyWrapperExpr(
|
|
const swift::AppliedPropertyWrapperExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.kind = translatePropertyWrapperValueKind(expr.getValueKind());
|
|
entry.value =
|
|
dispatcher.fetchLabel(const_cast<swift::AppliedPropertyWrapperExpr&>(expr).getValue());
|
|
entry.param = dispatcher.fetchLabel(expr.getParamDecl());
|
|
return entry;
|
|
}
|
|
|
|
codeql::RegexLiteralExpr ExprTranslator::translateRegexLiteralExpr(
|
|
const swift::RegexLiteralExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
auto pattern = expr.getParsedRegexText();
|
|
// the pattern has enclosing '/' delimiters, we'd rather get it without
|
|
entry.pattern = pattern.substr(1, pattern.size() - 2);
|
|
entry.version = expr.getVersion();
|
|
return entry;
|
|
}
|
|
|
|
codeql::SingleValueStmtExpr ExprTranslator::translateSingleValueStmtExpr(
|
|
const swift::SingleValueStmtExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.stmt = dispatcher.fetchLabel(expr.getStmt());
|
|
return entry;
|
|
}
|
|
|
|
codeql::PackExpansionExpr ExprTranslator::translatePackExpansionExpr(
|
|
const swift::PackExpansionExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.pattern_expr = dispatcher.fetchLabel(expr.getPatternExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::PackElementExpr ExprTranslator::translatePackElementExpr(
|
|
const swift::PackElementExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getPackRefExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::CopyExpr ExprTranslator::translateCopyExpr(const swift::CopyExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::ConsumeExpr ExprTranslator::translateConsumeExpr(const swift::ConsumeExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getSubExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::MaterializePackExpr ExprTranslator::translateMaterializePackExpr(
|
|
const swift::MaterializePackExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.sub_expr = dispatcher.fetchLabel(expr.getFromExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::ExtractFunctionIsolationExpr ExprTranslator::translateExtractFunctionIsolationExpr(
|
|
const swift::ExtractFunctionIsolationExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.function_expr = dispatcher.fetchLabel(expr.getFunctionExpr());
|
|
return entry;
|
|
}
|
|
|
|
codeql::CurrentContextIsolationExpr ExprTranslator::translateCurrentContextIsolationExpr(
|
|
const swift::CurrentContextIsolationExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
entry.actor = dispatcher.fetchLabel(expr.getActor());
|
|
return entry;
|
|
}
|
|
|
|
codeql::TypeValueExpr ExprTranslator::translateTypeValueExpr(const swift::TypeValueExpr& expr) {
|
|
auto entry = createExprEntry(expr);
|
|
if (expr.getParamTypeRepr() && expr.getParamType()) {
|
|
entry.type_repr = dispatcher.fetchLabel(expr.getParamTypeRepr(), expr.getParamType());
|
|
}
|
|
return entry;
|
|
}
|
|
|
|
} // namespace codeql
|