Skip to content

Commit b7320cd

Browse files
committed
[AST] Collapse two arrays into one
Store an array of Located<Identifier> instead of an array of Identifiers and SourceLocs on OperatorDecl. This allows us to cleanup OperatorPrecedenceGroupRequest a little.
1 parent 6205aac commit b7320cd

File tree

8 files changed

+55
-80
lines changed

8 files changed

+55
-80
lines changed

include/swift/AST/Decl.h

Lines changed: 13 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -7156,18 +7156,16 @@ class OperatorDecl : public Decl {
71567156

71577157
Identifier name;
71587158

7159-
ArrayRef<Identifier> Identifiers;
7160-
ArrayRef<SourceLoc> IdentifierLocs;
7159+
ArrayRef<Located<Identifier>> Identifiers;
71617160
ArrayRef<NominalTypeDecl *> DesignatedNominalTypes;
71627161
SourceLoc getLocFromSource() const { return NameLoc; }
71637162
friend class Decl;
71647163
public:
71657164
OperatorDecl(DeclKind kind, DeclContext *DC, SourceLoc OperatorLoc,
71667165
Identifier Name, SourceLoc NameLoc,
7167-
ArrayRef<Identifier> Identifiers,
7168-
ArrayRef<SourceLoc> IdentifierLocs)
7166+
ArrayRef<Located<Identifier>> Identifiers)
71697167
: Decl(kind, DC), OperatorLoc(OperatorLoc), NameLoc(NameLoc), name(Name),
7170-
Identifiers(Identifiers), IdentifierLocs(IdentifierLocs) {}
7168+
Identifiers(Identifiers) {}
71717169

71727170
OperatorDecl(DeclKind kind, DeclContext *DC, SourceLoc OperatorLoc,
71737171
Identifier Name, SourceLoc NameLoc,
@@ -7202,14 +7200,10 @@ class OperatorDecl : public Decl {
72027200
///
72037201
/// \todo These two purposes really ought to be in separate properties and the
72047202
/// designated type list should be of TypeReprs instead of Identifiers.
7205-
ArrayRef<Identifier> getIdentifiers() const {
7203+
ArrayRef<Located<Identifier>> getIdentifiers() const {
72067204
return Identifiers;
72077205
}
72087206

7209-
ArrayRef<SourceLoc> getIdentifierLocs() const {
7210-
return IdentifierLocs;
7211-
}
7212-
72137207
ArrayRef<NominalTypeDecl *> getDesignatedNominalTypes() const {
72147208
return DesignatedNominalTypes;
72157209
}
@@ -7238,18 +7232,17 @@ class InfixOperatorDecl : public OperatorDecl {
72387232
public:
72397233
InfixOperatorDecl(DeclContext *DC, SourceLoc operatorLoc, Identifier name,
72407234
SourceLoc nameLoc, SourceLoc colonLoc,
7241-
ArrayRef<Identifier> identifiers,
7242-
ArrayRef<SourceLoc> identifierLocs)
7235+
ArrayRef<Located<Identifier>> identifiers)
72437236
: OperatorDecl(DeclKind::InfixOperator, DC, operatorLoc, name, nameLoc,
7244-
identifiers, identifierLocs),
7237+
identifiers),
72457238
ColonLoc(colonLoc) {}
72467239

72477240
SourceLoc getEndLoc() const {
7248-
auto identifierLocs = getIdentifierLocs();
7249-
if (identifierLocs.empty())
7241+
auto identifiers = getIdentifiers();
7242+
if (identifiers.empty())
72507243
return getNameLoc();
72517244

7252-
return identifierLocs.back();
7245+
return identifiers.back().Loc;
72537246
}
72547247

72557248
SourceRange getSourceRange() const {
@@ -7280,10 +7273,9 @@ class PrefixOperatorDecl : public OperatorDecl {
72807273
public:
72817274
PrefixOperatorDecl(DeclContext *DC, SourceLoc OperatorLoc, Identifier Name,
72827275
SourceLoc NameLoc,
7283-
ArrayRef<Identifier> Identifiers,
7284-
ArrayRef<SourceLoc> IdentifierLocs)
7276+
ArrayRef<Located<Identifier>> Identifiers)
72857277
: OperatorDecl(DeclKind::PrefixOperator, DC, OperatorLoc, Name, NameLoc,
7286-
Identifiers, IdentifierLocs) {}
7278+
Identifiers) {}
72877279

72887280
PrefixOperatorDecl(DeclContext *DC, SourceLoc OperatorLoc, Identifier Name,
72897281
SourceLoc NameLoc,
@@ -7315,10 +7307,9 @@ class PostfixOperatorDecl : public OperatorDecl {
73157307
public:
73167308
PostfixOperatorDecl(DeclContext *DC, SourceLoc OperatorLoc, Identifier Name,
73177309
SourceLoc NameLoc,
7318-
ArrayRef<Identifier> Identifiers,
7319-
ArrayRef<SourceLoc> IdentifierLocs)
7310+
ArrayRef<Located<Identifier>> Identifiers)
73207311
: OperatorDecl(DeclKind::PostfixOperator, DC, OperatorLoc, Name, NameLoc,
7321-
Identifiers, IdentifierLocs) {}
7312+
Identifiers) {}
73227313

73237314
PostfixOperatorDecl(DeclContext *DC, SourceLoc OperatorLoc, Identifier Name,
73247315
SourceLoc NameLoc,

lib/AST/ASTDumper.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1229,7 +1229,7 @@ namespace {
12291229
auto identifiers = OD->getIdentifiers();
12301230
for (auto index : indices(identifiers)) {
12311231
OS.indent(Indent + 2);
1232-
OS << "identifier #" << index << " " << identifiers[index];
1232+
OS << "identifier #" << index << " " << identifiers[index].Item;
12331233
if (index != identifiers.size() - 1)
12341234
OS << "\n";
12351235
}

lib/Parse/ParseDecl.cpp

Lines changed: 13 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -7530,8 +7530,7 @@ Parser::parseDeclOperatorImpl(SourceLoc OperatorLoc, Identifier Name,
75307530
// parse them both as identifiers here and sort it out in type
75317531
// checking.
75327532
SourceLoc colonLoc;
7533-
SmallVector<Identifier, 4> identifiers;
7534-
SmallVector<SourceLoc, 4> identifierLocs;
7533+
SmallVector<Located<Identifier>, 4> identifiers;
75357534
if (Tok.is(tok::colon)) {
75367535
SyntaxParsingContext GroupCtxt(SyntaxContext,
75377536
SyntaxKind::OperatorPrecedenceAndTypes);
@@ -7552,16 +7551,16 @@ Parser::parseDeclOperatorImpl(SourceLoc OperatorLoc, Identifier Name,
75527551
SyntaxKind::IdentifierList);
75537552

75547553
Identifier name;
7555-
identifierLocs.push_back(consumeIdentifier(&name));
7556-
identifiers.push_back(name);
7554+
auto loc = consumeIdentifier(&name);
7555+
identifiers.emplace_back(name, loc);
75577556

75587557
while (Tok.is(tok::comma)) {
75597558
auto comma = consumeToken();
75607559

75617560
if (Tok.is(tok::identifier)) {
75627561
Identifier name;
7563-
identifierLocs.push_back(consumeIdentifier(&name));
7564-
identifiers.push_back(name);
7562+
auto loc = consumeIdentifier(&name);
7563+
identifiers.emplace_back(name, loc);
75657564
} else {
75667565
if (Tok.isNot(tok::eof)) {
75677566
auto otherTokLoc = consumeToken();
@@ -7576,12 +7575,13 @@ Parser::parseDeclOperatorImpl(SourceLoc OperatorLoc, Identifier Name,
75767575
SyntaxParsingContext GroupCtxt(SyntaxContext,
75777576
SyntaxKind::IdentifierList);
75787577

7579-
identifiers.push_back(Context.getIdentifier(Tok.getText()));
7580-
identifierLocs.push_back(consumeToken(tok::identifier));
7578+
Identifier name;
7579+
auto nameLoc = consumeIdentifier(&name);
7580+
identifiers.emplace_back(name, nameLoc);
75817581

75827582
if (isPrefix || isPostfix) {
75837583
diagnose(colonLoc, diag::precedencegroup_not_infix)
7584-
.fixItRemove({colonLoc, identifierLocs.back()});
7584+
.fixItRemove({colonLoc, nameLoc});
75857585
}
75867586
// Nothing to complete here, simply consume the token.
75877587
if (Tok.is(tok::code_complete))
@@ -7598,7 +7598,7 @@ Parser::parseDeclOperatorImpl(SourceLoc OperatorLoc, Identifier Name,
75987598
auto Diag = diagnose(lBraceLoc, diag::deprecated_operator_body);
75997599
if (Tok.is(tok::r_brace)) {
76007600
SourceLoc lastGoodLoc =
7601-
!identifierLocs.empty() ? identifierLocs.back() : SourceLoc();
7601+
!identifiers.empty() ? identifiers.back().Loc : SourceLoc();
76027602
if (lastGoodLoc.isInvalid())
76037603
lastGoodLoc = NameLoc;
76047604
SourceLoc lastGoodLocEnd = Lexer::getLocForEndOfToken(SourceMgr,
@@ -7616,18 +7616,15 @@ Parser::parseDeclOperatorImpl(SourceLoc OperatorLoc, Identifier Name,
76167616
if (Attributes.hasAttribute<PrefixAttr>())
76177617
res = new (Context)
76187618
PrefixOperatorDecl(CurDeclContext, OperatorLoc, Name, NameLoc,
7619-
Context.AllocateCopy(identifiers),
7620-
Context.AllocateCopy(identifierLocs));
7619+
Context.AllocateCopy(identifiers));
76217620
else if (Attributes.hasAttribute<PostfixAttr>())
76227621
res = new (Context)
76237622
PostfixOperatorDecl(CurDeclContext, OperatorLoc, Name, NameLoc,
7624-
Context.AllocateCopy(identifiers),
7625-
Context.AllocateCopy(identifierLocs));
7623+
Context.AllocateCopy(identifiers));
76267624
else
76277625
res = new (Context)
76287626
InfixOperatorDecl(CurDeclContext, OperatorLoc, Name, NameLoc, colonLoc,
7629-
Context.AllocateCopy(identifiers),
7630-
Context.AllocateCopy(identifierLocs));
7627+
Context.AllocateCopy(identifiers));
76317628

76327629
diagnoseOperatorFixityAttributes(*this, Attributes, res);
76337630

lib/Sema/TypeCheckAccess.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2006,9 +2006,9 @@ class ExportabilityChecker : public DeclVisitor<ExportabilityChecker> {
20062006
// FIXME: Handle operator designated types (which also applies to prefix
20072007
// and postfix operators).
20082008
if (auto *precedenceGroup = IOD->getPrecedenceGroup()) {
2009-
if (!IOD->getIdentifierLocs().empty()) {
2009+
if (!IOD->getIdentifiers().empty()) {
20102010
checkPrecedenceGroup(precedenceGroup, IOD, IOD->getLoc(),
2011-
IOD->getIdentifierLocs().front());
2011+
IOD->getIdentifiers().front().Loc);
20122012
}
20132013
}
20142014
}

lib/Sema/TypeCheckDecl.cpp

Lines changed: 23 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -1449,18 +1449,13 @@ static NominalTypeDecl *resolveSingleNominalTypeDecl(
14491449
}
14501450

14511451
bool swift::checkDesignatedTypes(OperatorDecl *OD,
1452-
ArrayRef<Identifier> identifiers,
1453-
ArrayRef<SourceLoc> identifierLocs,
1454-
ASTContext &ctx) {
1455-
assert(identifiers.size() == identifierLocs.size());
1456-
1457-
SmallVector<NominalTypeDecl *, 1> designatedNominalTypes;
1452+
ArrayRef<Located<Identifier>> identifiers) {
1453+
auto &ctx = OD->getASTContext();
14581454
auto *DC = OD->getDeclContext();
14591455

1460-
for (auto index : indices(identifiers)) {
1461-
auto *decl = resolveSingleNominalTypeDecl(DC, identifierLocs[index],
1462-
identifiers[index], ctx);
1463-
1456+
SmallVector<NominalTypeDecl *, 1> designatedNominalTypes;
1457+
for (auto ident : identifiers) {
1458+
auto *decl = resolveSingleNominalTypeDecl(DC, ident.Loc, ident.Item, ctx);
14641459
if (!decl)
14651460
return true;
14661461

@@ -1479,63 +1474,58 @@ bool swift::checkDesignatedTypes(OperatorDecl *OD,
14791474
PrecedenceGroupDecl *
14801475
OperatorPrecedenceGroupRequest::evaluate(Evaluator &evaluator,
14811476
InfixOperatorDecl *IOD) const {
1477+
auto &ctx = IOD->getASTContext();
1478+
auto *dc = IOD->getDeclContext();
1479+
14821480
auto enableOperatorDesignatedTypes =
1483-
IOD->getASTContext().TypeCheckerOpts.EnableOperatorDesignatedTypes;
1481+
ctx.TypeCheckerOpts.EnableOperatorDesignatedTypes;
14841482

1485-
auto &Diags = IOD->getASTContext().Diags;
1483+
auto &Diags = ctx.Diags;
14861484
PrecedenceGroupDecl *group = nullptr;
14871485

14881486
auto identifiers = IOD->getIdentifiers();
1489-
auto identifierLocs = IOD->getIdentifierLocs();
1490-
14911487
if (!identifiers.empty()) {
1492-
group = TypeChecker::lookupPrecedenceGroup(
1493-
IOD->getDeclContext(), identifiers[0], identifierLocs[0]);
1488+
auto name = identifiers[0].Item;
1489+
auto loc = identifiers[0].Loc;
1490+
1491+
group = TypeChecker::lookupPrecedenceGroup(dc, name, loc);
14941492

14951493
if (group) {
14961494
identifiers = identifiers.slice(1);
1497-
identifierLocs = identifierLocs.slice(1);
14981495
} else {
14991496
// If we're either not allowing types, or we are allowing them
15001497
// and this identifier is not a type, emit an error as if it's
15011498
// a precedence group.
1502-
auto *DC = IOD->getDeclContext();
15031499
if (!(enableOperatorDesignatedTypes &&
1504-
resolveSingleNominalTypeDecl(DC, identifierLocs[0], identifiers[0],
1505-
IOD->getASTContext(),
1500+
resolveSingleNominalTypeDecl(dc, loc, name, ctx,
15061501
TypeResolutionFlags::SilenceErrors))) {
1507-
Diags.diagnose(identifierLocs[0], diag::unknown_precedence_group,
1508-
identifiers[0]);
1502+
Diags.diagnose(loc, diag::unknown_precedence_group, name);
15091503
identifiers = identifiers.slice(1);
1510-
identifierLocs = identifierLocs.slice(1);
15111504
}
15121505
}
15131506
}
15141507

15151508
if (!identifiers.empty() && !enableOperatorDesignatedTypes) {
15161509
assert(!group);
1517-
Diags.diagnose(identifierLocs[0], diag::unknown_precedence_group,
1518-
identifiers[0]);
1510+
Diags.diagnose(identifiers[0].Loc, diag::unknown_precedence_group,
1511+
identifiers[0].Item);
15191512
identifiers = identifiers.slice(1);
1520-
identifierLocs = identifierLocs.slice(1);
1521-
assert(identifiers.empty() && identifierLocs.empty());
1513+
assert(identifiers.empty());
15221514
}
15231515

15241516
if (!group) {
1525-
group = TypeChecker::lookupPrecedenceGroup(
1526-
IOD->getDeclContext(), IOD->getASTContext().Id_DefaultPrecedence,
1527-
SourceLoc());
1517+
group = TypeChecker::lookupPrecedenceGroup(dc, ctx.Id_DefaultPrecedence,
1518+
SourceLoc());
15281519
}
15291520

15301521
if (!group) {
15311522
Diags.diagnose(IOD->getLoc(), diag::missing_builtin_precedence_group,
1532-
IOD->getASTContext().Id_DefaultPrecedence);
1523+
ctx.Id_DefaultPrecedence);
15331524
}
15341525

15351526
auto nominalTypes = IOD->getDesignatedNominalTypes();
15361527
if (nominalTypes.empty() && enableOperatorDesignatedTypes) {
1537-
if (checkDesignatedTypes(IOD, identifiers, identifierLocs,
1538-
IOD->getASTContext())) {
1528+
if (checkDesignatedTypes(IOD, identifiers)) {
15391529
IOD->setInvalid();
15401530
}
15411531
}

lib/Sema/TypeCheckDecl.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -56,9 +56,7 @@ Optional<AutomaticEnumValueKind> computeAutomaticEnumValueKind(EnumDecl *ED);
5656
void validatePrecedenceGroup(PrecedenceGroupDecl *PGD);
5757

5858
bool checkDesignatedTypes(OperatorDecl *OD,
59-
ArrayRef<Identifier> identifiers,
60-
ArrayRef<SourceLoc> identifierLocs,
61-
ASTContext &ctx);
59+
ArrayRef<Located<Identifier>> identifiers);
6260

6361
}
6462

lib/Sema/TypeCheckDeclPrimary.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1299,8 +1299,7 @@ class DeclChecker : public DeclVisitor<DeclChecker> {
12991299
Ctx.TypeCheckerOpts.EnableOperatorDesignatedTypes;
13001300
if (nominalTypes.empty() && wantsDesignatedTypes) {
13011301
auto identifiers = OD->getIdentifiers();
1302-
auto identifierLocs = OD->getIdentifierLocs();
1303-
if (checkDesignatedTypes(OD, identifiers, identifierLocs, Ctx))
1302+
if (checkDesignatedTypes(OD, identifiers))
13041303
OD->setInvalid();
13051304
}
13061305
return;

lib/Serialization/Deserialization.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -3481,7 +3481,7 @@ class DeclDeserializer {
34813481

34823482
auto result = MF.createDecl<InfixOperatorDecl>(
34833483
DC, SourceLoc(), name, SourceLoc(), SourceLoc(),
3484-
ArrayRef<Identifier>{}, ArrayRef<SourceLoc>{});
3484+
ArrayRef<Located<Identifier>>{});
34853485
result->setDesignatedNominalTypes(ctx.AllocateCopy(designatedNominalTypes));
34863486
ctx.evaluator.cacheOutput(
34873487
OperatorPrecedenceGroupRequest{result},

0 commit comments

Comments
 (0)