Skip to content

Commit ceb847d

Browse files
authored
Merge pull request #20990 from rintaro/5.0-ide-completion-rdar39312854
[5.0][CodeCompletion] Propagate completion status of parseGenericArguments()
2 parents a9dba6a + 74e6888 commit ceb847d

File tree

4 files changed

+48
-23
lines changed

4 files changed

+48
-23
lines changed

include/swift/Parse/Parser.h

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -972,9 +972,9 @@ class Parser {
972972
/// \brief Parse layout constraint.
973973
LayoutConstraint parseLayoutConstraint(Identifier LayoutConstraintID);
974974

975-
bool parseGenericArguments(SmallVectorImpl<TypeRepr*> &Args,
976-
SourceLoc &LAngleLoc,
977-
SourceLoc &RAngleLoc);
975+
ParserStatus parseGenericArguments(SmallVectorImpl<TypeRepr *> &Args,
976+
SourceLoc &LAngleLoc,
977+
SourceLoc &RAngleLoc);
978978

979979
ParserResult<TypeRepr> parseTypeIdentifier();
980980
ParserResult<TypeRepr> parseOldStyleProtocolComposition();

lib/Parse/ParseExpr.cpp

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1207,9 +1207,9 @@ Parser::parseExprPostfixSuffix(ParserResult<Expr> Result, bool isExprBasic,
12071207
if (canParseAsGenericArgumentList()) {
12081208
SmallVector<TypeRepr *, 8> args;
12091209
SourceLoc LAngleLoc, RAngleLoc;
1210-
if (parseGenericArguments(args, LAngleLoc, RAngleLoc)) {
1210+
auto argStat = parseGenericArguments(args, LAngleLoc, RAngleLoc);
1211+
if (argStat.isError())
12111212
diagnose(LAngleLoc, diag::while_parsing_as_left_angle_bracket);
1212-
}
12131213

12141214
SmallVector<TypeLoc, 8> locArgs;
12151215
for (auto ty : args)
@@ -2259,9 +2259,9 @@ Expr *Parser::parseExprIdentifier() {
22592259
if (canParseAsGenericArgumentList()) {
22602260
SyntaxContext->createNodeInPlace(SyntaxKind::IdentifierExpr);
22612261
SyntaxContext->setCreateSyntax(SyntaxKind::SpecializeExpr);
2262-
if (parseGenericArguments(args, LAngleLoc, RAngleLoc)) {
2262+
auto argStat = parseGenericArguments(args, LAngleLoc, RAngleLoc);
2263+
if (argStat.isError())
22632264
diagnose(LAngleLoc, diag::while_parsing_as_left_angle_bracket);
2264-
}
22652265

22662266
// The result can be empty in error cases.
22672267
hasGenericArgumentList = !args.empty();

lib/Parse/ParseType.cpp

Lines changed: 9 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -502,9 +502,9 @@ ParserResult<TypeRepr> Parser::parseType(Diag<> MessageID,
502502
specifierLoc));
503503
}
504504

505-
bool Parser::parseGenericArguments(SmallVectorImpl<TypeRepr*> &Args,
506-
SourceLoc &LAngleLoc,
507-
SourceLoc &RAngleLoc) {
505+
ParserStatus Parser::parseGenericArguments(SmallVectorImpl<TypeRepr *> &Args,
506+
SourceLoc &LAngleLoc,
507+
SourceLoc &RAngleLoc) {
508508
SyntaxParsingContext GenericArgumentsContext(
509509
SyntaxContext, SyntaxKind::GenericArgumentClause);
510510

@@ -523,7 +523,7 @@ bool Parser::parseGenericArguments(SmallVectorImpl<TypeRepr*> &Args,
523523
if (Ty.isNull() || Ty.hasCodeCompletion()) {
524524
// Skip until we hit the '>'.
525525
RAngleLoc = skipUntilGreaterInTypeList();
526-
return true;
526+
return ParserStatus(Ty);
527527
}
528528

529529
Args.push_back(Ty.get());
@@ -540,12 +540,12 @@ bool Parser::parseGenericArguments(SmallVectorImpl<TypeRepr*> &Args,
540540

541541
// Skip until we hit the '>'.
542542
RAngleLoc = skipUntilGreaterInTypeList();
543-
return true;
543+
return makeParserError();
544544
} else {
545545
RAngleLoc = consumeStartingGreater();
546546
}
547547

548-
return false;
548+
return makeParserSuccess();
549549
}
550550

551551
/// parseTypeIdentifier
@@ -597,8 +597,9 @@ ParserResult<TypeRepr> Parser::parseTypeIdentifier() {
597597
SourceLoc LAngle, RAngle;
598598
SmallVector<TypeRepr*, 8> GenericArgs;
599599
if (startsWithLess(Tok)) {
600-
if (parseGenericArguments(GenericArgs, LAngle, RAngle))
601-
return nullptr;
600+
auto genericArgsStatus = parseGenericArguments(GenericArgs, LAngle, RAngle);
601+
if (genericArgsStatus.isError())
602+
return genericArgsStatus;
602603
}
603604
EndLoc = Loc;
604605

test/IDE/complete_type.swift

Lines changed: 32 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -362,13 +362,13 @@
362362
// RUN: %FileCheck %s -check-prefix=GLOBAL_NEGATIVE < %t.types.txt
363363

364364

365-
// FIXME: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TYPE_IDENTIFIER_GENERIC_1 > %t.types.txt
366-
// FIXME: %FileCheck %s -check-prefix=TYPE_IDENTIFIER_GENERIC_1 < %t.types.txt
365+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TYPE_IDENTIFIER_GENERIC_1 > %t.types.txt
366+
// RUN: %FileCheck %s -check-prefix=TYPE_IDENTIFIER_GENERIC_1 < %t.types.txt
367367
// RUN: %FileCheck %s -check-prefix=WITHOUT_GLOBAL_TYPES < %t.types.txt
368368
// RUN: %FileCheck %s -check-prefix=GLOBAL_NEGATIVE < %t.types.txt
369369

370370
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=TYPE_IDENTIFIER_GENERIC_2 > %t.types.txt
371-
// FIXME: %FileCheck %s -check-prefix=TYPE_IDENTIFIER_GENERIC_2 < %t.types.txt
371+
// RUN: %FileCheck %s -check-prefix=TYPE_IDENTIFIER_GENERIC_2 < %t.types.txt
372372
// RUN: %FileCheck %s -check-prefix=WITHOUT_GLOBAL_TYPES < %t.types.txt
373373
// RUN: %FileCheck %s -check-prefix=GLOBAL_NEGATIVE < %t.types.txt
374374

@@ -386,6 +386,16 @@
386386
// RUN: %FileCheck %s -check-prefix=WITH_GLOBAL_TYPES < %t.gentypealias.txt
387387
// RUN: %FileCheck %s -check-prefix=GLOBAL_NEGATIVE < %t.gentypealias.txt
388388

389+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=GENERIC_ARGS_TOPLEVEL_VAR | %FileCheck %s -check-prefix=WITH_GLOBAL_TYPES
390+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=GENERIC_ARGS_TOPLEVEL_PARAM | %FileCheck %s -check-prefix=WITH_GLOBAL_TYPES
391+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=GENERIC_ARGS_TOPLEVEL_RETURN | %FileCheck %s -check-prefix=WITH_GLOBAL_TYPES
392+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=GENERIC_ARGS_MEMBER_VAR | %FileCheck %s -check-prefix=WITH_GLOBAL_TYPES
393+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=GENERIC_ARGS_MEMBER_PARAM | %FileCheck %s -check-prefix=WITH_GLOBAL_TYPES
394+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=GENERIC_ARGS_MEMBER_RETURN | %FileCheck %s -check-prefix=WITH_GLOBAL_TYPES
395+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=GENERIC_ARGS_LOCAL_VAR | %FileCheck %s -check-prefix=WITH_GLOBAL_TYPES
396+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=GENERIC_ARGS_LOCAL_PARAM | %FileCheck %s -check-prefix=WITH_GLOBAL_TYPES
397+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=GENERIC_ARGS_LOCAL_RETURN | %FileCheck %s -check-prefix=WITH_GLOBAL_TYPES
398+
389399
//===--- Helper types that are used in this test
390400

391401
struct FooStruct {
@@ -1003,20 +1013,18 @@ func testTypeIdentifierGeneric1<
10031013
>(a: GenericFoo.#^TYPE_IDENTIFIER_GENERIC_1^#
10041014

10051015
// TYPE_IDENTIFIER_GENERIC_1: Begin completions
1006-
// TYPE_IDENTIFIER_GENERIC_1-NEXT: Decl[TypeAlias]/Super: FooTypeAlias1{{; name=.+$}}
1016+
// TYPE_IDENTIFIER_GENERIC_1-NEXT: Decl[AssociatedType]/Super: FooTypeAlias1{{; name=.+$}}
10071017
// TYPE_IDENTIFIER_GENERIC_1-NEXT: Keyword/None: Type[#GenericFoo.Type#]
1008-
// TYPE_IDENTIFIER_GENERIC_1-NEXT: Keyword/None: self[#GenericFoo#]
10091018
// TYPE_IDENTIFIER_GENERIC_1-NEXT: End completions
10101019

10111020
func testTypeIdentifierGeneric2<
10121021
GenericFoo : FooProtocol & BarProtocol
10131022
>(a: GenericFoo.#^TYPE_IDENTIFIER_GENERIC_2^#
10141023

10151024
// TYPE_IDENTIFIER_GENERIC_2: Begin completions
1016-
// TYPE_IDENTIFIER_GENERIC_2-NEXT: Decl[TypeAlias]/Super: BarTypeAlias1{{; name=.+$}}
1017-
// TYPE_IDENTIFIER_GENERIC_2-NEXT: Decl[TypeAlias]/Super: FooTypeAlias1{{; name=.+$}}
1025+
// TYPE_IDENTIFIER_GENERIC_2-NEXT: Decl[AssociatedType]/Super: BarTypeAlias1{{; name=.+$}}
1026+
// TYPE_IDENTIFIER_GENERIC_2-NEXT: Decl[AssociatedType]/Super: FooTypeAlias1{{; name=.+$}}
10181027
// TYPE_IDENTIFIER_GENERIC_2-NEXT: Keyword/None: Type[#GenericFoo.Type#]
1019-
// TYPE_IDENTIFIER_GENERIC_2-NEXT: Keyword/None: self[#GenericFoo#]
10201028
// TYPE_IDENTIFIER_GENERIC_2-NEXT: End completions
10211029

10221030
func testTypeIdentifierGeneric3<
@@ -1058,3 +1066,19 @@ func testGenericTypealias2() {
10581066
typealias MyPair<T> = (T, T)
10591067
let x: MyPair<#^GENERIC_TYPEALIAS_2^#>
10601068
}
1069+
1070+
// In generic argument
1071+
struct GenStruct<T> { }
1072+
let a : GenStruct<#^GENERIC_ARGS_TOPLEVEL_VAR^#
1073+
func foo1(x: GenStruct<#^GENERIC_ARGS_TOPLEVEL_PARAM^#
1074+
func foo2() -> GenStruct<#^GENERIC_ARGS_TOPLEVEL_RETURN^#
1075+
class _TestForGenericArg_ {
1076+
let a : GenStruct<#^GENERIC_ARGS_MEMBER_VAR^#
1077+
func foo1(x: GenStruct<#^GENERIC_ARGS_MEMBER_PARAM^#
1078+
func foo2() -> GenStruct<#^GENERIC_ARGS_MEMBER_RETURN^#
1079+
}
1080+
func _testForGenericArg_() {
1081+
let a : GenStruct<#^GENERIC_ARGS_LOCAL_VAR^#
1082+
func foo1(x: GenStruct<#^GENERIC_ARGS_LOCAL_PARAM^#
1083+
func foo2() -> GenStruct<#^GENERIC_ARGS_LOCAL_RETURN^#
1084+
}

0 commit comments

Comments
 (0)