Skip to content

Commit 918b51f

Browse files
committed
Language updates
1 parent ead9410 commit 918b51f

File tree

4 files changed

+43
-89
lines changed

4 files changed

+43
-89
lines changed

ast/nodes.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -11,7 +11,7 @@ type Node interface {
1111

1212
type BaseNode struct {
1313
Kind kinds.Kind `json:"kind"`
14-
Loc *Location `json:"loc,omitempty"`
14+
Loc *Location `json:"-"`
1515
}
1616

1717
func (node *BaseNode) GetKind() kinds.Kind {

go.mod

+1-1
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,3 @@
11
module github.com/apexlang/apex-go
22

3-
go 1.16
3+
go 1.18

lexer/lexer.go

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,8 +43,8 @@ const (
4343
IMPORT = "import"
4444
ALIAS = "alias"
4545
TYPE = "type"
46+
FUNC = "func"
4647
INTERFACE = "interface"
47-
ROLE = "role"
4848
UNION = "union"
4949
ENUM = "enum"
5050
DIRECTIVE = "directive"

parser/parser.go

+40-86
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,7 @@
11
package parser
22

33
import (
4+
stderrs "errors"
45
"fmt"
56
"strconv"
67

@@ -10,7 +11,7 @@ import (
1011
"github.com/apexlang/apex-go/source"
1112
)
1213

13-
type parseFn func(parser *Parser) (interface{}, error)
14+
type parseFn func(parser *Parser) (ast.Node, error)
1415

1516
// parse operation, fragment, typeSystem{schema, type..., extension, directives} definition
1617
type parseDefinitionFn func(parser *Parser) (ast.Node, error)
@@ -29,8 +30,8 @@ func init() {
2930
tokenDefinitionFn[lexer.IMPORT] = parseImportDefinition
3031
tokenDefinitionFn[lexer.ALIAS] = parseAliasDefinition
3132
tokenDefinitionFn[lexer.TYPE] = parseTypeDefinition
33+
tokenDefinitionFn[lexer.FUNC] = parseFunctionDefinition
3234
tokenDefinitionFn[lexer.INTERFACE] = parseInterfaceDefinition
33-
tokenDefinitionFn[lexer.ROLE] = parseRoleDefinition
3435
tokenDefinitionFn[lexer.UNION] = parseUnionDefinition
3536
tokenDefinitionFn[lexer.ENUM] = parseEnumDefinition
3637
tokenDefinitionFn[lexer.DIRECTIVE] = parseDirectiveDefinition
@@ -60,9 +61,12 @@ func Parse(p ParseParams) (*ast.Document, error) {
6061
switch src := p.Source.(type) {
6162
case *source.Source:
6263
sourceObj = src
64+
case []byte:
65+
sourceObj = source.NewSource("", src)
66+
case string:
67+
sourceObj = source.NewSource("", []byte(src))
6368
default:
64-
body, _ := p.Source.(string)
65-
sourceObj = source.NewSource("", []byte(body))
69+
return nil, stderrs.New("unexpected value for Source")
6670
}
6771
parser, err := makeParser(sourceObj, p.Options)
6872
if err != nil {
@@ -75,28 +79,6 @@ func Parse(p ParseParams) (*ast.Document, error) {
7579
return doc, nil
7680
}
7781

78-
// TODO: test and expose parseValue as a public
79-
func parseValue(p ParseParams) (ast.Value, error) {
80-
var value ast.Value
81-
var sourceObj *source.Source
82-
switch src := p.Source.(type) {
83-
case *source.Source:
84-
sourceObj = src
85-
default:
86-
body, _ := p.Source.(string)
87-
sourceObj = source.NewSource("", []byte(body))
88-
}
89-
parser, err := makeParser(sourceObj, p.Options)
90-
if err != nil {
91-
return value, err
92-
}
93-
value, err = parseValueLiteral(parser, false)
94-
if err != nil {
95-
return value, err
96-
}
97-
return value, nil
98-
}
99-
10082
// Converts a name lex token into a name parse node.
10183
func parseName(parser *Parser) (*ast.Name, error) {
10284
token, err := expect(parser, lexer.TokenKind[lexer.NAME])
@@ -188,7 +170,7 @@ func parseArguments(parser *Parser) ([]*ast.Argument, error) {
188170
/**
189171
* Argument : Name : Value
190172
*/
191-
func parseArgument(parser *Parser) (interface{}, error) {
173+
func parseArgument(parser *Parser) (ast.Node, error) {
192174
var (
193175
err error
194176
name *ast.Name
@@ -294,15 +276,15 @@ func parseValueLiteral(parser *Parser, isConst bool) (ast.Value, error) {
294276
return nil, unexpected(parser, lexer.Token{})
295277
}
296278

297-
func parseConstValue(parser *Parser) (interface{}, error) {
279+
func parseConstValue(parser *Parser) (ast.Node, error) {
298280
value, err := parseValueLiteral(parser, true)
299281
if err != nil {
300282
return value, err
301283
}
302284
return value, nil
303285
}
304286

305-
func parseValueValue(parser *Parser) (interface{}, error) {
287+
func parseValueValue(parser *Parser) (ast.Node, error) {
306288
return parseValueLiteral(parser, false)
307289
}
308290

@@ -660,7 +642,7 @@ func parseImportDefinition(parser *Parser) (ast.Node, error) {
660642
), nil
661643
}
662644

663-
func parseImportName(parser *Parser) (interface{}, error) {
645+
func parseImportName(parser *Parser) (ast.Node, error) {
664646
start := parser.Token.Start
665647
name, err := parseName(parser)
666648
if err != nil {
@@ -798,15 +780,32 @@ func parseImplementsInterfaces(parser *Parser) ([]*ast.Named, error) {
798780
return types, nil
799781
}
800782

783+
func parseFunctionDefinition(parser *Parser) (ast.Node, error) {
784+
start := parser.Token.Start
785+
description, err := parseDescription(parser)
786+
if err != nil {
787+
return nil, err
788+
}
789+
_, err = expectKeyWord(parser, lexer.FUNC)
790+
if err != nil {
791+
return nil, err
792+
}
793+
return parseOperationDefinitionBody(parser, start, description)
794+
}
795+
801796
/**
802797
* OperationDefinition : Description? Name ArgumentsDefinition? : Type Annotations?
803798
*/
804-
func parseOperationDefinition(parser *Parser) (interface{}, error) {
799+
func parseOperationDefinition(parser *Parser) (ast.Node, error) {
805800
start := parser.Token.Start
806801
description, err := parseDescription(parser)
807802
if err != nil {
808803
return nil, err
809804
}
805+
return parseOperationDefinitionBody(parser, start, description)
806+
}
807+
808+
func parseOperationDefinitionBody(parser *Parser, start uint, description *ast.StringValue) (*ast.OperationDefinition, error) {
810809
name, err := parseName(parser)
811810
if err != nil {
812811
return nil, err
@@ -844,7 +843,7 @@ func parseOperationDefinition(parser *Parser) (interface{}, error) {
844843
/**
845844
* FieldDefinition : Description? Name ArgumentsDefinition? : Type Annotations?
846845
*/
847-
func parseFieldDefinition(parser *Parser) (interface{}, error) {
846+
func parseFieldDefinition(parser *Parser) (ast.Node, error) {
848847
start := parser.Token.Start
849848
description, err := parseDescription(parser)
850849
if err != nil {
@@ -906,7 +905,7 @@ func parseParameterDefs(parser *Parser, unary bool) ([]*ast.ParameterDefinition,
906905
}
907906

908907
return parameterDefinitions, false, nil
909-
} else if unary && peek(parser, lexer.TokenKind[lexer.BRACE_L]) {
908+
} else if unary && peek(parser, lexer.TokenKind[lexer.BRACKET_L]) {
910909
// Unary operation
911910
if err := advance(parser); err != nil {
912911
return nil, true, err
@@ -916,7 +915,7 @@ func parseParameterDefs(parser *Parser, unary bool) ([]*ast.ParameterDefinition,
916915
return nil, true, err
917916
}
918917

919-
if _, err := expect(parser, lexer.TokenKind[lexer.BRACE_R]); err != nil {
918+
if _, err := expect(parser, lexer.TokenKind[lexer.BRACKET_R]); err != nil {
920919
return nil, true, err
921920
}
922921

@@ -929,7 +928,7 @@ func parseParameterDefs(parser *Parser, unary bool) ([]*ast.ParameterDefinition,
929928
/**
930929
* ParameterDefinition : Description? Name : Type DefaultValue? Annotations?
931930
*/
932-
func parseParameterDef(parser *Parser) (interface{}, error) {
931+
func parseParameterDef(parser *Parser) (ast.Node, error) {
933932
var (
934933
description *ast.StringValue
935934
name *ast.Name
@@ -978,7 +977,7 @@ func parseParameterDef(parser *Parser) (interface{}, error) {
978977
/**
979978
* InterfaceDefinition :
980979
* Description?
981-
* interface Annotations? { FieldDefinition+ }
980+
* interface Name Annotations? { FieldDefinition+ }
982981
*/
983982
func parseInterfaceDefinition(parser *Parser) (ast.Node, error) {
984983
start := parser.Token.Start
@@ -990,46 +989,6 @@ func parseInterfaceDefinition(parser *Parser) (ast.Node, error) {
990989
if err != nil {
991990
return nil, err
992991
}
993-
annotations, err := parseAnnotations(parser)
994-
if err != nil {
995-
return nil, err
996-
}
997-
iOperations, err := reverse(parser,
998-
lexer.TokenKind[lexer.BRACE_L], parseOperationDefinition, lexer.TokenKind[lexer.BRACE_R],
999-
false,
1000-
)
1001-
if err != nil {
1002-
return nil, err
1003-
}
1004-
operations := []*ast.OperationDefinition{}
1005-
for _, iOperation := range iOperations {
1006-
if iOperation != nil {
1007-
operations = append(operations, iOperation.(*ast.OperationDefinition))
1008-
}
1009-
}
1010-
return ast.NewInterfaceDefinition(
1011-
loc(parser, start),
1012-
description,
1013-
annotations,
1014-
operations,
1015-
), nil
1016-
}
1017-
1018-
/**
1019-
* RoleDefinition :
1020-
* Description?
1021-
* role Name Annotations? { FieldDefinition+ }
1022-
*/
1023-
func parseRoleDefinition(parser *Parser) (ast.Node, error) {
1024-
start := parser.Token.Start
1025-
description, err := parseDescription(parser)
1026-
if err != nil {
1027-
return nil, err
1028-
}
1029-
_, err = expectKeyWord(parser, lexer.ROLE)
1030-
if err != nil {
1031-
return nil, err
1032-
}
1033992
name, err := parseName(parser)
1034993
if err != nil {
1035994
return nil, err
@@ -1168,7 +1127,7 @@ func parseEnumDefinition(parser *Parser) (ast.Node, error) {
11681127
*
11691128
* EnumValue : Name
11701129
*/
1171-
func parseEnumValueDefinition(parser *Parser) (interface{}, error) {
1130+
func parseEnumValueDefinition(parser *Parser) (ast.Node, error) {
11721131
start := parser.Token.Start
11731132
description, err := parseDescription(parser)
11741133
if err != nil {
@@ -1187,6 +1146,9 @@ func parseEnumValueDefinition(parser *Parser) (interface{}, error) {
11871146
return nil, err
11881147
}
11891148
indexValue, err := strconv.Atoi(token.Value)
1149+
if err != nil {
1150+
return nil, err
1151+
}
11901152
index := ast.NewIntValue(loc(parser, token.Start), indexValue)
11911153
annotations, err := parseAnnotations(parser)
11921154
if err != nil {
@@ -1444,15 +1406,7 @@ func unexpected(parser *Parser, atToken lexer.Token) error {
14441406
return errors.NewSyntaxError(parser.Source, token.Start, description)
14451407
}
14461408

1447-
func unexpectedEmpty(parser *Parser, beginLoc uint, openKind, closeKind int) error {
1448-
description := fmt.Sprintf("Unexpected empty IN %s%s",
1449-
lexer.GetTokenKindDesc(openKind),
1450-
lexer.GetTokenKindDesc(closeKind),
1451-
)
1452-
return errors.NewSyntaxError(parser.Source, beginLoc, description)
1453-
}
1454-
1455-
// Returns list of parse nodes, determined by
1409+
// Returns list of parse nodes, determined by
14561410
// the parseFn. This list begins with a lex token of openKind
14571411
// and ends with a lex token of closeKind. Advances the parser
14581412
// to the next lex token after the closing token.

0 commit comments

Comments
 (0)