Skip to content

Commit 7d82e70

Browse files
committed
Excise getInput() from printing
Not NFC because it changes the printing behavior for function type parameters. They are no longer reported as types (paren, tuple, or raw), but as Params.
1 parent 60f2002 commit 7d82e70

File tree

3 files changed

+87
-68
lines changed

3 files changed

+87
-68
lines changed

lib/AST/ASTDumper.cpp

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3359,6 +3359,25 @@ namespace {
33593359
OS << ")";
33603360
}
33613361

3362+
void printAnyFunctionParams(ArrayRef<AnyFunctionType::Param> params,
3363+
StringRef label) {
3364+
printCommon(label, "function_params");
3365+
printField("num_params", params.size());
3366+
Indent += 2;
3367+
for (const auto &param : params) {
3368+
OS << "\n";
3369+
OS.indent(Indent) << "(";
3370+
PrintWithColorRAII(OS, TypeFieldColor) << "param";
3371+
if (param.hasLabel())
3372+
printField("name", param.getLabel().str());
3373+
dumpParameterFlags(param.getParameterFlags());
3374+
printRec(param.getType());
3375+
OS << ")";
3376+
}
3377+
Indent -= 2;
3378+
OS << ")";
3379+
}
3380+
33623381
void printAnyFunctionTypeCommon(AnyFunctionType *T, StringRef label,
33633382
StringRef name) {
33643383
printCommon(label, name);
@@ -3373,7 +3392,10 @@ namespace {
33733392
printFlag(!T->isNoEscape(), "escaping");
33743393
printFlag(T->throws(), "throws");
33753394

3376-
printRec("input", T->getInput());
3395+
OS << "\n";
3396+
Indent += 2;
3397+
printAnyFunctionParams(T->getParams(), "input");
3398+
Indent -=2;
33773399
printRec("output", T->getResult());
33783400
}
33793401

lib/AST/ASTPrinter.cpp

Lines changed: 62 additions & 65 deletions
Original file line numberDiff line numberDiff line change
@@ -624,7 +624,9 @@ class PrintAST : public ASTVisitor<PrintAST> {
624624
void printOneParameter(const ParamDecl *param, ParameterTypeFlags paramFlags,
625625
bool Curried, bool ArgNameIsAPIByDefault);
626626

627-
void printParameterList(ParameterList *PL, Type paramListTy, bool isCurried,
627+
void printParameterList(ParameterList *PL,
628+
ArrayRef<AnyFunctionType::Param> params,
629+
bool isCurried,
628630
llvm::function_ref<bool()> isAPINameByDefault);
629631

630632
/// \brief Print the function parameters in curried or selector style,
@@ -2309,30 +2311,19 @@ void PrintAST::printOneParameter(const ParamDecl *param,
23092311
}
23102312
}
23112313

2312-
void PrintAST::printParameterList(ParameterList *PL, Type paramListTy,
2314+
void PrintAST::printParameterList(ParameterList *PL,
2315+
ArrayRef<AnyFunctionType::Param> params,
23132316
bool isCurried,
23142317
llvm::function_ref<bool()> isAPINameByDefault) {
2315-
SmallVector<ParameterTypeFlags, 4> paramFlags;
2316-
if (paramListTy && !paramListTy->hasError()) {
2317-
if (auto parenTy = dyn_cast<ParenType>(paramListTy.getPointer())) {
2318-
paramFlags.push_back(parenTy->getParameterFlags());
2319-
} else if (auto tupleTy = paramListTy->getAs<TupleType>()) {
2320-
for (auto elt : tupleTy->getElements())
2321-
paramFlags.push_back(elt.getParameterFlags());
2322-
} else {
2323-
paramFlags.push_back({});
2324-
}
2325-
} else {
2326-
// Malformed AST, just use default flags
2327-
paramFlags.resize(PL->size());
2328-
}
2329-
23302318
Printer << "(";
2319+
const unsigned paramSize = params.size();
23312320
for (unsigned i = 0, e = PL->size(); i != e; ++i) {
23322321
if (i > 0)
23332322
Printer << ", ";
2334-
2335-
printOneParameter(PL->get(i), paramFlags[i], isCurried,
2323+
auto paramFlags = (i < paramSize)
2324+
? params[i].getParameterFlags()
2325+
: ParameterTypeFlags();
2326+
printOneParameter(PL->get(i), paramFlags, isCurried,
23362327
isAPINameByDefault());
23372328
}
23382329
Printer << ")";
@@ -2350,15 +2341,13 @@ void PrintAST::printFunctionParameters(AbstractFunctionDecl *AFD) {
23502341
curTy = funTy->getResult();
23512342
}
23522343

2353-
SmallVector<Type, 4> parameterListTypes;
2344+
SmallVector<ArrayRef<AnyFunctionType::Param>, 4> parameterListTypes;
23542345
for (unsigned i = 0; i < BodyParams.size(); ++i) {
23552346
if (curTy) {
23562347
if (auto funTy = curTy->getAs<AnyFunctionType>()) {
2357-
parameterListTypes.push_back(funTy->getInput());
2348+
parameterListTypes.push_back(funTy->getParams());
23582349
if (i < BodyParams.size() - 1)
23592350
curTy = funTy->getResult();
2360-
} else {
2361-
parameterListTypes.push_back(curTy);
23622351
}
23632352
}
23642353
}
@@ -2368,7 +2357,7 @@ void PrintAST::printFunctionParameters(AbstractFunctionDecl *AFD) {
23682357
// Be extra careful in the event of printing mal-formed ASTs
23692358
auto paramListType = CurrPattern < parameterListTypes.size()
23702359
? parameterListTypes[CurrPattern]
2371-
: nullptr;
2360+
: ArrayRef<AnyFunctionType::Param>();
23722361
printParameterList(BodyParams[CurrPattern], paramListType,
23732362
/*isCurried=*/CurrPattern > 0,
23742363
[&]()->bool {
@@ -2563,11 +2552,18 @@ void PrintAST::printEnumElement(EnumElementDecl *elt) {
25632552
llvm::SaveAndRestore<PrintOptions::ArgAndParamPrintingMode>
25642553
mode(Options.ArgAndParamPrinting,
25652554
PrintOptions::ArgAndParamPrintingMode::EnumElement);
2566-
printParameterList(PL,
2567-
elt->hasInterfaceType()
2568-
? elt->getArgumentInterfaceType()
2569-
: nullptr,
2570-
/*isCurried=*/false,
2555+
2556+
2557+
auto params = ArrayRef<AnyFunctionType::Param>();
2558+
if (elt->hasInterfaceType() && !elt->getInterfaceType()->hasError()) {
2559+
// Walk to the params of the associated values.
2560+
// (EnumMetaType) -> (AssocValues) -> Enum
2561+
params = elt->getInterfaceType()->castTo<AnyFunctionType>()
2562+
->getResult()
2563+
->castTo<AnyFunctionType>()
2564+
->getParams();
2565+
}
2566+
printParameterList(PL, params, /*isCurried=*/false,
25712567
/*isAPINameByDefault*/[]()->bool{return true;});
25722568
}
25732569

@@ -2636,11 +2632,12 @@ void PrintAST::visitSubscriptDecl(SubscriptDecl *decl) {
26362632
Printer << "subscript";
26372633
}, [&] { // Parameters
26382634
printGenericDeclGenericParams(decl);
2639-
printParameterList(decl->getIndices(),
2640-
decl->hasInterfaceType()
2641-
? decl->getIndicesInterfaceType()
2642-
: nullptr,
2643-
/*isCurried=*/false,
2635+
auto params = ArrayRef<AnyFunctionType::Param>();
2636+
if (decl->hasInterfaceType() && !decl->getInterfaceType()->hasError()) {
2637+
// Walk to the params of the subscript's indices.
2638+
params = decl->getInterfaceType()->castTo<AnyFunctionType>()->getParams();
2639+
}
2640+
printParameterList(decl->getIndices(), params, /*isCurried=*/false,
26442641
/*isAPINameByDefault*/[]()->bool{return false;});
26452642
});
26462643
Printer << " -> ";
@@ -3522,6 +3519,35 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
35223519
}
35233520
}
35243521

3522+
void visitAnyFunctionTypeParams(ArrayRef<AnyFunctionType::Param> Params,
3523+
bool printLabels) {
3524+
Printer << "(";
3525+
3526+
for (unsigned i = 0, e = Params.size(); i != e; ++i) {
3527+
if (i)
3528+
Printer << ", ";
3529+
const AnyFunctionType::Param &Param = Params[i];
3530+
3531+
Printer.callPrintStructurePre(PrintStructureKind::FunctionParameter);
3532+
SWIFT_DEFER {
3533+
Printer.printStructurePost(PrintStructureKind::FunctionParameter);
3534+
};
3535+
3536+
if (printLabels && Param.hasLabel()) {
3537+
Printer.printName(Param.getLabel(),
3538+
PrintNameContext::FunctionParameterExternal);
3539+
Printer << ": ";
3540+
}
3541+
3542+
printParameterFlags(Printer, Options, Param.getParameterFlags());
3543+
visit(Param.getType());
3544+
if (Param.isVariadic())
3545+
Printer << "...";
3546+
}
3547+
3548+
Printer << ")";
3549+
}
3550+
35253551
void visitFunctionType(FunctionType *T) {
35263552
Printer.callPrintStructurePre(PrintStructureKind::FunctionType);
35273553
SWIFT_DEFER {
@@ -3531,26 +3557,7 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
35313557
printFunctionExtInfo(T->getExtInfo());
35323558

35333559
// If we're stripping argument labels from types, do it when printing.
3534-
Type inputType = T->getInput();
3535-
if (auto tupleTy = dyn_cast<TupleType>(inputType.getPointer())) {
3536-
SmallVector<TupleTypeElt, 4> elements;
3537-
elements.reserve(tupleTy->getNumElements());
3538-
for (const auto &elt : tupleTy->getElements())
3539-
elements.push_back(elt.getWithoutName());
3540-
inputType = TupleType::get(elements, inputType->getASTContext());
3541-
}
3542-
3543-
bool needsParens =
3544-
!inputType->hasParenSugar() &&
3545-
!inputType->is<TupleType>();
3546-
3547-
if (needsParens)
3548-
Printer << "(";
3549-
3550-
visit(inputType);
3551-
3552-
if (needsParens)
3553-
Printer << ")";
3560+
visitAnyFunctionTypeParams(T->getParams(), /*printLabels*/false);
35543561

35553562
if (T->throws())
35563563
Printer << " " << tok::kw_throws;
@@ -3579,17 +3586,7 @@ class TypePrinter : public TypeVisitor<TypePrinter> {
35793586
PrintAST::PrintRequirements);
35803587
Printer << " ";
35813588

3582-
bool needsParens =
3583-
!T->getInput()->hasParenSugar() &&
3584-
!T->getInput()->is<TupleType>();
3585-
3586-
if (needsParens)
3587-
Printer << "(";
3588-
3589-
visit(T->getInput());
3590-
3591-
if (needsParens)
3592-
Printer << ")";
3589+
visitAnyFunctionTypeParams(T->getParams(), /*printLabels*/true);
35933590

35943591
if (T->throws())
35953592
Printer << " " << tok::kw_throws;

test/SourceKit/DocSupport/doc_clang_module.swift.response

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -5952,7 +5952,7 @@ var FooSubUnnamedEnumeratorA1: Int { get }
59525952
key.usr: "c:@F@fooFuncWithBlock",
59535953
key.offset: 3729,
59545954
key.length: 49,
5955-
key.fully_annotated_decl: "<decl.function.free><syntaxtype.keyword>func</syntaxtype.keyword> <decl.name>fooFuncWithBlock</decl.name>(<decl.var.parameter><decl.var.parameter.argument_label>_</decl.var.parameter.argument_label> <decl.var.parameter.name>blk</decl.var.parameter.name>: <decl.var.parameter.type>((<ref.struct usr=\"s:Sf\">Float</ref.struct>) -&gt; <decl.function.returntype><ref.struct usr=\"s:s5Int32V\">Int32</ref.struct></decl.function.returntype>)!</decl.var.parameter.type></decl.var.parameter>)</decl.function.free>",
5955+
key.fully_annotated_decl: "<decl.function.free><syntaxtype.keyword>func</syntaxtype.keyword> <decl.name>fooFuncWithBlock</decl.name>(<decl.var.parameter><decl.var.parameter.argument_label>_</decl.var.parameter.argument_label> <decl.var.parameter.name>blk</decl.var.parameter.name>: <decl.var.parameter.type>((<decl.var.parameter><decl.var.parameter.type><ref.struct usr=\"s:Sf\">Float</ref.struct></decl.var.parameter.type></decl.var.parameter>) -&gt; <decl.function.returntype><ref.struct usr=\"s:s5Int32V\">Int32</ref.struct></decl.function.returntype>)!</decl.var.parameter.type></decl.var.parameter>)</decl.function.free>",
59565956
key.entities: [
59575957
{
59585958
key.kind: source.lang.swift.decl.var.local,
@@ -5969,7 +5969,7 @@ var FooSubUnnamedEnumeratorA1: Int { get }
59695969
key.usr: "c:@F@fooFuncWithFunctionPointer",
59705970
key.offset: 3779,
59715971
key.length: 60,
5972-
key.fully_annotated_decl: "<decl.function.free><syntaxtype.keyword>func</syntaxtype.keyword> <decl.name>fooFuncWithFunctionPointer</decl.name>(<decl.var.parameter><decl.var.parameter.argument_label>_</decl.var.parameter.argument_label> <decl.var.parameter.name>fptr</decl.var.parameter.name>: <decl.var.parameter.type>((<ref.struct usr=\"s:Sf\">Float</ref.struct>) -&gt; <decl.function.returntype><ref.struct usr=\"s:s5Int32V\">Int32</ref.struct></decl.function.returntype>)!</decl.var.parameter.type></decl.var.parameter>)</decl.function.free>",
5972+
key.fully_annotated_decl: "<decl.function.free><syntaxtype.keyword>func</syntaxtype.keyword> <decl.name>fooFuncWithFunctionPointer</decl.name>(<decl.var.parameter><decl.var.parameter.argument_label>_</decl.var.parameter.argument_label> <decl.var.parameter.name>fptr</decl.var.parameter.name>: <decl.var.parameter.type>((<decl.var.parameter><decl.var.parameter.type><ref.struct usr=\"s:Sf\">Float</ref.struct></decl.var.parameter.type></decl.var.parameter>) -&gt; <decl.function.returntype><ref.struct usr=\"s:s5Int32V\">Int32</ref.struct></decl.function.returntype>)!</decl.var.parameter.type></decl.var.parameter>)</decl.function.free>",
59735973
key.entities: [
59745974
{
59755975
key.kind: source.lang.swift.decl.var.local,

0 commit comments

Comments
 (0)