diff --git a/pkg/service/expr.go b/pkg/service/expr.go index 7653986..aecbf9f 100644 --- a/pkg/service/expr.go +++ b/pkg/service/expr.go @@ -126,10 +126,17 @@ func handleIndexExpr(ind *ast.IndexExpr) (code string) { switch x := ind.X.(type) { case *ast.SelectorExpr: - if isInMethod { + // if isInMethod { + // println() + // spew.Dump(currentReceiverName) + // spew.Dump(x) + // } + + object_name := handleExpr(x.X) + if isInMethod && object_name == currentReceiverName { code += "this" } else { - code += handleExpr(x.X) + code += object_name } code += "->" diff --git a/pkg/service/features/app.feature b/pkg/service/features/app.feature index 52c3681..fbcafeb 100644 --- a/pkg/service/features/app.feature +++ b/pkg/service/features/app.feature @@ -368,50 +368,6 @@ void device::doSomething() { this->x=1; this->x=this->y; } -``` - - Сценарий: Структура с обращением к полям - * Исходник: -``` -package test - -type device struct { - g [8]bool -} - -func (dev *device) doSomething(a *int) { - if dev.g[0] { - a:=1 - } -} - -func some(gs *GPIOS) { - if gs.g[0] { - a:=1 - } -} -``` - * Результат: -``` -class device { -public: - bool g[8]; - void doSomething(int* a); -}; - -void some(GPIOS* gs); - -void device::doSomething(int* a) { -if (this->g[0]) { - auto a=1; - } -} - -void some(GPIOS* gs) { -if (gs->g[0]) { - auto a=1; - } -} ``` Сценарий: Структура с вызовом метода и свойства другого объекта diff --git a/pkg/service/features/selecting.feature b/pkg/service/features/selecting.feature index 5a134a5..0741ff5 100644 --- a/pkg/service/features/selecting.feature +++ b/pkg/service/features/selecting.feature @@ -57,7 +57,7 @@ foo->Bar(1,"2",LOW); } ``` - Сценарий: Обращение к полям динамически созданного класса + Сценарий: Обращение к простому полю динамически созданного класса: в фукнции и методе * Исходник: ``` package test @@ -71,19 +71,114 @@ func NewDevice() *Device { d.v = 1 return d } + +func (d *Device) something() { + d2 := &Device{} + d2.v = 1 +} ``` * Результат: ``` class Device { -public: int v; +public: + int v; + void something(); }; Device* NewDevice(); +void Device::something() { +auto d2=new Device(); +d2->v=1; +} Device* NewDevice() { auto d=new Device(); d->v=1; return d; } +``` + + Сценарий: Обращение к полю-массиву динамически созданного класса: в фукнции и методе + * Исходник: +``` +package test + +type Device struct { + va []int +} + +func NewDevice() *Device { + d := &Device{} + d.va[0] = 1 + return d +} + +func (d *Device) something() { + d2 := &Device{} + d2.va[0] = 1 +} +``` + * Результат: +``` +class Device { +public: + int va[]; + void something(); +}; +Device* NewDevice(); + +void Device::something() { +auto d2=new Device(); +d2->va[0]=1; +} +Device* NewDevice() { +auto d=new Device(); +d->va[0]=1; +return d; +} +``` + + Сценарий: Структура с обращением к полям + * Исходник: +``` +package test + +type device struct { + g [8]bool +} + +func (dev *device) doSomething(a *int) { + if dev.g[0] { + a:=1 + } +} + +func some(gs *GPIOS) { + if gs.g[0] { + a:=1 + } +} +``` + * Результат: +``` +class device { +public: + bool g[8]; + void doSomething(int* a); +}; + +void some(GPIOS* gs); + +void device::doSomething(int* a) { +if (this->g[0]) { + auto a=1; + } +} + +void some(GPIOS* gs) { +if (gs->g[0]) { + auto a=1; + } +} ``` Сценарий: diff --git a/pkg/service/stmt.go b/pkg/service/stmt.go index ad87fa7..343f87a 100644 --- a/pkg/service/stmt.go +++ b/pkg/service/stmt.go @@ -98,6 +98,9 @@ func isExpr0String(ee []ast.Expr) bool { } func handleAssignStmtExpr(e []ast.Expr) (code string) { + // println() + // spew.Dump(e) + ops := make([]string, 0) for _, op := range e { ops = append(ops, handleExpr(op))