Функциональность: Обращения к полям - всегда через указатель ->
Этот коммит содержится в:
родитель
f4fcbd57c4
коммит
bbb46751ee
7 изменённых файлов: 137 добавлений и 66 удалений
|
@ -115,6 +115,9 @@ func handleParenExpr(stmt *ast.ParenExpr) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleSelectorExpr(s *ast.SelectorExpr) (code string) {
|
func handleSelectorExpr(s *ast.SelectorExpr) (code string) {
|
||||||
|
// println()
|
||||||
|
// spew.Dump(s)
|
||||||
|
|
||||||
switch x := s.X.(type) {
|
switch x := s.X.(type) {
|
||||||
case *ast.Ident:
|
case *ast.Ident:
|
||||||
if isInMethod {
|
if isInMethod {
|
||||||
|
@ -126,7 +129,7 @@ func handleSelectorExpr(s *ast.SelectorExpr) (code string) {
|
||||||
code += "->"
|
code += "->"
|
||||||
} else {
|
} else {
|
||||||
code += handleIdentExpr(x)
|
code += handleIdentExpr(x)
|
||||||
code += "."
|
code += "->"
|
||||||
}
|
}
|
||||||
case *ast.SelectorExpr:
|
case *ast.SelectorExpr:
|
||||||
code += "this"
|
code += "this"
|
||||||
|
@ -135,9 +138,7 @@ func handleSelectorExpr(s *ast.SelectorExpr) (code string) {
|
||||||
code += "->"
|
code += "->"
|
||||||
}
|
}
|
||||||
code += handleIdentExpr(s.Sel)
|
code += handleIdentExpr(s.Sel)
|
||||||
if val, ok := mapping[code]; ok {
|
code = RemapCode(code)
|
||||||
code = val
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
116
pkg/service/features/selecting.feature
Обычный файл
116
pkg/service/features/selecting.feature
Обычный файл
|
@ -0,0 +1,116 @@
|
||||||
|
# Во имя Бога Милостивого, Милосердного!!!
|
||||||
|
# language: ru
|
||||||
|
Функциональность: Обращения к полям
|
||||||
|
|
||||||
|
Сценарий: Вызов метода
|
||||||
|
* Исходник:
|
||||||
|
```
|
||||||
|
package test
|
||||||
|
func foo() {
|
||||||
|
foo.Bar(1,"2")
|
||||||
|
}
|
||||||
|
```
|
||||||
|
* Результат:
|
||||||
|
```
|
||||||
|
void foo();
|
||||||
|
|
||||||
|
void foo() {
|
||||||
|
foo->Bar(1,"2");
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Сценарий: Вызов метода из пакета
|
||||||
|
* Исходник:
|
||||||
|
```
|
||||||
|
package test
|
||||||
|
func foo() {
|
||||||
|
x = bar()
|
||||||
|
y = pkg.Bar()
|
||||||
|
z = x + y
|
||||||
|
}
|
||||||
|
```
|
||||||
|
* Результат:
|
||||||
|
```
|
||||||
|
void foo();
|
||||||
|
|
||||||
|
void foo() {
|
||||||
|
x=bar();
|
||||||
|
y=pkg->Bar();
|
||||||
|
z=x+y;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Сценарий: Вызов метода из пакета ещё
|
||||||
|
* Исходник:
|
||||||
|
```
|
||||||
|
package test
|
||||||
|
func foo() {
|
||||||
|
foo.Bar(1,"2",digital.Low)
|
||||||
|
}
|
||||||
|
```
|
||||||
|
* Результат:
|
||||||
|
```
|
||||||
|
void foo();
|
||||||
|
|
||||||
|
void foo() {
|
||||||
|
foo->Bar(1,"2",LOW);
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Сценарий: Обращение к полям динамически созданного класса
|
||||||
|
* Исходник:
|
||||||
|
```
|
||||||
|
package test
|
||||||
|
|
||||||
|
type Device struct {
|
||||||
|
v int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDevice() *Device {
|
||||||
|
d := &Device{}
|
||||||
|
d.v = 1
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
```
|
||||||
|
* Результат:
|
||||||
|
```
|
||||||
|
class Device {
|
||||||
|
public: int v;
|
||||||
|
};
|
||||||
|
Device* NewDevice();
|
||||||
|
|
||||||
|
Device* NewDevice() {
|
||||||
|
auto d=new Device();
|
||||||
|
d->v=1;
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
```
|
||||||
|
|
||||||
|
Сценарий:
|
||||||
|
* Исходник:
|
||||||
|
```
|
||||||
|
package test
|
||||||
|
|
||||||
|
type Device struct {
|
||||||
|
v int
|
||||||
|
}
|
||||||
|
|
||||||
|
func NewDevice() *Device {
|
||||||
|
d := &Device{}
|
||||||
|
d.v = 1
|
||||||
|
return d
|
||||||
|
}
|
||||||
|
```
|
||||||
|
* Результат:
|
||||||
|
```
|
||||||
|
class Device {
|
||||||
|
public: int v;
|
||||||
|
};
|
||||||
|
Device* NewDevice();
|
||||||
|
|
||||||
|
Device* NewDevice() {
|
||||||
|
auto d=new Device();
|
||||||
|
d->v=1;
|
||||||
|
return d;
|
||||||
|
}
|
||||||
|
```
|
|
@ -117,9 +117,7 @@ func handleFuncDeclName(ident *ast.Ident) (code string) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
code += ident.Name
|
code += ident.Name
|
||||||
if val, ok := mapping[code]; ok {
|
code = RemapCode(code)
|
||||||
code = val
|
|
||||||
}
|
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
|
@ -24,9 +24,7 @@ func (i *Include) String() (code string) {
|
||||||
func (i *Include) genString(s *ast.ImportSpec) (code string) {
|
func (i *Include) genString(s *ast.ImportSpec) (code string) {
|
||||||
if s.Name != nil {
|
if s.Name != nil {
|
||||||
name := handleIdentExpr(s.Name)
|
name := handleIdentExpr(s.Name)
|
||||||
if val, ok := mapping[name]; ok {
|
name = RemapCode(name)
|
||||||
name = val
|
|
||||||
}
|
|
||||||
if name != "" {
|
if name != "" {
|
||||||
if name != "controller" {
|
if name != "controller" {
|
||||||
code = "#include <" + name + ".h>\n"
|
code = "#include <" + name + ".h>\n"
|
||||||
|
|
|
@ -1,8 +1,9 @@
|
||||||
package service
|
package service
|
||||||
|
|
||||||
|
import "strings"
|
||||||
|
|
||||||
var mapping = map[string]string{
|
var mapping = map[string]string{
|
||||||
"fmt.Sprint": "std::to_string",
|
"fmt.Sprint": "std::to_string",
|
||||||
"fmt->Sprint": "std::to_string",
|
|
||||||
"digital.Low": "LOW",
|
"digital.Low": "LOW",
|
||||||
"digital.High": "HIGH",
|
"digital.High": "HIGH",
|
||||||
"digital.ModeInput": "INPUT",
|
"digital.ModeInput": "INPUT",
|
||||||
|
@ -111,3 +112,12 @@ var mapping = map[string]string{
|
||||||
"semaphore.SemaphoreGive": "xSemaphoreGive",
|
"semaphore.SemaphoreGive": "xSemaphoreGive",
|
||||||
"log.Log_e": "log_e",
|
"log.Log_e": "log_e",
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func RemapCode(code string) string {
|
||||||
|
check := strings.ReplaceAll(code, "->", ".")
|
||||||
|
|
||||||
|
if val, ok := mapping[check]; ok {
|
||||||
|
return val
|
||||||
|
}
|
||||||
|
return code
|
||||||
|
}
|
||||||
|
|
|
@ -138,22 +138,6 @@ var _ = Describe("Go Translator", func() {
|
||||||
Compare(source, expected)
|
Compare(source, expected)
|
||||||
})
|
})
|
||||||
|
|
||||||
It("Function_With_Package_Function_Call", func() {
|
|
||||||
source := `package test
|
|
||||||
func foo() {
|
|
||||||
foo.Bar(1,"2")
|
|
||||||
}
|
|
||||||
`
|
|
||||||
expected := `
|
|
||||||
void foo();
|
|
||||||
|
|
||||||
void foo() {
|
|
||||||
foo.Bar(1,"2");
|
|
||||||
}
|
|
||||||
`
|
|
||||||
Compare(source, expected)
|
|
||||||
})
|
|
||||||
|
|
||||||
It("Function_With_Assignments", func() {
|
It("Function_With_Assignments", func() {
|
||||||
source := `package test
|
source := `package test
|
||||||
func foo() {
|
func foo() {
|
||||||
|
@ -174,26 +158,6 @@ var _ = Describe("Go Translator", func() {
|
||||||
Compare(source, expected)
|
Compare(source, expected)
|
||||||
})
|
})
|
||||||
|
|
||||||
It("Function_With_Package_Selector_Assignments", func() {
|
|
||||||
source := `package test
|
|
||||||
func foo() {
|
|
||||||
x = bar()
|
|
||||||
y = pkg.Bar()
|
|
||||||
z = x + y
|
|
||||||
}
|
|
||||||
`
|
|
||||||
expected := `
|
|
||||||
void foo();
|
|
||||||
|
|
||||||
void foo() {
|
|
||||||
x = bar();
|
|
||||||
y = pkg.Bar();
|
|
||||||
z = x + y;
|
|
||||||
}
|
|
||||||
`
|
|
||||||
Compare(source, expected)
|
|
||||||
})
|
|
||||||
|
|
||||||
It("Function_Ident_Mapping", func() {
|
It("Function_Ident_Mapping", func() {
|
||||||
source := `package test
|
source := `package test
|
||||||
func foo() {
|
func foo() {
|
||||||
|
@ -210,22 +174,6 @@ var _ = Describe("Go Translator", func() {
|
||||||
Compare(source, expected)
|
Compare(source, expected)
|
||||||
})
|
})
|
||||||
|
|
||||||
It("Function_With_Ident_Param", func() {
|
|
||||||
source := `package test
|
|
||||||
func foo() {
|
|
||||||
foo.Bar(1,"2",digital.Low)
|
|
||||||
}
|
|
||||||
`
|
|
||||||
expected := `
|
|
||||||
void foo();
|
|
||||||
|
|
||||||
void foo() {
|
|
||||||
foo.Bar(1,"2",LOW);
|
|
||||||
}
|
|
||||||
`
|
|
||||||
Compare(source, expected)
|
|
||||||
})
|
|
||||||
|
|
||||||
It("Function_With_Function_Param", func() {
|
It("Function_With_Function_Param", func() {
|
||||||
source := `package test
|
source := `package test
|
||||||
func foo() {
|
func foo() {
|
||||||
|
|
|
@ -23,6 +23,7 @@ func handleBlockStmt(body *ast.BlockStmt) string {
|
||||||
func handleStmt(stmt ast.Stmt, standaloneAssignment bool) string {
|
func handleStmt(stmt ast.Stmt, standaloneAssignment bool) string {
|
||||||
// println()
|
// println()
|
||||||
// spew.Dump(stmt)
|
// spew.Dump(stmt)
|
||||||
|
|
||||||
code := ""
|
code := ""
|
||||||
switch s := stmt.(type) {
|
switch s := stmt.(type) {
|
||||||
case *ast.AssignStmt:
|
case *ast.AssignStmt:
|
||||||
|
@ -96,14 +97,13 @@ func isExpr0String(ee []ast.Expr) bool {
|
||||||
return false
|
return false
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleAssignStmtExpr(e []ast.Expr) string {
|
func handleAssignStmtExpr(e []ast.Expr) (code string) {
|
||||||
ops := make([]string, 0)
|
ops := make([]string, 0)
|
||||||
code := ""
|
|
||||||
for _, op := range e {
|
for _, op := range e {
|
||||||
ops = append(ops, handleExpr(op))
|
ops = append(ops, handleExpr(op))
|
||||||
}
|
}
|
||||||
code += strings.Join(ops, ",")
|
code += strings.Join(ops, ",")
|
||||||
return code
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleToken(t token.Token) (code string, new bool) {
|
func handleToken(t token.Token) (code string, new bool) {
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче