github.com/gocuntian/go@v0.0.0-20160610041250-fee02d270bf8/src/go/importer/importer.go (about)

     1  // Copyright 2015 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  
     5  // Package importer provides access to export data importers.
     6  package importer
     7  
     8  import (
     9  	"go/internal/gccgoimporter"
    10  	"go/internal/gcimporter"
    11  	"go/types"
    12  	"io"
    13  	"runtime"
    14  )
    15  
    16  // A Lookup function returns a reader to access package data for
    17  // a given import path, or an error if no matching package is found.
    18  type Lookup func(path string) (io.ReadCloser, error)
    19  
    20  // For returns an Importer for the given compiler and lookup interface,
    21  // or nil. Supported compilers are "gc", and "gccgo". If lookup is nil,
    22  // the default package lookup mechanism for the given compiler is used.
    23  // BUG(issue13847): For does not support non-nil lookup functions.
    24  func For(compiler string, lookup Lookup) types.Importer {
    25  	switch compiler {
    26  	case "gc":
    27  		if lookup != nil {
    28  			panic("gc importer for custom import path lookup not yet implemented")
    29  		}
    30  
    31  		return make(gcimports)
    32  
    33  	case "gccgo":
    34  		if lookup != nil {
    35  			panic("gccgo importer for custom import path lookup not yet implemented")
    36  		}
    37  
    38  		var inst gccgoimporter.GccgoInstallation
    39  		if err := inst.InitFromDriver("gccgo"); err != nil {
    40  			return nil
    41  		}
    42  		return &gccgoimports{
    43  			packages: make(map[string]*types.Package),
    44  			importer: inst.GetImporter(nil, nil),
    45  		}
    46  	}
    47  
    48  	// compiler not supported
    49  	return nil
    50  }
    51  
    52  // Default returns an Importer for the compiler that built the running binary.
    53  // If available, the result implements types.ImporterFrom.
    54  func Default() types.Importer {
    55  	return For(runtime.Compiler, nil)
    56  }
    57  
    58  // gc support
    59  
    60  type gcimports map[string]*types.Package
    61  
    62  func (m gcimports) Import(path string) (*types.Package, error) {
    63  	return m.ImportFrom(path, "" /* no vendoring */, 0)
    64  }
    65  
    66  func (m gcimports) ImportFrom(path, srcDir string, mode types.ImportMode) (*types.Package, error) {
    67  	if mode != 0 {
    68  		panic("mode must be 0")
    69  	}
    70  	return gcimporter.Import(m, path, srcDir)
    71  }
    72  
    73  // gccgo support
    74  
    75  type gccgoimports struct {
    76  	packages map[string]*types.Package
    77  	importer gccgoimporter.Importer
    78  }
    79  
    80  func (m *gccgoimports) Import(path string) (*types.Package, error) {
    81  	return m.ImportFrom(path, "" /* no vendoring */, 0)
    82  }
    83  
    84  func (m *gccgoimports) ImportFrom(path, srcDir string, mode types.ImportMode) (*types.Package, error) {
    85  	if mode != 0 {
    86  		panic("mode must be 0")
    87  	}
    88  	// TODO(gri) pass srcDir
    89  	return m.importer(m.packages, path)
    90  }