Ai
1 Star 0 Fork 0

idsutong/gqlgen

加入 Gitee
与超过 1200万 开发者一起发现、参与优秀开源项目,私有仓库也完全免费 :)
免费加入
文件
克隆/下载
interface_build.go 1.38 KB
一键复制 编辑 原始数据 按行查看 历史
package codegen
import (
"go/types"
"sort"
"github.com/vektah/gqlparser/ast"
"golang.org/x/tools/go/loader"
)
func (cfg *Config) buildInterfaces(types NamedTypes, prog *loader.Program) []*Interface {
var interfaces []*Interface
for _, typ := range cfg.schema.Types {
if typ.Kind == ast.Union || typ.Kind == ast.Interface {
interfaces = append(interfaces, cfg.buildInterface(types, typ, prog))
}
}
sort.Slice(interfaces, func(i, j int) bool {
return interfaces[i].GQLType < interfaces[j].GQLType
})
return interfaces
}
func (cfg *Config) buildInterface(types NamedTypes, typ *ast.Definition, prog *loader.Program) *Interface {
i := &Interface{NamedType: types[typ.Name]}
for _, implementor := range cfg.schema.GetPossibleTypes(typ) {
t := types[implementor.Name]
i.Implementors = append(i.Implementors, InterfaceImplementor{
NamedType: t,
ValueReceiver: cfg.isValueReceiver(types[typ.Name], t, prog),
})
}
return i
}
func (cfg *Config) isValueReceiver(intf *NamedType, implementor *NamedType, prog *loader.Program) bool {
interfaceType, err := findGoInterface(prog, intf.Package, intf.GoType)
if interfaceType == nil || err != nil {
return true
}
implementorType, err := findGoNamedType(prog, implementor.Package, implementor.GoType)
if implementorType == nil || err != nil {
return true
}
return types.Implements(implementorType, interfaceType)
}
Loading...
马建仓 AI 助手
尝试更多
代码解读
代码找茬
代码优化
1
https://gitee.com/idsutong/gqlgen.git
git@gitee.com:idsutong/gqlgen.git
idsutong
gqlgen
gqlgen
v0.7.2

搜索帮助