Skip to content

Commit 787af41

Browse files
committed
[Macros] Parse generic arguments in macro expansions.
1 parent 3d9ce27 commit 787af41

File tree

8 files changed

+115
-36
lines changed

8 files changed

+115
-36
lines changed

include/swift/AST/Decl.h

Lines changed: 16 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8340,14 +8340,28 @@ class MacroExpansionDecl : public Decl {
83408340
SourceLoc PoundLoc;
83418341
DeclNameRef Macro;
83428342
DeclNameLoc MacroLoc;
8343+
SourceLoc LeftAngleLoc, RightAngleLoc;
8344+
ArrayRef<TypeRepr *> GenericArgs;
83438345
ArgumentList *ArgList;
83448346
Decl *Rewritten;
83458347

83468348
public:
83478349
MacroExpansionDecl(DeclContext *dc, SourceLoc poundLoc, DeclNameRef macro,
8348-
DeclNameLoc macroLoc, ArgumentList *args)
8350+
DeclNameLoc macroLoc,
8351+
SourceLoc leftAngleLoc,
8352+
ArrayRef<TypeRepr *> genericArgs,
8353+
SourceLoc rightAngleLoc,
8354+
ArgumentList *args)
83498355
: Decl(DeclKind::MacroExpansion, dc), PoundLoc(poundLoc),
8350-
Macro(macro), MacroLoc(macroLoc), ArgList(args), Rewritten(nullptr) {}
8356+
Macro(macro), MacroLoc(macroLoc),
8357+
LeftAngleLoc(leftAngleLoc), RightAngleLoc(rightAngleLoc),
8358+
GenericArgs(genericArgs), ArgList(args), Rewritten(nullptr) {}
8359+
8360+
ArrayRef<TypeRepr *> getGenericArgs() const { return GenericArgs; }
8361+
8362+
SourceRange getGenericArgsRange() const {
8363+
return SourceRange(LeftAngleLoc, RightAngleLoc);
8364+
}
83518365

83528366
SourceRange getSourceRange() const;
83538367
SourceLoc getLocFromSource() const { return PoundLoc; }

include/swift/AST/Expr.h

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -6016,16 +6016,24 @@ class MacroExpansionExpr final : public Expr {
60166016
SourceLoc PoundLoc;
60176017
DeclNameRef MacroName;
60186018
DeclNameLoc MacroNameLoc;
6019+
SourceLoc LeftAngleLoc, RightAngleLoc;
6020+
ArrayRef<TypeRepr *> GenericArgs;
60196021
ArgumentList *ArgList;
60206022
Expr *Rewritten;
60216023

60226024
public:
60236025
explicit MacroExpansionExpr(SourceLoc poundLoc, DeclNameRef macroName,
60246026
DeclNameLoc macroNameLoc,
6027+
SourceLoc leftAngleLoc,
6028+
ArrayRef<TypeRepr *> genericArgs,
6029+
SourceLoc rightAngleLoc,
60256030
ArgumentList *argList, bool isImplicit = false,
60266031
Type ty = Type())
60276032
: Expr(ExprKind::MacroExpansion, isImplicit, ty), PoundLoc(poundLoc),
6028-
MacroName(macroName), MacroNameLoc(macroNameLoc), ArgList(argList),
6033+
MacroName(macroName), MacroNameLoc(macroNameLoc),
6034+
LeftAngleLoc(leftAngleLoc), RightAngleLoc(rightAngleLoc),
6035+
GenericArgs(genericArgs),
6036+
ArgList(argList),
60296037
Rewritten(nullptr) { }
60306038

60316039
DeclNameRef getMacroName() const { return MacroName; }
@@ -6034,15 +6042,18 @@ class MacroExpansionExpr final : public Expr {
60346042
Expr *getRewritten() const { return Rewritten; }
60356043
void setRewritten(Expr *rewritten) { Rewritten = rewritten; }
60366044

6045+
ArrayRef<TypeRepr *> getGenericArgs() const { return GenericArgs; }
6046+
6047+
SourceRange getGenericArgsRange() const {
6048+
return SourceRange(LeftAngleLoc, RightAngleLoc);
6049+
}
6050+
60376051
ArgumentList *getArgs() const { return ArgList; }
60386052
void setArgs(ArgumentList *newArgs) { ArgList = newArgs; }
60396053

60406054
SourceLoc getLoc() const { return PoundLoc; }
60416055

6042-
SourceRange getSourceRange() const {
6043-
return SourceRange(
6044-
PoundLoc, ArgList ? ArgList->getEndLoc() : MacroNameLoc.getEndLoc());
6045-
}
6056+
SourceRange getSourceRange() const;
60466057

60476058
static bool classof(const Expr *E) {
60486059
return E->getKind() == ExprKind::MacroExpansion;

lib/AST/Decl.cpp

Lines changed: 9 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -9644,6 +9644,13 @@ SourceRange MacroDecl::getSourceRange() const {
96449644
}
96459645

96469646
SourceRange MacroExpansionDecl::getSourceRange() const {
9647-
return SourceRange(PoundLoc,
9648-
ArgList ? ArgList->getEndLoc() : MacroLoc.getEndLoc());
9647+
SourceLoc endLoc;
9648+
if (ArgList)
9649+
endLoc = ArgList->getEndLoc();
9650+
else if (RightAngleLoc.isValid())
9651+
endLoc = RightAngleLoc;
9652+
else
9653+
endLoc = MacroLoc.getEndLoc();
9654+
9655+
return SourceRange(PoundLoc, endLoc);
96499656
}

lib/AST/Expr.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2470,6 +2470,18 @@ TypeJoinExpr *TypeJoinExpr::create(ASTContext &ctx, DeclRefExpr *var,
24702470
return new (mem) TypeJoinExpr(var, elements);
24712471
}
24722472

2473+
SourceRange MacroExpansionExpr::getSourceRange() const {
2474+
SourceLoc endLoc;
2475+
if (ArgList)
2476+
endLoc = ArgList->getEndLoc();
2477+
else if (RightAngleLoc.isValid())
2478+
endLoc = RightAngleLoc;
2479+
else
2480+
endLoc = MacroNameLoc.getEndLoc();
2481+
2482+
return SourceRange(PoundLoc, endLoc);
2483+
}
2484+
24732485
void swift::simple_display(llvm::raw_ostream &out, const ClosureExpr *CE) {
24742486
if (!CE) {
24752487
out << "(null)";

lib/Parse/ParseDecl.cpp

Lines changed: 29 additions & 13 deletions
Original file line numberDiff line numberDiff line change
@@ -8987,28 +8987,44 @@ Parser::parseDeclMacroExpansion(ParseDeclOptions flags,
89878987
if (!macroNameRef)
89888988
return makeParserError();
89898989

8990+
ParserStatus status;
8991+
SourceLoc leftAngleLoc, rightAngleLoc;
8992+
SmallVector<TypeRepr *, 8> genericArgs;
8993+
if (canParseAsGenericArgumentList()) {
8994+
auto genericArgsStatus = parseGenericArguments(
8995+
genericArgs, leftAngleLoc, rightAngleLoc);
8996+
status |= genericArgsStatus;
8997+
if (genericArgsStatus.isErrorOrHasCompletion())
8998+
diagnose(leftAngleLoc, diag::while_parsing_as_left_angle_bracket);
8999+
}
9000+
89909001
ArgumentList *argList = nullptr;
89919002
if (Tok.isFollowingLParen()) {
89929003
auto result = parseArgumentList(tok::l_paren, tok::r_paren,
89939004
/*isExprBasic*/ false,
89949005
/*allowTrailingClosure*/ true);
9006+
status |= result;
89959007
if (result.hasCodeCompletion())
89969008
return makeParserCodeCompletionResult<MacroExpansionDecl>();
8997-
if (result.isParseError())
8998-
return makeParserError();
8999-
argList = result.get();
9009+
argList = result.getPtrOrNull();
90009010
} else if (Tok.is(tok::l_brace)) {
90019011
SmallVector<Argument, 2> trailingClosures;
9002-
auto status = parseTrailingClosures(/*isExprBasic*/ false,
9003-
macroNameLoc.getSourceRange(),
9004-
trailingClosures);
9005-
if (status.isError() || trailingClosures.empty())
9006-
return makeParserError();
9007-
argList = ArgumentList::createParsed(Context, SourceLoc(),
9008-
trailingClosures, SourceLoc(),
9009-
/*trailingClosureIdx*/ 0);
9012+
auto closuresStatus = parseTrailingClosures(/*isExprBasic*/ false,
9013+
macroNameLoc.getSourceRange(),
9014+
trailingClosures);
9015+
status |= closuresStatus;
9016+
9017+
if (!trailingClosures.empty()) {
9018+
argList = ArgumentList::createParsed(Context, SourceLoc(),
9019+
trailingClosures, SourceLoc(),
9020+
/*trailingClosureIdx*/ 0);
9021+
}
90109022
}
90119023

9012-
return makeParserResult(new (Context) MacroExpansionDecl(
9013-
CurDeclContext, poundLoc, macroNameRef, macroNameLoc, argList));
9024+
return makeParserResult(
9025+
status,
9026+
new (Context) MacroExpansionDecl(
9027+
CurDeclContext, poundLoc, macroNameRef, macroNameLoc,
9028+
leftAngleLoc, Context.AllocateCopy(genericArgs), rightAngleLoc,
9029+
argList));
90149030
}

lib/Parse/ParseExpr.cpp

Lines changed: 26 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -3411,31 +3411,45 @@ ParserResult<Expr> Parser::parseExprMacroExpansion(bool isExprBasic) {
34113411
if (!macroNameRef)
34123412
return makeParserError();
34133413

3414+
ParserStatus status;
3415+
SourceLoc leftAngleLoc, rightAngleLoc;
3416+
SmallVector<TypeRepr *, 8> genericArgs;
3417+
if (canParseAsGenericArgumentList()) {
3418+
auto genericArgsStatus = parseGenericArguments(
3419+
genericArgs, leftAngleLoc, rightAngleLoc);
3420+
status |= genericArgsStatus;
3421+
if (genericArgsStatus.isErrorOrHasCompletion())
3422+
diagnose(leftAngleLoc, diag::while_parsing_as_left_angle_bracket);
3423+
}
3424+
34143425
ArgumentList *argList = nullptr;
34153426
if (Tok.isFollowingLParen()) {
34163427
auto result = parseArgumentList(tok::l_paren, tok::r_paren, isExprBasic,
34173428
/*allowTrailingClosure*/ true);
34183429
if (result.hasCodeCompletion())
34193430
return makeParserCodeCompletionResult<Expr>();
3420-
if (result.isParseError())
3421-
return makeParserError();
3422-
argList = result.get();
3431+
argList = result.getPtrOrNull();
3432+
status |= result;
34233433
} else if (Tok.is(tok::l_brace) &&
34243434
isValidTrailingClosure(isExprBasic, *this)) {
34253435
SmallVector<Argument, 2> trailingClosures;
3426-
auto status = parseTrailingClosures(isExprBasic,
3427-
macroNameLoc.getSourceRange(),
3428-
trailingClosures);
3429-
if (status.isError() || trailingClosures.empty())
3430-
return makeParserError();
3431-
argList = ArgumentList::createParsed(Context, SourceLoc(),
3432-
trailingClosures, SourceLoc(),
3433-
/*trailingClosureIdx*/ 0);
3436+
auto closureStatus = parseTrailingClosures(isExprBasic,
3437+
macroNameLoc.getSourceRange(),
3438+
trailingClosures);
3439+
status |= closureStatus;
3440+
3441+
if (!trailingClosures.empty()) {
3442+
argList = ArgumentList::createParsed(Context, SourceLoc(),
3443+
trailingClosures, SourceLoc(),
3444+
/*trailingClosureIdx*/ 0);
3445+
}
34343446
}
34353447

34363448
return makeParserResult(
3449+
status,
34373450
new (Context) MacroExpansionExpr(
3438-
poundLoc, macroNameRef, macroNameLoc, argList));
3451+
poundLoc, macroNameRef, macroNameLoc, leftAngleLoc,
3452+
Context.AllocateCopy(genericArgs), rightAngleLoc, argList));
34393453
}
34403454

34413455
/// parseExprCollection - Parse a collection literal expression.

lib/Sema/CSApply.cpp

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2986,8 +2986,8 @@ namespace {
29862986
if (auto newExpr = expandMacroExpr(dc, expr, macroRef, expandedType)) {
29872987
auto expansion = new (ctx) MacroExpansionExpr(
29882988
expr->getStartLoc(), DeclNameRef(macro->getName()),
2989-
DeclNameLoc(expr->getLoc()), nullptr, /*isImplicit=*/true,
2990-
expandedType);
2989+
DeclNameLoc(expr->getLoc()), SourceLoc(), { }, SourceLoc(),
2990+
nullptr, /*isImplicit=*/true, expandedType);
29912991
expansion->setRewritten(newExpr);
29922992
cs.cacheExprTypes(expansion);
29932993
return expansion;

test/Macros/macros.swift

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,4 +12,9 @@ func test(a: Int, b: Int) {
1212
// CHECK: macro_expansion_expr type='(() -> Bool, String)'{{.*}}name=stringify
1313
// CHECK-NEXT: argument_list
1414
// CHECK: tuple_expr type='(() -> Bool, String)' location=Macro expansion of #stringify
15+
16+
let (b2, s3) = #stringify<Double>(1 + 2)
17+
// CHECK: macro_expansion_expr type='(Int, String)'{{.*}}name=stringify
18+
// CHECK-NEXT: argument_list
19+
// CHECK: tuple_expr type='(Int, String)' location=Macro expansion of #stringify
1520
}

0 commit comments

Comments
 (0)