11package parser
22
33import (
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
1617type 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.
10183func 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 */
983982func 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