Skip to content

Commit f67f7e7

Browse files
committed
[Serialization] Refactor some services on errors
Intro a new class ErrorWithUnderlyingReason to refactor duplicated logic from three classes. It can be used as super class to any error with an underlying error.
1 parent 08af8a6 commit f67f7e7

File tree

1 file changed

+36
-29
lines changed

1 file changed

+36
-29
lines changed

lib/Serialization/DeserializationErrors.h

Lines changed: 36 additions & 29 deletions
Original file line numberDiff line numberDiff line change
@@ -359,20 +359,13 @@ class OverrideError : public llvm::ErrorInfo<OverrideError,
359359
}
360360
};
361361

362-
class TypeError : public llvm::ErrorInfo<TypeError, DeclDeserializationError> {
363-
friend ErrorInfo;
364-
static const char ID;
365-
void anchor() override;
362+
// Service class for errors with an underlying cause.
363+
class ErrorWithUnderlyingReason {
364+
std::unique_ptr<llvm::ErrorInfoBase> underlyingReason;
366365

367-
std::unique_ptr<ErrorInfoBase> underlyingReason;
368366
public:
369-
explicit TypeError(DeclName name, std::unique_ptr<ErrorInfoBase> reason,
370-
Flags flags={}, unsigned numVTableEntries=0)
371-
: underlyingReason(std::move(reason)) {
372-
this->name = name;
373-
this->flags = flags;
374-
this->numVTableEntries = numVTableEntries;
375-
}
367+
explicit ErrorWithUnderlyingReason (std::unique_ptr<llvm::ErrorInfoBase> reason) :
368+
underlyingReason(std::move(reason)) {}
376369

377370
template <typename UnderlyingErrorT>
378371
bool underlyingReasonIsA() const {
@@ -381,60 +374,74 @@ class TypeError : public llvm::ErrorInfo<TypeError, DeclDeserializationError> {
381374
return underlyingReason->isA<UnderlyingErrorT>();
382375
}
383376

384-
void log(raw_ostream &OS) const override {
385-
OS << "Could not deserialize type for '" << name << "'";
377+
void log(raw_ostream &OS) const {
386378
if (underlyingReason) {
387379
OS << "\nCaused by: ";
388380
underlyingReason->log(OS);
389381
}
390382
}
391383

384+
};
385+
386+
class TypeError : public llvm::ErrorInfo<TypeError, DeclDeserializationError>,
387+
public ErrorWithUnderlyingReason {
388+
friend ErrorInfo;
389+
static const char ID;
390+
void anchor() override;
391+
392+
public:
393+
explicit TypeError(DeclName name, std::unique_ptr<ErrorInfoBase> reason,
394+
Flags flags={}, unsigned numVTableEntries=0)
395+
: ErrorWithUnderlyingReason(std::move(reason)) {
396+
this->name = name;
397+
this->flags = flags;
398+
this->numVTableEntries = numVTableEntries;
399+
}
400+
401+
void log(raw_ostream &OS) const override {
402+
OS << "Could not deserialize type for '" << name << "'";
403+
ErrorWithUnderlyingReason::log(OS);
404+
}
405+
392406
std::error_code convertToErrorCode() const override {
393407
return llvm::inconvertibleErrorCode();
394408
}
395409
};
396410

397-
class ExtensionError : public llvm::ErrorInfo<ExtensionError> {
411+
class ExtensionError : public llvm::ErrorInfo<ExtensionError>,
412+
public ErrorWithUnderlyingReason {
398413
friend ErrorInfo;
399414
static const char ID;
400415
void anchor() override;
401416

402-
std::unique_ptr<ErrorInfoBase> underlyingReason;
403-
404417
public:
405418
explicit ExtensionError(std::unique_ptr<ErrorInfoBase> reason)
406-
: underlyingReason(std::move(reason)) {}
419+
: ErrorWithUnderlyingReason(std::move(reason)) {}
407420

408421
void log(raw_ostream &OS) const override {
409422
OS << "could not deserialize extension";
410-
if (underlyingReason) {
411-
OS << ": ";
412-
underlyingReason->log(OS);
413-
}
423+
ErrorWithUnderlyingReason::log(OS);
414424
}
415425

416426
std::error_code convertToErrorCode() const override {
417427
return llvm::inconvertibleErrorCode();
418428
}
419429
};
420430

421-
class SILEntityError : public llvm::ErrorInfo<SILEntityError> {
431+
class SILEntityError : public llvm::ErrorInfo<SILEntityError>,
432+
public ErrorWithUnderlyingReason {
422433
friend ErrorInfo;
423434
static const char ID;
424435
void anchor() override;
425436

426-
std::unique_ptr<ErrorInfoBase> underlyingReason;
427437
StringRef name;
428438
public:
429439
SILEntityError(StringRef name, std::unique_ptr<ErrorInfoBase> reason)
430-
: underlyingReason(std::move(reason)), name(name) {}
440+
: ErrorWithUnderlyingReason(std::move(reason)), name(name) {}
431441

432442
void log(raw_ostream &OS) const override {
433443
OS << "could not deserialize SIL entity '" << name << "'";
434-
if (underlyingReason) {
435-
OS << ": ";
436-
underlyingReason->log(OS);
437-
}
444+
ErrorWithUnderlyingReason::log(OS);
438445
}
439446

440447
std::error_code convertToErrorCode() const override {

0 commit comments

Comments
 (0)