Skip to content
This repository was archived by the owner on Mar 27, 2025. It is now read-only.

Commit 01841e8

Browse files
committed
keep only best feedback in error case of ParseAny
1 parent ba36a07 commit 01841e8

File tree

1 file changed

+28
-3
lines changed

1 file changed

+28
-3
lines changed

complex_parser.go

Lines changed: 28 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -173,7 +173,7 @@ func ParseAny(
173173
pluginSubparsers []SubparserOp, pluginSemantics SemanticsOp,
174174
) (*ParseData, interface{}) {
175175
orgPos := pd.Source.pos
176-
allFeedback := make([]*FeedbackItem, 0, len(pluginSubparsers))
176+
subresults := make([]*ParseResult, 0, len(pluginSubparsers))
177177
lastPos := 0
178178

179179
for _, subparser := range pluginSubparsers {
@@ -183,7 +183,7 @@ func ParseAny(
183183
}
184184
lastPos = max(lastPos, pd.Result.Pos)
185185
pd.Source.pos = orgPos
186-
allFeedback = append(allFeedback, pd.Result.Feedback...)
186+
subresults = append(subresults, pd.Result)
187187
pd.Result = nil
188188
}
189189

@@ -198,7 +198,7 @@ func ParseAny(
198198
),
199199
nil,
200200
)
201-
pd.Result.Feedback = append(pd.Result.Feedback, allFeedback...)
201+
saveBestFeedback(pd, subresults)
202202
return pd, ctx
203203
}
204204

@@ -290,6 +290,31 @@ func saveAllFeedback(pd *ParseData, tmpSubresults []*ParseResult) {
290290
}
291291
}
292292

293+
func saveBestFeedback(pd *ParseData, tmpSubresults []*ParseResult) {
294+
maxFBPos := -1
295+
bestFeedback := []*FeedbackItem{}
296+
for _, subres := range tmpSubresults {
297+
fbPos := maxFeedbackPos(subres.Feedback)
298+
if fbPos > maxFBPos {
299+
maxFBPos = fbPos
300+
bestFeedback = subres.Feedback
301+
} else if fbPos == maxFBPos {
302+
bestFeedback = append(bestFeedback, subres.Feedback...)
303+
}
304+
}
305+
pd.Result.Feedback = append(pd.Result.Feedback, bestFeedback...)
306+
}
307+
308+
func maxFeedbackPos(feedback []*FeedbackItem) int {
309+
maxPos := -1
310+
for _, fb := range feedback {
311+
if fb.Pos > maxPos {
312+
maxPos = fb.Pos
313+
}
314+
}
315+
return maxPos
316+
}
317+
293318
func addPotentialProblems(feedback []*FeedbackItem, potentialFeedback []*FeedbackItem) []*FeedbackItem {
294319
if potentialFeedback == nil {
295320
return feedback

0 commit comments

Comments
 (0)