Libraryless. Click here for Pure Java version (16250L/105K).
1 | sclass ConceptsRefChecker {
|
2 | Concepts cc; |
3 | new L<Err> errors; |
4 | bool veryVerbose; |
5 | |
6 | sclass Err {}
|
7 | srecord ErrNoBackRef(Concept.Ref ref, Concept dest) > Err {}
|
8 | srecord ErrSuperfluousBackRef(Concept.Ref ref, Concept dest) > Err {}
|
9 | |
10 | srecord ErrDuplicateRef(Concept c) > Err {}
|
11 | srecord ErrNullRef(Concept c) > Err {}
|
12 | |
13 | srecord ErrMissingRef(Concept c, Concept.Ref ref) > Err {}
|
14 | srecord ErrSuperfluousRef(Concept c, Concept.Ref ref) > Err {}
|
15 | |
16 | // a reference from a concept that is not in the concepts list |
17 | srecord ErrDanglingSource(Concept.Ref ref, Concept dest) > Err {}
|
18 | |
19 | // a reference to a concept that is not in the concepts list |
20 | srecord ErrDanglingDestination(Concept.Ref ref, Concept dest) > Err {}
|
21 | |
22 | *() {}
|
23 | *(Concepts *cc) {}
|
24 | |
25 | L<Err> run() {
|
26 | errors.clear(); |
27 | if (cc == null) ret errors; |
28 | Cl<Concept> concepts = cc.allConcepts(); |
29 | if (veryVerbose) |
30 | print("Checking " + nConcepts(concepts));
|
31 | for (Concept c : concepts) try {
|
32 | O badElement = firstElementNotSubclassing(c.backRefs, Concept.Ref.class); |
33 | if (badElement != null) continue with print("Bad element in backRefs of " + c + ": " + badElement);
|
34 | |
35 | for (Concept.Ref ref : cloneList(c.backRefs)) {
|
36 | if (ref! != c) |
37 | errors.add(new ErrSuperfluousBackRef(ref, c)); |
38 | if (ref.concept()._concepts != cc) |
39 | errors.add(new ErrDanglingSource(ref, c)); |
40 | } |
41 | |
42 | Cl<Concept.Ref> refs = c._refs(); |
43 | |
44 | badElement = firstElementNotSubclassing(refs, Concept.Ref.class); |
45 | if (badElement != null) continue with print("Bad element in backRefs of " + c + ": " + badElement);
|
46 | |
47 | if (!allUnique(refs)) |
48 | errors.add(new ErrDuplicateRef(c)); |
49 | if (contains(refs, null)) |
50 | errors.add(new ErrNullRef(c)); |
51 | |
52 | refs = nonNulls(refs); |
53 | Cl<Concept.Ref> actualRefs = scanConceptForRefs(c); |
54 | for (Concept.Ref ref : listMinusSet(refs, actualRefs)) |
55 | errors.add(new ErrSuperfluousRef(c, ref)); |
56 | for (Concept.Ref ref : listMinusSet(actualRefs, refs)) |
57 | errors.add(new ErrMissingRef(c, ref)); |
58 | |
59 | for (Concept.Ref ref : refs) |
60 | if (ref.has()) {
|
61 | if (!contains(ref->backRefs, ref)) |
62 | errors.add(new ErrNoBackRef(ref, c)); |
63 | if (ref->_concepts != cc) |
64 | errors.add(new ErrDanglingDestination(ref, c)); |
65 | } |
66 | } catch print e {
|
67 | print("Error processing concept " + c);
|
68 | } |
69 | ret errors; |
70 | } |
71 | |
72 | L<Err> errors() { ret errors; }
|
73 | |
74 | S fixAll() {
|
75 | new LS out; |
76 | // start from end because list removes should be faster like this |
77 | for (Err err : reversed(cloneAndClear(errors))) pcall {
|
78 | out.add("Processing " + err);
|
79 | if (err cast ErrNoBackRef) {
|
80 | err.ref.index(); |
81 | out.add(" reference added");
|
82 | } else if (err cast ErrSuperfluousRef) {
|
83 | err.ref.unindexAndDrop(); |
84 | out.add(" reference dropped");
|
85 | } else if (err cast ErrDanglingSource) {
|
86 | err.ref->_removeBackRef(err.ref); |
87 | out.add(" reference removed from destination");
|
88 | } else if (err cast ErrDanglingDestination) {
|
89 | err.ref->_removeBackRef(err.ref); |
90 | out.add(" reference removed from destination");
|
91 | } else if (err cast ErrMissingRef) {
|
92 | err.ref.registerRef(); |
93 | out.add(" reference registered");
|
94 | } else if (err cast ErrSuperfluousBackRef) {
|
95 | err.dest._removeBackRef(err.ref); |
96 | out.add(" backreference dropped");
|
97 | } else |
98 | out.add(" TODO - fix not implemented");
|
99 | } |
100 | ret lines(out); |
101 | } |
102 | |
103 | S runAndFixAll() { run(); ret fixAll(); }
|
104 | } |
download show line numbers debug dex old transpilations
Travelled to 5 computer(s): bhatertpkbcr, mqqgnosmbjvj, pyentgdyhuwx, tvejysmllsmz, vouqrxazstgt
No comments. add comment
| Snippet ID: | #1029845 |
| Snippet name: | ConceptsRefChecker - detect + fix broken references |
| Eternal ID of this version: | #1029845/29 |
| Text MD5: | 3d3c9c60c6febc0bdc33459ea2837e64 |
| Transpilation MD5: | 12f401791ec7643c24e390b11eee0691 |
| Author: | stefan |
| Category: | javax |
| Type: | JavaX fragment (include) |
| Public (visible to everyone): | Yes |
| Archived (hidden from active list): | No |
| Created/modified: | 2021-06-27 06:49:30 |
| Source code size: | 3735 bytes / 104 lines |
| Pitched / IR pitched: | No / No |
| Views / Downloads: | 540 / 939 |
| Version history: | 28 change(s) |
| Referenced in: | [show references] |