in src/scip-lib/scanner/scan.go [156:218]
func (is *IndexScannerImpl) ScanDocumentReader(docPath string, r ScipReader) error {
symbolInfo := scip.SymbolInformation{}
occurrence := scip.Occurrence{}
for {
fieldNumber, fieldType, err := is.consumeBytesFieldMeta(r)
if err == io.EOF {
return nil
}
if err != nil {
return errors.Join(fmt.Errorf("failed to consume field"), err)
}
if !is.shouldParseDocumentField(fieldNumber) {
err := is.skipField(r)
if err != nil {
return errors.Join(fmt.Errorf("failed to skip %q", documentFieldName(fieldNumber)), err)
}
continue
}
dataLen, err := is.consumeLen(r, fieldType)
if err != nil {
return errors.Join(fmt.Errorf("failed to consume length"), err)
}
dataBuf := is.Pool.Get(dataLen)
err = is.consumeFieldData(r, dataLen, dataBuf)
if err != nil {
is.Pool.Put(dataBuf)
return errors.Join(fmt.Errorf("failed to consume %q data", documentFieldName(fieldNumber)), err)
}
switch fieldNumber {
case documentSymbolsFieldNumber:
syByte, err := is.parseSymbolMoniker(dataBuf)
if err != nil {
is.Pool.Put(dataBuf)
return errors.Join(fmt.Errorf("failed to parse symbol moniker"), err)
}
match := is.MatchSymbol(syByte)
is.Pool.Put(syByte)
if match && is.VisitSymbol != nil {
if err := proto.Unmarshal(dataBuf, &symbolInfo); err != nil {
is.Pool.Put(dataBuf)
return errors.Join(fmt.Errorf("failed to read %q", documentFieldName(fieldNumber)), err)
}
is.VisitSymbol(docPath, &symbolInfo)
}
case documentOccurrencesFieldNumber:
syByte, err := is.parseOccurrenceSymbol(dataBuf)
if err != nil {
is.Pool.Put(dataBuf)
return errors.Join(fmt.Errorf("failed to parse symbol moniker"), err)
}
match := is.MatchOccurrence(syByte)
is.Pool.Put(syByte)
if match && is.VisitOccurrence != nil {
if err := proto.Unmarshal(dataBuf, &occurrence); err != nil {
is.Pool.Put(dataBuf)
return errors.Join(fmt.Errorf("failed to read %q", documentFieldName(fieldNumber)), err)
}
is.VisitOccurrence(docPath, &occurrence)
}
}
is.Pool.Put(dataBuf)
}
}