fix: scrolling on suggestions
This commit is contained in:
@@ -2,10 +2,15 @@ package main
|
||||
|
||||
import (
|
||||
"strings"
|
||||
"sync"
|
||||
|
||||
"github.com/charmbracelet/x/ansi"
|
||||
)
|
||||
|
||||
const suggestionRenderCacheLimit = 256
|
||||
|
||||
var renderedSuggestions = newSuggestionRenderCache(suggestionRenderCacheLimit)
|
||||
|
||||
type parsedCommentBody struct {
|
||||
Prose string
|
||||
Suggestions []string
|
||||
@@ -16,6 +21,98 @@ type codeRange struct {
|
||||
End int
|
||||
}
|
||||
|
||||
type suggestionRenderCacheKey struct {
|
||||
path string
|
||||
removed string
|
||||
removedLines int
|
||||
replacement string
|
||||
width int
|
||||
}
|
||||
|
||||
type suggestionRenderCacheEntry struct {
|
||||
removed []detailLine
|
||||
added []detailLine
|
||||
}
|
||||
|
||||
type suggestionRenderCache struct {
|
||||
mu sync.Mutex
|
||||
limit int
|
||||
entries map[suggestionRenderCacheKey]suggestionRenderCacheEntry
|
||||
order []suggestionRenderCacheKey
|
||||
}
|
||||
|
||||
func newSuggestionRenderCache(limit int) *suggestionRenderCache {
|
||||
return &suggestionRenderCache{
|
||||
limit: limit, entries: make(map[suggestionRenderCacheKey]suggestionRenderCacheEntry),
|
||||
}
|
||||
}
|
||||
|
||||
func (c *suggestionRenderCache) get(
|
||||
key suggestionRenderCacheKey,
|
||||
) (suggestionRenderCacheEntry, bool) {
|
||||
c.mu.Lock()
|
||||
defer c.mu.Unlock()
|
||||
entry, ok := c.entries[key]
|
||||
return cloneSuggestionRenderEntry(entry), ok
|
||||
}
|
||||
|
||||
func (c *suggestionRenderCache) put(
|
||||
key suggestionRenderCacheKey, entry suggestionRenderCacheEntry,
|
||||
) suggestionRenderCacheEntry {
|
||||
c.mu.Lock()
|
||||
defer c.mu.Unlock()
|
||||
if cached, ok := c.entries[key]; ok {
|
||||
return cloneSuggestionRenderEntry(cached)
|
||||
}
|
||||
if len(c.entries) >= c.limit {
|
||||
delete(c.entries, c.order[0])
|
||||
c.order = c.order[1:]
|
||||
}
|
||||
c.entries[key] = cloneSuggestionRenderEntry(entry)
|
||||
c.order = append(c.order, key)
|
||||
return cloneSuggestionRenderEntry(entry)
|
||||
}
|
||||
|
||||
func (c *suggestionRenderCache) clear() {
|
||||
c.mu.Lock()
|
||||
defer c.mu.Unlock()
|
||||
c.entries = make(map[suggestionRenderCacheKey]suggestionRenderCacheEntry)
|
||||
c.order = nil
|
||||
}
|
||||
|
||||
func cloneSuggestionRenderEntry(entry suggestionRenderCacheEntry) suggestionRenderCacheEntry {
|
||||
return suggestionRenderCacheEntry{
|
||||
removed: append([]detailLine(nil), entry.removed...),
|
||||
added: append([]detailLine(nil), entry.added...),
|
||||
}
|
||||
}
|
||||
|
||||
func renderSuggestion(
|
||||
path string, reviewed []string, replacement string, width int,
|
||||
) suggestionRenderCacheEntry {
|
||||
key := suggestionRenderCacheKey{
|
||||
path: path, removed: strings.Join(reviewed, "\n"), removedLines: len(reviewed),
|
||||
replacement: replacement, width: width,
|
||||
}
|
||||
if cached, ok := renderedSuggestions.get(key); ok {
|
||||
return cached
|
||||
}
|
||||
removed, added := normalizeSuggestion(reviewed, replacement)
|
||||
removedRanges, addedRanges := suggestionChangedRanges(removed, added)
|
||||
entry := suggestionRenderCacheEntry{}
|
||||
for index, source := range removed {
|
||||
entry.removed = append(entry.removed, wrapSuggestionLine(
|
||||
path, source, '-', removedRanges[index], width,
|
||||
)...)
|
||||
}
|
||||
for index, source := range added {
|
||||
entry.added = append(entry.added, wrapSuggestionLine(
|
||||
path, source, '+', addedRanges[index], width,
|
||||
)...)
|
||||
}
|
||||
return renderedSuggestions.put(key, entry)
|
||||
}
|
||||
|
||||
func parseCommentBody(body string) parsedCommentBody {
|
||||
var (
|
||||
result parsedCommentBody
|
||||
|
||||
Reference in New Issue
Block a user