mirror of
https://github.com/apple/swift.git
synced 2025-12-21 12:14:44 +01:00
Add GenericSubscriptExpr to represent subscripting into a generic type.
Swift SVN r2336
This commit is contained in:
@@ -169,6 +169,19 @@ class Traversal : public ASTVisitor<Traversal, Expr*, Stmt*> {
|
||||
|
||||
return E;
|
||||
}
|
||||
Expr *visitGenericSubscriptExpr(GenericSubscriptExpr *E) {
|
||||
if (Expr *Base = doIt(E->getBase()))
|
||||
E->setBase(Base);
|
||||
else
|
||||
return nullptr;
|
||||
|
||||
if (Expr *Index = doIt(E->getIndex()))
|
||||
E->setIndex(Index);
|
||||
else
|
||||
return nullptr;
|
||||
|
||||
return E;
|
||||
}
|
||||
Expr *visitOverloadedSubscriptExpr(OverloadedSubscriptExpr *E) { return E; }
|
||||
Expr *visitUnresolvedDotExpr(UnresolvedDotExpr *E) {
|
||||
if (!E->getBase())
|
||||
|
||||
@@ -254,6 +254,15 @@ ArchetypeSubscriptExpr(Expr *Base, SourceLoc LBracketLoc, Expr *Index,
|
||||
"use SubscriptExpr for non-archetype type subscript");
|
||||
}
|
||||
|
||||
GenericSubscriptExpr::
|
||||
GenericSubscriptExpr(Expr *Base, SourceLoc LBracketLoc, Expr *Index,
|
||||
SourceLoc RBracketLoc, SubscriptDecl *D)
|
||||
: Expr(ExprKind::GenericSubscript, D? D->getElementType() : Type()),
|
||||
D(D), Brackets(LBracketLoc, RBracketLoc), Base(Base), Index(Index) {
|
||||
assert(Base->getType()->getRValueType()->is<BoundGenericType>() &&
|
||||
"use SubscriptExpr for non-generic type subscript");
|
||||
}
|
||||
|
||||
Expr *OverloadedSubscriptExpr::createWithCopy(Expr *Base,
|
||||
ArrayRef<ValueDecl*> Decls,
|
||||
SourceLoc LBracketLoc,
|
||||
@@ -274,6 +283,11 @@ Expr *OverloadedSubscriptExpr::createWithCopy(Expr *Base,
|
||||
RBracketLoc,
|
||||
cast<SubscriptDecl>(Decls[0]));
|
||||
|
||||
if (ContainerTy->is<BoundGenericType>())
|
||||
return new (C) GenericSubscriptExpr(Base, LBracketLoc, Index,
|
||||
RBracketLoc,
|
||||
cast<SubscriptDecl>(Decls[0]));
|
||||
|
||||
return new (C) SubscriptExpr(Base, LBracketLoc, Index, RBracketLoc,
|
||||
cast<SubscriptDecl>(Decls[0]));
|
||||
}
|
||||
@@ -505,6 +519,14 @@ public:
|
||||
printRec(E->getIndex());
|
||||
OS << ')';
|
||||
}
|
||||
void visitGenericSubscriptExpr(GenericSubscriptExpr *E) {
|
||||
printCommon(E, "generic_subscript_expr");
|
||||
OS << '\n';
|
||||
printRec(E->getBase());
|
||||
OS << '\n';
|
||||
printRec(E->getIndex());
|
||||
OS << ')';
|
||||
}
|
||||
void visitOverloadedSubscriptExpr(OverloadedSubscriptExpr *E) {
|
||||
printCommon(E, "overloaded_subscript_expr");
|
||||
OS << '\n';
|
||||
|
||||
Reference in New Issue
Block a user