diff options
-rw-r--r-- | lib/Properties.hs | 20 |
1 files changed, 13 insertions, 7 deletions
diff --git a/lib/Properties.hs b/lib/Properties.hs index ba78fca..07b4397 100644 --- a/lib/Properties.hs +++ b/lib/Properties.hs @@ -14,7 +14,8 @@ import Control.Monad (forM_, unless, when) import Data.Text (Text, isPrefixOf) import qualified Data.Vector as V import Tiled (Layer (..), Object (..), Property (..), - PropertyValue (..), Tiledmap (..), Tileset (..)) + PropertyValue (..), Tile (..), Tiledmap (..), + Tileset (..)) import TiledAbstract (HasName (..), HasProperties (..), HasTypeName (..), IsProperty (..)) import Util (layerIsEmpty, mkProxy, naiveEscapeHTML, @@ -368,13 +369,18 @@ refuseDoubledNames => (Foldable t, Functor t) => t a -> LintWriter b -refuseDoubledNames things = foldr folding base things mempty +refuseDoubledNames things = foldr folding base things (mempty,mempty) where - -- this accumulates a function that complains about things it's already seen - folding thing cont seen = do - when (name `elem` seen) - $ complain $ "cannot use " <> typeName (mkProxy thing) <> " name \"" <> name <> "\" twice" - cont (S.insert name seen) + -- this accumulates a function that complains about things it's + -- already seen, except if they've already occured twice and then + -- occur again … + folding thing cont (seen, twice) + | name `elem` seen && name `notElem` twice = do + complain $ "cannot use " <> typeName (mkProxy thing) + <> " name \"" <> name <> "\" multiple times." + cont (seen, S.insert name twice) + | otherwise = + cont (S.insert name seen, twice) where name = getName thing base _ = pure () |