From cef7769cb810aa8137462a9bc4bb8e36bb7c5940 Mon Sep 17 00:00:00 2001 From: xushiwei Date: Wed, 25 May 2022 14:57:27 +0800 Subject: [PATCH] gop/ast/mod --- ast/mod/deps.go | 97 +++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 97 insertions(+) create mode 100644 ast/mod/deps.go diff --git a/ast/mod/deps.go b/ast/mod/deps.go new file mode 100644 index 000000000..1515dd729 --- /dev/null +++ b/ast/mod/deps.go @@ -0,0 +1,97 @@ +/* + * Copyright (c) 2022 The GoPlus Authors (goplus.org). All rights reserved. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package mod + +import ( + "strconv" + "strings" + + goast "go/ast" + gotoken "go/token" + + "github.com/goplus/gop/ast" + "github.com/goplus/gop/token" +) + +// ---------------------------------------------------------------------------- + +type none struct{} + +type Deps struct { + Pkgs map[string]none +} + +func (p *Deps) Load(pkg *ast.Package, withGopStd bool) { + for _, f := range pkg.Files { + p.LoadFile(f, withGopStd) + } + for _, f := range pkg.GoFiles { + p.LoadGoFile(f) + } +} + +func (p *Deps) LoadGoFile(f *goast.File) { + if p.Pkgs == nil { + p.Pkgs = make(map[string]none) + } + for _, imp := range f.Imports { + path := imp.Path + if path.Kind == gotoken.STRING { + if s, err := strconv.Unquote(path.Value); err == nil { + if s == "C" { + continue + } + p.Pkgs[s] = none{} + } + } + } +} + +func (p *Deps) LoadFile(f *ast.File, withGopStd bool) { + if p.Pkgs == nil { + p.Pkgs = make(map[string]none) + } + for _, imp := range f.Imports { + path := imp.Path + if path.Kind == token.STRING { + if s, err := strconv.Unquote(path.Value); err == nil { + p.gopPkgPath(s, withGopStd) + } + } + } +} + +func (p *Deps) gopPkgPath(s string, withGopStd bool) { + if strings.HasPrefix(s, "gop/") { + if !withGopStd { + return + } + s = "github.com/goplus/gop/" + s[4:] + } else if strings.HasPrefix(s, "C") { + if len(s) == 1 { + s = "github.com/goplus/libc" + } else if s[1] == '/' { + s = s[2:] + if strings.IndexByte(s, '/') < 0 { + s = "github.com/goplus/" + s + } + } + } + p.Pkgs[s] = none{} +} + +// ----------------------------------------------------------------------------