[SourceKit] Add type tags for parameters and return types

When the type is not just a reference to a nominal type, we still need
to be able to delineate it.

rdar://problem/24292226
This commit is contained in:
Ben Langmuir
2016-02-25 08:48:22 -08:00
parent 394b731e01
commit 86bc29cfc6
5 changed files with 85 additions and 19 deletions

View File

@@ -24,6 +24,7 @@ namespace swift {
class ModuleEntity; class ModuleEntity;
class TypeDecl; class TypeDecl;
class Type; class Type;
struct TypeLoc;
class Pattern; class Pattern;
class ExtensionDecl; class ExtensionDecl;
class NominalTypeDecl; class NominalTypeDecl;
@@ -73,7 +74,13 @@ public:
/// Called after finishing printing of a declaration. /// Called after finishing printing of a declaration.
virtual void printDeclPost(const Decl *D) {} virtual void printDeclPost(const Decl *D) {}
/// Called when printing the referenced name of a type declaration. /// Called before printing a type.
virtual void printTypePre(const TypeLoc &TL) {}
/// Called after printing a type.
virtual void printTypePost(const TypeLoc &TL) {}
/// Called when printing the referenced name of a type declaration, possibly
/// from deep inside another type.
virtual void printTypeRef(const TypeDecl *TD, Identifier Name); virtual void printTypeRef(const TypeDecl *TD, Identifier Name);
/// Called when printing the referenced name of a module. /// Called when printing the referenced name of a module.

View File

@@ -600,11 +600,17 @@ class PrintAST : public ASTVisitor<PrintAST> {
void printTypeLoc(const TypeLoc &TL) { void printTypeLoc(const TypeLoc &TL) {
if (Options.TransformContext && TL.getType()) { if (Options.TransformContext && TL.getType()) {
if (auto RT = Options.TransformContext->transform(TL.getType())) { if (auto RT = Options.TransformContext->transform(TL.getType())) {
Printer.printTypePre(TypeLoc::withoutLoc(RT));
PrintOptions FreshOptions; PrintOptions FreshOptions;
RT.print(Printer, FreshOptions); RT.print(Printer, FreshOptions);
Printer.printTypePost(TypeLoc::withoutLoc(RT));
return; return;
} }
} }
Printer.printTypePre(TL);
defer { Printer.printTypePost(TL); };
// Print a TypeRepr if instructed to do so by options, or if the type // Print a TypeRepr if instructed to do so by options, or if the type
// is null. // is null.
if ((Options.PreferTypeRepr && TL.hasLocation()) || if ((Options.PreferTypeRepr && TL.hasLocation()) ||
@@ -2113,12 +2119,8 @@ void PrintAST::visitFuncDecl(FuncDecl *decl) {
Type ResultTy = decl->getResultType(); Type ResultTy = decl->getResultType();
if (ResultTy && !ResultTy->isEqual(TupleType::getEmpty(Context))) { if (ResultTy && !ResultTy->isEqual(TupleType::getEmpty(Context))) {
Printer << " -> "; Printer << " -> ";
if (Options.TransformContext) { // Use the non-repr external type, but reuse the TypeLoc printing code.
ResultTy = Options.TransformContext->transform(ResultTy); printTypeLoc(TypeLoc::withoutLoc(ResultTy));
PrintOptions FreshOptions;
ResultTy->print(Printer, FreshOptions);
} else
ResultTy->print(Printer, Options);
} }
} }

View File

@@ -62,6 +62,12 @@ private:
void printDeclNameOrSignatureEndLoc(const Decl *D) override { void printDeclNameOrSignatureEndLoc(const Decl *D) override {
return OtherPrinter.printDeclNameOrSignatureEndLoc(D); return OtherPrinter.printDeclNameOrSignatureEndLoc(D);
} }
void printTypePre(const TypeLoc &TL) override {
return OtherPrinter.printTypePre(TL);
}
void printTypePost(const TypeLoc &TL) override {
return OtherPrinter.printTypePost(TL);
}
void printTypeRef(const TypeDecl *TD, Identifier Name) override { void printTypeRef(const TypeDecl *TD, Identifier Name) override {
return OtherPrinter.printTypeRef(TD, Name); return OtherPrinter.printTypeRef(TD, Name);
} }

View File

@@ -85,6 +85,8 @@ enum E1<T, U where T == U> {}
func nonDefaultArgNames(external1 local1: Int, _ local2: Int, external3 local3: Int, external4 _: Int, _: Int) {} func nonDefaultArgNames(external1 local1: Int, _ local2: Int, external3 local3: Int, external4 _: Int, _: Int) {}
func nestedFunctionType(closure: (y: (z: Int) -> Int) -> Int) -> (y: (z: Int) -> Int) -> Int) { return closure }
// RUN: rm -rf %t.tmp // RUN: rm -rf %t.tmp
// RUN: mkdir %t.tmp // RUN: mkdir %t.tmp
// RUN: %swiftc_driver -emit-module -o %t.tmp/FooSwiftModule.swiftmodule %S/Inputs/FooSwiftModule.swift // RUN: %swiftc_driver -emit-module -o %t.tmp/FooSwiftModule.swiftmodule %S/Inputs/FooSwiftModule.swift
@@ -103,7 +105,7 @@ func nonDefaultArgNames(external1 local1: Int, _ local2: Int, external3 local3:
// CHECK2-NEXT: <Group>Math</Group> // CHECK2-NEXT: <Group>Math</Group>
// CHECK2-NEXT: SYSTEM // CHECK2-NEXT: SYSTEM
// CHECK2-NEXT: <Declaration>func +(lhs: <Type usr="s:Si">Int</Type>, rhs: <Type usr="s:Si">Int</Type>) -&gt; <Type usr="s:Si">Int</Type></Declaration> // CHECK2-NEXT: <Declaration>func +(lhs: <Type usr="s:Si">Int</Type>, rhs: <Type usr="s:Si">Int</Type>) -&gt; <Type usr="s:Si">Int</Type></Declaration>
// CHECK2-NEXT: <decl.function.operator.infix>func <decl.name>+</decl.name>(<decl.var.parameter><decl.var.parameter.name.local>lhs</decl.var.parameter.name.local>: <ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter>, <decl.var.parameter><decl.var.parameter.name.local>rhs</decl.var.parameter.name.local>: <ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter>) -&gt; <ref.struct usr="s:Si">Int</ref.struct></decl.function.operator.infix> // CHECK2-NEXT: <decl.function.operator.infix>func <decl.name>+</decl.name>(<decl.var.parameter><decl.var.parameter.name.local>lhs</decl.var.parameter.name.local>: <decl.var.parameter.type><ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>, <decl.var.parameter><decl.var.parameter.name.local>rhs</decl.var.parameter.name.local>: <decl.var.parameter.type><ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>) -&gt; <decl.function.returntype><ref.struct usr="s:Si">Int</ref.struct></decl.function.returntype></decl.function.operator.infix>
// RUN: %sourcekitd-test -req=cursor -pos=9:12 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck -check-prefix=CHECK3 %s // RUN: %sourcekitd-test -req=cursor -pos=9:12 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck -check-prefix=CHECK3 %s
// CHECK3: source.lang.swift.ref.var.local (8:10-8:11) // CHECK3: source.lang.swift.ref.var.local (8:10-8:11)
@@ -137,7 +139,7 @@ func nonDefaultArgNames(external1 local1: Int, _ local2: Int, external3 local3:
// CHECK6-NEXT: () -> Int // CHECK6-NEXT: () -> Int
// CHECK6-NEXT: FooSwiftModule // CHECK6-NEXT: FooSwiftModule
// CHECK6-NEXT: <Declaration>func fooSwiftFunc() -&gt; <Type usr="s:Si">Int</Type></Declaration> // CHECK6-NEXT: <Declaration>func fooSwiftFunc() -&gt; <Type usr="s:Si">Int</Type></Declaration>
// CHECK6-NEXT: <decl.function.free>func <decl.name>fooSwiftFunc</decl.name>() -&gt; <ref.struct usr="s:Si">Int</ref.struct></decl.function.free> // CHECK6-NEXT: <decl.function.free>func <decl.name>fooSwiftFunc</decl.name>() -&gt; <decl.function.returntype><ref.struct usr="s:Si">Int</ref.struct></decl.function.returntype></decl.function.free>
// CHECK6-NEXT: {{^}}<Function><Name>fooSwiftFunc()</Name><USR>s:F14FooSwiftModule12fooSwiftFuncFT_Si</USR><Declaration>func fooSwiftFunc() -&gt; Int</Declaration><Abstract><Para>This is &apos;fooSwiftFunc&apos; from &apos;FooSwiftModule&apos;.</Para></Abstract></Function>{{$}} // CHECK6-NEXT: {{^}}<Function><Name>fooSwiftFunc()</Name><USR>s:F14FooSwiftModule12fooSwiftFuncFT_Si</USR><Declaration>func fooSwiftFunc() -&gt; Int</Declaration><Abstract><Para>This is &apos;fooSwiftFunc&apos; from &apos;FooSwiftModule&apos;.</Para></Abstract></Function>{{$}}
// RUN: %sourcekitd-test -req=cursor -pos=14:10 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck -check-prefix=CHECK7 %s // RUN: %sourcekitd-test -req=cursor -pos=14:10 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck -check-prefix=CHECK7 %s
@@ -155,7 +157,7 @@ func nonDefaultArgNames(external1 local1: Int, _ local2: Int, external3 local3:
// CHECK8-NEXT: s:FC11cursor_info2CCcFT1xSi_S0_ // CHECK8-NEXT: s:FC11cursor_info2CCcFT1xSi_S0_
// CHECK8-NEXT: CC.Type -> (x: Int) -> CC // CHECK8-NEXT: CC.Type -> (x: Int) -> CC
// CHECK8-NEXT: <Declaration>convenience init(x: <Type usr="s:Si">Int</Type>)</Declaration> // CHECK8-NEXT: <Declaration>convenience init(x: <Type usr="s:Si">Int</Type>)</Declaration>
// CHECK8-NEXT: <decl.function.constructor>convenience <decl.name>init</decl.name>(<decl.var.parameter><decl.var.parameter.name.external>x</decl.var.parameter.name.external>: <ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter>)</decl.function.constructor> // CHECK8-NEXT: <decl.function.constructor>convenience <decl.name>init</decl.name>(<decl.var.parameter><decl.var.parameter.name.external>x</decl.var.parameter.name.external>: <decl.var.parameter.type><ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>)</decl.function.constructor>
// RUN: %sourcekitd-test -req=cursor -pos=23:6 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck -check-prefix=CHECK9 %s // RUN: %sourcekitd-test -req=cursor -pos=23:6 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck -check-prefix=CHECK9 %s
// CHECK9: source.lang.swift.decl.var.global (23:5-23:15) // CHECK9: source.lang.swift.decl.var.global (23:5-23:15)
@@ -182,7 +184,7 @@ func nonDefaultArgNames(external1 local1: Int, _ local2: Int, external3 local3:
// RUN: %sourcekitd-test -req=cursor -pos=31:7 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck -check-prefix=CHECK13 %s // RUN: %sourcekitd-test -req=cursor -pos=31:7 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck -check-prefix=CHECK13 %s
// CHECK13: source.lang.swift.decl.function.free (31:6-31:37) // CHECK13: source.lang.swift.decl.function.free (31:6-31:37)
// CHECK13: <Declaration>func testDefaultParam(arg1: <Type usr="s:Si">Int</Type> = default)</Declaration> // CHECK13: <Declaration>func testDefaultParam(arg1: <Type usr="s:Si">Int</Type> = default)</Declaration>
// CHECK13: <decl.function.free>func <decl.name>testDefaultParam</decl.name>(<decl.var.parameter><decl.var.parameter.name.local>arg1</decl.var.parameter.name.local>: <ref.struct usr="s:Si">Int</ref.struct> = default</decl.var.parameter>)</decl.function.free> // CHECK13: <decl.function.free>func <decl.name>testDefaultParam</decl.name>(<decl.var.parameter><decl.var.parameter.name.local>arg1</decl.var.parameter.name.local>: <decl.var.parameter.type><ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter.type> = default</decl.var.parameter>)</decl.function.free>
// RUN: %sourcekitd-test -req=cursor -pos=34:4 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck -check-prefix=CHECK14 %s // RUN: %sourcekitd-test -req=cursor -pos=34:4 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck -check-prefix=CHECK14 %s
// CHECK14: source.lang.swift.ref.function.free ({{.*}}Foo.framework/Frameworks/FooSub.framework/Headers/FooSub.h:4:5-4:16) // CHECK14: source.lang.swift.ref.function.free ({{.*}}Foo.framework/Frameworks/FooSub.framework/Headers/FooSub.h:4:5-4:16)
@@ -194,7 +196,7 @@ func nonDefaultArgNames(external1 local1: Int, _ local2: Int, external3 local3:
// CHECK15: source.lang.swift.decl.function.free (38:6-38:40) // CHECK15: source.lang.swift.decl.function.free (38:6-38:40)
// CHECK15: myFunc // CHECK15: myFunc
// CHECK15: <Declaration>func myFunc(arg1: <Type usr="s:SS">String</Type>, options: <Type usr="s:Si">Int</Type>)</Declaration> // CHECK15: <Declaration>func myFunc(arg1: <Type usr="s:SS">String</Type>, options: <Type usr="s:Si">Int</Type>)</Declaration>
// CHECK15: <decl.function.free>func <decl.name>myFunc</decl.name>(<decl.var.parameter><decl.var.parameter.name.local>arg1</decl.var.parameter.name.local>: <ref.struct usr="s:SS">String</ref.struct></decl.var.parameter>, <decl.var.parameter><decl.var.parameter.name.external>options</decl.var.parameter.name.external>: <ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter>)</decl.function.free> // CHECK15: <decl.function.free>func <decl.name>myFunc</decl.name>(<decl.var.parameter><decl.var.parameter.name.local>arg1</decl.var.parameter.name.local>: <decl.var.parameter.type><ref.struct usr="s:SS">String</ref.struct></decl.var.parameter.type></decl.var.parameter>, <decl.var.parameter><decl.var.parameter.name.external>options</decl.var.parameter.name.external>: <decl.var.parameter.type><ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>)</decl.function.free>
// CHECK15: RELATED BEGIN // CHECK15: RELATED BEGIN
// CHECK15-NEXT: <RelatedName usr="s:F11cursor_info6myFuncFSST_">myFunc(_:)</RelatedName> // CHECK15-NEXT: <RelatedName usr="s:F11cursor_info6myFuncFSST_">myFunc(_:)</RelatedName>
// CHECK15-NEXT: RELATED END // CHECK15-NEXT: RELATED END
@@ -249,11 +251,13 @@ func nonDefaultArgNames(external1 local1: Int, _ local2: Int, external3 local3:
// RUN: %sourcekitd-test -req=cursor -pos=69:14 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck -check-prefix=CHECK27 %s // RUN: %sourcekitd-test -req=cursor -pos=69:14 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck -check-prefix=CHECK27 %s
// CHECK27: <Declaration>public subscript(i: <Type usr="s:Si">Int</Type>) -&gt; <Type usr="s:Si">Int</Type> { get }</Declaration> // CHECK27: <Declaration>public subscript(i: <Type usr="s:Si">Int</Type>) -&gt; <Type usr="s:Si">Int</Type> { get }</Declaration>
// CHECK27: <decl.function.subscript>public <decl.name>subscript</decl.name>(<decl.var.parameter><decl.var.parameter.name.local>i</decl.var.parameter.name.local>: <ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter>) -&gt; <ref.struct usr="s:Si">Int</ref.struct> { get }</decl.function.subscript> // CHECK27: <decl.function.subscript>public <decl.name>subscript</decl.name>(<decl.var.parameter><decl.var.parameter.name.local>i</decl.var.parameter.name.local>: <decl.var.parameter.type><ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>) -&gt; <ref.struct usr="s:Si">Int</ref.struct> { get }</decl.function.subscript>
// FIXME: returntype
// RUN: %sourcekitd-test -req=cursor -pos=69:19 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck -check-prefix=CHECK28 %s // RUN: %sourcekitd-test -req=cursor -pos=69:19 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck -check-prefix=CHECK28 %s
// CHECK28: <Declaration>public subscript(i: <Type usr="s:Si">Int</Type>) -&gt; <Type usr="s:Si">Int</Type> { get }</Declaration> // CHECK28: <Declaration>public subscript(i: <Type usr="s:Si">Int</Type>) -&gt; <Type usr="s:Si">Int</Type> { get }</Declaration>
// CHECK28: <decl.function.subscript>public <decl.name>subscript</decl.name>(<decl.var.parameter><decl.var.parameter.name.local>i</decl.var.parameter.name.local>: <ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter>) -&gt; <ref.struct usr="s:Si">Int</ref.struct> { get }</decl.function.subscript> // CHECK28: <decl.function.subscript>public <decl.name>subscript</decl.name>(<decl.var.parameter><decl.var.parameter.name.local>i</decl.var.parameter.name.local>: <decl.var.parameter.type><ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>) -&gt; <ref.struct usr="s:Si">Int</ref.struct> { get }</decl.function.subscript>
// FIXME: returntype
// RUN: %sourcekitd-test -req=cursor -pos=74:3 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK29 // RUN: %sourcekitd-test -req=cursor -pos=74:3 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK29
// CHECK29: source.lang.swift.decl.function.destructor (74:3-74:9) // CHECK29: source.lang.swift.decl.function.destructor (74:3-74:9)
@@ -269,7 +273,7 @@ func nonDefaultArgNames(external1 local1: Int, _ local2: Int, external3 local3:
// CHECK30-NEXT: s:FC11cursor_info2C3cFT1xSi_GSQS0__ // CHECK30-NEXT: s:FC11cursor_info2C3cFT1xSi_GSQS0__
// CHECK30-NEXT: C3.Type -> (x: Int) -> C3! // CHECK30-NEXT: C3.Type -> (x: Int) -> C3!
// CHECK30-NEXT: <Declaration>init!(x: <Type usr="s:Si">Int</Type>)</Declaration> // CHECK30-NEXT: <Declaration>init!(x: <Type usr="s:Si">Int</Type>)</Declaration>
// CHECK30-NEXT: <decl.function.constructor><decl.name>init</decl.name>!(<decl.var.parameter><decl.var.parameter.name.external>x</decl.var.parameter.name.external>: <ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter>)</decl.function.constructor> // CHECK30-NEXT: <decl.function.constructor><decl.name>init</decl.name>!(<decl.var.parameter><decl.var.parameter.name.external>x</decl.var.parameter.name.external>: <decl.var.parameter.type><ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>)</decl.function.constructor>
// RUN: %sourcekitd-test -req=cursor -pos=76:3 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK31 // RUN: %sourcekitd-test -req=cursor -pos=76:3 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK31
// CHECK31: source.lang.swift.decl.function.constructor (76:3-76:16) // CHECK31: source.lang.swift.decl.function.constructor (76:3-76:16)
@@ -277,7 +281,7 @@ func nonDefaultArgNames(external1 local1: Int, _ local2: Int, external3 local3:
// CHECK31-NEXT: s:FC11cursor_info2C3cFT1ySi_GSqS0__ // CHECK31-NEXT: s:FC11cursor_info2C3cFT1ySi_GSqS0__
// CHECK31-NEXT: C3.Type -> (y: Int) -> C3? // CHECK31-NEXT: C3.Type -> (y: Int) -> C3?
// CHECK31-NEXT: <Declaration>init?(y: <Type usr="s:Si">Int</Type>)</Declaration> // CHECK31-NEXT: <Declaration>init?(y: <Type usr="s:Si">Int</Type>)</Declaration>
// CHECK31-NEXT: <decl.function.constructor><decl.name>init</decl.name>?(<decl.var.parameter><decl.var.parameter.name.external>y</decl.var.parameter.name.external>: <ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter>)</decl.function.constructor> // CHECK31-NEXT: <decl.function.constructor><decl.name>init</decl.name>?(<decl.var.parameter><decl.var.parameter.name.external>y</decl.var.parameter.name.external>: <decl.var.parameter.type><ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>)</decl.function.constructor>
// RUN: %sourcekitd-test -req=cursor -pos=77:3 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK32 // RUN: %sourcekitd-test -req=cursor -pos=77:3 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK32
// CHECK32: source.lang.swift.decl.function.constructor (77:3-77:15) // CHECK32: source.lang.swift.decl.function.constructor (77:3-77:15)
@@ -285,7 +289,7 @@ func nonDefaultArgNames(external1 local1: Int, _ local2: Int, external3 local3:
// CHECK32-NEXT: s:FC11cursor_info2C3cFzT1zSi_S0_ // CHECK32-NEXT: s:FC11cursor_info2C3cFzT1zSi_S0_
// CHECK32-NEXT: C3.Type -> (z: Int) throws -> C3 // CHECK32-NEXT: C3.Type -> (z: Int) throws -> C3
// CHECK32-NEXT: <Declaration>init(z: <Type usr="s:Si">Int</Type>) throws</Declaration> // CHECK32-NEXT: <Declaration>init(z: <Type usr="s:Si">Int</Type>) throws</Declaration>
// CHECK32-NEXT: <decl.function.constructor><decl.name>init</decl.name>(<decl.var.parameter><decl.var.parameter.name.external>z</decl.var.parameter.name.external>: <ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter>) throws</decl.function.constructor> // CHECK32-NEXT: <decl.function.constructor><decl.name>init</decl.name>(<decl.var.parameter><decl.var.parameter.name.external>z</decl.var.parameter.name.external>: <decl.var.parameter.type><ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>) throws</decl.function.constructor>
// RUN: %sourcekitd-test -req=cursor -pos=80:8 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK33 // RUN: %sourcekitd-test -req=cursor -pos=80:8 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK33
// CHECK33: source.lang.swift.decl.struct (80:8-80:10) // CHECK33: source.lang.swift.decl.struct (80:8-80:10)
@@ -301,7 +305,7 @@ func nonDefaultArgNames(external1 local1: Int, _ local2: Int, external3 local3:
// CHECK34-NEXT: s:FV11cursor_info2S23foou0_rFFT_T_FT_T_ // CHECK34-NEXT: s:FV11cursor_info2S23foou0_rFFT_T_FT_T_
// CHECK34-NEXT: <T, U> (S2<T, U>) -> <V, W> (() -> ()) -> () -> () // CHECK34-NEXT: <T, U> (S2<T, U>) -> <V, W> (() -> ()) -> () -> ()
// CHECK34-NEXT: <Declaration>func foo&lt;V, W&gt;(closure: () -&gt; ()) -&gt; () -&gt; ()</Declaration> // CHECK34-NEXT: <Declaration>func foo&lt;V, W&gt;(closure: () -&gt; ()) -&gt; () -&gt; ()</Declaration>
// CHECK34-NEXT: <decl.function.method.instance>func <decl.name>foo</decl.name>&lt;V, W&gt;(<decl.var.parameter><decl.var.parameter.name.local>closure</decl.var.parameter.name.local>: () -&gt; ()</decl.var.parameter>) -&gt; () -&gt; ()</decl.function.method.instance> // CHECK34-NEXT: <decl.function.method.instance>func <decl.name>foo</decl.name>&lt;V, W&gt;(<decl.var.parameter><decl.var.parameter.name.local>closure</decl.var.parameter.name.local>: <decl.var.parameter.type>() -&gt; ()</decl.var.parameter.type></decl.var.parameter>) -&gt; <decl.function.returntype>() -&gt; ()</decl.function.returntype></decl.function.method.instance>
// RUN: %sourcekitd-test -req=cursor -pos=83:7 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK35 // RUN: %sourcekitd-test -req=cursor -pos=83:7 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK35
// CHECK35: source.lang.swift.decl.class (83:7-83:9) // CHECK35: source.lang.swift.decl.class (83:7-83:9)
@@ -325,4 +329,8 @@ func nonDefaultArgNames(external1 local1: Int, _ local2: Int, external3 local3:
// CHECK37-NEXT: s:F11cursor_info18nonDefaultArgNamesFT9external1SiSi9external3Si9external4SiSi_T_ // CHECK37-NEXT: s:F11cursor_info18nonDefaultArgNamesFT9external1SiSi9external3Si9external4SiSi_T_
// CHECK37-NEXT: (external1: Int, Int, external3: Int, external4: Int, Int) -> () // CHECK37-NEXT: (external1: Int, Int, external3: Int, external4: Int, Int) -> ()
// CHECK37-NEXT: <Declaration>func nonDefaultArgNames(external1 local1: <Type usr="s:Si">Int</Type>, _ local2: <Type usr="s:Si">Int</Type>, external3 local3: <Type usr="s:Si">Int</Type>, external4 _: <Type usr="s:Si">Int</Type>, _: <Type usr="s:Si">Int</Type>)</Declaration> // CHECK37-NEXT: <Declaration>func nonDefaultArgNames(external1 local1: <Type usr="s:Si">Int</Type>, _ local2: <Type usr="s:Si">Int</Type>, external3 local3: <Type usr="s:Si">Int</Type>, external4 _: <Type usr="s:Si">Int</Type>, _: <Type usr="s:Si">Int</Type>)</Declaration>
// CHECK37-NEXT: <decl.function.free>func <decl.name>nonDefaultArgNames</decl.name>(<decl.var.parameter><decl.var.parameter.name.external>external1</decl.var.parameter.name.external> <decl.var.parameter.name.local>local1</decl.var.parameter.name.local>: <ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter>, <decl.var.parameter><decl.var.parameter.name.external>_</decl.var.parameter.name.external> <decl.var.parameter.name.local>local2</decl.var.parameter.name.local>: <ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter>, <decl.var.parameter><decl.var.parameter.name.external>external3</decl.var.parameter.name.external> <decl.var.parameter.name.local>local3</decl.var.parameter.name.local>: <ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter>, <decl.var.parameter><decl.var.parameter.name.external>external4</decl.var.parameter.name.external> <decl.var.parameter.name.local>_</decl.var.parameter.name.local>: <ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter>, <decl.var.parameter><decl.var.parameter.name.external>_</decl.var.parameter.name.external>: <ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter>)</decl.function.free> // CHECK37-NEXT: <decl.function.free>func <decl.name>nonDefaultArgNames</decl.name>(<decl.var.parameter><decl.var.parameter.name.external>external1</decl.var.parameter.name.external> <decl.var.parameter.name.local>local1</decl.var.parameter.name.local>: <decl.var.parameter.type><ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>, <decl.var.parameter><decl.var.parameter.name.external>_</decl.var.parameter.name.external> <decl.var.parameter.name.local>local2</decl.var.parameter.name.local>: <decl.var.parameter.type><ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>, <decl.var.parameter><decl.var.parameter.name.external>external3</decl.var.parameter.name.external> <decl.var.parameter.name.local>local3</decl.var.parameter.name.local>: <decl.var.parameter.type><ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>, <decl.var.parameter><decl.var.parameter.name.external>external4</decl.var.parameter.name.external> <decl.var.parameter.name.local>_</decl.var.parameter.name.local>: <decl.var.parameter.type><ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>, <decl.var.parameter><decl.var.parameter.name.external>_</decl.var.parameter.name.external>: <decl.var.parameter.type><ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>)</decl.function.free>
// RUN: %sourcekitd-test -req=cursor -pos=88:6 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %mcp_opt %s | FileCheck %s -check-prefix=CHECK38
// CHECK38: <decl.function.free>func <decl.name>nestedFunctionType</decl.name>(<decl.var.parameter><decl.var.parameter.name.local>closure</decl.var.parameter.name.local>: <decl.var.parameter.type>(y: (z: <ref.struct usr="s:Si">Int</ref.struct>) -&gt; <ref.struct usr="s:Si">Int</ref.struct>) -&gt; <ref.struct usr="s:Si">Int</ref.struct></decl.var.parameter.type></decl.var.parameter>) -&gt; <decl.function.returntype>(<decl.var.parameter.name.external>y</decl.var.parameter.name.external>: (<decl.var.parameter.name.external>z</decl.var.parameter.name.external>: <ref.struct usr="s:Si">Int</ref.struct>) -&gt; <ref.struct usr="s:Si">Int</ref.struct>) -&gt; <ref.struct usr="s:Si">Int</ref.struct></decl.function.returntype></decl.function.free>
// FIXME: inconsistent use of parameter inside type

View File

@@ -103,11 +103,18 @@ private:
// MARK: The ASTPrinter callback interface. // MARK: The ASTPrinter callback interface.
void printDeclPre(const Decl *D) override { void printDeclPre(const Decl *D) override {
DeclStack.emplace_back(D);
openTag(getTagForDecl(D, /*isRef=*/false)); openTag(getTagForDecl(D, /*isRef=*/false));
} }
void printDeclPost(const Decl *D) override { void printDeclPost(const Decl *D) override {
assert(DeclStack.back() == D && "unmatched printDeclPre");
DeclStack.pop_back();
closeTag(getTagForDecl(D, /*isRef=*/false)); closeTag(getTagForDecl(D, /*isRef=*/false));
} }
void avoidPrintDeclPost(const Decl *D) override {
assert(DeclStack.back() == D && "unmatched printDeclPre");
DeclStack.pop_back();
}
void printDeclLoc(const Decl *D) override { void printDeclLoc(const Decl *D) override {
openTag("decl.name"); openTag("decl.name");
@@ -116,6 +123,17 @@ private:
closeTag("decl.name"); closeTag("decl.name");
} }
void printTypePre(const TypeLoc &TL) override {
auto tag = getTypeTagForCurrentDecl();
if (!tag.empty())
openTag(tag);
}
void printTypePost(const TypeLoc &TL) override {
auto tag = getTypeTagForCurrentDecl();
if (!tag.empty())
closeTag(tag);
}
void printNamePre(PrintNameContext context) override { void printNamePre(PrintNameContext context) override {
auto tag = getTagForPrintNameContext(context); auto tag = getTagForPrintNameContext(context);
if (!tag.empty()) if (!tag.empty())
@@ -140,6 +158,31 @@ private:
void openTag(StringRef tag) { OS << "<" << tag << ">"; } void openTag(StringRef tag) { OS << "<" << tag << ">"; }
void closeTag(StringRef tag) { OS << "</" << tag << ">"; } void closeTag(StringRef tag) { OS << "</" << tag << ">"; }
// MARK: Misc.
StringRef getTypeTagForCurrentDecl() const {
if (const Decl *D = currentDecl()) {
switch (D->getKind()) {
case DeclKind::Param:
return "decl.var.parameter.type";
case DeclKind::Func:
return "decl.function.returntype";
default:
break;
}
}
return "";
}
const Decl *currentDecl() const {
return DeclStack.empty() ? nullptr : DeclStack.back();
}
private:
/// A stack of declarations being printed, used to determine the context for
/// other ASTPrinter callbacks.
llvm::SmallVector<const Decl *, 3> DeclStack;
}; };
static Type findBaseTypeForReplacingArchetype(const ValueDecl *VD, const Type Ty) { static Type findBaseTypeForReplacingArchetype(const ValueDecl *VD, const Type Ty) {