Skip to content

Commit 930a4d9

Browse files
committed
---
yaml --- r: 348723 b: refs/heads/master c: 5dceb39 h: refs/heads/master i: 348721: dfb8581 348719: 5b90746
1 parent 7067a16 commit 930a4d9

File tree

3 files changed

+26
-16
lines changed

3 files changed

+26
-16
lines changed

[refs]

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,5 +1,5 @@
11
---
2-
refs/heads/master: e7e45fd311607b896efeb4cddf0fa29f1ccde452
2+
refs/heads/master: 5dceb395f78d9703ecc54a329c2d5f75e91b7cd0
33
refs/heads/master-next: 203b3026584ecad859eb328b2e12490099409cd5
44
refs/tags/osx-passed: b6b74147ef8a386f532cf9357a1bde006e552c54
55
refs/tags/swift-2.2-SNAPSHOT-2015-12-01-a: 6bb18e013c2284f2b45f5f84f2df2887dc0f7dea

trunk/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
}

trunk/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)