From 6a67d3e41fc49e09ed6c1c02fec2946c6db9bc1f Mon Sep 17 00:00:00 2001
From: stuebinm <stuebinm@disroot.org>
Date: Sat, 4 Dec 2021 13:06:27 +0100
Subject: [PATCH] lints for names that are used more than twice

(previously it would just lint "can't use name twice" multiple times,
which looks kind of silly)
---
 lib/Properties.hs | 20 +++++++++++++-------
 1 file 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 ()
 
-- 
GitLab