Skip to content

Commit

Permalink
refactor modifier checks into reusable functions
Browse files Browse the repository at this point in the history
  • Loading branch information
turbolent committed Dec 6, 2022
1 parent 6ed330e commit 2dc4091
Show file tree
Hide file tree
Showing 3 changed files with 103 additions and 61 deletions.
2 changes: 1 addition & 1 deletion runtime/common/declarationkind.go
Original file line number Diff line number Diff line change
Expand Up @@ -130,7 +130,7 @@ func (k DeclarationKind) Name() string {
case DeclarationKindTypeParameter:
return "type parameter"
case DeclarationKindPragma:
return "#pragma"
return "pragma"
case DeclarationKindEnum:
return "enum"
case DeclarationKindEnumCase:
Expand Down
158 changes: 100 additions & 58 deletions runtime/parser/declaration.go
Original file line number Diff line number Diff line change
Expand Up @@ -77,25 +77,18 @@ func parseDeclaration(p *parser, docString string) (ast.Declaration, error) {

switch p.current.Type {
case lexer.TokenPragma:
if access != ast.AccessNotSpecified {
return nil, NewSyntaxError(*accessPos, "invalid access modifier for pragma")
}
if staticModifierEnabled && staticPos != nil {
return nil, NewSyntaxError(*staticPos, "invalid static modifier for pragma")
}
if nativeModifierEnabled && nativePos != nil {
return nil, NewSyntaxError(*nativePos, "invalid native modifier for pragma")
err := rejectAllModifiers(p, access, accessPos, staticPos, nativePos, common.DeclarationKindPragma)
if err != nil {
return nil, err
}
return parsePragmaDeclaration(p)

case lexer.TokenIdentifier:
switch string(p.currentTokenSource()) {
case keywordLet, keywordVar:
if staticModifierEnabled && staticPos != nil {
return nil, NewSyntaxError(*staticPos, "invalid static modifier for variable")
}
if nativeModifierEnabled && nativePos != nil {
return nil, NewSyntaxError(*nativePos, "invalid native modifier for variable")
err := rejectStaticAndNativeModifiers(p, staticPos, nativePos, common.DeclarationKindVariable)
if err != nil {
return nil, err
}
return parseVariableDeclaration(p, access, accessPos, docString)

Expand All @@ -111,41 +104,51 @@ func parseDeclaration(p *parser, docString string) (ast.Declaration, error) {
)

case keywordImport:
if staticModifierEnabled && staticPos != nil {
return nil, NewSyntaxError(*staticPos, "invalid static modifier for import")
}
if nativeModifierEnabled && nativePos != nil {
return nil, NewSyntaxError(*nativePos, "invalid native modifier for import")
err := rejectStaticAndNativeModifiers(p, staticPos, nativePos, common.DeclarationKindImport)
if err != nil {
return nil, err
}
return parseImportDeclaration(p)

case keywordEvent:
if staticModifierEnabled && staticPos != nil {
return nil, NewSyntaxError(*staticPos, "invalid static modifier for event")
}
if nativeModifierEnabled && nativePos != nil {
return nil, NewSyntaxError(*nativePos, "invalid native modifier for event")
err := rejectStaticAndNativeModifiers(p, staticPos, nativePos, common.DeclarationKindEvent)
if err != nil {
return nil, err
}
return parseEventDeclaration(p, access, accessPos, docString)

case keywordStruct, keywordResource, keywordContract, keywordEnum:
if staticModifierEnabled && staticPos != nil {
return nil, NewSyntaxError(*staticPos, "invalid static modifier for composite")
case keywordStruct:
err := rejectStaticAndNativeModifiers(p, staticPos, nativePos, common.DeclarationKindStructure)
if err != nil {
return nil, err
}
if nativeModifierEnabled && nativePos != nil {
return nil, NewSyntaxError(*nativePos, "invalid native modifier for composite")
return parseCompositeOrInterfaceDeclaration(p, access, accessPos, docString)

case keywordResource:
err := rejectStaticAndNativeModifiers(p, staticPos, nativePos, common.DeclarationKindResource)
if err != nil {
return nil, err
}
return parseCompositeOrInterfaceDeclaration(p, access, accessPos, docString)

case KeywordTransaction:
if access != ast.AccessNotSpecified {
return nil, NewSyntaxError(*accessPos, "invalid access modifier for transaction")
case keywordContract:
err := rejectStaticAndNativeModifiers(p, staticPos, nativePos, common.DeclarationKindContract)
if err != nil {
return nil, err
}
if staticModifierEnabled && staticPos != nil {
return nil, NewSyntaxError(*staticPos, "invalid static modifier for transaction")
return parseCompositeOrInterfaceDeclaration(p, access, accessPos, docString)

case keywordEnum:
err := rejectStaticAndNativeModifiers(p, staticPos, nativePos, common.DeclarationKindEnum)
if err != nil {
return nil, err
}
if nativeModifierEnabled && nativePos != nil {
return nil, NewSyntaxError(*nativePos, "invalid native modifier for transaction")
return parseCompositeOrInterfaceDeclaration(p, access, accessPos, docString)

case KeywordTransaction:
err := rejectAllModifiers(p, access, accessPos, staticPos, nativePos, common.DeclarationKindTransaction)
if err != nil {
return nil, err
}
return parseTransactionDeclaration(p, docString)

Expand Down Expand Up @@ -1137,11 +1140,9 @@ func parseMemberOrNestedDeclaration(p *parser, docString string) (ast.Declaratio
)

case keywordCase:
if staticModifierEnabled && staticPos != nil {
return nil, NewSyntaxError(*staticPos, "invalid static modifier for enum case")
}
if nativeModifierEnabled && nativePos != nil {
return nil, NewSyntaxError(*nativePos, "invalid native modifier for enum case")
err := rejectStaticAndNativeModifiers(p, staticPos, nativePos, common.DeclarationKindEnumCase)
if err != nil {
return nil, err
}
return parseEnumCase(p, access, accessPos, docString)

Expand All @@ -1157,20 +1158,37 @@ func parseMemberOrNestedDeclaration(p *parser, docString string) (ast.Declaratio
)

case keywordEvent:
if staticModifierEnabled && staticPos != nil {
return nil, NewSyntaxError(*staticPos, "invalid static modifier for event")
}
if nativeModifierEnabled && nativePos != nil {
return nil, NewSyntaxError(*nativePos, "invalid native modifier for event")
err := rejectStaticAndNativeModifiers(p, staticPos, nativePos, common.DeclarationKindEvent)
if err != nil {
return nil, err
}
return parseEventDeclaration(p, access, accessPos, docString)

case keywordStruct, keywordResource, keywordContract, keywordEnum:
if staticModifierEnabled && staticPos != nil {
return nil, NewSyntaxError(*staticPos, "invalid static modifier for composite")
case keywordStruct:
err := rejectStaticAndNativeModifiers(p, staticPos, nativePos, common.DeclarationKindStructure)
if err != nil {
return nil, err
}
if nativeModifierEnabled && nativePos != nil {
return nil, NewSyntaxError(*nativePos, "invalid native modifier for composite")
return parseCompositeOrInterfaceDeclaration(p, access, accessPos, docString)

case keywordResource:
err := rejectStaticAndNativeModifiers(p, staticPos, nativePos, common.DeclarationKindResource)
if err != nil {
return nil, err
}
return parseCompositeOrInterfaceDeclaration(p, access, accessPos, docString)

case keywordContract:
err := rejectStaticAndNativeModifiers(p, staticPos, nativePos, common.DeclarationKindContract)
if err != nil {
return nil, err
}
return parseCompositeOrInterfaceDeclaration(p, access, accessPos, docString)

case keywordEnum:
err := rejectStaticAndNativeModifiers(p, staticPos, nativePos, common.DeclarationKindEnum)
if err != nil {
return nil, err
}
return parseCompositeOrInterfaceDeclaration(p, access, accessPos, docString)

Expand Down Expand Up @@ -1237,14 +1255,9 @@ func parseMemberOrNestedDeclaration(p *parser, docString string) (ast.Declaratio
previousIdentifierToken.Type,
)
}
if access != ast.AccessNotSpecified {
return nil, NewSyntaxError(*accessPos, "invalid access modifier for pragma")
}
if staticModifierEnabled && staticPos != nil {
return nil, NewSyntaxError(*staticPos, "invalid static modifier for pragma")
}
if nativeModifierEnabled && nativePos != nil {
return nil, NewSyntaxError(*nativePos, "invalid native modifier for pragma")
err := rejectAllModifiers(p, access, accessPos, staticPos, nativePos, common.DeclarationKindPragma)
if err != nil {
return nil, err
}
return parsePragmaDeclaration(p)

Expand Down Expand Up @@ -1285,6 +1298,35 @@ func parseMemberOrNestedDeclaration(p *parser, docString string) (ast.Declaratio
}
}

func rejectAllModifiers(
p *parser,
access ast.Access,
accessPos *ast.Position,
staticPos *ast.Position,
nativePos *ast.Position,
kind common.DeclarationKind,
) error {
if access != ast.AccessNotSpecified {
return NewSyntaxError(*accessPos, "invalid access modifier for %s", kind.Name())
}
return rejectStaticAndNativeModifiers(p, staticPos, nativePos, kind)
}

func rejectStaticAndNativeModifiers(
p *parser,
staticPos *ast.Position,
nativePos *ast.Position,
kind common.DeclarationKind,
) error {
if p.config.StaticModifierEnabled && staticPos != nil {
return NewSyntaxError(*staticPos, "invalid static modifier for %s", kind.Name())
}
if p.config.NativeModifierEnabled && nativePos != nil {
return NewSyntaxError(*nativePos, "invalid native modifier for %s", kind.Name())
}
return nil
}

func parseFieldDeclarationWithoutVariableKind(
p *parser,
access ast.Access,
Expand Down
4 changes: 2 additions & 2 deletions runtime/parser/declaration_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -6023,7 +6023,7 @@ func TestParseCompositeWithModifier(t *testing.T) {
utils.AssertEqualWithDiff(t,
[]error{
&SyntaxError{
Message: "invalid static modifier for composite",
Message: "invalid static modifier for structure",
Pos: ast.Position{Offset: 17, Line: 2, Column: 16},
},
},
Expand Down Expand Up @@ -6067,7 +6067,7 @@ func TestParseCompositeWithModifier(t *testing.T) {
utils.AssertEqualWithDiff(t,
[]error{
&SyntaxError{
Message: "invalid native modifier for composite",
Message: "invalid native modifier for structure",
Pos: ast.Position{Offset: 17, Line: 2, Column: 16},
},
},
Expand Down

0 comments on commit 2dc4091

Please sign in to comment.