@@ -33,13 +33,17 @@ func NewErrorBuilder(t *Type) ErrorBuilder {
3333}
3434
3535// WithCause provides an original cause for error.
36- // For non-errorx errors, a stack trace is collected.
36+ // For non-errorx errors, a stack trace is collected unless Type tells otherwise .
3737// Otherwise, it is inherited by default, as error wrapping is typically performed 'en passe'.
3838// Note that even if an original error explicitly omitted the stack trace, it could be added on wrap.
3939func (eb ErrorBuilder ) WithCause (err error ) ErrorBuilder {
4040 eb .cause = err
4141 if Cast (err ) != nil {
42- eb .mode = stackTraceBorrow
42+ if eb .errorType .modifiers .CollectStackTrace () {
43+ eb .mode = stackTraceBorrowOrCollect
44+ } else {
45+ eb .mode = stackTraceBorrowOnly
46+ }
4347 }
4448
4549 return eb
@@ -105,18 +109,25 @@ func (eb ErrorBuilder) Create() *Error {
105109type callStackBuildMode int
106110
107111const (
108- stackTraceCollect callStackBuildMode = 1
109- stackTraceBorrow callStackBuildMode = 2
110- stackTraceEnhance callStackBuildMode = 3
111- stackTraceOmit callStackBuildMode = 4
112+ stackTraceCollect callStackBuildMode = 1
113+ stackTraceBorrowOrCollect callStackBuildMode = 2
114+ stackTraceBorrowOnly callStackBuildMode = 3
115+ stackTraceEnhance callStackBuildMode = 4
116+ stackTraceOmit callStackBuildMode = 5
112117)
113118
114119func (eb ErrorBuilder ) assembleStackTrace () * stackTrace {
115120 switch eb .mode {
116121 case stackTraceCollect :
117122 return eb .collectOriginalStackTrace ()
118- case stackTraceBorrow :
123+ case stackTraceBorrowOnly :
119124 return eb .borrowStackTraceFromCause ()
125+ case stackTraceBorrowOrCollect :
126+ if st := eb .borrowStackTraceFromCause (); st != nil {
127+ return st
128+ }
129+
130+ return eb .collectOriginalStackTrace ()
120131 case stackTraceEnhance :
121132 return eb .combineStackTraceWithCause ()
122133 case stackTraceOmit :
@@ -131,11 +142,7 @@ func (eb ErrorBuilder) collectOriginalStackTrace() *stackTrace {
131142}
132143
133144func (eb ErrorBuilder ) borrowStackTraceFromCause () * stackTrace {
134- originalStackTrace := eb .extractStackTraceFromCause (eb .cause )
135- if originalStackTrace != nil {
136- return originalStackTrace
137- }
138- return collectStackTrace ()
145+ return eb .extractStackTraceFromCause (eb .cause )
139146}
140147
141148func (eb ErrorBuilder ) combineStackTraceWithCause () * stackTrace {
0 commit comments