Skip to content

Commit e50d21e

Browse files
authored
Merge pull request #26241 from rintaro/5.1-ide-completion-exprcontext-arrayliteral-rdar50696432
[5.1][CodeCompletion] Expr context type analysis for failed array literal expression
2 parents f883175 + 9b7465a commit e50d21e

File tree

3 files changed

+60
-3
lines changed

3 files changed

+60
-3
lines changed

lib/IDE/ExprContextAnalysis.cpp

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -664,6 +664,21 @@ class ExprContextAnalyzer {
664664
analyzeApplyExpr(Parent);
665665
break;
666666
}
667+
case ExprKind::Array: {
668+
if (auto type = ParsedExpr->getType()) {
669+
recordPossibleType(type);
670+
break;
671+
}
672+
673+
// Check context types of the array literal expression.
674+
ExprContextInfo arrayCtxtInfo(DC, Parent);
675+
for (auto arrayT : arrayCtxtInfo.getPossibleTypes()) {
676+
if (auto boundGenericT = arrayT->getAs<BoundGenericType>())
677+
if (boundGenericT->getDecl() == Context.getArrayDecl())
678+
recordPossibleType(boundGenericT->getGenericArgs()[0]);
679+
}
680+
break;
681+
}
667682
case ExprKind::Assign: {
668683
auto *AE = cast<AssignExpr>(Parent);
669684

@@ -867,6 +882,7 @@ class ExprContextAnalyzer {
867882
case ExprKind::Binary:
868883
case ExprKind::PrefixUnary:
869884
case ExprKind::Assign:
885+
case ExprKind::Array:
870886
return true;
871887
case ExprKind::UnresolvedMember:
872888
return true;

test/IDE/complete_call_arg.swift

Lines changed: 41 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -82,6 +82,14 @@
8282
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=IMPLICIT_MEMBER_AFTERPAREN_2 | %FileCheck %s -check-prefix=IMPLICIT_MEMBER_AFTERPAREN_2
8383
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=IMPLICIT_MEMBER_SECOND | %FileCheck %s -check-prefix=IMPLICIT_MEMBER_SECOND
8484
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=IMPLICIT_MEMBER_SKIPPED | %FileCheck %s -check-prefix=IMPLICIT_MEMBER_SKIPPED
85+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=IMPLICIT_MEMBER_ARRAY_1_AFTERPAREN_1 | %FileCheck %s -check-prefix=IMPLICIT_MEMBER_AFTERPAREN_1
86+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=IMPLICIT_MEMBER_ARRAY_1_AFTERPAREN_2 | %FileCheck %s -check-prefix=IMPLICIT_MEMBER_AFTERPAREN_2
87+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=IMPLICIT_MEMBER_ARRAY_1_SECOND | %FileCheck %s -check-prefix=IMPLICIT_MEMBER_SECOND
88+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=IMPLICIT_MEMBER_ARRAY_1_SKIPPED | %FileCheck %s -check-prefix=IMPLICIT_MEMBER_SKIPPED
89+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=IMPLICIT_MEMBER_ARRAY_2_AFTERPAREN_1 | %FileCheck %s -check-prefix=IMPLICIT_MEMBER_AFTERPAREN_1
90+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=IMPLICIT_MEMBER_ARRAY_2_AFTERPAREN_2 | %FileCheck %s -check-prefix=IMPLICIT_MEMBER_AFTERPAREN_2
91+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=IMPLICIT_MEMBER_ARRAY_2_SECOND | %FileCheck %s -check-prefix=IMPLICIT_MEMBER_SECOND
92+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=IMPLICIT_MEMBER_ARRAY_2_SKIPPED | %FileCheck %s -check-prefix=IMPLICIT_MEMBER_SKIPPED
8593

8694
// RUN: %target-swift-ide-test -code-completion -source-filename %s -code-completion-token=ARCHETYPE_GENERIC_1 | %FileCheck %s -check-prefix=ARCHETYPE_GENERIC_1
8795

@@ -688,6 +696,39 @@ func testImplicitMember() {
688696
// IMPLICIT_MEMBER_SKIPPED: Keyword/ExprSpecific: arg4: [#Argument name#];
689697
// IMPLICIT_MEMBER_SKIPPED: End completions
690698
}
699+
func testImplicitMemberInArrayLiteral() {
700+
struct Receiver {
701+
init(_: [TestStaticMemberCall]) {}
702+
init(arg1: Int, arg2: [TestStaticMemberCall]) {}
703+
}
704+
705+
Receiver([
706+
.create1(x: 1),
707+
.create1(#^IMPLICIT_MEMBER_ARRAY_1_AFTERPAREN_1^#),
708+
// Same as IMPLICIT_MEMBER_AFTERPAREN_1.
709+
])
710+
Receiver([
711+
.create2(#^IMPLICIT_MEMBER_ARRAY_1_AFTERPAREN_2^#),
712+
// Same as IMPLICIT_MEMBER_AFTERPAREN_2.
713+
.create2(1, #^IMPLICIT_MEMBER_ARRAY_1_SECOND^#
714+
// Same as IMPLICIT_MEMBER_SECOND.
715+
])
716+
Receiver(arg1: 12, arg2: [
717+
.create2(1, arg3: 2, #^IMPLICIT_MEMBER_ARRAY_1_SKIPPED^#
718+
// Same as IMPLICIT_MEMBER_SKIPPED.
719+
.create1(x: 12)
720+
])
721+
let _: [TestStaticMemberCall] = [
722+
.create1(#^IMPLICIT_MEMBER_ARRAY_2_AFTERPAREN_1^#),
723+
// Same as STATIC_METHOD_AFTERPAREN_1.
724+
.create2(#^IMPLICIT_MEMBER_ARRAY_2_AFTERPAREN_2^#),
725+
// Same as STATIC_METHOD_AFTERPAREN_2.
726+
.create2(1, #^IMPLICIT_MEMBER_ARRAY_2_SECOND^#),
727+
// Same as STATIC_METHOD_SECOND.
728+
.create2(1, arg3: 2, #^IMPLICIT_MEMBER_ARRAY_2_SKIPPED^#),
729+
// Same as STATIC_METHOD_SKIPPED.
730+
]
731+
}
691732

692733
struct Wrap<T> {
693734
func method<U>(_ fn: (T) -> U) -> Wrap<U> {}

test/IDE/complete_unresolved_members.swift

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -373,12 +373,12 @@ func f() -> SomeEnum1 {
373373
return .#^UNRESOLVED_27^#
374374
}
375375

376-
let TopLevelVar1 = OptionSetTaker7([.#^UNRESOLVED_28^#], Op2: [.Option4])
376+
let TopLevelVar1 = OptionSetTaker7([.#^UNRESOLVED_28^#], [.Option4])
377377

378378
let TopLevelVar2 = OptionSetTaker1([.#^UNRESOLVED_29^#])
379379

380-
let TopLevelVar3 = OptionSetTaker7([.Option1], Op2: [.#^UNRESOLVED_30^#])
381-
let TopLevelVar4 = OptionSetTaker7([.Option1], Op2: [.Option4, .#^UNRESOLVED_31^#])
380+
let TopLevelVar3 = OptionSetTaker7([.Option1], [.#^UNRESOLVED_30^#])
381+
let TopLevelVar4 = OptionSetTaker7([.Option1], [.Option4, .#^UNRESOLVED_31^#])
382382

383383
let _: [SomeEnum1] = [.#^UNRESOLVED_32^#]
384384
let _: [SomeEnum1] = [.South, .#^UNRESOLVED_33^#]

0 commit comments

Comments
 (0)