#include "swift/extractor/translators/ExprTranslator.h" #include namespace codeql { template void ExprTranslator::fillAccessorSemantics(const T& ast, TrapClassOf& 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(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 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 scratch; entry.name = expr.getName().getString(scratch).str(); return entry; } codeql::UnresolvedMemberExpr ExprTranslator::translateUnresolvedMemberExpr( const swift::UnresolvedMemberExpr& expr) { auto entry = createExprEntry(expr); llvm::SmallVector 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 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 ExprTranslator::emitKeyPathComponent( const swift::KeyPathExpr::Component& component) { auto entry = dispatcher.createUncachedEntry(component); entry.kind = static_cast(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(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(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(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); entry.type_repr = dispatcher.fetchLabel(expr.getParamTypeRepr()); return entry; } } // namespace codeql