From 625d7100ca123e5aff265fb843ec4979d76a9f7d Mon Sep 17 00:00:00 2001 From: Eugen Wissner Date: Fri, 22 Nov 2019 08:00:50 +0100 Subject: [PATCH] Try type parsers in a different order --- CHANGELOG.md | 19 ++++++++++++++++--- src/Language/GraphQL/AST/Lexer.hs | 2 +- src/Language/GraphQL/AST/Parser.hs | 6 +++--- src/Language/GraphQL/AST/Transform.hs | 7 ++----- stack.yaml | 2 +- 5 files changed, 23 insertions(+), 13 deletions(-) diff --git a/CHANGELOG.md b/CHANGELOG.md index 741a206..cc590de 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -10,11 +10,24 @@ All notable changes to this project will be documented in this file. module should be imported qualified. - All `Language.GraphQL.AST.Core.Value` data constructor prefixes were removed. The module should be imported qualified. -- Make `Language.GraphQL.AST.Core.Object` is now just a HashMap. -- `Language.GraphQL.AST.Transform` is now isn't exposed publically anymore. +- `Language.GraphQL.AST.Core.Object` is now just a HashMap. +- `Language.GraphQL.AST.Transform` is isn't exposed publically anymore. +- `Language.GraphQL.Schema.resolve` accepts a selection `Seq` (`Data.Sequence`) + instead of a list. Selections are stored as sequences internally as well. ### Added - - Nested fragment support. +- Nested fragment support. + +### Fixed +- Consume ignored tokens after `$` and `!`. I mistakenly assumed that + `$variable` is a single token, same as `Type!` is a single token. This is not + the case, for example `Variable` is defined as `$ Name`, so these are two + tokens, therefore whitespaces and commas after `$` and `!` should be + consumed. + +### Improved +- `Language.GraphQL.AST.Parser.type_`: Try type parsers in a variable + definition in a different order to avoid using `but`. ## [0.5.1.0] - 2019-10-22 ### Deprecated diff --git a/src/Language/GraphQL/AST/Lexer.hs b/src/Language/GraphQL/AST/Lexer.hs index f4111a9..e4d64ca 100644 --- a/src/Language/GraphQL/AST/Lexer.hs +++ b/src/Language/GraphQL/AST/Lexer.hs @@ -3,7 +3,7 @@ -- | This module defines a bunch of small parsers used to parse individual -- lexemes. -module Language.GraphQL.AST.Lexer +module Language.GraphQL.AST.Lexer ( Parser , amp , at diff --git a/src/Language/GraphQL/AST/Parser.hs b/src/Language/GraphQL/AST/Parser.hs index a5b6681..1505615 100644 --- a/src/Language/GraphQL/AST/Parser.hs +++ b/src/Language/GraphQL/AST/Parser.hs @@ -152,9 +152,9 @@ defaultValue = equals *> value -- * Input Types type_ :: Parser Type -type_ = try (TypeNamed <$> name <* but "!") - <|> TypeList <$> brackets type_ - <|> TypeNonNull <$> nonNullType +type_ = try (TypeNonNull <$> nonNullType) + <|> TypeList <$> brackets type_ + <|> TypeNamed <$> name "type_ error!" nonNullType :: Parser NonNullType diff --git a/src/Language/GraphQL/AST/Transform.hs b/src/Language/GraphQL/AST/Transform.hs index 0dfc5e5..95cdfbb 100644 --- a/src/Language/GraphQL/AST/Transform.hs +++ b/src/Language/GraphQL/AST/Transform.hs @@ -13,12 +13,10 @@ import Control.Monad (foldM, unless) import Control.Monad.Trans.Class (lift) import Control.Monad.Trans.Reader (ReaderT, ask, runReaderT) import Control.Monad.Trans.State (StateT, evalStateT, gets, modify) -import Data.Foldable (toList) import Data.HashMap.Strict (HashMap) import qualified Data.HashMap.Strict as HashMap import qualified Data.List.NonEmpty as NonEmpty import Data.Sequence (Seq, (<|), (><)) -import qualified Data.Sequence as Sequence import qualified Language.GraphQL.AST as Full import qualified Language.GraphQL.AST.Core as Core import qualified Language.GraphQL.Schema as Schema @@ -99,10 +97,9 @@ collectFragments = do fragmentDefinition :: Full.FragmentDefinition -> TransformT (Seq Core.Selection) -fragmentDefinition (Full.FragmentDefinition name _tc _dirs sels) = do +fragmentDefinition (Full.FragmentDefinition name _tc _dirs selections) = do modify deleteFragmentDefinition - selections <- traverse selection sels - let newValue = either id pure =<< Sequence.fromList (toList selections) + newValue <- appendSelection selections modify $ insertFragment newValue liftJust newValue where diff --git a/stack.yaml b/stack.yaml index 5aff6f9..a40ea8b 100644 --- a/stack.yaml +++ b/stack.yaml @@ -1,4 +1,4 @@ -resolver: lts-14.14 +resolver: lts-14.15 packages: - .