IOC-golang icon indicating copy to clipboard operation
IOC-golang copied to clipboard

iocli gen问题

Open T-Manson opened this issue 3 years ago • 4 comments

type Test interface { T(a int) (int64, []*int, error) }

// +ioc:autowire=true // +ioc:autowire:type=singleton type TestImpl1 struct { }

func (t *TestImpl1) T(a int) (int64, []*int, error) { return 0, nil, nil }

// +ioc:autowire=true // +ioc:autowire:type=singleton type TestImpl2 struct { }

func (t *TestImpl2) T(a int) (int64, []*int, error) { return 0, nil, nil }

// +ioc:autowire=true // +ioc:autowire:type=singleton type TestImpl3 struct { }

func (t *TestImpl3) T( a int, ) (int64, []*int, error) { return 0, nil, nil }

使用 iocli gen后的zz_generated.ioc.go文件,如下:

//go:build !ignore_autogenerated // +build !ignore_autogenerated

// Code generated by iocli, run 'iocli gen' to re-generate

package main

import ( autowire "github.com/alibaba/ioc-golang/autowire" normal "github.com/alibaba/ioc-golang/autowire/normal" singleton "github.com/alibaba/ioc-golang/autowire/singleton" util "github.com/alibaba/ioc-golang/autowire/util" )

func init() { normal.RegisterStructDescriptor(&autowire.StructDescriptor{ Factory: func() interface{} { return &testImpl1_{} }, }) singleton.RegisterStructDescriptor(&autowire.StructDescriptor{ Factory: func() interface{} { return &TestImpl1{} }, }) normal.RegisterStructDescriptor(&autowire.StructDescriptor{ Factory: func() interface{} { return &testImpl2_{} }, }) singleton.RegisterStructDescriptor(&autowire.StructDescriptor{ Factory: func() interface{} { return &TestImpl2{} }, }) normal.RegisterStructDescriptor(&autowire.StructDescriptor{ Factory: func() interface{} { return &testImpl3_{} }, }) singleton.RegisterStructDescriptor(&autowire.StructDescriptor{ Factory: func() interface{} { return &TestImpl3{} }, }) }

type testImpl1_ struct { T_ func(a int) (int64, []*int, error) }

func (t *testImpl1_) T(a int) (int64, []*int, error) { return t.T_(a) }

type testImpl2_ struct { T_ func(a int) (int64, []*int, error) }

func (t *testImpl2_) T(a int) (int64, []*int, error) { return t.T_(a) }

type testImpl3_ struct { }

type TestImpl1IOCInterface interface { T(a int) (int64, []*int, error) }

type TestImpl2IOCInterface interface { T(a int) (int64, []*int, error) }

type TestImpl3IOCInterface interface { }

func GetTestImpl1() (*TestImpl1, error) { i, err := singleton.GetImpl(util.GetSDIDByStructPtr(new(TestImpl1)), nil) if err != nil { return nil, err } impl := i.(*TestImpl1) return impl, nil }

func GetTestImpl1IOCInterface() (TestImpl1IOCInterface, error) { i, err := singleton.GetImplWithProxy(util.GetSDIDByStructPtr(new(TestImpl1)), nil) if err != nil { return nil, err } impl := i.(TestImpl1IOCInterface) return impl, nil }

func GetTestImpl2() (*TestImpl2, error) { i, err := singleton.GetImpl(util.GetSDIDByStructPtr(new(TestImpl2)), nil) if err != nil { return nil, err } impl := i.(*TestImpl2) return impl, nil }

func GetTestImpl2IOCInterface() (TestImpl2IOCInterface, error) { i, err := singleton.GetImplWithProxy(util.GetSDIDByStructPtr(new(TestImpl2)), nil) if err != nil { return nil, err } impl := i.(TestImpl2IOCInterface) return impl, nil }

func GetTestImpl3() (*TestImpl3, error) { i, err := singleton.GetImpl(util.GetSDIDByStructPtr(new(TestImpl3)), nil) if err != nil { return nil, err } impl := i.(*TestImpl3) return impl, nil }

func GetTestImpl3IOCInterface() (TestImpl3IOCInterface, error) { i, err := singleton.GetImplWithProxy(util.GetSDIDByStructPtr(new(TestImpl3)), nil) if err != nil { return nil, err } impl := i.(TestImpl3IOCInterface) return impl, nil }

问题: TestImpl3未正确生成对应函数签名,结果为空结构体。

T-Manson avatar Jun 21 '22 09:06 T-Manson

@T-Manson 方法名需要写成一行才能识别到,这是个问题,后面会修

LaurenceLiZhixin avatar Jun 21 '22 09:06 LaurenceLiZhixin

@T-Manson 方法名需要写成一行才能识别到,这是个enhancement,后面会修

👌

T-Manson avatar Jun 21 '22 10:06 T-Manson

@photowey How is going on with ast analysis of iocli ? I want to refactor codes and structure of iocli recently, and I'm worry about conflicts with your contribution.

LaurenceLiZhixin avatar Jul 04 '22 05:07 LaurenceLiZhixin

解析占据多行的函数,如果覆盖全部写法,需要引入语法分析,这个能力可能要暂时被搁置了。目前只支持单行方法名解析,合法的方法签名所在行例如:

valid line is like
func (s *ServiceStruct) GetString(name string, param *substruct.Param) string {
func (s *ServiceStruct) GetString(param *substruct.Param) string {
func (s *ServiceStruct) GetString(name, param *substruct.Param) (string, error) {
func (s *ServiceStruct) GetString() string {
func (s *ServiceStruct) GetString()  {

LaurenceLiZhixin avatar Jul 26 '22 14:07 LaurenceLiZhixin