Skip to content

Commit

Permalink
Finished initial version of AST Building.
Browse files Browse the repository at this point in the history
  • Loading branch information
bd82 committed Aug 4, 2018
1 parent 9798d78 commit f12c01f
Show file tree
Hide file tree
Showing 2 changed files with 194 additions and 23 deletions.
215 changes: 193 additions & 22 deletions lib/ast.js
Original file line number Diff line number Diff line change
Expand Up @@ -205,7 +205,7 @@ class AstBuilderVisitor extends BaseVisitor {
} else if (ctx.NullValue) {
return this.visit(ctx.NullValue)
} else if (ctx.EnumValue) {
return this.visit(ctx.EnumValue)
return this.visit(ctx.EnumValue, "EnumValue")
} else if (ctx.ListValue) {
return this.visit(ctx.ListValue)
} else if (ctx.ObjectValue) {
Expand Down Expand Up @@ -239,8 +239,8 @@ class AstBuilderVisitor extends BaseVisitor {
}
}

EnumValue(ctx) {
return visitToken(ctx.NameButNotTrueOrFalseOrNull, "EnumValue")
EnumValue(ctx, kind) {
return visitToken(ctx.NameButNotTrueOrFalseOrNull, kind)
}

ListValue(ctx) {
Expand Down Expand Up @@ -514,7 +514,7 @@ class AstBuilderVisitor extends BaseVisitor {

FieldsDefinition(ctx) {
let interfaces = []
if (ctx.NamedType) {
if (ctx.FieldDefinition) {
interfaces = ctx.FieldDefinition.map(this.visit, this)
}
return interfaces
Expand All @@ -540,41 +540,212 @@ class AstBuilderVisitor extends BaseVisitor {
return argsDefs
}

InputValueDefinition(ctx) {}
InputValueDefinition(ctx) {
return {
kind: "InputValueDefinition",
description: this.visit(ctx.Description),
name: visitName(ctx.Name),
type: this.visit(ctx.Type),
defaultValue: this.visit(ctx.DefaultValue),
directives: this.visit(ctx.Directives) || [],
loc: "TBD"
}
}

InterfaceTypeDefinition(ctx) {}
InterfaceTypeDefinition(ctx) {
return {
kind: "InterfaceTypeDefinition",
description: this.visit(ctx.Description),
name: visitName(ctx.Name),
directives: this.visit(ctx.Directives) || [],
fields: this.visit(ctx.FieldsDefinition) || [],
loc: "TBD"
}
}

InterfaceTypeExtension(ctx) {}
InterfaceTypeExtension(ctx) {
return {
kind: "InterfaceTypeExtension",
name: visitName(ctx.Name),
description: this.visit(ctx.Description),
fields: this.visit(ctx.FieldsDefinition) || [],
loc: "TBD"
}
}

UnionTypeDefinition(ctx) {}
UnionTypeDefinition(ctx) {
return {
kind: "UnionTypeDefinition",
description: this.visit(ctx.Description),
name: visitName(ctx.Name),
directives: this.visit(ctx.Directives) || [],
types: this.visit(ctx.UnionMemberTypes) || [],
loc: "TBD"
}
}

UnionMemberTypes(ctx) {}
UnionMemberTypes(ctx) {
let types = []
if (ctx.NamedType) {
types = ctx.NamedType.map(this.visit, this)
}
return types
}

UnionTypeExtension(ctx) {}
UnionTypeExtension(ctx) {
return {
kind: "UnionTypeExtension",
name: visitName(ctx.Name),
directives: this.visit(ctx.Directives) || [],
types: this.visit(ctx.UnionMemberTypes) || [],
loc: "TBD"
}
}

EnumTypeDefinition(ctx) {}
EnumTypeDefinition(ctx) {
return {
kind: "EnumTypeDefinition",
description: this.visit(ctx.Description),
name: visitName(ctx.Name),
directives: this.visit(ctx.Directives) || [],
values: this.visit(ctx.EnumValuesDefinition) || [],
loc: "TBD"
}
}

EnumValuesDefinition(ctx) {}
EnumValuesDefinition(ctx) {
let values = []
if (ctx.EnumValueDefinition) {
values = ctx.EnumValueDefinition.map(this.visit, this)
}
return values
}

EnumValueDefinition(ctx) {}
EnumValueDefinition(ctx) {
return {
kind: "EnumValueDefinition",
description: this.visit(ctx.Description),
name: this.visit(ctx.EnumValue, "Name"),
directives: this.visit(ctx.Directives) || [],
loc: "TBD"
}
}

EnumTypeExtension(ctx) {}
EnumTypeExtension(ctx) {
return {
kind: "EnumTypeExtension",
name: visitName(ctx.Name),
directives: this.visit(ctx.Directives) || [],
values: this.visit(ctx.EnumValuesDefinition) || [],
loc: "TBD"
}
}

InputObjectTypeDefinition(ctx) {}
InputObjectTypeDefinition(ctx) {
return {
kind: "InputObjectTypeDefinition",
description: this.visit(ctx.Description),
name: visitName(ctx.Name),
directives: this.visit(ctx.Directives) || [],
fields: this.visit(ctx.InputFieldsDefinition) || [],
loc: "TBD"
}
}

InputFieldsDefinition(ctx) {}
InputFieldsDefinition(ctx) {
let inputFields = []
if (ctx.InputValueDefinition) {
inputFields = ctx.InputValueDefinition.map(this.visit, this)
}
return inputFields
}

InputObjectTypeExtension(ctx) {}
InputObjectTypeExtension(ctx) {
return {
kind: "InputObjectTypeExtension",
name: visitName(ctx.Name),
directives: this.visit(ctx.Directives) || [],
fields: this.visit(ctx.InputFieldsDefinition) || [],
loc: "TBD"
}
}

DirectiveDefinition(ctx) {}
DirectiveDefinition(ctx) {
return {
kind: "DirectiveDefinition",
description: this.visit(ctx.Description),
name: visitName(ctx.Name),
arguments: this.visit(ctx.ArgumentsDefinition) || [],
locations: this.visit(ctx.DirectiveLocations) || [],
loc: "TBD"
}
}

DirectiveLocations(ctx) {}
DirectiveLocations(ctx) {
let values = []
if (ctx.DirectiveLocation) {
values = ctx.DirectiveLocation.map(this.visit, this)
}
return values
}

DirectiveLocation(ctx) {}
DirectiveLocation(ctx) {
if (ctx.ExecutableDirectiveLocation) {
return this.visit(ctx.ExecutableDirectiveLocation)
} else if (ctx.TypeSystemDirectiveLocation) {
return this.visit(ctx.TypeSystemDirectiveLocation)
} else {
throw "None Exhaustive Match"
}
}

ExecutableDirectiveLocation(ctx) {}
ExecutableDirectiveLocation(ctx) {
if (ctx.QUERY) {
return visitToken(ctx.QUERY, "Name")
} else if (ctx.MUTATION) {
return visitToken(ctx.MUTATION, "Name")
} else if (ctx.SUBSCRIPTION) {
return visitToken(ctx.SUBSCRIPTION, "Name")
} else if (ctx.FIELD) {
return visitToken(ctx.FIELD, "Name")
} else if (ctx.FRAGMENT_DEFINITION) {
return visitToken(ctx.FRAGMENT_DEFINITION, "Name")
} else if (ctx.FRAGMENT_SPREAD) {
return visitToken(ctx.FRAGMENT_SPREAD, "Name")
} else if (ctx.INLINE_FRAGMENT) {
return visitToken(ctx.INLINE_FRAGMENT, "Name")
} else {
throw "None Exhaustive Match"
}
}

TypeSystemDirectiveLocation(ctx) {}
TypeSystemDirectiveLocation(ctx) {
if (ctx.SCHEMA) {
return visitToken(ctx.SCHEMA, "Name")
} else if (ctx.SCALAR) {
return visitToken(ctx.SCALAR, "Name")
} else if (ctx.OBJECT) {
return visitToken(ctx.OBJECT, "Name")
} else if (ctx.FIELD_DEFINITION) {
return visitToken(ctx.FIELD_DEFINITION, "Name")
} else if (ctx.ARGUMENT_DEFINITION) {
return visitToken(ctx.ARGUMENT_DEFINITION, "Name")
} else if (ctx.INTERFACE) {
return visitToken(ctx.INTERFACE, "Name")
} else if (ctx.UNION) {
return visitToken(ctx.UNION, "Name")
} else if (ctx.ENUM) {
return visitToken(ctx.ENUM, "Name")
} else if (ctx.ENUM_VALUE) {
return visitToken(ctx.ENUM_VALUE, "Name")
} else if (ctx.INPUT_OBJECT) {
return visitToken(ctx.INPUT_OBJECT, "Name")
} else if (ctx.INPUT_FIELD_DEFINITION) {
return visitToken(ctx.INPUT_FIELD_DEFINITION, "Name")
} else {
throw "None Exhaustive Match"
}
}
}

new AstBuilderVisitor()
Expand Down
2 changes: 1 addition & 1 deletion lib/parser.js
Original file line number Diff line number Diff line change
Expand Up @@ -697,7 +697,7 @@ class GraphQLParser extends Parser {
ALT: () => {
$.SUBRULE($.Directives, { ARGS: [true] })
$.OPTION(() => {
$.SUBRULE($.EnumValuesDefinition)
$.SUBRULE($.InputFieldsDefinition)
})
}
},
Expand Down

0 comments on commit f12c01f

Please sign in to comment.