hindent
hindent copied to clipboard
Issue with running hindent on IHP generated Types.hs file
When using the IHP web framework, a file, build/Generated/Types.hs
is generated.
When I run hindent
on this file I get the following:
$ hindent build/Generated/Types.hs
hindent: build/Generated/Types.hs:61:53: Parse error: )
CallStack (from HasCallStack):
error, called at src/main/Main.hs:56:23 in main:Main
Lines 59-62 of that file:
instance QueryBuilder.FilterPrimaryKey "students" where
filterWhereId id builder =
builder |> QueryBuilder.filterWhere (#id, id)
{-# INLINE filterWhereId #-}
If I comment out those lines then I get the following:
$ hindent build/Generated/Types.hs
hindent: build/Generated/Types.hs:133:114: Parse error: )
CallStack (from HasCallStack):
error, called at src/main/Main.hs:56:23 in main:Main
If I continue on commenting out the following parts of the file:
instance FromRow Instructor where
fromRow = do
id <- field
lastName <- field
firstMidName <- field
hireDate <- field
let theRecord = Instructor id lastName firstMidName hireDate (QueryBuilder.filterWhere (#instructorId, id) (QueryBuilder.query @OfficeAssignment)) def { originalDatabaseRecord = Just (Data.Dynamic.toDyn theRecord) }
pure theRecord
instance QueryBuilder.FilterPrimaryKey "instructors" where
filterWhereId id builder =
builder |> QueryBuilder.filterWhere (#id, id)
{-# INLINE filterWhereId #-}
instance QueryBuilder.FilterPrimaryKey "office_assignments" where
filterWhereId id builder =
builder |> QueryBuilder.filterWhere (#id, id)
{-# INLINE filterWhereId #-}
then hindent
properly runs.
I've included the full original Types.hs
file below.
Not sure if this is necessarily a bug in hindent
or if it's just some unsupported syntax from an extension.
Thanks for any suggestions!
-- This file is auto generated and will be overriden regulary. Please edit `Application/Schema.sql` to change the Types
{-# LANGUAGE TypeSynonymInstances, FlexibleInstances, InstanceSigs, MultiParamTypeClasses, TypeFamilies, DataKinds, TypeOperators, UndecidableInstances, ConstraintKinds, StandaloneDeriving #-}
{-# OPTIONS_GHC -Wno-unused-imports -Wno-dodgy-imports -Wno-unused-matches #-}
module Generated.Types where
import IHP.HaskellSupport
import IHP.ModelSupport
import CorePrelude hiding (id)
import Data.Time.Clock
import Data.Time.LocalTime
import qualified Data.Time.Calendar
import qualified Data.List as List
import qualified Data.ByteString as ByteString
import qualified Net.IP
import Database.PostgreSQL.Simple
import Database.PostgreSQL.Simple.FromRow
import Database.PostgreSQL.Simple.FromField hiding (Field, name)
import Database.PostgreSQL.Simple.ToField hiding (Field)
import qualified IHP.Controller.Param
import GHC.TypeLits
import Data.UUID (UUID)
import Data.Default
import qualified IHP.QueryBuilder as QueryBuilder
import qualified Data.Proxy
import GHC.Records
import Data.Data
import qualified Data.String.Conversions
import qualified Data.Text.Encoding
import qualified Data.Aeson
import Database.PostgreSQL.Simple.Types (Query (Query), Binary ( .. ))
import qualified Database.PostgreSQL.Simple.Types
import IHP.Job.Types
import IHP.Job.Queue ()
import qualified Data.Dynamic
import Data.Scientific
data Student' = Student {id :: (Id' "students"), lastName :: Text, firstMidName :: Text, enrollmentDate :: Data.Time.Calendar.Day, meta :: MetaBag} deriving (Eq, Show)
instance InputValue Student where inputValue = IHP.ModelSupport.recordToInputValue
type Student = Student'
instance FromRow Student where
fromRow = do
id <- field
lastName <- field
firstMidName <- field
enrollmentDate <- field
let theRecord = Student id lastName firstMidName enrollmentDate def { originalDatabaseRecord = Just (Data.Dynamic.toDyn theRecord) }
pure theRecord
type instance GetTableName (Student' ) = "students"
type instance GetModelByTableName "students" = Student
type instance GetModelName (Student' ) = "Student"
type instance PrimaryKey "students" = UUID
instance QueryBuilder.FilterPrimaryKey "students" where
filterWhereId id builder =
builder |> QueryBuilder.filterWhere (#id, id)
{-# INLINE filterWhereId #-}
instance () => PrimaryKeyCondition (Student' ) where
primaryKeyCondition Student { id } = [("id", toField id)]
{-# INLINABLE primaryKeyCondition #-}
instance CanCreate Student where
create :: (?modelContext :: ModelContext) => Student -> IO Student
create model = do
List.head <$> sqlQuery "INSERT INTO students (id, last_name, first_mid_name, enrollment_date) VALUES (?, ?, ?, ?) RETURNING *" ((fieldWithDefault #id model, get #lastName model, get #firstMidName model, get #enrollmentDate model))
createMany [] = pure []
createMany models = do
sqlQuery (Query $ "INSERT INTO students (id, last_name, first_mid_name, enrollment_date) VALUES " <> (ByteString.intercalate ", " (List.map (\_ -> "(?, ?, ?, ?)") models)) <> " RETURNING *") (List.concat $ List.map (\model -> [toField (fieldWithDefault #id model), toField (get #lastName model), toField (get #firstMidName model), toField (get #enrollmentDate model)]) models)
instance CanUpdate Student where
updateRecord model = do
List.head <$> sqlQuery "UPDATE students SET id = ?, last_name = ?, first_mid_name = ?, enrollment_date = ? WHERE id = ? RETURNING *" ((fieldWithUpdate #id model, fieldWithUpdate #lastName model, fieldWithUpdate #firstMidName model, fieldWithUpdate #enrollmentDate model, get #id model))
instance Record Student where
{-# INLINE newRecord #-}
newRecord = Student def def def def def
instance Default (Id' "students") where def = Id def
instance SetField "id" (Student' ) (Id' "students") where
{-# INLINE setField #-}
setField newValue (Student id lastName firstMidName enrollmentDate meta) =
Student newValue lastName firstMidName enrollmentDate (meta { touchedFields = "id" : touchedFields meta })
instance SetField "lastName" (Student' ) Text where
{-# INLINE setField #-}
setField newValue (Student id lastName firstMidName enrollmentDate meta) =
Student id newValue firstMidName enrollmentDate (meta { touchedFields = "lastName" : touchedFields meta })
instance SetField "firstMidName" (Student' ) Text where
{-# INLINE setField #-}
setField newValue (Student id lastName firstMidName enrollmentDate meta) =
Student id lastName newValue enrollmentDate (meta { touchedFields = "firstMidName" : touchedFields meta })
instance SetField "enrollmentDate" (Student' ) Data.Time.Calendar.Day where
{-# INLINE setField #-}
setField newValue (Student id lastName firstMidName enrollmentDate meta) =
Student id lastName firstMidName newValue (meta { touchedFields = "enrollmentDate" : touchedFields meta })
instance SetField "meta" (Student' ) MetaBag where
{-# INLINE setField #-}
setField newValue (Student id lastName firstMidName enrollmentDate meta) =
Student id lastName firstMidName enrollmentDate newValue
instance UpdateField "id" (Student' ) (Student' ) (Id' "students") (Id' "students") where
{-# INLINE updateField #-}
updateField newValue (Student id lastName firstMidName enrollmentDate meta) = Student newValue lastName firstMidName enrollmentDate (meta { touchedFields = "id" : touchedFields meta })
instance UpdateField "lastName" (Student' ) (Student' ) Text Text where
{-# INLINE updateField #-}
updateField newValue (Student id lastName firstMidName enrollmentDate meta) = Student id newValue firstMidName enrollmentDate (meta { touchedFields = "lastName" : touchedFields meta })
instance UpdateField "firstMidName" (Student' ) (Student' ) Text Text where
{-# INLINE updateField #-}
updateField newValue (Student id lastName firstMidName enrollmentDate meta) = Student id lastName newValue enrollmentDate (meta { touchedFields = "firstMidName" : touchedFields meta })
instance UpdateField "enrollmentDate" (Student' ) (Student' ) Data.Time.Calendar.Day Data.Time.Calendar.Day where
{-# INLINE updateField #-}
updateField newValue (Student id lastName firstMidName enrollmentDate meta) = Student id lastName firstMidName newValue (meta { touchedFields = "enrollmentDate" : touchedFields meta })
instance UpdateField "meta" (Student' ) (Student' ) MetaBag MetaBag where
{-# INLINE updateField #-}
updateField newValue (Student id lastName firstMidName enrollmentDate meta) = Student id lastName firstMidName enrollmentDate newValue
data Instructor' officeAssignments = Instructor {id :: (Id' "instructors"), lastName :: Text, firstMidName :: Text, hireDate :: Data.Time.Calendar.Day, officeAssignments :: officeAssignments, meta :: MetaBag} deriving (Eq, Show)
instance InputValue Instructor where inputValue = IHP.ModelSupport.recordToInputValue
type Instructor = Instructor' (QueryBuilder.QueryBuilder "office_assignments")
instance FromRow Instructor where
fromRow = do
id <- field
lastName <- field
firstMidName <- field
hireDate <- field
let theRecord = Instructor id lastName firstMidName hireDate (QueryBuilder.filterWhere (#instructorId, id) (QueryBuilder.query @OfficeAssignment)) def { originalDatabaseRecord = Just (Data.Dynamic.toDyn theRecord) }
pure theRecord
type instance GetTableName (Instructor' _) = "instructors"
type instance GetModelByTableName "instructors" = Instructor
type instance GetModelName (Instructor' _) = "Instructor"
type instance PrimaryKey "instructors" = UUID
instance QueryBuilder.FilterPrimaryKey "instructors" where
filterWhereId id builder =
builder |> QueryBuilder.filterWhere (#id, id)
{-# INLINE filterWhereId #-}
instance () => PrimaryKeyCondition (Instructor' officeAssignments) where
primaryKeyCondition Instructor { id } = [("id", toField id)]
{-# INLINABLE primaryKeyCondition #-}
type instance Include "officeAssignments" (Instructor' officeAssignments) = Instructor' [OfficeAssignment]
instance CanCreate Instructor where
create :: (?modelContext :: ModelContext) => Instructor -> IO Instructor
create model = do
List.head <$> sqlQuery "INSERT INTO instructors (id, last_name, first_mid_name, hire_date) VALUES (?, ?, ?, ?) RETURNING *" ((fieldWithDefault #id model, get #lastName model, get #firstMidName model, get #hireDate model))
createMany [] = pure []
createMany models = do
sqlQuery (Query $ "INSERT INTO instructors (id, last_name, first_mid_name, hire_date) VALUES " <> (ByteString.intercalate ", " (List.map (\_ -> "(?, ?, ?, ?)") models)) <> " RETURNING *") (List.concat $ List.map (\model -> [toField (fieldWithDefault #id model), toField (get #lastName model), toField (get #firstMidName model), toField (get #hireDate model)]) models)
instance CanUpdate Instructor where
updateRecord model = do
List.head <$> sqlQuery "UPDATE instructors SET id = ?, last_name = ?, first_mid_name = ?, hire_date = ? WHERE id = ? RETURNING *" ((fieldWithUpdate #id model, fieldWithUpdate #lastName model, fieldWithUpdate #firstMidName model, fieldWithUpdate #hireDate model, get #id model))
instance Record Instructor where
{-# INLINE newRecord #-}
newRecord = Instructor def def def def def def
instance Default (Id' "instructors") where def = Id def
instance SetField "id" (Instructor' officeAssignments) (Id' "instructors") where
{-# INLINE setField #-}
setField newValue (Instructor id lastName firstMidName hireDate officeAssignments meta) =
Instructor newValue lastName firstMidName hireDate officeAssignments (meta { touchedFields = "id" : touchedFields meta })
instance SetField "lastName" (Instructor' officeAssignments) Text where
{-# INLINE setField #-}
setField newValue (Instructor id lastName firstMidName hireDate officeAssignments meta) =
Instructor id newValue firstMidName hireDate officeAssignments (meta { touchedFields = "lastName" : touchedFields meta })
instance SetField "firstMidName" (Instructor' officeAssignments) Text where
{-# INLINE setField #-}
setField newValue (Instructor id lastName firstMidName hireDate officeAssignments meta) =
Instructor id lastName newValue hireDate officeAssignments (meta { touchedFields = "firstMidName" : touchedFields meta })
instance SetField "hireDate" (Instructor' officeAssignments) Data.Time.Calendar.Day where
{-# INLINE setField #-}
setField newValue (Instructor id lastName firstMidName hireDate officeAssignments meta) =
Instructor id lastName firstMidName newValue officeAssignments (meta { touchedFields = "hireDate" : touchedFields meta })
instance SetField "officeAssignments" (Instructor' officeAssignments) officeAssignments where
{-# INLINE setField #-}
setField newValue (Instructor id lastName firstMidName hireDate officeAssignments meta) =
Instructor id lastName firstMidName hireDate newValue (meta { touchedFields = "officeAssignments" : touchedFields meta })
instance SetField "meta" (Instructor' officeAssignments) MetaBag where
{-# INLINE setField #-}
setField newValue (Instructor id lastName firstMidName hireDate officeAssignments meta) =
Instructor id lastName firstMidName hireDate officeAssignments newValue
instance UpdateField "id" (Instructor' officeAssignments) (Instructor' officeAssignments) (Id' "instructors") (Id' "instructors") where
{-# INLINE updateField #-}
updateField newValue (Instructor id lastName firstMidName hireDate officeAssignments meta) = Instructor newValue lastName firstMidName hireDate officeAssignments (meta { touchedFields = "id" : touchedFields meta })
instance UpdateField "lastName" (Instructor' officeAssignments) (Instructor' officeAssignments) Text Text where
{-# INLINE updateField #-}
updateField newValue (Instructor id lastName firstMidName hireDate officeAssignments meta) = Instructor id newValue firstMidName hireDate officeAssignments (meta { touchedFields = "lastName" : touchedFields meta })
instance UpdateField "firstMidName" (Instructor' officeAssignments) (Instructor' officeAssignments) Text Text where
{-# INLINE updateField #-}
updateField newValue (Instructor id lastName firstMidName hireDate officeAssignments meta) = Instructor id lastName newValue hireDate officeAssignments (meta { touchedFields = "firstMidName" : touchedFields meta })
instance UpdateField "hireDate" (Instructor' officeAssignments) (Instructor' officeAssignments) Data.Time.Calendar.Day Data.Time.Calendar.Day where
{-# INLINE updateField #-}
updateField newValue (Instructor id lastName firstMidName hireDate officeAssignments meta) = Instructor id lastName firstMidName newValue officeAssignments (meta { touchedFields = "hireDate" : touchedFields meta })
instance UpdateField "officeAssignments" (Instructor' officeAssignments) (Instructor' officeAssignments') officeAssignments officeAssignments' where
{-# INLINE updateField #-}
updateField newValue (Instructor id lastName firstMidName hireDate officeAssignments meta) = Instructor id lastName firstMidName hireDate newValue (meta { touchedFields = "officeAssignments" : touchedFields meta })
instance UpdateField "meta" (Instructor' officeAssignments) (Instructor' officeAssignments) MetaBag MetaBag where
{-# INLINE updateField #-}
updateField newValue (Instructor id lastName firstMidName hireDate officeAssignments meta) = Instructor id lastName firstMidName hireDate officeAssignments newValue
data OfficeAssignment' instructorId = OfficeAssignment {id :: (Id' "office_assignments"), instructorId :: instructorId, location :: Text, meta :: MetaBag} deriving (Eq, Show)
instance InputValue OfficeAssignment where inputValue = IHP.ModelSupport.recordToInputValue
type OfficeAssignment = OfficeAssignment' (Id' "instructors")
instance FromRow OfficeAssignment where
fromRow = do
id <- field
instructorId <- field
location <- field
let theRecord = OfficeAssignment id instructorId location def { originalDatabaseRecord = Just (Data.Dynamic.toDyn theRecord) }
pure theRecord
type instance GetTableName (OfficeAssignment' _) = "office_assignments"
type instance GetModelByTableName "office_assignments" = OfficeAssignment
type instance GetModelName (OfficeAssignment' _) = "OfficeAssignment"
type instance PrimaryKey "office_assignments" = UUID
instance QueryBuilder.FilterPrimaryKey "office_assignments" where
filterWhereId id builder =
builder |> QueryBuilder.filterWhere (#id, id)
{-# INLINE filterWhereId #-}
instance () => PrimaryKeyCondition (OfficeAssignment' instructorId) where
primaryKeyCondition OfficeAssignment { id } = [("id", toField id)]
{-# INLINABLE primaryKeyCondition #-}
type instance Include "instructorId" (OfficeAssignment' instructorId) = OfficeAssignment' (GetModelById instructorId)
instance CanCreate OfficeAssignment where
create :: (?modelContext :: ModelContext) => OfficeAssignment -> IO OfficeAssignment
create model = do
List.head <$> sqlQuery "INSERT INTO office_assignments (id, instructor_id, location) VALUES (?, ?, ?) RETURNING *" ((fieldWithDefault #id model, get #instructorId model, get #location model))
createMany [] = pure []
createMany models = do
sqlQuery (Query $ "INSERT INTO office_assignments (id, instructor_id, location) VALUES " <> (ByteString.intercalate ", " (List.map (\_ -> "(?, ?, ?)") models)) <> " RETURNING *") (List.concat $ List.map (\model -> [toField (fieldWithDefault #id model), toField (get #instructorId model), toField (get #location model)]) models)
instance CanUpdate OfficeAssignment where
updateRecord model = do
List.head <$> sqlQuery "UPDATE office_assignments SET id = ?, instructor_id = ?, location = ? WHERE id = ? RETURNING *" ((fieldWithUpdate #id model, fieldWithUpdate #instructorId model, fieldWithUpdate #location model, get #id model))
instance Record OfficeAssignment where
{-# INLINE newRecord #-}
newRecord = OfficeAssignment def def def def
instance Default (Id' "office_assignments") where def = Id def
instance SetField "id" (OfficeAssignment' instructorId) (Id' "office_assignments") where
{-# INLINE setField #-}
setField newValue (OfficeAssignment id instructorId location meta) =
OfficeAssignment newValue instructorId location (meta { touchedFields = "id" : touchedFields meta })
instance SetField "instructorId" (OfficeAssignment' instructorId) instructorId where
{-# INLINE setField #-}
setField newValue (OfficeAssignment id instructorId location meta) =
OfficeAssignment id newValue location (meta { touchedFields = "instructorId" : touchedFields meta })
instance SetField "location" (OfficeAssignment' instructorId) Text where
{-# INLINE setField #-}
setField newValue (OfficeAssignment id instructorId location meta) =
OfficeAssignment id instructorId newValue (meta { touchedFields = "location" : touchedFields meta })
instance SetField "meta" (OfficeAssignment' instructorId) MetaBag where
{-# INLINE setField #-}
setField newValue (OfficeAssignment id instructorId location meta) =
OfficeAssignment id instructorId location newValue
instance UpdateField "id" (OfficeAssignment' instructorId) (OfficeAssignment' instructorId) (Id' "office_assignments") (Id' "office_assignments") where
{-# INLINE updateField #-}
updateField newValue (OfficeAssignment id instructorId location meta) = OfficeAssignment newValue instructorId location (meta { touchedFields = "id" : touchedFields meta })
instance UpdateField "instructorId" (OfficeAssignment' instructorId) (OfficeAssignment' instructorId') instructorId instructorId' where
{-# INLINE updateField #-}
updateField newValue (OfficeAssignment id instructorId location meta) = OfficeAssignment id newValue location (meta { touchedFields = "instructorId" : touchedFields meta })
instance UpdateField "location" (OfficeAssignment' instructorId) (OfficeAssignment' instructorId) Text Text where
{-# INLINE updateField #-}
updateField newValue (OfficeAssignment id instructorId location meta) = OfficeAssignment id instructorId newValue (meta { touchedFields = "location" : touchedFields meta })
instance UpdateField "meta" (OfficeAssignment' instructorId) (OfficeAssignment' instructorId) MetaBag MetaBag where
{-# INLINE updateField #-}
updateField newValue (OfficeAssignment id instructorId location meta) = OfficeAssignment id instructorId location newValue