]> gitweb.factorcode.org Git - factor.git/commitdiff
bare: check duplicate keys too.
authorJohn Benediktsson <mrjbq7@gmail.com>
Thu, 16 Jun 2022 16:29:54 +0000 (09:29 -0700)
committerJohn Benediktsson <mrjbq7@gmail.com>
Thu, 16 Jun 2022 16:29:54 +0000 (09:29 -0700)
extra/bare/bare-tests.factor
extra/bare/bare.factor

index 125308783204a91c78448b30a8450f1a26080511..de739c22b07cdcfd0c65904f50efa38123f56975 100644 (file)
@@ -370,6 +370,18 @@ type Person union {Customer | Employee | TerminatedEmployee}
     B{ 0x02 } Person bare>
 ] unit-test
 
+! enum checks
+
+[
+    "type Alphabet enum {
+      A
+      B
+      C = 0
+      A
+      B = 99
+    }" parse-schema
+] [ duplicate-keys? ] must-fail-with
+
 [
     "type Alphabet enum {
       A
index 8af0e1670f6ca2a404e3a2441c27b4f932208e4d..429fdfa83c153cad8ef79b7330b2dba76a9002fb 100644 (file)
@@ -4,7 +4,7 @@
 USING: accessors arrays assocs bare combinators endian
 hashtables io io.encodings.binary io.encodings.string
 io.encodings.utf8 io.files io.streams.byte-array kernel math
-math.parser multiline namespaces parser peg.ebnf sequences
+math.parser multiline namespaces parser peg.ebnf sequences sets
 strings words words.constant ;
 
 IN: bare
@@ -151,15 +151,23 @@ ERROR: invalid-schema ;
 
 ERROR: unknown-type name ;
 
+ERROR: duplicate-keys keys ;
+
 ERROR: duplicate-values values ;
 
 <PRIVATE
 
+: check-duplicate-keys ( alist -- alist )
+    dup keys duplicates [ duplicate-keys ] unless-empty ;
+
 : check-duplicate-values ( alist -- alist )
     dup H{ } clone [ '[ _ push-at ] assoc-each ] keep
     [ nip length 1 > ] { } assoc-filter-as
     [ duplicate-values ] unless-empty ;
 
+: check-duplicates ( alist -- alist )
+    check-duplicate-keys check-duplicate-values ;
+
 : assign-values ( alist -- alist' )
     0 swap [ rot or dup 1 + -rot ] assoc-map nip ;
 
@@ -203,7 +211,7 @@ enum-values = enum-value (ws enum-value)* => [[ first2 swap prefix ]]
 enum-value = enum-value-name (ws "="~ ws number)?
 enum-value-name = upper (upper|digit|[_])* => [[ first2 swap prefix >string ]]
 enum      = "enum"~ ws "{"~ ws enum-values ws "}"~
-          => [[ assign-values check-duplicate-values enum boa ]]
+          => [[ assign-values check-duplicates enum boa ]]
 
 uints     = uint|u8|u16|u32|u64
 ints      = int|i8|i16|i32|i64