Skip to content

Commit c773c3b

Browse files
committed
Revert "Merge pull request swiftlang#27485 from rintaro/syntaxparse-decltypealias"
This reverts commit 8c5dcc0, reversing changes made to af5eda5.
1 parent e53ad15 commit c773c3b

File tree

8 files changed

+107
-225
lines changed

8 files changed

+107
-225
lines changed

include/swift/Parse/ASTGen.h

Lines changed: 0 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -56,8 +56,6 @@ class ASTGen {
5656
Decl *generate(const syntax::DeclSyntax &Decl, const SourceLoc Loc);
5757
TypeDecl *generate(const syntax::AssociatedtypeDeclSyntax &Decl,
5858
const SourceLoc Loc);
59-
TypeDecl *generate(const syntax::TypealiasDeclSyntax &Decl,
60-
const SourceLoc Loc);
6159

6260
TrailingWhereClause *generate(const syntax::GenericWhereClauseSyntax &syntax,
6361
const SourceLoc Loc);
@@ -72,11 +70,6 @@ class ASTGen {
7270
const Optional<syntax::ModifierListSyntax> &modifiers,
7371
SourceLoc Loc, bool includeComments);
7472

75-
void generateFreeStandingGenericWhereClause(
76-
const syntax::GenericWhereClauseSyntax &syntax,
77-
const SourceLoc Loc,
78-
GenericParamList *genericParams);
79-
8073
public:
8174
//===--------------------------------------------------------------------===//
8275
// Expressions.

include/swift/Parse/Parser.h

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -1013,11 +1013,6 @@ class Parser {
10131013
Optional<ParsedAttributeListSyntax> attrs,
10141014
Optional<ParsedModifierListSyntax> modifiers);
10151015

1016-
ParsedSyntaxResult<ParsedDeclSyntax>
1017-
parseDeclTypeAliasSyntax(ParseDeclOptions flags,
1018-
Optional<ParsedAttributeListSyntax> attrs,
1019-
Optional<ParsedModifierListSyntax> modifiers);
1020-
10211016
ParserResult<TypeDecl> parseDeclTypeAlias(ParseDeclOptions Flags,
10221017
DeclAttributes &Attributes,
10231018
SourceLoc leadingLoc);
@@ -1633,9 +1628,6 @@ class Parser {
16331628
SmallVectorImpl<GenericTypeParamDecl *> &GenericParams);
16341629
ParserResult<GenericParamList> maybeParseGenericParams();
16351630
void
1636-
diagnoseWhereClauseInGenericParamList(const GenericParamList *GenericParams,
1637-
SourceLoc whereLoc);
1638-
void
16391631
diagnoseWhereClauseInGenericParamList(const GenericParamList *GenericParams);
16401632

16411633
enum class WhereClauseKind : unsigned {

lib/Parse/ASTGen.cpp

Lines changed: 2 additions & 88 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@
1818
#include "swift/Basic/SourceManager.h"
1919
#include "swift/Parse/CodeCompletionCallbacks.h"
2020
#include "swift/Parse/Parser.h"
21-
#include "swift/Parse/Scope.h"
2221

2322
using namespace swift;
2423
using namespace swift::syntax;
@@ -47,8 +46,6 @@ Decl *ASTGen::generate(const DeclSyntax &D, const SourceLoc Loc) {
4746

4847
if (auto associatedTypeDecl = D.getAs<AssociatedtypeDeclSyntax>()) {
4948
DeclAST = generate(*associatedTypeDecl, Loc);
50-
} else if (auto typealiasDecl = D.getAs<TypealiasDeclSyntax>()) {
51-
DeclAST = generate(*typealiasDecl, Loc);
5249
} else {
5350
llvm_unreachable("unsupported decl kind");
5451
}
@@ -108,8 +105,8 @@ TypeDecl *ASTGen::generate(const AssociatedtypeDeclSyntax &D,
108105
return nullptr;
109106

110107
auto keywordLoc = advanceLocBegin(Loc, D.getAssociatedtypeKeyword());
111-
Identifier name;
112-
SourceLoc nameLoc = generateIdentifierDeclName(idToken, Loc, name);
108+
auto name = Context.getIdentifier(idToken.getIdentifierText());
109+
auto nameLoc = advanceLocBegin(Loc, idToken);
113110

114111
DeclAttributes attrs =
115112
generateDeclAttributes(D, D.getAttributes(), D.getModifiers(), Loc, true);
@@ -139,89 +136,6 @@ TypeDecl *ASTGen::generate(const AssociatedtypeDeclSyntax &D,
139136
return assocType;
140137
}
141138

142-
TypeDecl *ASTGen::generate(const TypealiasDeclSyntax &D, const SourceLoc Loc) {
143-
auto idToken = D.getIdentifier();
144-
if (idToken.isMissing())
145-
return nullptr;
146-
147-
auto keywordLoc = advanceLocBegin(Loc, D.getTypealiasKeyword());
148-
Identifier name;
149-
SourceLoc nameLoc = generateIdentifierDeclName(idToken, Loc, name);
150-
auto attrs =
151-
generateDeclAttributes(D, D.getAttributes(), D.getModifiers(), Loc, true);
152-
SourceLoc equalLoc;
153-
154-
DebuggerContextChange DCC(P, name, DeclKind::TypeAlias);
155-
156-
Optional<Scope> GenericScope;
157-
GenericParamList *genericParams = nullptr;
158-
GenericScope.emplace(&P, ScopeKind::Generics);
159-
if (auto clause = D.getGenericParameterClause())
160-
genericParams = generate(*clause, Loc);
161-
162-
auto *TAD = new (Context) TypeAliasDecl(keywordLoc, equalLoc, name, nameLoc,
163-
genericParams, P.CurDeclContext);
164-
P.setLocalDiscriminator(TAD);
165-
TAD->getAttrs() = attrs;
166-
167-
TypeRepr *underlyingType = nullptr;
168-
SourceLoc typeEndLoc;
169-
if (auto init = D.getInitializer()) {
170-
Parser::ContextChange CC(P, TAD);
171-
equalLoc = generate(init->getEqual(), Loc);
172-
underlyingType = generate(init->getValue(), Loc);
173-
if (auto lastToken = init->getLastToken())
174-
typeEndLoc = generate(*lastToken, Loc);
175-
}
176-
TAD->setUnderlyingTypeRepr(underlyingType);
177-
178-
SourceLoc whereLoc;
179-
if (auto clause = D.getGenericWhereClause()) {
180-
whereLoc = advanceLocBegin(Loc, clause->getWhereKeyword());
181-
Parser::ContextChange CC(P, TAD);
182-
generateFreeStandingGenericWhereClause(*clause, Loc, genericParams);
183-
}
184-
P.diagnoseWhereClauseInGenericParamList(genericParams, whereLoc);
185-
186-
if (equalLoc.isInvalid())
187-
return nullptr;
188-
189-
GenericScope.reset();
190-
191-
addToScope(TAD);
192-
return DCC.fixupParserResult(TAD).getPtrOrNull();
193-
}
194-
195-
void ASTGen::generateFreeStandingGenericWhereClause(
196-
const syntax::GenericWhereClauseSyntax &syntax, const SourceLoc Loc,
197-
GenericParamList *genericParams) {
198-
199-
SourceLoc whereLoc = generate(syntax.getWhereKeyword(), Loc);
200-
201-
if (!genericParams) {
202-
P.diagnose(whereLoc, diag::where_without_generic_params,
203-
unsigned(Parser::WhereClauseKind::Declaration));
204-
return;
205-
}
206-
207-
// Push the generic parameters back into a local scope so that references
208-
// will find them.
209-
Scope S(&P, ScopeKind::Generics);
210-
for (auto pd : genericParams->getParams())
211-
addToScope(pd);
212-
213-
SmallVector<RequirementRepr, 4> requirements;
214-
requirements.reserve(syntax.getRequirementList().size());
215-
for (auto elem : syntax.getRequirementList()) {
216-
if (auto req = generate(elem, Loc))
217-
requirements.push_back(*req);
218-
}
219-
if (requirements.empty())
220-
return;
221-
222-
genericParams->addTrailingWhereClause(Context, whereLoc, requirements);
223-
}
224-
225139
TrailingWhereClause *ASTGen::generate(const GenericWhereClauseSyntax &syntax,
226140
const SourceLoc Loc) {
227141
SourceLoc whereLoc = advanceLocBegin(Loc, syntax.getWhereKeyword());

lib/Parse/ParseDecl.cpp

Lines changed: 73 additions & 83 deletions
Original file line numberDiff line numberDiff line change
@@ -2782,6 +2782,7 @@ Parser::parseDecl(ParseDeclOptions Flags,
27822782
break;
27832783
}
27842784
case tok::kw_typealias:
2785+
DeclParsingContext.setCreateSyntax(SyntaxKind::TypealiasDecl);
27852786
DeclResult = parseDeclTypeAlias(Flags, Attributes, leadingLoc);
27862787
MayNeedOverrideCompletion = true;
27872788
break;
@@ -3976,126 +3977,115 @@ ParserStatus Parser::parseLineDirective(bool isLine) {
39763977

39773978
/// Parse a typealias decl.
39783979
///
3980+
/// \verbatim
39793981
/// decl-typealias:
3980-
/// 'typealias' identifier generic-params? '=' type
3981-
/// generic-where-clause?
3982-
ParsedSyntaxResult<ParsedDeclSyntax>
3983-
Parser::parseDeclTypeAliasSyntax(Parser::ParseDeclOptions Flags,
3984-
Optional<ParsedAttributeListSyntax> attrs,
3985-
Optional<ParsedModifierListSyntax> modifiers) {
3982+
/// 'typealias' identifier generic-params? '=' type requirement-clause?
3983+
/// \endverbatim
3984+
ParserResult<TypeDecl>
3985+
Parser::parseDeclTypeAlias(Parser::ParseDeclOptions Flags,
3986+
DeclAttributes &Attributes, SourceLoc leadingLoc) {
39863987
ParserPosition startPosition = getParserPosition();
39873988
llvm::Optional<SyntaxParsingContext> TmpCtxt;
39883989
TmpCtxt.emplace(SyntaxContext);
39893990
TmpCtxt->setBackTracking();
39903991

3991-
auto typealiasKeyword = consumeTokenSyntax(tok::kw_typealias);
3992-
3993-
ParserStatus status;
3994-
3995-
auto applyIntroducer = [&](ParsedTypealiasDeclSyntaxBuilder &builder) {
3996-
if (attrs)
3997-
builder.useAttributes(std::move(*attrs));
3998-
if (modifiers)
3999-
builder.useModifiers(std::move(*modifiers));
4000-
builder.useTypealiasKeyword(std::move(typealiasKeyword));
4001-
};
3992+
SourceLoc TypeAliasLoc = consumeToken(tok::kw_typealias);
3993+
SourceLoc EqualLoc;
3994+
Identifier Id;
3995+
SourceLoc IdLoc;
3996+
ParserStatus Status;
40023997

4003-
// Parse the name.
4004-
auto name =
4005-
parseIdentifierDeclNameSyntax(*this, "typealias", [](const Token &next) {
4006-
return next.isAny(tok::colon, tok::equal);
4007-
});
4008-
if (name.isNull()) {
3998+
Status |= parseIdentifierDeclName(
3999+
*this, Id, IdLoc, "typealias",
4000+
[](const Token &next) { return next.isAny(tok::colon, tok::equal); });
4001+
if (Status.isError()) {
40094002
TmpCtxt->setTransparent();
4010-
TmpCtxt.reset();
4011-
ParsedTypealiasDeclSyntaxBuilder builder(*SyntaxContext);
4012-
applyIntroducer(builder);
4013-
return makeParsedError(builder.build());
4003+
return nullptr;
40144004
}
40154005

4016-
// Parse optional generic parameters.
4017-
Optional<ParsedGenericParameterClauseSyntax> genericParams;
4006+
DebuggerContextChange DCC(*this, Id, DeclKind::TypeAlias);
4007+
4008+
Optional<Scope> GenericsScope;
4009+
GenericsScope.emplace(this, ScopeKind::Generics);
4010+
4011+
// Parse a generic parameter list if it is present.
4012+
GenericParamList *genericParams = nullptr;
40184013
if (startsWithLess(Tok)) {
4019-
auto result = parseGenericParameterClauseSyntax();
4020-
status |= result.getStatus();
4021-
if (!result.isNull())
4022-
genericParams = result.get();
4014+
auto Result = parseGenericParameters();
4015+
if (Result.hasCodeCompletion() && !CodeCompletion)
4016+
return makeParserCodeCompletionStatus();
4017+
genericParams = Result.getPtrOrNull();
4018+
4019+
if (!genericParams) {
4020+
// If the parser returned null, it is an already diagnosed parse error.
4021+
} else if (!genericParams->getRequirements().empty()) {
4022+
// Reject a where clause.
4023+
diagnose(genericParams->getWhereLoc(),
4024+
diag::associated_type_generic_parameter_list)
4025+
.highlight(genericParams->getWhereClauseSourceRange());
4026+
}
40234027
}
40244028

40254029
if (Flags.contains(PD_InProtocol) && !genericParams && !Tok.is(tok::equal)) {
4026-
// If we're in a protocol and don't see an '=' this looks like leftover
4027-
// Swift 2 code intending to be an associatedtype.
40284030
TmpCtxt.reset();
4031+
// If we're in a protocol and don't see an '=' this looks like leftover Swift 2
4032+
// code intending to be an associatedtype.
40294033
backtrackToPosition(startPosition);
4030-
return parseDeclAssociatedTypeSyntax(Flags, std::move(attrs),
4031-
std::move(modifiers));
4034+
return parseDeclAssociatedType(Flags, Attributes, leadingLoc);
40324035
}
4033-
40344036
TmpCtxt->setTransparent();
40354037
TmpCtxt.reset();
40364038

4037-
ParsedTypealiasDeclSyntaxBuilder builder(*SyntaxContext);
4038-
applyIntroducer(builder);
4039-
builder.useIdentifier(name.get());
4040-
if (genericParams)
4041-
builder.useGenericParameterClause(std::move(*genericParams));
4039+
auto *TAD = new (Context) TypeAliasDecl(TypeAliasLoc, EqualLoc, Id, IdLoc,
4040+
genericParams, CurDeclContext);
4041+
setLocalDiscriminator(TAD);
4042+
ParserResult<TypeRepr> UnderlyingTy;
40424043

4043-
// Parse underlying type clause.
4044-
if (Tok.isAny(tok::equal, tok::colon)) {
4045-
ParsedTypeInitializerClauseSyntaxBuilder initBuilder(*SyntaxContext);
4044+
if (Tok.is(tok::colon) || Tok.is(tok::equal)) {
4045+
ContextChange CC(*this, TAD);
40464046

4047-
// Parse '='.
4047+
SyntaxParsingContext InitCtx(SyntaxContext,
4048+
SyntaxKind::TypeInitializerClause);
40484049
if (Tok.is(tok::colon)) {
40494050
// It is a common mistake to write "typealias A : Int" instead of = Int.
40504051
// Recognize this and produce a fixit.
40514052
diagnose(Tok, diag::expected_equal_in_typealias)
40524053
.fixItReplace(Tok.getLoc(), " = ");
4053-
ignoreToken(tok::colon);
4054+
EqualLoc = consumeToken(tok::colon);
40544055
} else {
4055-
initBuilder.useEqual(consumeTokenSyntax());
4056+
EqualLoc = consumeToken(tok::equal);
40564057
}
40574058

4058-
// Parse the underlying type.
4059-
auto underlyingType = parseTypeSyntax(diag::expected_type_in_typealias);
4060-
status |= underlyingType.getStatus();
4061-
if (!underlyingType.isNull()) {
4062-
initBuilder.useValue(underlyingType.get());
4063-
} else {
4064-
initBuilder.useValue(
4065-
ParsedSyntaxRecorder::makeUnknownType({}, *SyntaxContext));
4066-
}
4067-
builder.useInitializer(initBuilder.build());
4068-
} else {
4069-
diagnose(Tok, diag::expected_equal_in_typealias);
4070-
status.setIsParseError();
4059+
UnderlyingTy = parseType(diag::expected_type_in_typealias);
4060+
TAD->setTypeEndLoc(PreviousLoc);
4061+
Status |= UnderlyingTy;
40714062
}
40724063

4073-
// Parse optional where clause.
4064+
TAD->setUnderlyingTypeRepr(UnderlyingTy.getPtrOrNull());
4065+
TAD->getAttrs() = Attributes;
4066+
4067+
// Parse a 'where' clause if present, adding it to our GenericParamList.
40744068
if (Tok.is(tok::kw_where)) {
4075-
bool FirstTypeInComplete = false;
4076-
auto whereClause = parseGenericWhereClauseSyntax(FirstTypeInComplete);
4077-
status |= whereClause.getStatus();
4078-
builder.useGenericWhereClause(whereClause.get());
4069+
ContextChange CC(*this, TAD);
4070+
Status |= parseFreestandingGenericWhereClause(genericParams);
40794071
}
40804072

4081-
return makeParsedResult(builder.build(), status);
4082-
}
4083-
4084-
ParserResult<TypeDecl>
4085-
Parser::parseDeclTypeAlias(Parser::ParseDeclOptions Flags,
4086-
DeclAttributes &Attributes, SourceLoc leadingLoc) {
4087-
auto modifiers = SyntaxContext->popIf<ParsedModifierListSyntax>();
4088-
auto attrs = SyntaxContext->popIf<ParsedAttributeListSyntax>();
4073+
if (UnderlyingTy.isNull()) {
4074+
// If there is an attempt to do code completion
4075+
// inside of typealias type, let's just return
4076+
// because we've seen required '=' token.
4077+
if (EqualLoc.isInvalid()) {
4078+
diagnose(Tok, diag::expected_equal_in_typealias);
4079+
Status.setIsParseError();
4080+
return Status;
4081+
}
4082+
}
40894083

4090-
auto parsed =
4091-
parseDeclTypeAliasSyntax(Flags, std::move(attrs), std::move(modifiers));
4092-
assert(!parsed.isNull());
4084+
// Exit the scope introduced for the generic parameters.
4085+
GenericsScope.reset();
40934086

4094-
SyntaxContext->addSyntax(parsed.get());
4095-
auto syntax = SyntaxContext->topNode<DeclSyntax>();
4096-
TypeDecl *result =
4097-
cast_or_null<TypeDecl>(Generator.generate(syntax, leadingLoc));
4098-
return makeParserResult(parsed.getStatus(), result);
4087+
addToScope(TAD);
4088+
return DCC.fixupParserResult(Status, TAD);
40994089
}
41004090

41014091
/// Parse an associatedtype decl.

0 commit comments

Comments
 (0)