func (s *InoMapper) CppToInoLine(targetLine int) (string, int) {
	res := s.toIno[targetLine]
	return res.File, res.Line
}
CppToInoLine converts a target (.cpp) line into a source.ino:line
package sourcemapper
import (
	"bufio"
	"bytes"
	"fmt"
	"log"
	"sort"
	"strconv"
	"strings"
	"github.com/arduino/arduino-language-server/handler/textutils"
	"github.com/arduino/arduino-language-server/lsp"
	"github.com/arduino/go-paths-helper"
	"github.com/pkg/errors"
)
type InoMapper struct {
	CppText         *SourceRevision
	toCpp           map[InoLine]int  
	toIno           map[int]InoLine  
	inoPreprocessed map[InoLine]int  
	cppPreprocessed map[int]InoLine  
}
var NotIno = InoLine{"/not-ino", 0}
var NotInoURI, _ = lsp.NewDocumentURIFromURL("file:///not-ino")
type SourceRevision struct {
	Version int
	Text    string
}
type InoLine struct {
	File string
	Line int
}
func (s *InoMapper) InoToCppLine(sourceURI lsp.DocumentURI, line int) int {
	return s.toCpp[InoLine{sourceURI.AsPath().String(), line}]
}
func (s *InoMapper) InoToCppLineOk(sourceURI lsp.DocumentURI, line int) (int, bool) {
	res, ok := s.toCpp[InoLine{sourceURI.AsPath().String(), line}]
	return res, ok
}
func (s *InoMapper) InoToCppLSPRange(sourceURI lsp.DocumentURI, r lsp.Range) lsp.Range {
	res := r
	res.Start.Line = s.InoToCppLine(sourceURI, r.Start.Line)
	res.End.Line = s.InoToCppLine(sourceURI, r.End.Line)
	return res
}
func (s *InoMapper) InoToCppLSPRangeOk(sourceURI lsp.DocumentURI, r lsp.Range) (lsp.Range, bool) {
	res := r
	if l, ok := s.InoToCppLineOk(sourceURI, r.Start.Line); ok {
		res.Start.Line = l
	} else {
		return res, false
	}
	if l, ok := s.InoToCppLineOk(sourceURI, r.End.Line); ok {
		res.End.Line = l
	} else {
		return res, false
	}
	return res, true
}