Skip to content

Commit a6a6ad8

Browse files
authored
Merge pull request #17099 from CodaFi/ast-toner
Excise getInput() from printing
2 parents d6bf8e3 + 7d82e70 commit a6a6ad8

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)