1
1
package parser
2
2
3
3
import (
4
+ stderrs "errors"
4
5
"fmt"
5
6
"strconv"
6
7
@@ -10,7 +11,7 @@ import (
10
11
"github.com/apexlang/apex-go/source"
11
12
)
12
13
13
- type parseFn func (parser * Parser ) (interface {} , error )
14
+ type parseFn func (parser * Parser ) (ast. Node , error )
14
15
15
16
// parse operation, fragment, typeSystem{schema, type..., extension, directives} definition
16
17
type parseDefinitionFn func (parser * Parser ) (ast.Node , error )
@@ -29,8 +30,8 @@ func init() {
29
30
tokenDefinitionFn [lexer .IMPORT ] = parseImportDefinition
30
31
tokenDefinitionFn [lexer .ALIAS ] = parseAliasDefinition
31
32
tokenDefinitionFn [lexer .TYPE ] = parseTypeDefinition
33
+ tokenDefinitionFn [lexer .FUNC ] = parseFunctionDefinition
32
34
tokenDefinitionFn [lexer .INTERFACE ] = parseInterfaceDefinition
33
- tokenDefinitionFn [lexer .ROLE ] = parseRoleDefinition
34
35
tokenDefinitionFn [lexer .UNION ] = parseUnionDefinition
35
36
tokenDefinitionFn [lexer .ENUM ] = parseEnumDefinition
36
37
tokenDefinitionFn [lexer .DIRECTIVE ] = parseDirectiveDefinition
@@ -60,9 +61,12 @@ func Parse(p ParseParams) (*ast.Document, error) {
60
61
switch src := p .Source .(type ) {
61
62
case * source.Source :
62
63
sourceObj = src
64
+ case []byte :
65
+ sourceObj = source .NewSource ("" , src )
66
+ case string :
67
+ sourceObj = source .NewSource ("" , []byte (src ))
63
68
default :
64
- body , _ := p .Source .(string )
65
- sourceObj = source .NewSource ("" , []byte (body ))
69
+ return nil , stderrs .New ("unexpected value for Source" )
66
70
}
67
71
parser , err := makeParser (sourceObj , p .Options )
68
72
if err != nil {
@@ -75,28 +79,6 @@ func Parse(p ParseParams) (*ast.Document, error) {
75
79
return doc , nil
76
80
}
77
81
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
-
100
82
// Converts a name lex token into a name parse node.
101
83
func parseName (parser * Parser ) (* ast.Name , error ) {
102
84
token , err := expect (parser , lexer .TokenKind [lexer .NAME ])
@@ -188,7 +170,7 @@ func parseArguments(parser *Parser) ([]*ast.Argument, error) {
188
170
/**
189
171
* Argument : Name : Value
190
172
*/
191
- func parseArgument (parser * Parser ) (interface {} , error ) {
173
+ func parseArgument (parser * Parser ) (ast. Node , error ) {
192
174
var (
193
175
err error
194
176
name * ast.Name
@@ -294,15 +276,15 @@ func parseValueLiteral(parser *Parser, isConst bool) (ast.Value, error) {
294
276
return nil , unexpected (parser , lexer.Token {})
295
277
}
296
278
297
- func parseConstValue (parser * Parser ) (interface {} , error ) {
279
+ func parseConstValue (parser * Parser ) (ast. Node , error ) {
298
280
value , err := parseValueLiteral (parser , true )
299
281
if err != nil {
300
282
return value , err
301
283
}
302
284
return value , nil
303
285
}
304
286
305
- func parseValueValue (parser * Parser ) (interface {} , error ) {
287
+ func parseValueValue (parser * Parser ) (ast. Node , error ) {
306
288
return parseValueLiteral (parser , false )
307
289
}
308
290
@@ -660,7 +642,7 @@ func parseImportDefinition(parser *Parser) (ast.Node, error) {
660
642
), nil
661
643
}
662
644
663
- func parseImportName (parser * Parser ) (interface {} , error ) {
645
+ func parseImportName (parser * Parser ) (ast. Node , error ) {
664
646
start := parser .Token .Start
665
647
name , err := parseName (parser )
666
648
if err != nil {
@@ -798,15 +780,32 @@ func parseImplementsInterfaces(parser *Parser) ([]*ast.Named, error) {
798
780
return types , nil
799
781
}
800
782
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
+
801
796
/**
802
797
* OperationDefinition : Description? Name ArgumentsDefinition? : Type Annotations?
803
798
*/
804
- func parseOperationDefinition (parser * Parser ) (interface {} , error ) {
799
+ func parseOperationDefinition (parser * Parser ) (ast. Node , error ) {
805
800
start := parser .Token .Start
806
801
description , err := parseDescription (parser )
807
802
if err != nil {
808
803
return nil , err
809
804
}
805
+ return parseOperationDefinitionBody (parser , start , description )
806
+ }
807
+
808
+ func parseOperationDefinitionBody (parser * Parser , start uint , description * ast.StringValue ) (* ast.OperationDefinition , error ) {
810
809
name , err := parseName (parser )
811
810
if err != nil {
812
811
return nil , err
@@ -844,7 +843,7 @@ func parseOperationDefinition(parser *Parser) (interface{}, error) {
844
843
/**
845
844
* FieldDefinition : Description? Name ArgumentsDefinition? : Type Annotations?
846
845
*/
847
- func parseFieldDefinition (parser * Parser ) (interface {} , error ) {
846
+ func parseFieldDefinition (parser * Parser ) (ast. Node , error ) {
848
847
start := parser .Token .Start
849
848
description , err := parseDescription (parser )
850
849
if err != nil {
@@ -906,7 +905,7 @@ func parseParameterDefs(parser *Parser, unary bool) ([]*ast.ParameterDefinition,
906
905
}
907
906
908
907
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 ]) {
910
909
// Unary operation
911
910
if err := advance (parser ); err != nil {
912
911
return nil , true , err
@@ -916,7 +915,7 @@ func parseParameterDefs(parser *Parser, unary bool) ([]*ast.ParameterDefinition,
916
915
return nil , true , err
917
916
}
918
917
919
- if _ , err := expect (parser , lexer .TokenKind [lexer .BRACE_R ]); err != nil {
918
+ if _ , err := expect (parser , lexer .TokenKind [lexer .BRACKET_R ]); err != nil {
920
919
return nil , true , err
921
920
}
922
921
@@ -929,7 +928,7 @@ func parseParameterDefs(parser *Parser, unary bool) ([]*ast.ParameterDefinition,
929
928
/**
930
929
* ParameterDefinition : Description? Name : Type DefaultValue? Annotations?
931
930
*/
932
- func parseParameterDef (parser * Parser ) (interface {} , error ) {
931
+ func parseParameterDef (parser * Parser ) (ast. Node , error ) {
933
932
var (
934
933
description * ast.StringValue
935
934
name * ast.Name
@@ -978,7 +977,7 @@ func parseParameterDef(parser *Parser) (interface{}, error) {
978
977
/**
979
978
* InterfaceDefinition :
980
979
* Description?
981
- * interface Annotations? { FieldDefinition+ }
980
+ * interface Name Annotations? { FieldDefinition+ }
982
981
*/
983
982
func parseInterfaceDefinition (parser * Parser ) (ast.Node , error ) {
984
983
start := parser .Token .Start
@@ -990,46 +989,6 @@ func parseInterfaceDefinition(parser *Parser) (ast.Node, error) {
990
989
if err != nil {
991
990
return nil , err
992
991
}
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
- }
1033
992
name , err := parseName (parser )
1034
993
if err != nil {
1035
994
return nil , err
@@ -1168,7 +1127,7 @@ func parseEnumDefinition(parser *Parser) (ast.Node, error) {
1168
1127
*
1169
1128
* EnumValue : Name
1170
1129
*/
1171
- func parseEnumValueDefinition (parser * Parser ) (interface {} , error ) {
1130
+ func parseEnumValueDefinition (parser * Parser ) (ast. Node , error ) {
1172
1131
start := parser .Token .Start
1173
1132
description , err := parseDescription (parser )
1174
1133
if err != nil {
@@ -1187,6 +1146,9 @@ func parseEnumValueDefinition(parser *Parser) (interface{}, error) {
1187
1146
return nil , err
1188
1147
}
1189
1148
indexValue , err := strconv .Atoi (token .Value )
1149
+ if err != nil {
1150
+ return nil , err
1151
+ }
1190
1152
index := ast .NewIntValue (loc (parser , token .Start ), indexValue )
1191
1153
annotations , err := parseAnnotations (parser )
1192
1154
if err != nil {
@@ -1444,15 +1406,7 @@ func unexpected(parser *Parser, atToken lexer.Token) error {
1444
1406
return errors .NewSyntaxError (parser .Source , token .Start , description )
1445
1407
}
1446
1408
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
1456
1410
// the parseFn. This list begins with a lex token of openKind
1457
1411
// and ends with a lex token of closeKind. Advances the parser
1458
1412
// to the next lex token after the closing token.
0 commit comments