Giant blob of minor changes
[dotfiles/.git] / .config / coc / extensions / coc-go-data / tools / pkg / mod / golang.org / x / tools@v0.0.0-20201028153306-37f0764111ff / internal / event / export / log.go
diff --git a/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/internal/event/export/log.go b/.config/coc/extensions/coc-go-data/tools/pkg/mod/golang.org/x/tools@v0.0.0-20201028153306-37f0764111ff/internal/event/export/log.go
new file mode 100644 (file)
index 0000000..96110e7
--- /dev/null
@@ -0,0 +1,57 @@
+// Copyright 2019 The Go Authors. All rights reserved.
+// Use of this source code is governed by a BSD-style
+// license that can be found in the LICENSE file.
+
+package export
+
+import (
+       "context"
+       "fmt"
+       "io"
+       "sync"
+
+       "golang.org/x/tools/internal/event"
+       "golang.org/x/tools/internal/event/core"
+       "golang.org/x/tools/internal/event/label"
+)
+
+// LogWriter returns an Exporter that logs events to the supplied writer.
+// If onlyErrors is true it does not log any event that did not have an
+// associated error.
+// It ignores all telemetry other than log events.
+func LogWriter(w io.Writer, onlyErrors bool) event.Exporter {
+       lw := &logWriter{writer: w, onlyErrors: onlyErrors}
+       return lw.ProcessEvent
+}
+
+type logWriter struct {
+       mu         sync.Mutex
+       printer    Printer
+       writer     io.Writer
+       onlyErrors bool
+}
+
+func (w *logWriter) ProcessEvent(ctx context.Context, ev core.Event, lm label.Map) context.Context {
+       switch {
+       case event.IsLog(ev):
+               if w.onlyErrors && !event.IsError(ev) {
+                       return ctx
+               }
+               w.mu.Lock()
+               defer w.mu.Unlock()
+               w.printer.WriteEvent(w.writer, ev, lm)
+
+       case event.IsStart(ev):
+               if span := GetSpan(ctx); span != nil {
+                       fmt.Fprintf(w.writer, "start: %v %v", span.Name, span.ID)
+                       if span.ParentID.IsValid() {
+                               fmt.Fprintf(w.writer, "[%v]", span.ParentID)
+                       }
+               }
+       case event.IsEnd(ev):
+               if span := GetSpan(ctx); span != nil {
+                       fmt.Fprintf(w.writer, "finish: %v %v", span.Name, span.ID)
+               }
+       }
+       return ctx
+}