Fix broken behavior for several options on the same node (#105)

## Summary:
Previously, we actually allowed you to put several genqlient directives
on the same node, but the semantics were undocumented (and somewhat
confusing, when it comes to `typename`).  In order to support directives
on input options, we're actually going to be encouraging this usage (see
notes in #14), so it's time to fix it.  To avoid confusion, I just had
conflicting directives be an error, rather than defining which one
"wins".  The same applies to specifying the same option several
times in one directive.

I also fixed two small bugs:
- `typename` on an operation would incorrectly cascade down to
  all input types in a query (causing conflicts).
- directive parse errors had useless positions, now they're correct

## Test plan:
make check


Author: benjaminjkraft

Reviewers: StevenACoffman, dnerdy, aberkan, jvoll, mahtabsabet, MiguelCastillo

Required Reviewers: 

Approved By: StevenACoffman, dnerdy

Checks:  Test (1.17),  Test (1.16),  Test (1.15),  Test (1.14),  Lint,  Test (1.17),  Test (1.16),  Test (1.15),  Test (1.14),  Lint

Pull Request URL: https://github.com/Khan/genqlient/pull/105
This commit is contained in:
Ben Kraft
2021-09-24 11:16:46 -07:00
committed by GitHub
parent 8de55d352e
commit 6e2b1a5811
13 changed files with 293 additions and 39 deletions
+12
View File
@@ -0,0 +1,12 @@
# @genqlient(typename: "MyMultipleDirectivesResponse")
# @genqlient(omitempty: true)
# @genqlient(pointer: true)
query MultipleDirectives(
# @genqlient(pointer: false)
# @genqlient(typename: "MyInput")
$query: UserQueryInput,
$queries: [UserQueryInput],
) {
user(query: $query) { id }
users(query: $queries) { id }
}