blob: 632986db0958bd465ecd4df3c33e1ccbb1aa7e7d [file]
// Copyright 2025 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.
package goasm
import (
"context"
"go/token"
"golang.org/x/tools/gopls/internal/cache"
"golang.org/x/tools/gopls/internal/file"
"golang.org/x/tools/gopls/internal/protocol"
"golang.org/x/tools/internal/event"
)
// Definition handles the textDocument/definition request for Go assembly files.
func Definition(ctx context.Context, snapshot *cache.Snapshot, fh file.Handle, rng protocol.Range) ([]protocol.Location, error) {
ctx, done := event.Start(ctx, "goasm.Definition")
defer done()
res, err := resolve(ctx, snapshot, fh, rng)
if err != nil {
return nil, err
}
// Package-qualified symbol: jump to its Go declaration.
if res.obj != nil {
pos := res.obj.Pos()
pgf, err := res.pkg.FileEnclosing(pos)
if err != nil {
return nil, err
}
loc, err := pgf.PosLocation(pos, pos+token.Pos(len(res.obj.Name())))
if err != nil {
return nil, err
}
return []protocol.Location{loc}, nil
}
// Local symbol: jump to its definition in the assembly file.
if res.localDef != nil {
loc, err := res.file.Mapper.OffsetLocation(res.localDef.Offset, res.localDef.End())
if err != nil {
return nil, err
}
return []protocol.Location{loc}, nil
}
return nil, nil
}