Skip to content

Commit

Permalink
Merge pull request #2234 from onflow/bastian/extended-transaction-format
Browse files Browse the repository at this point in the history
  • Loading branch information
turbolent committed Jan 18, 2023
2 parents ed465a2 + 3c0ba24 commit 67589aa
Show file tree
Hide file tree
Showing 13 changed files with 1,229 additions and 264 deletions.
15 changes: 12 additions & 3 deletions runtime/ast/block.go
Original file line number Diff line number Diff line change
Expand Up @@ -58,21 +58,30 @@ var blockStartDoc prettier.Doc = prettier.Text("{")
var blockEndDoc prettier.Doc = prettier.Text("}")
var blockEmptyDoc prettier.Doc = prettier.Text("{}")

func (b *Block) Doc() prettier.Doc {
if b.IsEmpty() {
func AsBlockDoc(doc prettier.Doc) prettier.Doc {
if doc == nil {
return blockEmptyDoc
}

return prettier.Concat{
blockStartDoc,
prettier.Indent{
Doc: StatementsDoc(b.Statements),
Doc: doc,
},
prettier.HardLine{},
blockEndDoc,
}
}

func (b *Block) Doc() prettier.Doc {
var doc prettier.Doc
if !b.IsEmpty() {
doc = StatementsDoc(b.Statements)
}

return AsBlockDoc(doc)
}

func StatementsDoc(statements []Statement) prettier.Doc {
var doc prettier.Concat

Expand Down
1 change: 1 addition & 0 deletions runtime/ast/elementtype.go
Original file line number Diff line number Diff line change
Expand Up @@ -40,6 +40,7 @@ const (
ElementTypePragmaDeclaration
ElementTypeImportDeclaration
ElementTypeTransactionDeclaration
ElementTypeTransactionRoleDeclaration

// Statements

Expand Down
73 changes: 37 additions & 36 deletions runtime/ast/elementtype_string.go

Some generated files are not rendered by default. Learn more about how customized files appear on GitHub.

151 changes: 142 additions & 9 deletions runtime/ast/transaction_declaration.go
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ import (
type TransactionDeclaration struct {
ParameterList *ParameterList
Prepare *SpecialFunctionDeclaration
Roles []*TransactionRoleDeclaration
PreConditions *Conditions
Execute *SpecialFunctionDeclaration
PostConditions *Conditions
Expand All @@ -46,6 +47,7 @@ func NewTransactionDeclaration(
parameterList *ParameterList,
fields []*FieldDeclaration,
prepare *SpecialFunctionDeclaration,
roles []*TransactionRoleDeclaration,
preConditions *Conditions,
postConditions *Conditions,
execute *SpecialFunctionDeclaration,
Expand All @@ -58,6 +60,7 @@ func NewTransactionDeclaration(
ParameterList: parameterList,
Fields: fields,
Prepare: prepare,
Roles: roles,
PreConditions: preConditions,
PostConditions: postConditions,
Execute: execute,
Expand All @@ -72,15 +75,23 @@ func (*TransactionDeclaration) ElementType() ElementType {

func (d *TransactionDeclaration) Walk(walkChild func(Element)) {
// TODO: walk parameters

for _, declaration := range d.Fields {
walkChild(declaration)
}

if d.Prepare != nil {
walkChild(d.Prepare)
}

for _, role := range d.Roles {
walkChild(role)
}

if d.Execute != nil {
walkChild(d.Execute)
}

// TODO: walk pre and post-conditions
}

Expand Down Expand Up @@ -142,6 +153,11 @@ func (d *TransactionDeclaration) Doc() prettier.Doc {
addContent(d.Prepare.Doc())
}

for _, role := range d.Roles {
roleDoc := role.Doc()
addContent(roleDoc)
}

if conditionsDoc := d.PreConditions.Doc(preConditionsKeywordDoc); conditionsDoc != nil {
addContent(conditionsDoc)
}
Expand All @@ -168,18 +184,135 @@ func (d *TransactionDeclaration) Doc() prettier.Doc {
return append(
doc,
prettier.Space,
blockStartDoc,
prettier.Indent{
Doc: prettier.Join(
prettier.HardLine{},
contents...,
),
},
prettier.HardLine{},
blockEndDoc,
AsBlockDoc(prettier.Join(
prettier.HardLine{},
contents...,
)),
)
}

func (d *TransactionDeclaration) String() string {
return Prettier(d)
}

// TransactionRoleDeclaration

type TransactionRoleDeclaration struct {
Identifier Identifier
Prepare *SpecialFunctionDeclaration
DocString string
Fields []*FieldDeclaration
Range
}

var _ Element = &TransactionRoleDeclaration{}
var _ Declaration = &TransactionRoleDeclaration{}
var _ Statement = &TransactionRoleDeclaration{}

func NewTransactionRoleDeclaration(
gauge common.MemoryGauge,
identifier Identifier,
fields []*FieldDeclaration,
prepare *SpecialFunctionDeclaration,
docString string,
declRange Range,
) *TransactionRoleDeclaration {
common.UseMemory(gauge, common.TransactionRoleDeclarationMemoryUsage)

return &TransactionRoleDeclaration{
Identifier: identifier,
Fields: fields,
Prepare: prepare,
DocString: docString,
Range: declRange,
}
}

func (*TransactionRoleDeclaration) ElementType() ElementType {
return ElementTypeTransactionRoleDeclaration
}

func (d *TransactionRoleDeclaration) Walk(walkChild func(Element)) {
for _, declaration := range d.Fields {
walkChild(declaration)
}
if d.Prepare != nil {
walkChild(d.Prepare)
}

// TODO: walk pre and post-conditions
}

func (*TransactionRoleDeclaration) isDeclaration() {}
func (*TransactionRoleDeclaration) isStatement() {}

func (d *TransactionRoleDeclaration) DeclarationIdentifier() *Identifier {
return &d.Identifier
}

func (d *TransactionRoleDeclaration) DeclarationKind() common.DeclarationKind {
return common.DeclarationKindTransactionRole
}

func (d *TransactionRoleDeclaration) DeclarationAccess() Access {
return AccessNotSpecified
}

func (d *TransactionRoleDeclaration) DeclarationMembers() *Members {
return nil
}

func (d *TransactionRoleDeclaration) DeclarationDocString() string {
return d.DocString
}

func (d *TransactionRoleDeclaration) MarshalJSON() ([]byte, error) {
type Alias TransactionRoleDeclaration
return json.Marshal(&struct {
*Alias
Type string
}{
Type: "TransactionRoleDeclaration",
Alias: (*Alias)(d),
})
}

var roleKeywordDoc = prettier.Text("role")

func (d *TransactionRoleDeclaration) Doc() prettier.Doc {

var contents []prettier.Doc

addContent := func(doc prettier.Doc) {
contents = append(
contents,
prettier.Concat{
prettier.HardLine{},
doc,
},
)
}

for _, field := range d.Fields {
addContent(field.Doc())
}

if d.Prepare != nil {
addContent(d.Prepare.Doc())
}

return prettier.Concat{
roleKeywordDoc,
prettier.Space,
prettier.Text(d.Identifier.Identifier),
prettier.Space,
AsBlockDoc(prettier.Join(
prettier.HardLine{},
contents...,
)),
}
}

func (d *TransactionRoleDeclaration) String() string {
return Prettier(d)
}
Loading

0 comments on commit 67589aa

Please sign in to comment.