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

index 8f93ff17f29570aa655b04f15ca61e5c40c799de..125308783204a91c78448b30a8450f1a26080511 100644 (file)
@@ -369,3 +369,13 @@ type Person union {Customer | Employee | TerminatedEmployee}
 } [
     B{ 0x02 } Person bare>
 ] unit-test
+
+[
+    "type Alphabet enum {
+      A
+      B
+      C = 0
+      D
+      E = 99
+    }" parse-schema
+] [ duplicate-values? ] must-fail-with
index df4caf03bbdb61e49980d82eb67fc4796429394f..8af0e1670f6ca2a404e3a2441c27b4f932208e4d 100644 (file)
@@ -151,12 +151,17 @@ ERROR: invalid-schema ;
 
 ERROR: unknown-type name ;
 
+ERROR: duplicate-values values ;
+
 <PRIVATE
 
+: check-duplicate-values ( alist -- alist )
+    dup H{ } clone [ '[ _ push-at ] assoc-each ] keep
+    [ nip length 1 > ] { } assoc-filter-as
+    [ duplicate-values ] unless-empty ;
+
 : assign-values ( alist -- alist' )
-    0 swap [
-        [ [ drop ] 2dip swap over ] [ over ] if* [ 1 + ] 2dip
-    ] assoc-map nip ;
+    0 swap [ rot or dup 1 + -rot ] assoc-map nip ;
 
 SYMBOL: user-types
 
@@ -198,7 +203,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 enum boa ]]
+          => [[ assign-values check-duplicate-values enum boa ]]
 
 uints     = uint|u8|u16|u32|u64
 ints      = int|i8|i16|i32|i64
@@ -243,8 +248,10 @@ PRIVATE>
 : load-schema ( path -- schema )
     utf8 file-contents parse-schema ;
 
-SYNTAX: SCHEMA:
-    scan-object parse-schema types>> [
+: define-schema ( schema -- )
+    types>> [
         [ name>> create-word-in dup reset-generic ]
         [ type>> define-constant ] bi
     ] each ;
+
+SYNTAX: SCHEMA: scan-object parse-schema define-schema ;