Пример #1
0
func (c *Clang) GetDefinition(a *content.GetDefinitionArgs, ret *content.SourceLocation) error {
	fn, args, err := c.prepare(&a.CompleteAtArgs)
	if err != nil {
		return err
	}
	args = append([]string{"-fsyntax-only", "-Xclang", "-ast-dump", "-Xclang", "-ast-dump-filter", "-Xclang", a.Identifier}, args...)
	args = append(args, fn)
	out, oute, err := RunClang(a.Location.File.Contents, args...)
	if len(out) == 0 {
		if err != nil {
			return err
		} else {
			return fmt.Errorf("%s", oute)
		}
	}
	re, err := regexp.Compile(`\w+Decl[^<]+<(..[^:,]+):?(\d+)?:?(\d+)?.*?\s` + a.Identifier + `\s`)
	if err != nil {
		return err
	}
	res := re.FindAllStringSubmatch(string(out), -1)
	if len(res) == 0 {
		return fmt.Errorf("Not found")
	}
	ret.File.Name = res[0][1]
	i, _ := strconv.ParseInt(res[0][2], 10, 32)
	ret.Line = uint(i)
	i, _ = strconv.ParseInt(res[0][3], 10, 32)
	ret.Column = uint(i)
	return nil
}
Пример #2
0
func TestClang(t *testing.T) {
	if _, err := RunClang("-v"); err != nil {
		t.Skipf("Couldn't launch clang: %s", err)
	}
	loc := content.SourceLocation{}
	loc.Column = 1
	loc.Line = 10
	loc.File.Name = "testdata/hello.cpp"
	t.Log(CompleteAt([]string{}, loc))
}