Skip to content

Commit 164f25e

Browse files
authored
Merge pull request #24493 from xedin/add-opaque-accessor-to-value-decl
[AST] NFC: Add `ValueDecl::getOpaqueResultTypeRepr` accessor
2 parents 16b6aa5 + 83d6f02 commit 164f25e

File tree

3 files changed

+21
-13
lines changed

3 files changed

+21
-13
lines changed

include/swift/AST/Decl.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,7 @@ namespace swift {
9090
class UnboundGenericType;
9191
class ValueDecl;
9292
class VarDecl;
93+
class OpaqueReturnTypeRepr;
9394

9495
enum class DeclKind : uint8_t {
9596
#define DECL(Id, Parent) Id,
@@ -2692,7 +2693,10 @@ class ValueDecl : public Decl {
26922693

26932694
/// Get the decl for this value's opaque result type, if it has one.
26942695
OpaqueTypeDecl *getOpaqueResultTypeDecl() const;
2695-
2696+
2697+
/// Get the representative for this value's opaque result type, if it has one.
2698+
OpaqueReturnTypeRepr *getOpaqueResultTypeRepr() const;
2699+
26962700
/// Set the opaque return type decl for this decl.
26972701
///
26982702
/// `this` must be of a decl type that supports opaque return types, and

lib/AST/Decl.cpp

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2454,6 +2454,19 @@ void ValueDecl::setOverriddenDecls(ArrayRef<ValueDecl *> overridden) {
24542454
request.cacheResult(overriddenVec);
24552455
}
24562456

2457+
OpaqueReturnTypeRepr *ValueDecl::getOpaqueResultTypeRepr() const {
2458+
TypeLoc returnLoc;
2459+
if (auto *VD = dyn_cast<VarDecl>(this)) {
2460+
returnLoc = VD->getTypeLoc();
2461+
} else if (auto *FD = dyn_cast<FuncDecl>(this)) {
2462+
returnLoc = FD->getBodyResultTypeLoc();
2463+
} else if (auto *SD = dyn_cast<SubscriptDecl>(this)) {
2464+
returnLoc = SD->getElementTypeLoc();
2465+
}
2466+
2467+
return dyn_cast_or_null<OpaqueReturnTypeRepr>(returnLoc.getTypeRepr());
2468+
}
2469+
24572470
OpaqueTypeDecl *ValueDecl::getOpaqueResultTypeDecl() const {
24582471
if (auto func = dyn_cast<FuncDecl>(this)) {
24592472
return func->getOpaqueResultTypeDecl();

lib/Sema/CSDiagnostics.cpp

Lines changed: 3 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -278,18 +278,9 @@ bool RequirementFailure::diagnoseAsError() {
278278
anchor->getLoc(), diag::type_does_not_conform_in_opaque_return,
279279
namingDecl->getDescriptiveKind(), namingDecl->getFullName(), lhs, rhs);
280280

281-
TypeLoc returnLoc;
282-
if (auto *VD = dyn_cast<VarDecl>(namingDecl)) {
283-
returnLoc = VD->getTypeLoc();
284-
} else if (auto *FD = dyn_cast<FuncDecl>(namingDecl)) {
285-
returnLoc = FD->getBodyResultTypeLoc();
286-
} else if (auto *SD = dyn_cast<SubscriptDecl>(namingDecl)) {
287-
returnLoc = SD->getElementTypeLoc();
288-
}
289-
290-
if (returnLoc.hasLocation()) {
291-
emitDiagnostic(returnLoc.getLoc(), diag::opaque_return_type_declared_here)
292-
.highlight(returnLoc.getSourceRange());
281+
if (auto *repr = namingDecl->getOpaqueResultTypeRepr()) {
282+
emitDiagnostic(repr->getLoc(), diag::opaque_return_type_declared_here)
283+
.highlight(repr->getSourceRange());
293284
}
294285
return true;
295286
}

0 commit comments

Comments
 (0)