Сценарий: Последовательность блоков: константы

Этот коммит содержится в:
Softonik 2024-02-12 02:06:27 +03:00 коммит произвёл Nobody
родитель 0516d8178a
коммит 8e3a1a3d7a
5 изменённых файлов: 84 добавлений и 7 удалений

41
pkg/service/const.go Обычный файл
Просмотреть файл

@ -0,0 +1,41 @@
package service
import "go/ast"
var (
constDeclarations []*Const
)
type Const struct {
s *ast.ValueSpec
}
func NewConst(s *ast.ValueSpec) *Const {
return &Const{s: s}
}
func (c *Const) String() (code string) {
// return c.s.Names[0].Name
return c.generate()
}
func (c *Const) generate() (code string) {
code += "const "
code += handleValueSpec(c.s)
code += ";"
return
}
func handleConstSpecs(specs []ast.Spec) string {
for _, spec := range specs {
switch s := spec.(type) {
case *ast.ValueSpec:
addConstant(s)
}
}
return ""
}
func addConstant(s *ast.ValueSpec) {
c := NewConst(s)
constDeclarations = append(constDeclarations, c)
}

Просмотреть файл

@ -345,4 +345,19 @@ return new Device();
void main() {
dev1=NewDevice();
}
```
Сценарий: Последовательность блоков: константы, типы, абстрактные классы, классы, переменные, функции
* Исходник:
```
package test
type Mera int
const c1 = 4
```
* Результат:
```
const int c1 = 4;
typedef int Mera;
```

Просмотреть файл

@ -86,6 +86,7 @@ func (s *defaultService) Start() error {
dst[i] = make(chan string, 1)
}
constDeclarations = nil
classDeclarations = nil
funcDeclarations = nil
helpersForDeclarations = nil
@ -104,6 +105,7 @@ func (s *defaultService) Start() error {
}
s.printIncludeHeaders()
s.printConstDeclarations()
s.printClassDeclarations()
s.printFunctionDeclarations()
s.printGoHelperDeclarations()
@ -130,6 +132,19 @@ func (s *defaultService) printIncludeHeaders() {
h := "#include <Arduino.h>\n\n"
s.out.Write([]byte(h))
}
func (s *defaultService) printConstDeclarations() {
dlock.Lock()
defer dlock.Unlock()
for _, c := range constDeclarations {
d := c.String()
s.out.Write([]byte(d + "\n"))
if s.header != nil {
s.header.Write([]byte(d + "\n"))
}
}
s.out.Write([]byte("\n"))
}
func (s *defaultService) printClassDeclarations() {
dlock.Lock()
defer dlock.Unlock()

Просмотреть файл

@ -80,10 +80,11 @@ var _ = Describe("Go Translator", func() {
}
`
expected := `
const std::string foo = "bar";
void foo();
void foo() {
const std::string foo = "bar";
}
`
Compare(source, expected)
@ -396,10 +397,11 @@ var _ = Describe("Go Translator", func() {
}
`
expected := `
const int maxX = 1;
void setup();
void loop();
const int maxX = 1;
void setup() {}
void loop() {
if (x == maxX) {
@ -423,10 +425,11 @@ var _ = Describe("Go Translator", func() {
}
`
expected := `
const int maxX = 1;
void setup();
void loop();
const int maxX = 1;
void setup() {}
void loop() {
if (x == maxX) {

Просмотреть файл

@ -22,11 +22,14 @@ func handleGenDecl(decl ast.Decl) string {
}
func handleSpecs(specs []ast.Spec) (code string) {
for _, spec := range specs {
if InConstBlock {
code += "const "
}
if InConstBlock {
return handleConstSpecs(specs)
}
return handleSpecsVariables(specs)
}
func handleSpecsVariables(specs []ast.Spec) (code string) {
for _, spec := range specs {
switch s := spec.(type) {
case *ast.ImportSpec:
code += handleImportSpec(spec)