// Copyright 2015 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.

// This file implements support functionality for ureader.go.

package gcimporter

import (
	
	
	
	
)

func assert( bool) {
	if ! {
		panic("assertion failed")
	}
}

func errorf( string,  ...any) {
	panic(fmt.Sprintf(, ...))
}

// Synthesize a token.Pos
type fakeFileSet struct {
	fset  *token.FileSet
	files map[string]*fileInfo
}

type fileInfo struct {
	file     *token.File
	lastline int
}

const maxlines = 64 * 1024

func ( *fakeFileSet) ( string, ,  int) token.Pos {
	// TODO(mdempsky): Make use of column.

	// Since we don't know the set of needed file positions, we reserve
	// maxlines positions per file. We delay calling token.File.SetLines until
	// all positions have been calculated (by way of fakeFileSet.setLines), so
	// that we can avoid setting unnecessary lines. See also golang/go#46586.
	 := .files[]
	if  == nil {
		 = &fileInfo{file: .fset.AddFile(, -1, maxlines)}
		.files[] = 
	}

	if  > maxlines {
		 = 1
	}
	if  > .lastline {
		.lastline = 
	}

	// Return a fake position assuming that f.file consists only of newlines.
	return token.Pos(.file.Base() +  - 1)
}

func ( *fakeFileSet) () {
	fakeLinesOnce.Do(func() {
		fakeLines = make([]int, maxlines)
		for  := range fakeLines {
			fakeLines[] = 
		}
	})
	for ,  := range .files {
		.file.SetLines(fakeLines[:.lastline])
	}
}

var (
	fakeLines     []int
	fakeLinesOnce sync.Once
)

// See cmd/compile/internal/noder.derivedInfo.
type derivedInfo struct {
	idx    pkgbits.Index
	needed bool
}

// See cmd/compile/internal/noder.typeInfo.
type typeInfo struct {
	idx     pkgbits.Index
	derived bool
}

// See cmd/compile/internal/types.SplitVargenSuffix.
func splitVargenSuffix( string) (,  string) {
	 := len()
	for  > 0 && [-1] >= '0' && [-1] <= '9' {
		--
	}
	const  = "ยท"
	if  >= len() && [-len():] ==  {
		 -= len()
		return [:], [:]
	}
	return , ""
}