Skip to content

Commit 842e42b

Browse files
authored
Merge pull request #37876 from rintaro/5.5-ide-completion-optionaltype-rdar78779049
[5.5][CodeCompletion] Keep completion status when parsing postfix types
2 parents 39d4640 + d5ef83e commit 842e42b

File tree

3 files changed

+46
-21
lines changed

3 files changed

+46
-21
lines changed

include/swift/Parse/Parser.h

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -1256,17 +1256,18 @@ class Parser {
12561256
const TypeAttributes &attrs);
12571257

12581258
ParserResult<TypeRepr> parseTypeTupleBody();
1259-
ParserResult<TypeRepr> parseTypeArray(TypeRepr *Base);
1259+
ParserResult<TypeRepr> parseTypeArray(ParserResult<TypeRepr> Base);
12601260

12611261
/// Parse a collection type.
12621262
/// type-simple:
12631263
/// '[' type ']'
12641264
/// '[' type ':' type ']'
12651265
ParserResult<TypeRepr> parseTypeCollection();
12661266

1267-
ParserResult<TypeRepr> parseTypeOptional(TypeRepr *Base);
1267+
ParserResult<TypeRepr> parseTypeOptional(ParserResult<TypeRepr> Base);
12681268

1269-
ParserResult<TypeRepr> parseTypeImplicitlyUnwrappedOptional(TypeRepr *Base);
1269+
ParserResult<TypeRepr>
1270+
parseTypeImplicitlyUnwrappedOptional(ParserResult<TypeRepr> Base);
12701271

12711272
bool isOptionalToken(const Token &T) const;
12721273
SourceLoc consumeOptionalToken();

lib/Parse/ParseType.cpp

Lines changed: 21 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -235,16 +235,16 @@ ParserResult<TypeRepr> Parser::parseTypeSimple(
235235

236236
if (!Tok.isAtStartOfLine()) {
237237
if (isOptionalToken(Tok)) {
238-
ty = parseTypeOptional(ty.get());
238+
ty = parseTypeOptional(ty);
239239
continue;
240240
}
241241
if (isImplicitlyUnwrappedOptionalToken(Tok)) {
242-
ty = parseTypeImplicitlyUnwrappedOptional(ty.get());
242+
ty = parseTypeImplicitlyUnwrappedOptional(ty);
243243
continue;
244244
}
245245
// Parse legacy array types for migration.
246246
if (Tok.is(tok::l_square) && reason != ParseTypeReason::CustomAttribute)
247-
ty = parseTypeArray(ty.get());
247+
ty = parseTypeArray(ty);
248248
}
249249
break;
250250
}
@@ -1182,12 +1182,11 @@ ParserResult<TypeRepr> Parser::parseTypeTupleBody() {
11821182
/// type-array '[' ']'
11831183
/// type-array '[' expr ']'
11841184
///
1185-
ParserResult<TypeRepr> Parser::parseTypeArray(TypeRepr *Base) {
1185+
ParserResult<TypeRepr> Parser::parseTypeArray(ParserResult<TypeRepr> Base) {
11861186
assert(Tok.isFollowingLSquare());
11871187
Parser::StructureMarkerRAII ParsingArrayBound(*this, Tok);
11881188
SourceLoc lsquareLoc = consumeToken();
1189-
ArrayTypeRepr *ATR = nullptr;
1190-
1189+
11911190
// Handle a postfix [] production, a common typo for a C-like array.
11921191

11931192
// If we have something that might be an array size expression, parse it as
@@ -1200,19 +1199,23 @@ ParserResult<TypeRepr> Parser::parseTypeArray(TypeRepr *Base) {
12001199

12011200
SourceLoc rsquareLoc;
12021201
if (parseMatchingToken(tok::r_square, rsquareLoc,
1203-
diag::expected_rbracket_array_type, lsquareLoc))
1204-
return makeParserErrorResult(Base);
1202+
diag::expected_rbracket_array_type, lsquareLoc)) {
1203+
Base.setIsParseError();
1204+
return Base;
1205+
}
1206+
1207+
auto baseTyR = Base.get();
12051208

12061209
// If we parsed something valid, diagnose it with a fixit to rewrite it to
12071210
// Swift syntax.
12081211
diagnose(lsquareLoc, diag::new_array_syntax)
1209-
.fixItInsert(Base->getStartLoc(), "[")
1212+
.fixItInsert(baseTyR->getStartLoc(), "[")
12101213
.fixItRemove(lsquareLoc);
12111214

12121215
// Build a normal array slice type for recovery.
1213-
ATR = new (Context) ArrayTypeRepr(Base,
1214-
SourceRange(Base->getStartLoc(), rsquareLoc));
1215-
return makeParserResult(ATR);
1216+
ArrayTypeRepr *ATR = new (Context) ArrayTypeRepr(
1217+
baseTyR, SourceRange(baseTyR->getStartLoc(), rsquareLoc));
1218+
return makeParserResult(ParserStatus(Base), ATR);
12161219
}
12171220

12181221
ParserResult<TypeRepr> Parser::parseTypeCollection() {
@@ -1317,22 +1320,22 @@ SourceLoc Parser::consumeImplicitlyUnwrappedOptionalToken() {
13171320
/// Parse a single optional suffix, given that we are looking at the
13181321
/// question mark.
13191322
ParserResult<TypeRepr>
1320-
Parser::parseTypeOptional(TypeRepr *base) {
1323+
Parser::parseTypeOptional(ParserResult<TypeRepr> base) {
13211324
SourceLoc questionLoc = consumeOptionalToken();
1322-
auto TyR = new (Context) OptionalTypeRepr(base, questionLoc);
1325+
auto TyR = new (Context) OptionalTypeRepr(base.get(), questionLoc);
13231326
SyntaxContext->createNodeInPlace(SyntaxKind::OptionalType);
1324-
return makeParserResult(TyR);
1327+
return makeParserResult(ParserStatus(base), TyR);
13251328
}
13261329

13271330
/// Parse a single implicitly unwrapped optional suffix, given that we
13281331
/// are looking at the exclamation mark.
13291332
ParserResult<TypeRepr>
1330-
Parser::parseTypeImplicitlyUnwrappedOptional(TypeRepr *base) {
1333+
Parser::parseTypeImplicitlyUnwrappedOptional(ParserResult<TypeRepr> base) {
13311334
SourceLoc exclamationLoc = consumeImplicitlyUnwrappedOptionalToken();
13321335
auto TyR =
1333-
new (Context) ImplicitlyUnwrappedOptionalTypeRepr(base, exclamationLoc);
1336+
new (Context) ImplicitlyUnwrappedOptionalTypeRepr(base.get(), exclamationLoc);
13341337
SyntaxContext->createNodeInPlace(SyntaxKind::ImplicitlyUnwrappedOptionalType);
1335-
return makeParserResult(TyR);
1338+
return makeParserResult(ParserStatus(base), TyR);
13361339
}
13371340

13381341
//===----------------------------------------------------------------------===//

test/IDE/complete_type.swift

Lines changed: 21 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -790,3 +790,24 @@ struct ContainExtension {
790790
// EXTENSION_INHERITANCE-DAG: Decl[TypeAlias]/CurrNominal: ProtoAlias[#FooProtocol#];
791791
// EXTENSION_INHERITANCE-DAG: Keyword/None: Type[#HasProtoAlias.Type#];
792792
// EXTENSION_INHERITANCE: End completions
793+
794+
var _: (() -> #^IN_POSTFIX_BASE_1?check=WITH_GLOBAL_TYPES^#)?
795+
var _: (() -> #^IN_POSTFIX_BASE_2?check=WITH_GLOBAL_TYPES^#)!
796+
var _: (() -> #^IN_POSTFIX_BASE_3?check=WITH_GLOBAL_TYPES^#)[1]
797+
var _: (() -> #^IN_POSTFIX_BASE_4?check=WITH_GLOBAL_TYPES^#).Protocol
798+
var _: (() -> #^IN_POSTFIX_BASE_5?check=WITH_GLOBAL_TYPES^#).Type
799+
800+
struct HaveNested {
801+
struct Nested {}
802+
}
803+
804+
var _: HaveNested.#^IN_POSTFIX_BASE_MEMBER_1?check=POSTFIX_BASE_MEMBER^#?
805+
var _: HaveNested.#^IN_POSTFIX_BASE_MEMBER_2?check=POSTFIX_BASE_MEMBER^#!
806+
var _: HaveNested.#^IN_POSTFIX_BASE_MEMBER_3?check=POSTFIX_BASE_MEMBER^#[1]
807+
var _: HaveNested.#^IN_POSTFIX_BASE_MEMBER_4?check=POSTFIX_BASE_MEMBER^#.Protocol
808+
var _: HaveNested.#^IN_POSTFIX_BASE_MEMBER_5?check=POSTFIX_BASE_MEMBER^#.Type
809+
810+
// POSTFIX_BASE_MEMBER: Begin completions, 2 items
811+
// POSTFIX_BASE_MEMBER-DAG: Decl[Struct]/CurrNominal: Nested[#HaveNested.Nested#];
812+
// POSTFIX_BASE_MEMBER-DAG: Keyword/None: Type[#HaveNested.Type#];
813+
// POSTFIX_BASE_MEMBER: End completions

0 commit comments

Comments
 (0)