Skip to content

Commit fcd084f

Browse files
author
Simon Barinka
committed
[SourceKit] Report cursor info information for literals
Adds literals support for the CursorInfo request. Previously CursorInfo just returned error for literals. Implements issue #57725
1 parent d2c8ede commit fcd084f

File tree

9 files changed

+223
-24
lines changed

9 files changed

+223
-24
lines changed

lib/IDE/IDERequests.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -349,7 +349,7 @@ bool CursorInfoResolver::walkToExprPost(Expr *E) {
349349

350350
if (OutermostCursorExpr && isCursorOn(E, LocToResolve)) {
351351
CursorInfo = new ResolvedExprStartCursorInfo(
352-
CursorInfo->getSourceFile(), CursorInfo->getLoc(), OutermostCursorExpr);
352+
CursorInfo->getSourceFile(), CursorInfo->getLoc(), E);
353353
return false;
354354
}
355355

test/SourceKit/CursorInfo/cursor_info.swift

Lines changed: 50 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,11 @@ enum E7: String {
230230

231231
func checkAnyIsAKeyword(x: Any) {}
232232

233+
var nilLiteral1: Int? = nil
234+
var nilLiteral2: Int! = nil
235+
236+
var binExpr = 1 + 2 + 3
237+
233238
// REQUIRES: objc_interop
234239
// RUN: %empty-directory(%t.tmp)
235240
// RUN: %swiftc_driver -emit-module -o %t.tmp/FooSwiftModule.swiftmodule %S/Inputs/FooSwiftModule.swift
@@ -803,9 +808,52 @@ func checkAnyIsAKeyword(x: Any) {}
803808
// CHECK93: <Declaration>case b = &quot;f&quot;</Declaration>
804809
// CHECK93-NEXT: <decl.enumelement><syntaxtype.keyword>case</syntaxtype.keyword> <decl.name>b</decl.name> = <syntaxtype.string>&quot;f&quot;</syntaxtype.string></decl.enumelement>
805810

806-
// RUN: %sourcekitd-test -req=cursor -pos=227:14 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %s | %FileCheck -check-prefix=CHECK94 %s
807-
// CHECK94: <empty cursor info; internal diagnostic: "Resolved to incomplete expression or statement.">
811+
// RUN: %sourcekitd-test -req=cursor -pos=23:23 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %s | %FileCheck -check-prefix=CHECK94 %s
812+
// CHECK94: source.lang.swift.expr.literal ()
813+
// CHECK94-EMPTY:
814+
// CHECK94-NEXT: s:SS
815+
// CHECK94-NEXT: source.lang.swift
816+
// CHECK94-NEXT: String
817+
// CHECK94-NEXT: $sSSD
818+
// CHECK94-NEXT: Swift
819+
// CHECK94-NEXT: <Group>String</Group>
820+
// CHECK94-NEXT: SYSTEM
821+
// CHECK94-NEXT: <Declaration>@frozen @_eagerMove struct String</Declaration>
822+
// CHECK94-NEXT: <decl.struct><syntaxtype.attribute.builtin><syntaxtype.attribute.name>@frozen</syntaxtype.attribute.name></syntaxtype.attribute.builtin> <syntaxtype.attribute.builtin><syntaxtype.attribute.name>@_eagerMove</syntaxtype.attribute.name></syntaxtype.attribute.builtin> <syntaxtype.keyword>struct</syntaxtype.keyword> <decl.name>String</decl.name></decl.struct>
808823

809824
// RUN: %sourcekitd-test -req=cursor -pos=231:6 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %s | %FileCheck -check-prefix=CHECK95 %s
810825
// CHECK95: <Declaration>func checkAnyIsAKeyword(x: Any)</Declaration>
811826
// CHECK95-NEXT: <decl.function.free><syntaxtype.keyword>func</syntaxtype.keyword> <decl.name>checkAnyIsAKeyword</decl.name>(<decl.var.parameter><decl.var.parameter.argument_label>x</decl.var.parameter.argument_label>: <decl.var.parameter.type><syntaxtype.keyword>Any</syntaxtype.keyword></decl.var.parameter.type></decl.var.parameter>)</decl.function.free>
827+
828+
// RUN: %sourcekitd-test -req=cursor -pos=233:25 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %s | %FileCheck -check-prefix=CHECK96 %s
829+
// CHECK96: source.lang.swift.expr.literal
830+
// CHECK96-EMPTY:
831+
// CHECK96-NEXT: s:Sq
832+
// CHECK96-NEXT: source.lang.swift
833+
// CHECK96-NEXT: Int?
834+
// CHECK96-NEXT: $sSiXSqD
835+
// CHECK96-NEXT: Swift
836+
// CHECK96-NEXT: <Group>Optional</Group>
837+
// CHECK96-NEXT: SYSTEM
838+
839+
// RUN: %sourcekitd-test -req=cursor -pos=234:25 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %s | %FileCheck -check-prefix=CHECK97 %s
840+
// CHECK97: source.lang.swift.expr.literal
841+
// CHECK97-EMPTY:
842+
// CHECK97-NEXT: s:Sq
843+
// CHECK97-NEXT: source.lang.swift
844+
// CHECK97-NEXT: Int?
845+
// CHECK97-NEXT: $sSiXSqD
846+
// CHECK97-NEXT: Swift
847+
// CHECK97-NEXT: <Group>Optional</Group>
848+
// CHECK97-NEXT: SYSTEM
849+
850+
// RUN: %sourcekitd-test -req=cursor -pos=236:19 %s -- -F %S/../Inputs/libIDE-mock-sdk -I %t.tmp %s | %FileCheck -check-prefix=CHECK98 %s
851+
// CHECK98: source.lang.swift.expr.literal
852+
// CHECK98-EMPTY:
853+
// CHECK98-NEXT: s:Si
854+
// CHECK98-NEXT: source.lang.swift
855+
// CHECK98-NEXT: Int
856+
// CHECK98-NEXT: $sSiD
857+
// CHECK98-NEXT: Swift
858+
// CHECK98-NEXT: <Group>Math/Integers</Group>
859+
// CHECK98-NEXT: SYSTEM

test/SourceKit/CursorInfo/cursor_stdlib.swift

Lines changed: 65 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,15 @@ func foo2(_ a : inout [S1]) {
2121
import Swift
2222
func foo3(a: Float, b: Bool) {}
2323

24+
import AppKit.NSColor
25+
let colorResource = #colorLiteral(red: 0.8549019694, green: 0.250980407, blue: 0.4784313738, alpha: 1)
26+
27+
let arrLiteral = [1, 2, 3]
28+
let arrNonConst = [1, 2, d]
29+
30+
let dictLiteral = [1:2, 3:4]
31+
let dictNonCost = [1:2, 3:d]
32+
2433
// REQUIRES: objc_interop
2534

2635
// RUN: %empty-directory(%t)
@@ -222,3 +231,59 @@ func foo3(a: Float, b: Bool) {}
222231

223232
// RUN: %sourcekitd-test -req=cursor -pos=22:25 %s -- %s -target %target-triple %clang-importer-sdk-nosource -I %t | %FileCheck -check-prefix=CHECK-BOOL1 %s
224233
// CHECK-BOOL1: s:Sb
234+
235+
// RUN: %sourcekitd-test_plain \
236+
// RUN: -req=open -name %s %s -- %s -sdk %sdk == \
237+
// RUN: -req=cursor -pos=25:29 %s -- %s -sdk %sdk | %FileCheck -check-prefix=CHECK-OBJ-LITERAL %s
238+
// CHECK-OBJ-LITERAL: source.lang.swift.expr.object_literal
239+
// CHECK-OBJ-LITERAL-EMPTY:
240+
// CHECK-OBJ-LITERAL: c:objc(cs)NSColor
241+
// CHECK-OBJ-LITERAL: source.lang.objc
242+
// CHECK-OBJ-LITERAL: NSColor
243+
// CHECK-OBJ-LITERAL: $sSo7NSColorCD
244+
// CHECK-OBJ-LITERAL: AppKit.NSColor
245+
// CHECK-OBJ-LITERAL: SYSTEM
246+
247+
// RUN: %sourcekitd-test_plain -req=cursor -pos=27:18 %s -- %s -sdk %sdk | %FileCheck -check-prefix=CHECK-ARRAY1 %s
248+
// CHECK-ARRAY1: source.lang.swift.expr.literal
249+
// CHECK-ARRAY1-EMPTY:
250+
// CHECK-ARRAY1: s:Sa
251+
// CHECK-ARRAY1: source.lang.swift
252+
// CHECK-ARRAY1: [Int]
253+
// CHECK-ARRAY1: $sSiXSaD
254+
// CHECK-ARRAY1: Swift
255+
// CHECK-ARRAY1: <Group>Collection/Array</Group>
256+
// CHECK-ARRAY1: SYSTEM
257+
258+
// RUN: %sourcekitd-test_plain -req=cursor -pos=28:19 %s -- %s -sdk %sdk | %FileCheck -check-prefix=CHECK-ARRAY2 %s
259+
// CHECK-ARRAY2: source.lang.swift.expr.literal
260+
// CHECK-ARRAY2-EMPTY:
261+
// CHECK-ARRAY2: s:Sa
262+
// CHECK-ARRAY2: source.lang.swift
263+
// CHECK-ARRAY2: [Any]
264+
// CHECK-ARRAY2: $sypXSaD
265+
// CHECK-ARRAY2: Swift
266+
// CHECK-ARRAY2: <Group>Collection/Array</Group>
267+
// CHECK-ARRAY2: SYSTEM
268+
269+
// RUN: %sourcekitd-test_plain -req=cursor -pos=30:19 %s -- %s -sdk %sdk | %FileCheck -check-prefix=CHECK-DICT1 %s
270+
// CHECK-DICT1: source.lang.swift.expr.literal
271+
// CHECK-DICT1-EMPTY:
272+
// CHECK-DICT1: s:SD
273+
// CHECK-DICT1: source.lang.swift
274+
// CHECK-DICT1: [Int : Int]
275+
// CHECK-DICT1: $sS2iXSDD
276+
// CHECK-DICT1: Swift
277+
// CHECK-DICT1: <Group>Collection/HashedCollections</Group>
278+
// CHECK-DICT1: SYSTEM
279+
280+
// RUN: %sourcekitd-test_plain -req=cursor -pos=31:19 %s -- %s -sdk %sdk | %FileCheck -check-prefix=CHECK-DICT2 %s
281+
// CHECK-DICT2: source.lang.swift.expr.literal
282+
// CHECK-DICT2-EMPTY:
283+
// CHECK-DICT2: s:SD
284+
// CHECK-DICT2: source.lang.swift
285+
// CHECK-DICT2: [Int : Any]
286+
// CHECK-DICT2: $sSiypXSDD
287+
// CHECK-DICT2: Swift
288+
// CHECK-DICT2: <Group>Collection/HashedCollections</Group>
289+
// CHECK-DICT2: SYSTEM

test/SourceKit/lit.local.cfg

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@ elif 'swift_evolve' in config.available_features:
1515
else:
1616
sk_path_sanitize = os.path.join(os.path.dirname(__file__), 'Inputs', 'sourcekitd_path_sanitize.py')
1717

18+
config.substitutions.append( ('%sourcekitd-test_plain', config.sourcekitd_test) )
1819
config.substitutions.append( ('%sourcekitd-test', '%s -module-cache-path %r' % (config.sourcekitd_test, config.clang_module_cache_path)) )
1920
config.substitutions.append( ('%complete-test', '%s -module-cache-path=%r' % (config.complete_test, config.clang_module_cache_path)) )
2021
config.substitutions.append( ('%swiftlib_dir', config.swiftlib_dir) )

tools/SourceKit/lib/SwiftLang/SwiftLangSupport.cpp

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,13 @@ UIdent SwiftLangSupport::getUIDForDecl(const Decl *D, bool IsRef) {
333333
return UIdentVisitor(IsRef).visit(const_cast<Decl*>(D));
334334
}
335335

336+
UIdent SwiftLangSupport::getUIDForLiteral(const Expr *Lit) {
337+
if (dyn_cast<ObjectLiteralExpr>(Lit)) {
338+
return KindExprObjectLiteral;
339+
}
340+
return KindExprLiteral;
341+
}
342+
336343
UIdent SwiftLangSupport::getUIDForExtensionOfDecl(const Decl *D) {
337344
switch (D->getKind()) {
338345
case swift::DeclKind::Struct:

tools/SourceKit/lib/SwiftLang/SwiftLangSupport.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -427,6 +427,7 @@ class SwiftLangSupport : public LangSupport {
427427
static SourceKit::UIdent getUIDForDeclLanguage(const swift::Decl *D);
428428
static SourceKit::UIdent getUIDForDecl(const swift::Decl *D,
429429
bool IsRef = false);
430+
static SourceKit::UIdent getUIDForLiteral(const swift::Expr *Lit);
430431
static SourceKit::UIdent getUIDForExtensionOfDecl(const swift::Decl *D);
431432
static SourceKit::UIdent getUIDForLocalVar(bool IsRef = false);
432433
static SourceKit::UIdent getUIDForRefactoringKind(

tools/SourceKit/lib/SwiftLang/SwiftSourceDocInfo.cpp

Lines changed: 95 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -776,6 +776,7 @@ struct DeclInfo {
776776
Type ContainerType;
777777
bool IsRef;
778778
bool IsDynamic;
779+
Expr* LitExpr;
779780
ArrayRef<NominalTypeDecl *> ReceiverTypes;
780781

781782
/// If VD is a synthesized property wrapper backing storage (_foo) or
@@ -788,10 +789,10 @@ struct DeclInfo {
788789
bool InSynthesizedExtension = false;
789790

790791
DeclInfo(const ValueDecl *VD, Type ContainerType, bool IsRef, bool IsDynamic,
791-
ArrayRef<NominalTypeDecl *> ReceiverTypes,
792+
Expr *LitExpr, ArrayRef<NominalTypeDecl *> ReceiverTypes,
792793
const CompilerInvocation &Invoc)
793794
: VD(VD), ContainerType(ContainerType), IsRef(IsRef),
794-
IsDynamic(IsDynamic), ReceiverTypes(ReceiverTypes) {
795+
IsDynamic(IsDynamic), LitExpr(LitExpr), ReceiverTypes(ReceiverTypes) {
795796
if (VD == nullptr)
796797
return;
797798

@@ -944,12 +945,17 @@ fillSymbolInfo(CursorSymbolInfo &Symbol, const DeclInfo &DInfo,
944945
SmallString<256> Buffer;
945946
SmallVector<StringRef, 4> Strings;
946947
llvm::raw_svector_ostream OS(Buffer);
948+
bool isLiteral = DInfo.LitExpr != nullptr;
947949

948950
Symbol.DeclarationLang = SwiftLangSupport::getUIDForDeclLanguage(DInfo.VD);
949-
Symbol.Kind = SwiftLangSupport::getUIDForDecl(DInfo.VD, DInfo.IsRef);
950951

951-
SwiftLangSupport::printDisplayName(DInfo.VD, OS);
952-
Symbol.Name = copyAndClearString(Allocator, Buffer);
952+
if (isLiteral) {
953+
Symbol.Kind = SwiftLangSupport::getUIDForLiteral(DInfo.LitExpr);
954+
} else {
955+
Symbol.Kind = SwiftLangSupport::getUIDForDecl(DInfo.VD, DInfo.IsRef);
956+
SwiftLangSupport::printDisplayName(DInfo.VD, OS);
957+
Symbol.Name = copyAndClearString(Allocator, Buffer);
958+
}
953959

954960
SwiftLangSupport::printUSR(DInfo.OriginalProperty, OS);
955961
if (DInfo.InSynthesizedExtension) {
@@ -958,10 +964,17 @@ fillSymbolInfo(CursorSymbolInfo &Symbol, const DeclInfo &DInfo,
958964
}
959965
Symbol.USR = copyAndClearString(Allocator, Buffer);
960966

967+
Type InterfaceType;
968+
if (isLiteral) {
969+
InterfaceType = DInfo.LitExpr->getType();
970+
} else {
971+
InterfaceType = DInfo.VD->getInterfaceType();
972+
}
973+
961974
{
962975
PrintOptions Options;
963976
Options.PrintTypeAliasUnderlyingType = true;
964-
DInfo.VD->getInterfaceType().print(OS, Options);
977+
InterfaceType.print(OS, Options);
965978
}
966979
Symbol.TypeName = copyAndClearString(Allocator, Buffer);
967980

@@ -970,7 +983,7 @@ fillSymbolInfo(CursorSymbolInfo &Symbol, const DeclInfo &DInfo,
970983
// But ParameterizedProtocolType can currently occur in 'typealias'
971984
// declarations. rdar://99176683
972985
// To avoid crashing in USR generation, return an error for now.
973-
if (auto Ty = DInfo.VD->getInterfaceType()) {
986+
if (Type Ty = InterfaceType) {
974987
while (auto MetaTy = Ty->getAs<MetatypeType>()) {
975988
Ty = MetaTy->getInstanceType();
976989
}
@@ -981,7 +994,11 @@ fillSymbolInfo(CursorSymbolInfo &Symbol, const DeclInfo &DInfo,
981994
}
982995
}
983996

984-
SwiftLangSupport::printDeclTypeUSR(DInfo.VD, OS);
997+
if (isLiteral) {
998+
SwiftLangSupport::printTypeUSR(DInfo.LitExpr->getType(), OS);
999+
} else {
1000+
SwiftLangSupport::printDeclTypeUSR(DInfo.VD, OS);
1001+
}
9851002
Symbol.TypeUSR = copyAndClearString(Allocator, Buffer);
9861003

9871004
if (DInfo.ContainerType && !DInfo.ContainerType->hasArchetype()) {
@@ -1151,15 +1168,40 @@ fillSymbolInfo(CursorSymbolInfo &Symbol, const DeclInfo &DInfo,
11511168
return llvm::Error::success();
11521169
}
11531170

1171+
static bool
1172+
addCursorInfoForLiteral(CursorInfoData &Data, Expr *LitExpr,
1173+
SwiftLangSupport &Lang,
1174+
const CompilerInvocation &CompInvoc,
1175+
SourceLoc CursorLoc,
1176+
ArrayRef<ImmutableTextSnapshotRef> PreviousSnaps) {
1177+
Type LitType = LitExpr->getType();
1178+
if (!LitType || !LitType->getAnyNominal()) {
1179+
return false;
1180+
}
1181+
TypeDecl *Decl = LitType->getAnyNominal();
1182+
auto &Symbol = Data.Symbols.emplace_back();
1183+
DeclInfo Info(Decl, nullptr, false, false, LitExpr, {}, CompInvoc);
1184+
auto Err = fillSymbolInfo(Symbol, Info, CursorLoc, false, Lang, CompInvoc,
1185+
PreviousSnaps, Data.Allocator);
1186+
bool Success = true;
1187+
llvm::handleAllErrors(
1188+
std::move(Err), [&](const llvm::StringError &E) {
1189+
Data.InternalDiagnostic =
1190+
copyCString(E.getMessage(), Data.Allocator);
1191+
Success = false;
1192+
});
1193+
return Success;
1194+
}
1195+
11541196
static bool
11551197
addCursorInfoForDecl(CursorInfoData &Data, ResolvedValueRefCursorInfoPtr Info,
11561198
bool AddRefactorings, bool AddSymbolGraph,
11571199
SwiftLangSupport &Lang, const CompilerInvocation &Invoc,
11581200
std::string &Diagnostic,
11591201
ArrayRef<ImmutableTextSnapshotRef> PreviousSnaps) {
11601202
DeclInfo OrigInfo(Info->getValueD(), Info->getContainerType(), Info->isRef(),
1161-
Info->isDynamic(), Info->getReceiverTypes(), Invoc);
1162-
DeclInfo CtorTypeInfo(Info->getCtorTyRef(), Type(), true, false,
1203+
Info->isDynamic(), nullptr, Info->getReceiverTypes(), Invoc);
1204+
DeclInfo CtorTypeInfo(Info->getCtorTyRef(), Type(), true, false, nullptr,
11631205
ArrayRef<NominalTypeDecl *>(), Invoc);
11641206
DeclInfo &MainInfo = CtorTypeInfo.VD ? CtorTypeInfo : OrigInfo;
11651207
if (MainInfo.Unavailable) {
@@ -1196,7 +1238,7 @@ addCursorInfoForDecl(CursorInfoData &Data, ResolvedValueRefCursorInfoPtr Info,
11961238
if (!Info->isRef()) {
11971239
for (auto D : Info->getShorthandShadowedDecls()) {
11981240
CursorSymbolInfo &SymbolInfo = Data.Symbols.emplace_back();
1199-
DeclInfo DInfo(D, Type(), /*IsRef=*/true, /*IsDynamic=*/false,
1241+
DeclInfo DInfo(D, Type(), /*IsRef=*/true, /*IsDynamic=*/false, nullptr,
12001242
ArrayRef<NominalTypeDecl *>(), Invoc);
12011243
if (auto Err =
12021244
fillSymbolInfo(SymbolInfo, DInfo, Info->getLoc(), AddSymbolGraph,
@@ -1630,21 +1672,54 @@ static void resolveCursor(
16301672
}
16311673
case CursorInfoKind::ExprStart:
16321674
case CursorInfoKind::StmtStart: {
1675+
// If code under cursor is literal expression returns Expr,
1676+
// otherwise nullptr
1677+
auto tryGetLiteralExpr = [](auto CI) -> Expr * {
1678+
auto *ExprInfo = dyn_cast<ResolvedExprStartCursorInfo>(CI);
1679+
if (!ExprInfo || !ExprInfo->getTrailingExpr()) {
1680+
return nullptr;
1681+
}
1682+
Expr* E = ExprInfo->getTrailingExpr();
1683+
if (dyn_cast<LiteralExpr>(E)) {
1684+
return E;
1685+
}
1686+
switch (E->getKind()) {
1687+
case ExprKind::Array:
1688+
case ExprKind::Dictionary:
1689+
case ExprKind::KeyPath: {
1690+
return E;
1691+
}
1692+
default:
1693+
return nullptr;
1694+
}
1695+
};
1696+
1697+
CursorInfoData Data;
1698+
16331699
if (Actionables) {
16341700
addRefactorings(
16351701
Actions, collectRefactorings(CursorInfo, /*ExcludeRename=*/true));
1636-
if (!Actions.empty()) {
1637-
CursorInfoData Data;
1638-
Data.AvailableActions = Actions;
1639-
Receiver(RequestResult<CursorInfoData>::fromResult(Data));
1640-
return;
1702+
Data.AvailableActions = Actions;
1703+
}
1704+
1705+
// Handle literal expression
1706+
if (auto *LitExpr = tryGetLiteralExpr(CursorInfo)) {
1707+
bool Success = addCursorInfoForLiteral(Data, LitExpr, Lang, CompInvok,
1708+
CursorInfo->getLoc(),
1709+
getPreviousASTSnaps());
1710+
if (!Success) {
1711+
Data.Symbols.clear();
1712+
Data.AvailableActions.clear();
16411713
}
16421714
}
16431715

1644-
CursorInfoData Info;
1645-
Info.InternalDiagnostic =
1646-
"Resolved to incomplete expression or statement.";
1647-
Receiver(RequestResult<CursorInfoData>::fromResult(Info));
1716+
if (Data.InternalDiagnostic.empty() && Data.AvailableActions.empty() &&
1717+
Data.Symbols.empty()) {
1718+
Data.InternalDiagnostic =
1719+
"Resolved to incomplete expression or statement.";
1720+
}
1721+
1722+
Receiver(RequestResult<CursorInfoData>::fromResult(Data));
16481723
return;
16491724
}
16501725
case CursorInfoKind::Invalid:

tools/SourceKit/tools/sourcekitd-test/sourcekitd-test.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1945,7 +1945,8 @@ struct ResponseSymbolInfo {
19451945
}
19461946
OS << ")" << '\n';
19471947

1948-
OS << Name << '\n';
1948+
if (Name)
1949+
OS << Name << '\n';
19491950
if (USR)
19501951
OS << USR << '\n';
19511952
if (Lang)

utils/gyb_sourcekit_support/UIDs.py

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -405,6 +405,7 @@ def __init__(self, internal_name, external_name):
405405
KIND('ExprArray', 'source.lang.swift.expr.array'),
406406
KIND('ExprDictionary', 'source.lang.swift.expr.dictionary'),
407407
KIND('ExprObjectLiteral', 'source.lang.swift.expr.object_literal'),
408+
KIND('ExprLiteral', 'source.lang.swift.expr.literal'),
408409
KIND('ExprTuple', 'source.lang.swift.expr.tuple'),
409410
KIND('ExprClosure', 'source.lang.swift.expr.closure'),
410411
KIND('StructureElemId', 'source.lang.swift.structure.elem.id'),

0 commit comments

Comments
 (0)