in Sources/generate-pipeline/RuleCollector.swift [47:80]
func collect(from url: URL) throws {
// For each file in the Rules directory, find types that either conform to SyntaxLintRule or
// inherit from SyntaxFormatRule.
let fm = FileManager.default
guard let rulesEnumerator = fm.enumerator(atPath: url.path) else {
fatalError("Could not list the directory \(url.path)")
}
for baseName in rulesEnumerator {
// Ignore files that aren't Swift source files.
guard let baseName = baseName as? String, baseName.hasSuffix(".swift") else { continue }
let fileURL = url.appendingPathComponent(baseName)
let sourceFile = try SyntaxParser.parse(fileURL)
for statement in sourceFile.statements {
guard let detectedRule = self.detectedRule(at: statement) else { continue }
if detectedRule.canFormat {
// Format rules just get added to their own list; we run them each over the entire tree in
// succession.
allFormatters.insert(detectedRule)
}
// Lint rules (this includes format rules, which can also lint) get added to a mapping over
// the names of the types they touch so that they can be interleaved into one pass over the
// tree.
allLinters.insert(detectedRule)
for visitedNode in detectedRule.visitedNodes {
syntaxNodeLinters[visitedNode, default: []].append(detectedRule.typeName)
}
}
}
}