diff --git a/src/Quasar/Wayland/Protocol/TH.hs b/src/Quasar/Wayland/Protocol/TH.hs index cb94e9605ee4cd4bf81023b6206e8a2bd0ecfef7..7a1e6362c4385f952c8f55336a459e77d24a4db0 100644 --- a/src/Quasar/Wayland/Protocol/TH.hs +++ b/src/Quasar/Wayland/Protocol/TH.hs @@ -342,10 +342,13 @@ parseMessage interfaceName (opcode, element) = do name <- getAttr "name" element since <- read <<$>> peekAttr "since" element arguments <- mapM parseArgument $ zip [0..] $ findChildren (qname "arg") element - forM_ arguments \arg -> + forM_ arguments \arg -> do when - do arg.argType == GenericNewIdArgument && interfaceName /= "wl_registry" - do fail $ "Invalid GenericNewIdArgument encountered on " <> interfaceName <> "." <> name <> " (only valid on wl_registry)" + do arg.argType == GenericNewIdArgument && (interfaceName /= "wl_registry" || name /= "bind") + do fail $ "Invalid 'new_id' argument without 'interface' attribute encountered on " <> interfaceName <> "." <> name <> " (only valid on wl_registry.bind)" + when + do arg.argType == GenericObjectArgument && (interfaceName /= "wl_display" || name /= "error") + do fail $ "Invalid 'object' argument without 'interface' attribute encountered on " <> interfaceName <> "." <> name <> " (only valid on wl_display.error)" pure MessageSpec { name, since,