Сценарий: Структура с обращением к полям
Этот коммит содержится в:
родитель
ba57ec17b1
коммит
bcfa576806
3 изменённых файлов: 74 добавлений и 0 удалений
|
@ -7,7 +7,9 @@ import (
|
||||||
)
|
)
|
||||||
|
|
||||||
func handleExpr(expr ast.Expr) (code string) {
|
func handleExpr(expr ast.Expr) (code string) {
|
||||||
|
// println()
|
||||||
// spew.Dump(expr)
|
// spew.Dump(expr)
|
||||||
|
|
||||||
switch e := expr.(type) {
|
switch e := expr.(type) {
|
||||||
case *ast.BasicLit:
|
case *ast.BasicLit:
|
||||||
code += handleBasicLit(e)
|
code += handleBasicLit(e)
|
||||||
|
@ -23,6 +25,8 @@ func handleExpr(expr ast.Expr) (code string) {
|
||||||
code += handleParenExpr(e)
|
code += handleParenExpr(e)
|
||||||
case *ast.SelectorExpr:
|
case *ast.SelectorExpr:
|
||||||
code += handleSelectorExpr(e)
|
code += handleSelectorExpr(e)
|
||||||
|
case *ast.IndexExpr:
|
||||||
|
code += handleIndexExpr(e)
|
||||||
case *ast.StructType:
|
case *ast.StructType:
|
||||||
code += handleStructType(e)
|
code += handleStructType(e)
|
||||||
case *ast.InterfaceType:
|
case *ast.InterfaceType:
|
||||||
|
@ -137,6 +141,27 @@ func handleSelectorExpr(s *ast.SelectorExpr) (code string) {
|
||||||
return
|
return
|
||||||
}
|
}
|
||||||
|
|
||||||
|
func handleIndexExpr(ind *ast.IndexExpr) (code string) {
|
||||||
|
// println()
|
||||||
|
// spew.Dump(ind)
|
||||||
|
|
||||||
|
switch x := ind.X.(type) {
|
||||||
|
case *ast.SelectorExpr:
|
||||||
|
if isInMethod {
|
||||||
|
code += "this"
|
||||||
|
} else {
|
||||||
|
code += handleExpr(x.X)
|
||||||
|
}
|
||||||
|
|
||||||
|
code += "->"
|
||||||
|
code += handleIdentExpr(x.Sel)
|
||||||
|
code += "["
|
||||||
|
code += handleExpr(ind.Index)
|
||||||
|
code += "]"
|
||||||
|
}
|
||||||
|
return
|
||||||
|
}
|
||||||
|
|
||||||
func handleStarExpr(s *ast.StarExpr) (code string) {
|
func handleStarExpr(s *ast.StarExpr) (code string) {
|
||||||
switch x := s.X.(type) {
|
switch x := s.X.(type) {
|
||||||
case *ast.Ident:
|
case *ast.Ident:
|
||||||
|
|
|
@ -307,6 +307,50 @@ void device::doSomething() {
|
||||||
this->x=1;
|
this->x=1;
|
||||||
this->x=this->y;
|
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;
|
||||||
|
}
|
||||||
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
Сценарий: Структура с вызовом метода и свойства другого объекта
|
Сценарий: Структура с вызовом метода и свойства другого объекта
|
||||||
|
|
|
@ -21,6 +21,8 @@ func handleBlockStmt(body *ast.BlockStmt) string {
|
||||||
return code
|
return code
|
||||||
}
|
}
|
||||||
func handleStmt(stmt ast.Stmt, standaloneAssignment bool) string {
|
func handleStmt(stmt ast.Stmt, standaloneAssignment bool) string {
|
||||||
|
// println()
|
||||||
|
// spew.Dump(stmt)
|
||||||
code := ""
|
code := ""
|
||||||
switch s := stmt.(type) {
|
switch s := stmt.(type) {
|
||||||
case *ast.AssignStmt:
|
case *ast.AssignStmt:
|
||||||
|
@ -182,6 +184,9 @@ func handleForStmt(stmt *ast.ForStmt) string {
|
||||||
}
|
}
|
||||||
|
|
||||||
func handleIfStmt(stmt *ast.IfStmt) string {
|
func handleIfStmt(stmt *ast.IfStmt) string {
|
||||||
|
// println()
|
||||||
|
// spew.Dump(stmt)
|
||||||
|
|
||||||
cond := handleExpr(stmt.Cond)
|
cond := handleExpr(stmt.Cond)
|
||||||
body := handleBlockStmt(stmt.Body)
|
body := handleBlockStmt(stmt.Body)
|
||||||
code := fmt.Sprintf("if (%s) {\n %s }\n", cond, body)
|
code := fmt.Sprintf("if (%s) {\n %s }\n", cond, body)
|
||||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче