Browse Source

Correct `#sparse` usage and error messages

gingerBill 3 years ago
parent
commit
6418ec3b21
4 changed files with 26 additions and 9 deletions
  1. 1 1
      core/math/big/common.odin
  2. 8 8
      examples/demo/demo.odin
  3. 16 0
      src/parser.cpp
  4. 1 0
      src/parser.hpp

+ 1 - 1
core/math/big/common.odin

@@ -172,7 +172,7 @@ Error :: enum int {
 	Unimplemented           = 127,
 	Unimplemented           = 127,
 }
 }
 
 
-Error_String :: #partial [Error]string{
+Error_String :: #sparse[Error]string{
 	.Okay                    = "Okay",
 	.Okay                    = "Okay",
 	.Out_Of_Memory           = "Out of memory",
 	.Out_Of_Memory           = "Out of memory",
 	.Invalid_Pointer         = "Invalid pointer",
 	.Invalid_Pointer         = "Invalid pointer",

+ 8 - 8
examples/demo/demo.odin

@@ -1921,14 +1921,14 @@ constant_literal_expressions :: proc() {
 
 
 	fmt.println("-------")
 	fmt.println("-------")
 
 
-	Partial_Baz :: enum{A=5, B, C, D=16}
-	#assert(len(Partial_Baz) < len(#partial [Partial_Baz]int))
-	PARTIAL_ENUM_ARRAY_CONST :: #partial [Partial_Baz]int{.A ..= .C = 1, .D = 16}
-
-	fmt.println(PARTIAL_ENUM_ARRAY_CONST[.A])
-	fmt.println(PARTIAL_ENUM_ARRAY_CONST[.B])
-	fmt.println(PARTIAL_ENUM_ARRAY_CONST[.C])
-	fmt.println(PARTIAL_ENUM_ARRAY_CONST[.D])
+	Sparse_Baz :: enum{A=5, B, C, D=16}
+	#assert(len(Sparse_Baz) < len(#sparse[Sparse_Baz]int))
+	SPARSE_ENUM_ARRAY_CONST :: #sparse[Sparse_Baz]int{.A ..= .C = 1, .D = 16}
+
+	fmt.println(SPARSE_ENUM_ARRAY_CONST[.A])
+	fmt.println(SPARSE_ENUM_ARRAY_CONST[.B])
+	fmt.println(SPARSE_ENUM_ARRAY_CONST[.C])
+	fmt.println(SPARSE_ENUM_ARRAY_CONST[.D])
 
 
 	fmt.println("-------")
 	fmt.println("-------")
 
 

+ 16 - 0
src/parser.cpp

@@ -2134,6 +2134,22 @@ Ast *parse_operand(AstFile *f, bool lhs) {
 				break;
 				break;
 			}
 			}
 			return original_type;
 			return original_type;
+		} else if (name.string == "partial") {
+			Ast *tag = ast_basic_directive(f, token, name);
+			Ast *original_expr = parse_expr(f, lhs);
+			Ast *expr = unparen_expr(original_expr);
+			switch (expr->kind) {
+			case Ast_ArrayType:
+				syntax_error(expr, "#partial has been replaced with #sparse for non-contiguous enumerated array types");
+				break;
+			case Ast_CompoundLit:
+				expr->CompoundLit.tag = tag;
+				break;
+			default:
+				syntax_error(expr, "Expected a compound literal after #%.*s, got %.*s", LIT(name.string), LIT(ast_strings[expr->kind]));
+				break;
+			}
+			return original_expr;
 		} else if (name.string == "sparse") {
 		} else if (name.string == "sparse") {
 			Ast *tag = ast_basic_directive(f, token, name);
 			Ast *tag = ast_basic_directive(f, token, name);
 			Ast *original_type = parse_type(f);
 			Ast *original_type = parse_type(f);

+ 1 - 0
src/parser.hpp

@@ -350,6 +350,7 @@ char const *inline_asm_dialect_strings[InlineAsmDialect_COUNT] = {
 		Slice<Ast *> elems; \
 		Slice<Ast *> elems; \
 		Token open, close; \
 		Token open, close; \
 		i64 max_count; \
 		i64 max_count; \
+		Ast *tag; \
 	}) \
 	}) \
 AST_KIND(_ExprBegin,  "",  bool) \
 AST_KIND(_ExprBegin,  "",  bool) \
 	AST_KIND(BadExpr,      "bad expression",         struct { Token begin, end; }) \
 	AST_KIND(BadExpr,      "bad expression",         struct { Token begin, end; }) \