Skip to content

Commit b79df82

Browse files
committed
Improve open definition check
1 parent c30d708 commit b79df82

File tree

5 files changed

+76
-3
lines changed

5 files changed

+76
-3
lines changed

src/Code/CodebaseTree.elm

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -326,9 +326,7 @@ viewNamespaceListing viewConfig openDefinitions expandedNamespaceListings (Names
326326
]
327327

328328
hasOpenDefinitions =
329-
openDefinitions
330-
|> FQNSet.toList
331-
|> List.any (\openFqn -> FQN.isSuffixOf name openFqn && not (FQN.equals openFqn name))
329+
FQNSet.isPrefixOfAny openDefinitions name
332330
in
333331
div [ class "subtree" ]
334332
[ a

src/Code/FullyQualifiedName.elm

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ module Code.FullyQualifiedName exposing
1212
, fromString
1313
, fromUrlList
1414
, fromUrlString
15+
, isPrefixOf
1516
, isRoot
1617
, isSuffixOf
1718
, isValidSegmentChar
@@ -293,6 +294,11 @@ isSuffixOf suffixName fqn =
293294
String.endsWith (toString suffixName) (toString fqn)
294295

295296

297+
isPrefixOf : FQN -> FQN -> Bool
298+
isPrefixOf prefixName fqn =
299+
String.startsWith (toString prefixName) (toString fqn)
300+
301+
296302
isRoot : FQN -> Bool
297303
isRoot (FQN segments_) =
298304
case NEL.toList segments_ of

src/Code/FullyQualifiedNameSet.elm

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@ module Code.FullyQualifiedNameSet exposing
55
, fromReference
66
, fromReferenceList
77
, insert
8+
, isPrefixOfAny
89
, member
910
, remove
1011
, singleton
@@ -85,6 +86,17 @@ toList (FQNSet set) =
8586
|> List.map FQN.fromString
8687

8788

89+
isPrefixOfAny : FQNSet -> FQN -> Bool
90+
isPrefixOfAny (FQNSet set) prefixFqn =
91+
set
92+
|> Set.toList
93+
|> List.map FQN.fromString
94+
|> List.any
95+
(\item ->
96+
FQN.isPrefixOf prefixFqn item && not (FQN.equals item prefixFqn)
97+
)
98+
99+
88100
toggle : FQN -> FQNSet -> FQNSet
89101
toggle fqn (FQNSet set) =
90102
FQNSet (Set.Extra.toggle (FQN.toString fqn) set)
Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,27 @@
1+
module Code.FullyQualifiedNameSetTests exposing (..)
2+
3+
import Code.FullyQualifiedName as FQN exposing (..)
4+
import Code.FullyQualifiedNameSet as FQNSet exposing (..)
5+
import Expect
6+
import List.Nonempty as NEL
7+
import Test exposing (..)
8+
9+
10+
isPrefixOfAny : Test
11+
isPrefixOfAny =
12+
describe "FQNSet.isPrefixOfAny"
13+
[ test "returns true when the given FQN is a prefix of any of the members of the set" <|
14+
\_ ->
15+
let
16+
prefix =
17+
FQN.fromList [ "BlogAuthor" ]
18+
19+
set =
20+
FQNSet.fromList
21+
[ FQN.fromList [ "BlogAuthor", "avatar" ]
22+
, FQN.fromList [ "Blog", "view" ]
23+
, FQN.fromList [ "Css", "toText" ]
24+
]
25+
in
26+
Expect.equal True (FQNSet.isPrefixOfAny set prefix)
27+
]

tests/Code/FullyQualifiedNameTests.elm

Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -300,6 +300,36 @@ isSuffixOf =
300300
]
301301

302302

303+
isPrefixOf : Test
304+
isPrefixOf =
305+
describe "FullyQualifiedName.isPrefixOf"
306+
[ test "Returns True when an FQN begin with the provided prefix" <|
307+
\_ ->
308+
let
309+
prefix =
310+
FQN.fromString "base.List"
311+
312+
fqn =
313+
FQN.fromString "base.List.map"
314+
in
315+
FQN.isPrefixOf prefix fqn
316+
|> Expect.equal True
317+
|> Expect.onFail "is correctly a prefix of"
318+
, test "Returns False when an FQN does begin with the provided prefix" <|
319+
\_ ->
320+
let
321+
prefix =
322+
FQN.fromString "base.Text"
323+
324+
fqn =
325+
FQN.fromString "base.List.map"
326+
in
327+
FQN.isPrefixOf prefix fqn
328+
|> Expect.equal False
329+
|> Expect.onFail "is correctly *not* a prefix of"
330+
]
331+
332+
303333
namespaceOf : Test
304334
namespaceOf =
305335
describe "FullyQualifiedName.namespaceOf"

0 commit comments

Comments
 (0)