GoPLS Viewer

Home|gopls/go/gcexportdata/importer.go
1// Copyright 2016 The Go Authors. All rights reserved.
2// Use of this source code is governed by a BSD-style
3// license that can be found in the LICENSE file.
4
5package gcexportdata
6
7import (
8    "fmt"
9    "go/token"
10    "go/types"
11    "os"
12)
13
14// NewImporter returns a new instance of the types.Importer interface
15// that reads type information from export data files written by gc.
16// The Importer also satisfies types.ImporterFrom.
17//
18// Export data files are located using "go build" workspace conventions
19// and the build.Default context.
20//
21// Use this importer instead of go/importer.For("gc", ...) to avoid the
22// version-skew problems described in the documentation of this package,
23// or to control the FileSet or access the imports map populated during
24// package loading.
25//
26// Deprecated: Use the higher-level API in golang.org/x/tools/go/packages,
27// which is more efficient.
28func NewImporter(fset *token.FileSetimports map[string]*types.Packagetypes.ImporterFrom {
29    return importer{fsetimports}
30}
31
32type importer struct {
33    fset    *token.FileSet
34    imports map[string]*types.Package
35}
36
37func (imp importerImport(importPath string) (*types.Packageerror) {
38    return imp.ImportFrom(importPath""0)
39}
40
41func (imp importerImportFrom(importPathsrcDir stringmode types.ImportMode) (_ *types.Packageerr error) {
42    filenamepath := Find(importPathsrcDir)
43    if filename == "" {
44        if importPath == "unsafe" {
45            // Even for unsafe, call Find first in case
46            // the package was vendored.
47            return types.Unsafenil
48        }
49        return nilfmt.Errorf("can't find import: %s"importPath)
50    }
51
52    if pkgok := imp.imports[path]; ok && pkg.Complete() {
53        return pkgnil // cache hit
54    }
55
56    // open file
57    ferr := os.Open(filename)
58    if err != nil {
59        return nilerr
60    }
61    defer func() {
62        f.Close()
63        if err != nil {
64            // add file name to error
65            err = fmt.Errorf("reading export data: %s: %v"filenameerr)
66        }
67    }()
68
69    rerr := NewReader(f)
70    if err != nil {
71        return nilerr
72    }
73
74    return Read(rimp.fsetimp.importspath)
75}
76
MembersX
importer.ImportFrom.mode
importer.ImportFrom.r
NewImporter.imports
importer.imports
importer.ImportFrom.importPath
importer.ImportFrom.srcDir
importer.ImportFrom.err
importer.ImportFrom.filename
importer.ImportFrom.f
NewImporter.fset
importer.Import.imp
NewImporter
importer.ImportFrom
importer.Import
importer.Import.importPath
importer.ImportFrom.imp
importer.ImportFrom.path
importer
importer.fset
Members
X