func()

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)
	}
}