@@ -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;
368366public:
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 << " \n Caused 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-
404417public:
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;
428438public:
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