Skip to content

Commit 28e1c59

Browse files
committed
tester: add duplicate error detection
* simplify `Db.checkDiagnosticLine` * report duplicate errors/warnings/notes * use iterator in Db.match code * add `Issue.found` indicator, no longer delete issues * add `Issues.count_found` to * use `color.useColor()` * use u32 for line numbers * remove trailing spaces * remove unused public
1 parent c4c618b commit 28e1c59

File tree

6 files changed

+134
-154
lines changed

6 files changed

+134
-154
lines changed

test/types/struct/bitfield_packed.c2

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,4 +1,3 @@
1-
// @skip
21
// @warnings{no-unused}
32
module test;
43

tools/tester/issues.c2

Lines changed: 38 additions & 37 deletions
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,13 @@ import unistd; // getcwd()
2424

2525
type Issue struct {
2626
u32 filename; // into Issues' string pool
27-
i32 line_nr;
27+
u32 line_nr;
2828
u32 msg; // index into Issues' string pool
29+
bool found;
2930
}
3031

3132
public type Iter struct {
32-
const Issues* issues;
33+
Issues* issues;
3334
u32 idx;
3435
}
3536

@@ -44,12 +45,22 @@ public fn const char* relativeFilename(const char *name) {
4445
return name;
4546
}
4647

48+
public fn bool Iter.find(Iter* iter, const char* filename, u32 line_nr) {
49+
const Issues* i = iter.issues;
50+
for (; iter.more(); iter.next()) {
51+
const Issue* cur = &i.issues[iter.idx];
52+
if (cur.line_nr == line_nr && !strcmp(&i.pool[cur.filename], filename))
53+
return true;
54+
}
55+
return false;
56+
}
57+
4758
public fn const char* Iter.getFilename(const Iter* iter) {
4859
const Issue* cur = &iter.issues.issues[iter.idx];
4960
return relativeFilename(&iter.issues.pool[cur.filename]);
5061
}
5162

52-
public fn i32 Iter.getLineNr(const Iter* iter) {
63+
public fn u32 Iter.getLineNr(const Iter* iter) {
5364
const Issue* cur = &iter.issues.issues[iter.idx];
5465
return cur.line_nr;
5566
}
@@ -59,6 +70,19 @@ public fn const char* Iter.getMsg(const Iter* iter) {
5970
return &iter.issues.pool[cur.msg];
6071
}
6172

73+
public fn bool Iter.getFound(const Iter* iter) {
74+
const Issue* cur = &iter.issues.issues[iter.idx];
75+
return cur.found;
76+
}
77+
78+
public fn void Iter.setFound(const Iter* iter) {
79+
Issue* cur = &iter.issues.issues[iter.idx];
80+
if (!cur.found) {
81+
cur.found = true;
82+
iter.issues.found_count++;
83+
}
84+
}
85+
6286
public fn bool Iter.more(const Iter* iter) {
6387
return iter.idx < iter.issues.count;
6488
}
@@ -75,6 +99,8 @@ public type Issues struct @(opaque) {
7599
char* pool;
76100
u32 pool_count;
77101
u32 pool_capacity;
102+
103+
u32 found_count;
78104
}
79105

80106
public fn Issues* create() {
@@ -101,12 +127,12 @@ fn void Issues.resizePool(Issues* i, u32 capacity) {
101127
}
102128

103129
fn u32 Issues.addPool(Issues* i, const char* text) {
104-
u32 len = (u32)strlen(text) + 1; // includes 0-terminator
105-
while (i.pool_count + len >= i.pool_capacity) i.resizePool(i.pool_capacity * 2);
130+
u32 size = (u32)strlen(text) + 1; // includes 0-terminator
131+
while (i.pool_count + size > i.pool_capacity) i.resizePool(i.pool_capacity * 2);
106132

107133
u32 idx = i.pool_count;
108-
memcpy(i.pool + i.pool_count, text, len);
109-
i.pool_count += len;
134+
memcpy(i.pool + i.pool_count, text, size);
135+
i.pool_count += size;
110136
return idx;
111137
}
112138

@@ -125,42 +151,17 @@ public fn void Issues.add(Issues* i, const char* filename, u32 line_nr, const ch
125151

126152
Issue* cur = &i.issues[i.count];
127153
cur.filename = i.addPool(filename);
128-
cur.line_nr = (i32)line_nr;
154+
cur.line_nr = line_nr;
129155
cur.msg = i.addPool(msg);
156+
cur.found = false;
130157
i.count++;
131158
}
132159

133-
fn void Issues.erase_idx(Issues* i, u32 idx) {
134-
// Note: does not erase text from pool
135-
for (u32 j = idx; j < i.count-1; j++) i.issues[j] = i.issues[j+1];
136-
i.count--;
137-
}
138-
139-
public fn void Issues.erase(Issues* i, const char* filename, i32 line_nr) {
140-
for (u32 j=0; j<i.count; j++) {
141-
const Issue* cur = &i.issues[j];
142-
if (cur.line_nr != line_nr) continue;
143-
if (strcmp(&i.pool[cur.filename], filename) == 0) {
144-
i.erase_idx(j);
145-
return;
146-
}
147-
}
148-
}
149-
150-
public fn const char* Issues.find(Issues* i, const char* filename, i32 line_nr) {
151-
for (u32 j=0; j<i.count; j++) {
152-
const Issue* cur = &i.issues[j];
153-
if (cur.line_nr != line_nr) continue;
154-
if (strcmp(&i.pool[cur.filename], filename) == 0) return &i.pool[cur.msg];
155-
}
156-
return nil;
157-
}
158-
159-
public fn bool Issues.empty(const Issues* i) {
160-
return i.count == 0;
160+
public fn bool Issues.allFound(const Issues* i) {
161+
return i.count == i.found_count;
161162
}
162163

163-
public fn Iter Issues.getIter(const Issues* i) {
164+
public fn Iter Issues.getIter(Issues* i) {
164165
Iter iter = { i, 0 }
165166
return iter;
166167
}

tools/tester/line_db.c2

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,7 @@ public fn u32 Db.size(const Db* db) {
4747
return db.count;
4848
}
4949

50-
public fn void Db.resize(Db* db, u32 capacity) {
50+
fn void Db.resize(Db* db, u32 capacity) {
5151
Entry* entries2 = malloc(capacity * sizeof(Entry));
5252
if (db.count) {
5353
memcpy(entries2, db.entries, db.count * sizeof(Entry));

0 commit comments

Comments
 (0)