Skip to content

Commit 5dceb39

Browse files
committed
[SyntaxParse] Invoke type completion in ASTGen
instead of Parser. So the completion get the correct decl context.
1 parent e7e45fd commit 5dceb39

File tree

2 files changed

+25
-15
lines changed

2 files changed

+25
-15
lines changed

lib/Parse/ASTGen.cpp

Lines changed: 25 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -756,13 +756,20 @@ TypeRepr *ASTGen::generate(const SILFunctionTypeSyntax &Type,
756756
TypeRepr *ASTGen::generate(const CodeCompletionTypeSyntax &Type,
757757
const SourceLoc Loc) {
758758
auto base = Type.getBase();
759-
if (!base)
759+
if (!base) {
760+
if (P.CodeCompletion)
761+
P.CodeCompletion->completeTypeSimpleBeginning();
760762
return nullptr;
763+
}
761764

762765
if (P.CodeCompletion) {
763-
TypeRepr *parsedTyR = generate(*base, Loc);
764-
if (parsedTyR)
766+
if (auto *parsedTyR = generate(*base, Loc)) {
765767
P.CodeCompletion->setParsedTypeLoc(parsedTyR);
768+
if (Type.getPeriod())
769+
P.CodeCompletion->completeTypeIdentifierWithDot();
770+
else
771+
P.CodeCompletion->completeTypeIdentifierWithoutDot();
772+
}
766773
}
767774

768775
// Return nullptr to typecheck this TypeRepr independently in code completion.
@@ -810,13 +817,28 @@ TypeRepr *ASTGen::generate(const UnknownTypeSyntax &Type, const SourceLoc Loc) {
810817
if (ChildrenCount >= 1) {
811818
auto LParen = Type.getChild(0)->getAs<TokenSyntax>();
812819
if (LParen && LParen->getTokenKind() == tok::l_paren) {
820+
// generate child 'TypeSyntax' anyway to trigger the side effects e.g.
821+
// code-completion.
822+
for (size_t i = 1; i != ChildrenCount; ++i) {
823+
auto elem = *Type.getChild(i);
824+
if (auto ty = elem.getAs<TypeSyntax>())
825+
(void)generate(*ty, Loc);
826+
}
813827
auto LParenLoc = advanceLocBegin(Loc, *LParen);
814828
auto EndLoc =
815829
advanceLocBegin(Loc, *Type.getChild(Type.getNumChildren() - 1));
816830
return TupleTypeRepr::createEmpty(Context, {LParenLoc, EndLoc});
817831
}
818832
}
819833

834+
// generate child 'TypeSyntax' anyway to trigger the side effects e.g.
835+
// code-completion.
836+
for (size_t i = 0; i != ChildrenCount; ++i) {
837+
auto elem = *Type.getChild(i);
838+
if (auto ty = elem.getAs<TypeSyntax>())
839+
(void)generate(*ty, Loc);
840+
}
841+
820842
// let's hope the main `generate` method can find this node in the type map
821843
return nullptr;
822844
}

lib/Parse/ParseType.cpp

Lines changed: 0 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -183,9 +183,6 @@ Parser::parseTypeSimple(Diag<> MessageID, bool HandleCodeCompletion) {
183183
case tok::code_complete: {
184184
if (!HandleCodeCompletion)
185185
break;
186-
if (CodeCompletion)
187-
CodeCompletion->completeTypeSimpleBeginning();
188-
189186
ParsedTypeSyntax ty = ParsedSyntaxRecorder::makeCodeCompletionType(
190187
None, None, consumeTokenSyntax(), *SyntaxContext);
191188
return makeParsedCodeCompletion(std::move(ty));
@@ -607,9 +604,6 @@ ParsedSyntaxResult<ParsedTypeSyntax> Parser::parseTypeIdentifier() {
607604
return parseAnyType();
608605

609606
if (Tok.is(tok::code_complete)) {
610-
if (CodeCompletion)
611-
CodeCompletion->completeTypeSimpleBeginning();
612-
613607
auto CCTok = consumeTokenSyntax(tok::code_complete);
614608
auto ty = ParsedSyntaxRecorder::makeCodeCompletionType(
615609
None, None, std::move(CCTok), *SyntaxContext);
@@ -700,9 +694,6 @@ ParsedSyntaxResult<ParsedTypeSyntax> Parser::parseTypeIdentifier() {
700694
assert(!genericArgs);
701695

702696
if (Tok.is(tok::code_complete)) {
703-
if (CodeCompletion)
704-
CodeCompletion->completeTypeIdentifierWithDot();
705-
706697
auto ty = ParsedSyntaxRecorder::makeCodeCompletionType(
707698
result.get(), std::move(period), consumeTokenSyntax(),
708699
*SyntaxContext);
@@ -717,9 +708,6 @@ ParsedSyntaxResult<ParsedTypeSyntax> Parser::parseTypeIdentifier() {
717708

718709
if (result.isSuccess() && Tok.is(tok::code_complete) &&
719710
!Tok.isAtStartOfLine()) {
720-
if (CodeCompletion)
721-
CodeCompletion->completeTypeIdentifierWithoutDot();
722-
723711
auto ty = ParsedSyntaxRecorder::makeCodeCompletionType(
724712
result.get(), None, consumeTokenSyntax(), *SyntaxContext);
725713
return makeParsedCodeCompletion(std::move(ty));

0 commit comments

Comments
 (0)