-
-
Notifications
You must be signed in to change notification settings - Fork 6
Commit
This commit does not belong to any branch on this repository, and may belong to a fork outside of the repository.
Type checking, sub-selectors, correct types
- Loading branch information
Showing
46 changed files
with
1,836 additions
and
1,451 deletions.
There are no files selected for viewing
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,71 @@ | ||
package checker | ||
|
||
import ( | ||
"fmt" | ||
"go/types" | ||
) | ||
|
||
type Importer struct { | ||
packages map[string]*types.Package | ||
} | ||
|
||
func New() *Importer { | ||
return &Importer{ | ||
packages: make(map[string]*types.Package), | ||
} | ||
} | ||
|
||
var importing types.Package | ||
|
||
func (p *Importer) Import(path string) (*types.Package, error) { | ||
pkg := p.packages[path] | ||
if pkg != nil { | ||
if pkg == &importing { | ||
return nil, fmt.Errorf("import cycle through package %q", path) | ||
} | ||
if !pkg.Complete() { | ||
return pkg, fmt.Errorf("reimported partially imported package %q", path) | ||
} | ||
return pkg, nil | ||
} | ||
|
||
p.packages[path] = &importing | ||
defer func() { | ||
if p.packages[path] == &importing { | ||
p.packages[path] = nil | ||
} | ||
}() | ||
|
||
var firstHardErr error | ||
conf := types.Config{ | ||
IgnoreFuncBodies: true, | ||
Error: func(err error) { | ||
if firstHardErr == nil && !err.(types.Error).Soft { | ||
firstHardErr = err | ||
} | ||
}, | ||
Importer: p, | ||
} | ||
|
||
pack := FindPackage(path) | ||
|
||
if pack == nil { | ||
return nil, fmt.Errorf("package not found %q", path) | ||
} | ||
|
||
pkg, err := conf.Check(path, GetFset(), pack, nil) | ||
if err != nil { | ||
if firstHardErr != nil { | ||
pkg = nil | ||
err = firstHardErr | ||
} | ||
return pkg, fmt.Errorf("type-checking package %q failed (%v)", path, err) | ||
} | ||
|
||
if firstHardErr != nil { | ||
panic("package is not safe yet no error was returned") | ||
} | ||
|
||
p.packages[path] = pkg | ||
return pkg, nil | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Original file line number | Diff line number | Diff line change |
---|---|---|
@@ -0,0 +1,35 @@ | ||
package checker | ||
|
||
import ( | ||
"go/ast" | ||
"go/parser" | ||
"go/token" | ||
) | ||
|
||
var packages = make(map[string][]*ast.File) | ||
var registryFset = token.NewFileSet() | ||
|
||
func RegisterPackages(path string, files map[string]string) { | ||
asts := make([]*ast.File, 0) | ||
|
||
for name, file := range files { | ||
f, err := parser.ParseFile(registryFset, name, file, 0) | ||
if err != nil { | ||
panic(err) | ||
} | ||
if f.Imports != nil || len(f.Imports) > 0 { | ||
continue | ||
} | ||
asts = append(asts, f) | ||
} | ||
|
||
packages[path] = asts | ||
} | ||
|
||
func FindPackage(path string) []*ast.File { | ||
return packages[path] | ||
} | ||
|
||
func GetFset() *token.FileSet { | ||
return registryFset | ||
} |
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
This file contains bidirectional Unicode text that may be interpreted or compiled differently than what appears below. To review, open the file in an editor that reveals hidden Unicode characters.
Learn more about bidirectional Unicode characters
Oops, something went wrong.