Сценарий: Блок констант
Этот коммит содержится в:
родитель
6c3785004c
коммит
0addf00c20
5 изменённых файлов: 73 добавлений и 11 удалений
|
@ -2,6 +2,7 @@ package service
|
|||
|
||||
import (
|
||||
"go/ast"
|
||||
"go/token"
|
||||
"strings"
|
||||
)
|
||||
|
||||
|
@ -32,6 +33,21 @@ func handleBasicLit(bl *ast.BasicLit) string {
|
|||
return bl.Value
|
||||
}
|
||||
|
||||
func handleBasicLitType(bl *ast.BasicLit) string {
|
||||
switch bl.Kind {
|
||||
case token.INT:
|
||||
return "int"
|
||||
case token.CHAR:
|
||||
return "char"
|
||||
case token.FLOAT:
|
||||
return "double"
|
||||
case token.STRING:
|
||||
return "std::string"
|
||||
}
|
||||
|
||||
return ""
|
||||
}
|
||||
|
||||
func handleUnaryExpr(expr *ast.UnaryExpr) (code string) {
|
||||
cl, ok := expr.X.(*ast.CompositeLit)
|
||||
if ok {
|
||||
|
|
22
pkg/service/features/variables.feature
Обычный файл
22
pkg/service/features/variables.feature
Обычный файл
|
@ -0,0 +1,22 @@
|
|||
# Во имя Бога Милостивого, Милосердного!!!
|
||||
# language: ru
|
||||
Функциональность: Преобразование в C++: переменные и константы
|
||||
|
||||
Сценарий: Блок констант
|
||||
* Исходник:
|
||||
```
|
||||
package test
|
||||
const (
|
||||
c1 = 4
|
||||
c2 = 5
|
||||
c3 = 5.5
|
||||
s1 = "privet"
|
||||
)
|
||||
```
|
||||
* Результат:
|
||||
```
|
||||
const int c1 = 4;
|
||||
const int c2 = 5;
|
||||
const double c3 = 5.5;
|
||||
const std::string s1 = "privet";
|
||||
```
|
|
@ -399,7 +399,7 @@ var _ = Describe("Go Translator", func() {
|
|||
void setup();
|
||||
void loop();
|
||||
|
||||
const maxX = 1;
|
||||
const int maxX = 1;
|
||||
void setup() {}
|
||||
void loop() {
|
||||
if (x == maxX) {
|
||||
|
@ -426,7 +426,7 @@ var _ = Describe("Go Translator", func() {
|
|||
void setup();
|
||||
void loop();
|
||||
|
||||
const maxX = 1;
|
||||
const int maxX = 1;
|
||||
void setup() {}
|
||||
void loop() {
|
||||
if (x == maxX) {
|
||||
|
|
|
@ -5,27 +5,34 @@ import (
|
|||
"go/token"
|
||||
)
|
||||
|
||||
var InConstBlock = false
|
||||
|
||||
func handleGenDecl(decl ast.Decl) string {
|
||||
gd := decl.(*ast.GenDecl)
|
||||
code := ""
|
||||
switch gd.Tok {
|
||||
case token.CONST:
|
||||
code += "const "
|
||||
case token.VAR:
|
||||
code += ""
|
||||
InConstBlock = true
|
||||
code += handleSpecs(gd.Specs)
|
||||
InConstBlock = false
|
||||
default:
|
||||
code += handleSpecs(gd.Specs)
|
||||
}
|
||||
code += handleSpecs(gd.Specs)
|
||||
return code
|
||||
}
|
||||
|
||||
func handleSpecs(specs []ast.Spec) string {
|
||||
code := ""
|
||||
for _, spec := range specs {
|
||||
switch spec.(type) {
|
||||
if InConstBlock {
|
||||
code += "const"
|
||||
}
|
||||
|
||||
switch s := spec.(type) {
|
||||
case *ast.ImportSpec:
|
||||
code += handleImportSpec(spec)
|
||||
case *ast.ValueSpec:
|
||||
code += handleValueSpec(spec) + ";"
|
||||
code += handleValueSpec(s) + ";"
|
||||
case *ast.TypeSpec:
|
||||
code += handleTypeSpec(spec)
|
||||
}
|
||||
|
|
|
@ -4,9 +4,11 @@ import (
|
|||
"go/ast"
|
||||
)
|
||||
|
||||
func handleValueSpec(spec ast.Spec) string {
|
||||
s := spec.(*ast.ValueSpec)
|
||||
code := ""
|
||||
func handleValueSpec(s *ast.ValueSpec) (code string) {
|
||||
if s.Type == nil {
|
||||
code += addTypeByValue(s)
|
||||
}
|
||||
|
||||
code += handleValueSpecType(s.Type)
|
||||
code += " "
|
||||
|
||||
|
@ -24,6 +26,21 @@ func handleValueSpec(spec ast.Spec) string {
|
|||
return code
|
||||
}
|
||||
|
||||
func addTypeByValue(s *ast.ValueSpec) (code string) {
|
||||
if len(s.Values) == 0 {
|
||||
return
|
||||
}
|
||||
|
||||
value := s.Values[0]
|
||||
|
||||
switch v := value.(type) {
|
||||
case *ast.BasicLit:
|
||||
code += " "
|
||||
code += handleBasicLitType(v)
|
||||
}
|
||||
return
|
||||
}
|
||||
|
||||
func handleValueSpecNames(names []*ast.Ident) (code string) {
|
||||
nado_zapyatuyu := false
|
||||
for _, name := range names {
|
||||
|
|
Загрузка…
Создание таблицы
Сослаться в новой задаче