Skip to content

Commit 0e8978a

Browse files
committed
[SourceKit] Annotate parameter noescape/autoclosure attributes
rdar://problem/25128165
1 parent ee3e7a5 commit 0e8978a

File tree

2 files changed

+30
-5
lines changed

2 files changed

+30
-5
lines changed

lib/AST/ASTPrinter.cpp

Lines changed: 17 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -2277,11 +2277,23 @@ void PrintAST::printOneParameter(const ParamDecl *param, bool Curried,
22772277
if (param->hasType()) {
22782278
auto bodyCanType = param->getType()->getCanonicalType();
22792279
if (auto patternType = dyn_cast<AnyFunctionType>(bodyCanType)) {
2280-
switch (patternType->isAutoClosure()*2 + patternType->isNoEscape()) {
2281-
case 0: break; // neither.
2282-
case 1: Printer << "@noescape "; break;
2283-
case 2: Printer << "@autoclosure(escaping) "; break;
2284-
case 3: Printer << "@autoclosure "; break;
2280+
if (patternType->isAutoClosure() || patternType->isNoEscape()) {
2281+
Printer.callPrintStructurePre(PrintStructureKind::BuiltinAttribute);
2282+
switch (patternType->isAutoClosure()*2 + patternType->isNoEscape()) {
2283+
case 1:
2284+
Printer.printAttrName("@noescape");
2285+
break;
2286+
case 2:
2287+
Printer.printAttrName("@autoclosure");
2288+
Printer << "(escaping)";
2289+
break;
2290+
case 3: Printer.printAttrName("@autoclosure");
2291+
break;
2292+
default:
2293+
llvm_unreachable("impossible autoclosure/noescape");
2294+
}
2295+
Printer.printStructurePost(PrintStructureKind::BuiltinAttribute);
2296+
Printer << " ";
22852297
}
22862298
}
22872299
}

test/SourceKit/SourceDocInfo/cursor_info.swift

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -151,6 +151,10 @@ protocol P2: class, P1 {}
151151

152152
typealias MyAlias<T, U> = (T, U, T, U)
153153
typealias MyAlias2<A, B> = MyAlias<A, B>
154+
155+
func paramAutoclosureNoescape1(@noescape msg: ()->String) {}
156+
func paramAutoclosureNoescape2(@autoclosure msg: ()->String) {}
157+
func paramAutoclosureNoescape3(@autoclosure(escaping) msg: ()->String) {}
154158
// RUN: rm -rf %t.tmp
155159
// RUN: mkdir %t.tmp
156160
// RUN: %swiftc_driver -emit-module -o %t.tmp/FooSwiftModule.swiftmodule %S/Inputs/FooSwiftModule.swift
@@ -551,3 +555,12 @@ typealias MyAlias2<A, B> = MyAlias<A, B>
551555
// FIXME: missing USR for generic typealias parameter.
552556
// CHECK69-NEXT: <Declaration>typealias MyAlias&lt;T, U&gt; = (<Type usr="{{.*}}">T</Type>, <Type usr="{{.*}}">U</Type>, <Type usr="{{.*}}">T</Type>, <Type usr="{{.*}}">U</Type>)</Declaration>
553557
// CHECK69-NEXT: <decl.typealias><syntaxtype.keyword>typealias</syntaxtype.keyword> <decl.name>MyAlias</decl.name>&lt;<decl.generic_type_param usr="{{.*}}"><decl.generic_type_param.name>T</decl.generic_type_param.name></decl.generic_type_param>, <decl.generic_type_param usr="{{.*}}"><decl.generic_type_param.name>U</decl.generic_type_param.name></decl.generic_type_param>&gt; = (<tuple.element><tuple.element.type><ref.generic_type_param usr="{{.*}}">T</ref.generic_type_param></tuple.element.type></tuple.element>, <tuple.element><tuple.element.type><ref.generic_type_param usr="{{.*}}">U</ref.generic_type_param></tuple.element.type></tuple.element>, <tuple.element><tuple.element.type><ref.generic_type_param usr="{{.*}}">T</ref.generic_type_param></tuple.element.type></tuple.element>, <tuple.element><tuple.element.type><ref.generic_type_param usr="{{.*}}">U</ref.generic_type_param></tuple.element.type></tuple.element>)</decl.typealias>
558+
559+
// RUN: %sourcekitd-test -req=cursor -pos=155:6 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK70
560+
// CHECK70: <decl.var.parameter><syntaxtype.attribute.builtin><syntaxtype.attribute.name>@noescape</syntaxtype.attribute.name></syntaxtype.attribute.builtin> <decl.var.parameter.name>
561+
562+
// RUN: %sourcekitd-test -req=cursor -pos=156:6 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK71
563+
// CHECK71: <decl.var.parameter><syntaxtype.attribute.builtin><syntaxtype.attribute.name>@autoclosure</syntaxtype.attribute.name></syntaxtype.attribute.builtin> <decl.var.parameter.name>
564+
565+
// RUN: %sourcekitd-test -req=cursor -pos=157:6 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK72
566+
// CHECK72: <decl.var.parameter><syntaxtype.attribute.builtin><syntaxtype.attribute.name>@autoclosure</syntaxtype.attribute.name>(escaping)</syntaxtype.attribute.builtin> <decl.var.parameter.name>

0 commit comments

Comments
 (0)