@@ -85,12 +85,13 @@ class CFunctionSignatureTypePrinter
8585 PrimitiveTypeMapping &typeMapping, OutputLanguageMode languageMode,
8686 SwiftToClangInteropContext &interopContext,
8787 CFunctionSignatureTypePrinterModifierDelegate modifiersDelegate,
88+ const ModuleDecl *moduleContext,
8889 FunctionSignatureTypeUse typeUseKind =
8990 FunctionSignatureTypeUse::ParamType)
9091 : ClangSyntaxPrinter(os), cPrologueOS(cPrologueOS),
9192 typeMapping (typeMapping), interopContext(interopContext),
9293 languageMode(languageMode), modifiersDelegate(modifiersDelegate),
93- typeUseKind(typeUseKind) {}
94+ moduleContext(moduleContext), typeUseKind(typeUseKind) {}
9495
9596 bool printIfKnownSimpleType (const TypeDecl *typeDecl,
9697 Optional<OptionalTypeKind> optionalKind,
@@ -168,11 +169,12 @@ class CFunctionSignatureTypePrinter
168169
169170 } else {
170171 ClangValueTypePrinter (os, cPrologueOS, typeMapping, interopContext)
171- .printValueTypeParameterType (decl, languageMode, isInOutParam);
172+ .printValueTypeParameterType (decl, languageMode, moduleContext,
173+ isInOutParam);
172174 }
173175 } else
174176 ClangValueTypePrinter (os, cPrologueOS, typeMapping, interopContext)
175- .printValueTypeReturnType (decl, languageMode);
177+ .printValueTypeReturnType (decl, languageMode, moduleContext );
176178 }
177179
178180 void visitPart (Type Ty, Optional<OptionalTypeKind> optionalKind,
@@ -186,6 +188,7 @@ class CFunctionSignatureTypePrinter
186188 SwiftToClangInteropContext &interopContext;
187189 OutputLanguageMode languageMode;
188190 CFunctionSignatureTypePrinterModifierDelegate modifiersDelegate;
191+ const ModuleDecl *moduleContext;
189192 FunctionSignatureTypeUse typeUseKind;
190193};
191194
@@ -195,6 +198,7 @@ void DeclAndTypeClangFunctionPrinter::printFunctionSignature(
195198 const AbstractFunctionDecl *FD, StringRef name, Type resultTy,
196199 FunctionSignatureKind kind, ArrayRef<AdditionalParam> additionalParams,
197200 FunctionSignatureModifiers modifiers) {
201+ auto emittedModule = FD->getModuleContext ();
198202 OutputLanguageMode outputLang = kind == FunctionSignatureKind::CFunctionProto
199203 ? OutputLanguageMode::ObjC
200204 : OutputLanguageMode::Cxx;
@@ -205,8 +209,9 @@ void DeclAndTypeClangFunctionPrinter::printFunctionSignature(
205209 CFunctionSignatureTypePrinterModifierDelegate delegate = {}) {
206210 // FIXME: add support for noescape and PrintMultiPartType,
207211 // see DeclAndTypePrinter::print.
208- CFunctionSignatureTypePrinter typePrinter (
209- os, cPrologueOS, typeMapping, outputLang, interopContext, delegate);
212+ CFunctionSignatureTypePrinter typePrinter (os, cPrologueOS, typeMapping,
213+ outputLang, interopContext,
214+ delegate, emittedModule);
210215 typePrinter.visit (ty, optionalKind, isInOutParam);
211216
212217 if (!name.empty ()) {
@@ -228,7 +233,7 @@ void DeclAndTypeClangFunctionPrinter::printFunctionSignature(
228233 DeclAndTypePrinter::getObjectTypeAndOptionality (FD, resultTy);
229234 CFunctionSignatureTypePrinter typePrinter (
230235 os, cPrologueOS, typeMapping, outputLang, interopContext,
231- CFunctionSignatureTypePrinterModifierDelegate (),
236+ CFunctionSignatureTypePrinterModifierDelegate (), emittedModule,
232237 FunctionSignatureTypeUse::ReturnType);
233238 // Param for indirect return cannot be marked as inout
234239 typePrinter.visit (objTy, retKind, /* isInOutParam=*/ false );
@@ -312,8 +317,8 @@ void DeclAndTypeClangFunctionPrinter::printFunctionSignature(
312317}
313318
314319void DeclAndTypeClangFunctionPrinter::printCxxToCFunctionParameterUse (
315- Type type, StringRef name, bool isInOut , bool isIndirect ,
316- llvm::Optional<AdditionalParam::Role> paramRole) {
320+ Type type, StringRef name, const ModuleDecl *moduleContext , bool isInOut ,
321+ bool isIndirect, llvm::Optional<AdditionalParam::Role> paramRole) {
317322 auto namePrinter = [&]() { ClangSyntaxPrinter (os).printIdentifier (name); };
318323 if (!isKnownCxxType (type, typeMapping) &&
319324 !hasKnownOptionalNullableCxxMapping (type)) {
@@ -323,7 +328,7 @@ void DeclAndTypeClangFunctionPrinter::printCxxToCFunctionParameterUse(
323328 .printParameterCxxToCUseScaffold (
324329 isIndirect || decl->isResilient () ||
325330 interopContext.getIrABIDetails ().shouldPassIndirectly (type),
326- decl, namePrinter, isInOut,
331+ decl, moduleContext, namePrinter, isInOut,
327332 /* isSelf=*/ paramRole &&
328333 *paramRole == AdditionalParam::Role::Self);
329334 return ;
@@ -339,12 +344,14 @@ void DeclAndTypeClangFunctionPrinter::printCxxToCFunctionParameterUse(
339344
340345void DeclAndTypeClangFunctionPrinter::printCxxToCFunctionParameterUse (
341346 const ParamDecl *param, StringRef name) {
342- printCxxToCFunctionParameterUse (param->getType (), name, param->isInOut ());
347+ printCxxToCFunctionParameterUse (param->getType (), name,
348+ param->getModuleContext (), param->isInOut ());
343349}
344350
345351void DeclAndTypeClangFunctionPrinter::printCxxThunkBody (
346- StringRef swiftSymbolName, Type resultTy, const ParameterList *params,
347- ArrayRef<AdditionalParam> additionalParams, bool hasThrows) {
352+ StringRef swiftSymbolName, const ModuleDecl *moduleContext, Type resultTy,
353+ const ParameterList *params, ArrayRef<AdditionalParam> additionalParams,
354+ bool hasThrows) {
348355 if (hasThrows) {
349356 os << " void* opaqueError = nullptr;\n " ;
350357 os << " void* self = nullptr;\n " ;
@@ -382,17 +389,17 @@ void DeclAndTypeClangFunctionPrinter::printCxxThunkBody(
382389 os << " , " ;
383390 interleaveComma (additionalParams, os, [&](const AdditionalParam ¶m) {
384391 if (param.role == AdditionalParam::Role::Self && !hasThrows)
385- printCxxToCFunctionParameterUse (param. type , " *this " , /* isInOut= */ false ,
386- /* isIndirect =*/ param. isIndirect ,
387- param.role );
392+ printCxxToCFunctionParameterUse (
393+ param. type , " *this " , moduleContext, /* isInOut =*/ false ,
394+ /* isIndirect= */ param. isIndirect , param.role );
388395 else if (param.role == AdditionalParam::Role::Self && hasThrows)
389- printCxxToCFunctionParameterUse (param. type , " self " , /* isInOut= */ false ,
390- /* isIndirect =*/ param. isIndirect ,
391- param.role );
396+ printCxxToCFunctionParameterUse (
397+ param. type , " self " , moduleContext, /* isInOut =*/ false ,
398+ /* isIndirect= */ param. isIndirect , param.role );
392399 else if (param.role == AdditionalParam::Role::Error && hasThrows)
393- printCxxToCFunctionParameterUse (param. type , " &opaqueError " , /* isInOut= */ false ,
394- /* isIndirect =*/ param. isIndirect ,
395- param.role );
400+ printCxxToCFunctionParameterUse (
401+ param. type , " &opaqueError " , moduleContext, /* isInOut =*/ false ,
402+ /* isIndirect= */ param. isIndirect , param.role );
396403 });
397404 }
398405
@@ -412,12 +419,13 @@ void DeclAndTypeClangFunctionPrinter::printCxxThunkBody(
412419 interopContext);
413420 if (isIndirect) {
414421 valueTypePrinter.printValueTypeIndirectReturnScaffold (
415- decl, [&](StringRef returnParam) {
422+ decl, moduleContext, [&](StringRef returnParam) {
416423 printCallToCFunc (/* additionalParam=*/ returnParam);
417424 });
418425 } else {
419426 valueTypePrinter.printValueTypeDirectReturnScaffold (
420- decl, [&]() { printCallToCFunc (/* additionalParam=*/ None); });
427+ decl, moduleContext,
428+ [&]() { printCallToCFunc (/* additionalParam=*/ None); });
421429 }
422430 return ;
423431 }
@@ -464,8 +472,8 @@ void DeclAndTypeClangFunctionPrinter::printCxxMethod(
464472 typeDeclContext->getDeclaredType (),
465473 /* isIndirect=*/ isMutating,
466474 });
467- printCxxThunkBody (swiftSymbolName, resultTy, FD->getParameters () ,
468- additionalParams, FD->hasThrows ());
475+ printCxxThunkBody (swiftSymbolName, FD->getModuleContext (), resultTy ,
476+ FD-> getParameters (), additionalParams, FD->hasThrows ());
469477 os << " }\n " ;
470478}
471479
@@ -482,7 +490,7 @@ void DeclAndTypeClangFunctionPrinter::printCxxPropertyAccessorMethod(
482490 CFunctionSignatureTypePrinter typePrinter (
483491 os, cPrologueOS, typeMapping, OutputLanguageMode::Cxx, interopContext,
484492 CFunctionSignatureTypePrinterModifierDelegate (),
485- FunctionSignatureTypeUse::ReturnType);
493+ accessor-> getModuleContext (), FunctionSignatureTypeUse::ReturnType);
486494 typePrinter.visit (objTy, retKind, /* isInOut=*/ false );
487495
488496 ClangSyntaxPrinter printer (os);
@@ -506,7 +514,8 @@ void DeclAndTypeClangFunctionPrinter::printCxxPropertyAccessorMethod(
506514 }
507515 os << " {\n " ;
508516 // FIXME: should it be objTy for resultTy?
509- printCxxThunkBody (swiftSymbolName, resultTy, accessor->getParameters (),
517+ printCxxThunkBody (swiftSymbolName, accessor->getModuleContext (), resultTy,
518+ accessor->getParameters (),
510519 {AdditionalParam{AdditionalParam::Role::Self,
511520 typeDeclContext->getDeclaredType (),
512521 /* isIndirect=*/ false }});
0 commit comments