浏览代码

Improve `odin doc` string printing (Fixes #2246)

gingerBill 2 年之前
父节点
当前提交
7f3795a231
共有 2 个文件被更改,包括 24 次插入47 次删除
  1. 9 13
      src/docs.cpp
  2. 15 34
      src/string.cpp

+ 9 - 13
src/docs.cpp

@@ -49,10 +49,9 @@ gb_internal GB_COMPARE_PROC(cmp_entities_for_printing) {
 	int ox = print_entity_kind_ordering[x->kind];
 	int ox = print_entity_kind_ordering[x->kind];
 	int oy = print_entity_kind_ordering[y->kind];
 	int oy = print_entity_kind_ordering[y->kind];
 	res = ox - oy;
 	res = ox - oy;
-	if (res != 0) {
-		return res;
+	if (res == 0) {
+		res = string_compare(x->token.string, y->token.string);
 	}
 	}
-	res = string_compare(x->token.string, y->token.string);
 	return res;
 	return res;
 }
 }
 
 
@@ -230,23 +229,20 @@ gb_internal void print_doc_package(CheckerInfo *info, AstPackage *pkg) {
 				// Fine
 				// Fine
 				break;
 				break;
 			}
 			}
-			array_add(&entities, e);
-		}
-		gb_sort_array(entities.data, entities.count, cmp_entities_for_printing);
-
-		bool show_docs = (build_context.cmd_doc_flags & CmdDocFlag_Short) == 0;
-
-		EntityKind curr_entity_kind = Entity_Invalid;
-		for_array(i, entities) {
-			Entity *e = entities[i];
 			if (e->pkg != pkg) {
 			if (e->pkg != pkg) {
 				continue;
 				continue;
 			}
 			}
 			if (!is_entity_exported(e)) {
 			if (!is_entity_exported(e)) {
 				continue;
 				continue;
 			}
 			}
+			array_add(&entities, e);
+		}
+		gb_sort_array(entities.data, entities.count, cmp_entities_for_printing);
 
 
+		bool show_docs = (build_context.cmd_doc_flags & CmdDocFlag_Short) == 0;
 
 
+		EntityKind curr_entity_kind = Entity_Invalid;
+		for (Entity *e : entities) {
 			if (curr_entity_kind != e->kind) {
 			if (curr_entity_kind != e->kind) {
 				if (curr_entity_kind != Entity_Invalid) {
 				if (curr_entity_kind != Entity_Invalid) {
 					print_doc_line(0, "");
 					print_doc_line(0, "");
@@ -287,7 +283,7 @@ gb_internal void print_doc_package(CheckerInfo *info, AstPackage *pkg) {
 				print_doc_expr(init_expr);
 				print_doc_expr(init_expr);
 			}
 			}
 
 
-			gb_printf(";\n");
+			gb_printf("\n");
 
 
 			if (show_docs) {
 			if (show_docs) {
 				print_doc_comment_group_string(3, docs);
 				print_doc_comment_group_string(3, docs);

+ 15 - 34
src/string.cpp

@@ -106,42 +106,23 @@ gb_internal void string_to_lower(String *s) {
 	}
 	}
 }
 }
 
 
-gb_internal int string_compare(String const &x, String const &y) {
-	if (x.len != y.len || x.text != y.text) {
-		isize n, fast, offset, curr_block;
-		isize *la, *lb;
-		isize pos;
-
-		n = gb_min(x.len, y.len);
-
-		fast = n/gb_size_of(isize) + 1;
-		offset = (fast-1)*gb_size_of(isize);
-		curr_block = 0;
-		if (n <= gb_size_of(isize)) {
-			fast = 0;
-		}
-
-		la = cast(isize *)x.text;
-		lb = cast(isize *)y.text;
-
-		for (; curr_block < fast; curr_block++) {
-			if (la[curr_block] ^ lb[curr_block]) {
-				for (pos = curr_block*gb_size_of(isize); pos < n; pos++) {
-					if (x[pos] ^ y[pos]) {
-						return cast(int)x[pos] - cast(int)y[pos];
-					}
-				}
-			}
-		}
+gb_internal int string_compare(String const &a, String const &b) {
+	if (a.text == b.text) {
+		return 0;
+	}
+	if (a.text == nullptr) {
+		return -1;
+	}
+	if (b.text == nullptr) {
+		return +1;
+	}
 
 
-		for (; offset < n; offset++) {
-			if (x[offset] ^ y[offset]) {
-				return cast(int)x[offset] - cast(int)y[offset];
-			}
-		}
-		return cast(int)(x.len - y.len);
+	uintptr n = gb_min(a.len, b.len);
+	int res = memcmp(a.text, b.text, n);
+	if (res == 0) {
+		res = cast(int)(a.len - b.len);
 	}
 	}
-	return 0;
+	return res;
 }
 }
 
 
 gb_internal isize string_index_byte(String const &s, u8 x) {
 gb_internal isize string_index_byte(String const &s, u8 x) {