Skip to content

Commit b871454

Browse files
author
Nathan Hawes
committed
[code-completion] Suggest module names in type and expression position
They can be used to qualify both.
1 parent 7350917 commit b871454

File tree

6 files changed

+148
-55
lines changed

6 files changed

+148
-55
lines changed

lib/IDE/CodeCompletion.cpp

Lines changed: 82 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -1317,8 +1317,21 @@ class CodeCompletionCallbacksImpl : public CodeCompletionCallbacks {
13171317
/// \returns true on success, false on failure.
13181318
bool typecheckParsedType() {
13191319
assert(ParsedTypeLoc.getTypeRepr() && "should have a TypeRepr");
1320-
return !performTypeLocChecking(P.Context, ParsedTypeLoc,
1321-
CurDeclContext, false);
1320+
if (!performTypeLocChecking(P.Context, ParsedTypeLoc,
1321+
CurDeclContext, false))
1322+
return true;
1323+
1324+
// It doesn't type check as a type, so see if it's a qualifying module name.
1325+
if (auto *ITR = dyn_cast<IdentTypeRepr>(ParsedTypeLoc.getTypeRepr())) {
1326+
SmallVector<ImportDecl::AccessPathElement, 4> AccessPath;
1327+
for (auto Component : ITR->getComponentRange())
1328+
AccessPath.push_back({ Component->getIdentifier(),
1329+
Component->getIdLoc() });
1330+
if (auto Module = Context.getLoadedModule(AccessPath))
1331+
ParsedTypeLoc.setType(ModuleType::get(Module));
1332+
return true;
1333+
}
1334+
return false;
13221335
}
13231336

13241337
public:
@@ -1583,26 +1596,37 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
15831596
bool OnlyTypes;
15841597
bool OnlyPrecedenceGroups;
15851598
bool NeedLeadingDot;
1599+
bool IncludeModuleQualifier;
15861600

15871601
static RequestedResultsTy fromModule(const ModuleDecl *TheModule) {
1588-
return { TheModule, false, false, false };
1602+
return { TheModule, false, false, false, true };
15891603
}
15901604

15911605
RequestedResultsTy onlyTypes() const {
1592-
return { TheModule, true, false, NeedLeadingDot };
1606+
return { TheModule, true, false, NeedLeadingDot, IncludeModuleQualifier };
15931607
}
15941608

15951609
RequestedResultsTy onlyPrecedenceGroups() const {
15961610
assert(!OnlyTypes && "onlyTypes() already includes precedence groups");
1597-
return { TheModule, false, true, false };
1611+
return { TheModule, false, true, false, true };
15981612
}
15991613

16001614
RequestedResultsTy needLeadingDot(bool NeedDot) const {
1601-
return { TheModule, OnlyTypes, OnlyPrecedenceGroups, NeedDot };
1615+
return {
1616+
TheModule, OnlyTypes, OnlyPrecedenceGroups, NeedDot,
1617+
IncludeModuleQualifier
1618+
};
1619+
}
1620+
1621+
RequestedResultsTy withModuleQualifier(bool IncludeModule) const {
1622+
return {
1623+
TheModule, OnlyTypes, OnlyPrecedenceGroups, NeedLeadingDot,
1624+
IncludeModule
1625+
};
16021626
}
16031627

16041628
static RequestedResultsTy toplevelResults() {
1605-
return { nullptr, false, false, false };
1629+
return { nullptr, false, false, false, true };
16061630
}
16071631
};
16081632

@@ -1741,6 +1765,21 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
17411765
}
17421766
}
17431767

1768+
void addModuleName(
1769+
const ModuleDecl *MD,
1770+
Optional<CodeCompletionResult::NotRecommendedReason> R = None) {
1771+
CodeCompletionResultBuilder Builder(
1772+
Sink,
1773+
CodeCompletionResult::ResultKind::Declaration,
1774+
SemanticContextKind::OtherModule,
1775+
expectedTypeContext);
1776+
Builder.setAssociatedDecl(MD);
1777+
Builder.addTextChunk(MD->getNameStr());
1778+
Builder.addTypeAnnotation("Module");
1779+
if (R)
1780+
Builder.setNotRecommended(*R);
1781+
}
1782+
17441783
void addImportModuleNames() {
17451784
SmallVector<Identifier, 0> ModuleNames;
17461785
Ctx.getVisibleTopLevelModuleNames(ModuleNames);
@@ -1757,19 +1796,13 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
17571796
continue;
17581797

17591798
auto MD = ModuleDecl::create(ModuleName, Ctx);
1760-
CodeCompletionResultBuilder Builder(
1761-
Sink,
1762-
CodeCompletionResult::ResultKind::Declaration,
1763-
SemanticContextKind::OtherModule,
1764-
expectedTypeContext);
1765-
Builder.setAssociatedDecl(MD);
1766-
Builder.addTextChunk(MD->getNameStr());
1767-
Builder.addTypeAnnotation("Module");
1799+
Optional<CodeCompletionResult::NotRecommendedReason> Reason = None;
17681800

17691801
// Imported modules are not recommended.
17701802
if (ImportedModules.count(MD->getNameStr()) != 0)
1771-
Builder.setNotRecommended(
1772-
CodeCompletionResult::NotRecommendedReason::Redundant);
1803+
Reason = CodeCompletionResult::NotRecommendedReason::Redundant;
1804+
1805+
addModuleName(MD, Reason);
17731806
}
17741807
}
17751808

@@ -3199,13 +3232,17 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
31993232
return false;
32003233
}
32013234

3202-
bool tryModuleCompletions(Type ExprType) {
3235+
bool tryModuleCompletions(Type ExprType, bool TypesOnly = false) {
32033236
if (auto MT = ExprType->getAs<ModuleType>()) {
32043237
ModuleDecl *M = MT->getModule();
32053238
if (CurrModule != M) {
32063239
// Only use the cache if it is not the current module.
3207-
RequestedCachedResults.push_back(
3208-
RequestedResultsTy::fromModule(M).needLeadingDot(needDot()));
3240+
RequestedResultsTy Request = RequestedResultsTy::fromModule(M)
3241+
.needLeadingDot(needDot())
3242+
.withModuleQualifier(false);
3243+
if (TypesOnly)
3244+
Request = Request.onlyTypes();
3245+
RequestedCachedResults.push_back(Request);
32093246
return true;
32103247
}
32113248
}
@@ -3763,17 +3800,16 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
37633800

37643801
void getValueCompletionsInDeclContext(SourceLoc Loc,
37653802
DeclFilter Filter = DefaultFilter,
3766-
bool IncludeTopLevel = false,
3767-
bool RequestCache = true,
3768-
bool LiteralCompletions = true) {
3803+
bool LiteralCompletions = true,
3804+
bool ModuleQualifier = true) {
37693805
ExprType = Type();
37703806
Kind = LookupKind::ValueInDeclContext;
37713807
NeedLeadingDot = false;
37723808
FilteredDeclConsumer Consumer(*this, Filter);
37733809
lookupVisibleDecls(Consumer, CurrDeclContext,
3774-
/*IncludeTopLevel=*/IncludeTopLevel, Loc);
3775-
if (RequestCache)
3776-
RequestedCachedResults.push_back(RequestedResultsTy::toplevelResults());
3810+
/*IncludeTopLevel=*/false, Loc);
3811+
RequestedCachedResults.push_back(RequestedResultsTy::toplevelResults()
3812+
.withModuleQualifier(ModuleQualifier));
37773813

37783814
// Manually add any expected nominal types from imported modules so that
37793815
// they get their expected type relation. Don't include protocols, since
@@ -3871,6 +3907,8 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
38713907
}
38723908

38733909
void getTypeCompletions(Type BaseType) {
3910+
if (tryModuleCompletions(BaseType, /*OnlyTypes=*/true))
3911+
return;
38743912
Kind = LookupKind::Type;
38753913
this->BaseType = BaseType;
38763914
NeedLeadingDot = !HaveDot;
@@ -3880,7 +3918,7 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
38803918
if (BaseType->isAnyExistentialType()) {
38813919
addKeyword("Protocol", MetatypeType::get(BaseType));
38823920
addKeyword("Type", ExistentialMetatypeType::get(BaseType));
3883-
} else {
3921+
} else if (!BaseType->is<ModuleType>()) {
38843922
addKeyword("Type", MetatypeType::get(BaseType));
38853923
}
38863924
}
@@ -3958,8 +3996,9 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
39583996
if (Module == CurrModule)
39593997
continue;
39603998

3961-
RequestedCachedResults.push_back(
3962-
RequestedResultsTy::fromModule(Module).onlyPrecedenceGroups());
3999+
RequestedCachedResults.push_back(RequestedResultsTy::fromModule(Module)
4000+
.onlyPrecedenceGroups()
4001+
.withModuleQualifier(false));
39634002
}
39644003
}
39654004

@@ -3996,13 +4035,16 @@ class CompletionLookup final : public swift::VisibleDeclConsumer {
39964035
getAttributeDeclParamCompletions(DAK_Available, 0);
39974036
}
39984037

3999-
void getTypeCompletionsInDeclContext(SourceLoc Loc) {
4038+
void getTypeCompletionsInDeclContext(SourceLoc Loc,
4039+
bool ModuleQualifier = true) {
40004040
Kind = LookupKind::TypeInDeclContext;
40014041
lookupVisibleDecls(*this, CurrDeclContext,
40024042
/*IncludeTopLevel=*/false, Loc);
40034043

40044044
RequestedCachedResults.push_back(
4005-
RequestedResultsTy::toplevelResults().onlyTypes());
4045+
RequestedResultsTy::toplevelResults()
4046+
.onlyTypes()
4047+
.withModuleQualifier(ModuleQualifier));
40064048
}
40074049

40084050
void getToplevelCompletions(bool OnlyTypes) {
@@ -5116,20 +5158,8 @@ void CodeCompletionCallbacksImpl::doneParsing() {
51165158
return;
51175159
}
51185160

5119-
if (!ParsedTypeLoc.isNull() && !typecheckParsedType()) {
5120-
// If we think we parsed a type but it doesn't type check as a type, see if
5121-
// it's a qualifying module name and recover if so.
5122-
if (auto *ITR = dyn_cast<IdentTypeRepr>(ParsedTypeLoc.getTypeRepr())) {
5123-
SmallVector<ImportDecl::AccessPathElement, 4> AccessPath;
5124-
for (auto Component : ITR->getComponentRange())
5125-
AccessPath.push_back({ Component->getIdentifier(),
5126-
Component->getIdLoc() });
5127-
if (auto Module = Context.getLoadedModule(AccessPath))
5128-
ParsedTypeLoc.setType(ModuleType::get(Module));
5129-
}
5130-
if (ParsedTypeLoc.isNull())
5131-
return;
5132-
}
5161+
if (!ParsedTypeLoc.isNull() && !typecheckParsedType())
5162+
return;
51335163

51345164
CompletionLookup Lookup(CompletionContext.getResultSink(), P.Context,
51355165
CurDeclContext, &CompletionContext);
@@ -5281,7 +5311,7 @@ void CodeCompletionCallbacksImpl::doneParsing() {
52815311
} else {
52825312
SourceLoc Loc = P.Context.SourceMgr.getCodeCompletionLoc();
52835313
Lookup.getValueCompletionsInDeclContext(Loc, KeyPathFilter,
5284-
false, true, false);
5314+
/*LiteralCompletions=*/false);
52855315
}
52865316
break;
52875317
}
@@ -5516,6 +5546,8 @@ void CodeCompletionCallbacksImpl::doneParsing() {
55165546
return; // already handled.
55175547
RequestedModules.push_back({std::move(K), TheModule,
55185548
Request.OnlyTypes, Request.OnlyPrecedenceGroups});
5549+
if (Request.IncludeModuleQualifier)
5550+
Lookup.addModuleName(TheModule);
55195551
}
55205552
};
55215553

@@ -5528,6 +5560,10 @@ void CodeCompletionCallbacksImpl::doneParsing() {
55285560
// Add results from current module.
55295561
Lookup.getToplevelCompletions(Request.OnlyTypes);
55305562

5563+
// Add the qualifying module name
5564+
if (Request.IncludeModuleQualifier)
5565+
Lookup.addModuleName(CurDeclContext->getParentModule());
5566+
55315567
// Add results for all imported modules.
55325568
ModuleDecl::ImportFilter ImportFilter;
55335569
ImportFilter |= ModuleDecl::ImportFilterKind::Public;

test/IDE/complete_from_clang_framework.swift

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -28,6 +28,9 @@
2828
// RUN: %target-swift-ide-test -code-completion -source-filename %s -F %S/Inputs/mock-sdk -enable-objc-interop -code-completion-token=CLANG_CLASS_MEMBERS_2 | %FileCheck %s -check-prefix=CLANG_CLASS_MEMBERS_2
2929
// RUN: %target-swift-ide-test -code-completion -source-filename %s -F %S/Inputs/mock-sdk -enable-objc-interop -code-completion-token=CLANG_INSTANCE_MEMBERS_1 | %FileCheck %s -check-prefix=CLANG_INSTANCE_MEMBERS_1
3030

31+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -F %S/Inputs/mock-sdk -enable-objc-interop -code-completion-token=TYPE_MODULE_QUALIFIER | %FileCheck %s -check-prefix=MODULE_QUALIFIER
32+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -F %S/Inputs/mock-sdk -enable-objc-interop -code-completion-token=EXPR_MODULE_QUALIFIER | %FileCheck %s -check-prefix=MODULE_QUALIFIER
33+
3134
import Foo
3235
// Don't import FooHelper directly in this test!
3336
// import FooHelper
@@ -332,3 +335,15 @@ func testCompleteInstanceMembers1(fooObject: FooClassDerived) {
332335
// CLANG_INSTANCE_MEMBERS_1-NEXT: Decl[InstanceMethod]/Super: ._internalMeth1()[#Any!#]
333336
// CLANG_INSTANCE_MEMBERS_1-NOT: Instance
334337
}
338+
339+
// Check the FooHelper module is suggested even though it's not imported directly
340+
func testExportedModuleCompletion() -> #^TYPE_MODULE_QUALIFIER^# {
341+
let x = #^EXPR_MODULE_QUALIFIER^#
342+
// MODULE_QUALIFIER: Begin completions
343+
// MODULE_QUALIFIER-DAG: Decl[Module]/OtherModule[swift_ide_test]: swift_ide_test[#Module#]; name=swift_ide_test
344+
// MODULE_QUALIFIER-DAG: Decl[Module]/OtherModule[Swift]: Swift[#Module#]; name=Swift
345+
// MODULE_QUALIFIER-DAG: Decl[Module]/OtherModule[Foo]: Foo[#Module#]; name=Foo
346+
// MODULE_QUALIFIER-DAG: Decl[Module]/OtherModule[FooHelper]: FooHelper[#Module#]; name=FooHelper
347+
// MODULE_QUALIFIER-DAG: Decl[Module]/OtherModule[Bar]: Bar[#Module#]; name=Bar
348+
// MODULE_QUALIFIER: End completions
349+
}

test/IDE/complete_from_swift_module.swift

Lines changed: 44 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,15 @@
44
//
55
// Note: this test checks both module import case and file import case.
66

7+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -I %t -code-completion-token=QUALIFYING_MODULE > %t.compl.txt
8+
// RUN: %FileCheck %s -check-prefix=QUALIFYING_MODULE < %t.compl.txt
9+
10+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -I %t -code-completion-token=QUALIFYING_MODULE_2 > %t.compl.txt
11+
// RUN: %FileCheck %s -check-prefix=QUALIFYING_MODULE < %t.compl.txt
12+
13+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -I %t -code-completion-token=ALREADY_QUALIFIED > %t.compl.txt
14+
// RUN: %FileCheck %s -check-prefix=ALREADY_QUALIFIED < %t.compl.txt
15+
716
// RUN: %target-swift-ide-test -code-completion -source-filename %s -I %t -code-completion-token=MODULE_QUALIFIED_1 > %t.compl.txt
817
// RUN: %FileCheck %s -check-prefix=MODULE_QUALIFIED_1 < %t.compl.txt
918
//
@@ -21,6 +30,9 @@
2130

2231
// RUN: %target-swift-ide-test -code-completion -source-filename %s -I %t -code-completion-token=MODULE_QUALIFIED_5 | %FileCheck %s -check-prefix=ERROR_COMMON
2332

33+
// RUN: %target-swift-ide-test -code-completion -source-filename %s -I %t -code-completion-token=STDLIB_TYPE_QUALIFIED_NESTED > %t.compl.txt
34+
// RUN: %FileCheck %s -check-prefix=STDLIB_TYPE_QUALIFIED_NESTED < %t.compl.txt
35+
2436
// RUN: %target-swift-ide-test -code-completion -source-filename %s -I %t -code-completion-token=STDLIB_TYPE_QUALIFIED > %t.compl.txt
2537
// RUN: %FileCheck %s -check-prefix=STDLIB_TYPE_QUALIFIED < %t.compl.txt
2638

@@ -47,6 +59,27 @@
4759
import foo_swift_module
4860
import corrupted_module
4961

62+
func testQualifyingModulesSuggested() -> #^QUALIFYING_MODULE^# {
63+
let x = #^QUALIFYING_MODULE_2^#
64+
// QUALIFYING_MODULE: Begin completions
65+
// QUALIFYING_MODULE-DAG: Decl[Module]/OtherModule[swift_ide_test]: swift_ide_test[#Module#]; name=swift_ide_test
66+
// QUALIFYING_MODULE-DAG: Decl[Module]/OtherModule[Swift]: Swift[#Module#]; name=Swift
67+
// QUALIFYING_MODULE-DAG: Decl[Module]/OtherModule[foo_swift_module]: foo_swift_module[#Module#]; name=foo_swift_module
68+
// QUALIFYING_MODULE: End completions
69+
}
70+
71+
struct SomeStructInThisModule {}
72+
func testQualifyingModulesNotSuggested() {
73+
let x: swift_ide_test.#^ALREADY_QUALIFIED^#;
74+
// ALREADY_QUALIFIED: Begin completions
75+
// ALREADY_QUALIFIED-NOT: Decl[Module]
76+
// ALREADY_QUALIFIED-NOT: name=Type
77+
// ALREADY_QUALIFIED: name=SomeStructInThisModule
78+
// ALREADY_QUALIFIED-NOT: Decl[Module]
79+
// ALREADY_QUALIFIED-NOT: name=Type
80+
// ALREADY_QUALIFIED: End completions
81+
}
82+
5083
var hiddenImport : Int
5184
// TOP_LEVEL_1_NEGATIVE-NOT: hiddenImport()
5285

@@ -106,11 +139,18 @@ func testPostfixOperator1(x: Int) {
106139
// TOP_LEVEL_1-DAG: Decl[GlobalVar]/OtherModule[foo_swift_module]: globalVar[#Int#]{{; name=.+$}}
107140
// TOP_LEVEL_1: End completions
108141

109-
struct Foo: Swift.Array.#^STDLIB_TYPE_QUALIFIED^# {}
142+
struct Foo: Swift.Array.#^STDLIB_TYPE_QUALIFIED_NESTED^# {}
143+
// STDLIB_TYPE_QUALIFIED_NESTED: Begin completions
144+
// STDLIB_TYPE_QUALIFIED_NESTED: Decl[TypeAlias]/CurrNominal: Index[#Int#]; name=Index
145+
// STDLIB_TYPE_QUALIFIED_NESTED: Decl[TypeAlias]/CurrNominal: Element[#Element#]; name=Element
146+
// STDLIB_TYPE_QUALIFIED_NESTED: Keyword/None: Type[#Array.Type#]; name=Type
147+
// STDLIB_TYPE_QUALIFIED_NESTED: End completions
148+
149+
struct Bar: Swift.#^STDLIB_TYPE_QUALIFIED^# {}
110150
// STDLIB_TYPE_QUALIFIED: Begin completions
111-
// STDLIB_TYPE_QUALIFIED: Decl[TypeAlias]/CurrNominal: Index[#Int#]; name=Index
112-
// STDLIB_TYPE_QUALIFIED: Decl[TypeAlias]/CurrNominal: Element[#Element#]; name=Element
113-
// STDLIB_TYPE_QUALIFIED: Keyword/None: Type[#Array.Type#]; name=Type
151+
// STDLIB_TYPE_QUALIFIED-NOT: Decl[Module]
152+
// STDLIB_TYPE_QUALIFIED: Decl[Struct]/OtherModule[Swift]: AnyCollection[#AnyCollection#]; name=AnyCollection
153+
// STDLIB_TYPE_QUALIFIED-NOT: Decl[Module]
114154
// STDLIB_TYPE_QUALIFIED: End completions
115155

116156
func foo() -> foo_swift_module.#^MODULE_TYPE_QUALIFIED^# {}
@@ -120,5 +160,4 @@ func foo() -> foo_swift_module.#^MODULE_TYPE_QUALIFIED^# {}
120160
// MODULE_TYPE_QUALIFIED: Decl[Struct]/OtherModule[foo_swift_module]: BarGenericSwiftStruct1[#BarGenericSwiftStruct1#]; name=BarGenericSwiftStruct1
121161
// MODULE_TYPE_QUALIFIED: Decl[Struct]/OtherModule[foo_swift_module]: FooSwiftStruct[#FooSwiftStruct#]; name=FooSwiftStruct
122162
// MODULE_TYPE_QUALIFIED: Decl[Struct]/OtherModule[foo_swift_module]: BarGenericSwiftStruct2[#BarGenericSwiftStruct2#]; name=BarGenericSwiftStruct2
123-
// MODULE_TYPE_QUALIFIED: Keyword/None: Type[#module<foo_swift_module>.Type#]; name=Type
124163
// MODULE_TYPE_QUALIFIED: End completions

test/SourceKit/CodeComplete/complete_filter_rules.swift

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -29,19 +29,19 @@ struct TestHideName {
2929
// RUN: %complete-test -filter-rules=%S/Inputs/filter-rules/hideKeywords.json -tok=HIDE_KEYWORDS_1 %s -- -F %S/../Inputs/libIDE-mock-sdk | %FileCheck %s -check-prefix=HIDE_LET
3030
func testHideKeyword01() {
3131
#^HIDE_KEYWORDS_1^#
32-
// HIDE_LET-NOT: let
32+
// HIDE_LET-NOT: {{^}}let
3333
// HIDE_LET: var
34-
// HIDE_LET-NOT: let
34+
// HIDE_LET-NOT: {{^}}let
3535
}
3636

3737
// RUN: %complete-test -filter-rules=%S/Inputs/filter-rules/showKeywords.json -tok=HIDE_KEYWORDS_2 %s -- -F %S/../Inputs/libIDE-mock-sdk | %FileCheck %s -check-prefix=SHOW_FUNC
3838
func testHideKeyword02() {
3939
#^HIDE_KEYWORDS_2^#
40-
// SHOW_FUNC-NOT: let
40+
// SHOW_FUNC-NOT: {{^}}let
4141
// SHOW_FUNC-NOT: var
4242
// SHOW_FUNC: func
4343
// SHOW_FUNC-NOT: var
44-
// SHOW_FUNC-NOT: let
44+
// SHOW_FUNC-NOT: {{^}}let
4545
}
4646

4747
// RUN: %complete-test -filter-rules=%S/Inputs/filter-rules/hideLiterals.json -tok=HIDE_LITERALS_1 %s -- -F %S/../Inputs/libIDE-mock-sdk | %FileCheck %s -check-prefix=HIDE_NIL

test/SourceKit/CodeComplete/complete_requestlimit.swift

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,6 +32,7 @@ func test001() {
3232
// TOP_LEVEL_0_ALL-NEXT: z
3333
// TOP_LEVEL_0_ALL-NEXT: A
3434
// TOP_LEVEL_0_ALL-NEXT: B
35+
// TOP_LEVEL_0_ALL-NEXT: complete_requestlimit
3536
// TOP_LEVEL_0_ALL-NEXT: test
3637

3738
// TOP_LEVEL_0_3: let

0 commit comments

Comments
 (0)