Libraryless. Click here for Pure Java version (16250L/105K).
sclass ConceptsRefChecker { Concepts cc; new L<Err> errors; bool veryVerbose; sclass Err {} srecord ErrNoBackRef(Concept.Ref ref, Concept dest) > Err {} srecord ErrSuperfluousBackRef(Concept.Ref ref, Concept dest) > Err {} srecord ErrDuplicateRef(Concept c) > Err {} srecord ErrNullRef(Concept c) > Err {} srecord ErrMissingRef(Concept c, Concept.Ref ref) > Err {} srecord ErrSuperfluousRef(Concept c, Concept.Ref ref) > Err {} // a reference from a concept that is not in the concepts list srecord ErrDanglingSource(Concept.Ref ref, Concept dest) > Err {} // a reference to a concept that is not in the concepts list srecord ErrDanglingDestination(Concept.Ref ref, Concept dest) > Err {} *() {} *(Concepts *cc) {} L<Err> run() { errors.clear(); if (cc == null) ret errors; Cl<Concept> concepts = cc.allConcepts(); if (veryVerbose) print("Checking " + nConcepts(concepts)); for (Concept c : concepts) try { O badElement = firstElementNotSubclassing(c.backRefs, Concept.Ref.class); if (badElement != null) continue with print("Bad element in backRefs of " + c + ": " + badElement); for (Concept.Ref ref : cloneList(c.backRefs)) { if (ref! != c) errors.add(new ErrSuperfluousBackRef(ref, c)); if (ref.concept()._concepts != cc) errors.add(new ErrDanglingSource(ref, c)); } Cl<Concept.Ref> refs = c._refs(); badElement = firstElementNotSubclassing(refs, Concept.Ref.class); if (badElement != null) continue with print("Bad element in backRefs of " + c + ": " + badElement); if (!allUnique(refs)) errors.add(new ErrDuplicateRef(c)); if (contains(refs, null)) errors.add(new ErrNullRef(c)); refs = nonNulls(refs); Cl<Concept.Ref> actualRefs = scanConceptForRefs(c); for (Concept.Ref ref : listMinusSet(refs, actualRefs)) errors.add(new ErrSuperfluousRef(c, ref)); for (Concept.Ref ref : listMinusSet(actualRefs, refs)) errors.add(new ErrMissingRef(c, ref)); for (Concept.Ref ref : refs) if (ref.has()) { if (!contains(ref->backRefs, ref)) errors.add(new ErrNoBackRef(ref, c)); if (ref->_concepts != cc) errors.add(new ErrDanglingDestination(ref, c)); } } catch print e { print("Error processing concept " + c); } ret errors; } L<Err> errors() { ret errors; } S fixAll() { new LS out; // start from end because list removes should be faster like this for (Err err : reversed(cloneAndClear(errors))) pcall { out.add("Processing " + err); if (err cast ErrNoBackRef) { err.ref.index(); out.add(" reference added"); } else if (err cast ErrSuperfluousRef) { err.ref.unindexAndDrop(); out.add(" reference dropped"); } else if (err cast ErrDanglingSource) { err.ref->_removeBackRef(err.ref); out.add(" reference removed from destination"); } else if (err cast ErrDanglingDestination) { err.ref->_removeBackRef(err.ref); out.add(" reference removed from destination"); } else if (err cast ErrMissingRef) { err.ref.registerRef(); out.add(" reference registered"); } else if (err cast ErrSuperfluousBackRef) { err.dest._removeBackRef(err.ref); out.add(" backreference dropped"); } else out.add(" TODO - fix not implemented"); } ret lines(out); } S runAndFixAll() { run(); ret fixAll(); } }
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: | 538 / 936 | 
| Version history: | 28 change(s) | 
| Referenced in: | [show references] |