|
12 | 12 |
|
13 | 13 | #if canImport(OSLog) |
14 | 14 | import OSLog |
15 | | -import SKLogging |
16 | | -import RegexBuilder |
17 | 15 |
|
18 | 16 | /// Reads oslog messages to find recent sourcekitd crashes. |
19 | 17 | struct OSLogScraper { |
@@ -47,90 +45,34 @@ struct OSLogScraper { |
47 | 45 | #"subsystem CONTAINS "sourcekit-lsp" AND composedMessage CONTAINS "sourcekitd crashed" AND category = %@"#, |
48 | 46 | logCategory |
49 | 47 | ) |
50 | | - enum LogSection { |
51 | | - case request |
52 | | - case fileContents |
53 | | - case contextualRequest |
54 | | - } |
55 | | - var section = LogSection.request |
| 48 | + var isInFileContentSection = false |
56 | 49 | var request = "" |
57 | 50 | var fileContents = "" |
58 | | - var contextualRequests: [String] = [] |
59 | | - let sourcekitdCrashedRegex = Regex { |
60 | | - "sourcekitd crashed (" |
61 | | - OneOrMore(.digit) |
62 | | - "/" |
63 | | - OneOrMore(.digit) |
64 | | - ")" |
65 | | - } |
66 | | - let contextualRequestRegex = Regex { |
67 | | - "Contextual request " |
68 | | - OneOrMore(.digit) |
69 | | - " / " |
70 | | - OneOrMore(.digit) |
71 | | - ":" |
72 | | - } |
73 | | - |
74 | 51 | for entry in try getLogEntries(matching: predicate) { |
75 | 52 | for line in entry.composedMessage.components(separatedBy: "\n") { |
76 | | - if try sourcekitdCrashedRegex.wholeMatch(in: line) != nil { |
| 53 | + if line.starts(with: "sourcekitd crashed (") { |
77 | 54 | continue |
78 | 55 | } |
79 | 56 | if line == "Request:" { |
80 | 57 | continue |
81 | 58 | } |
82 | 59 | if line == "File contents:" { |
83 | | - section = .fileContents |
84 | | - continue |
85 | | - } |
86 | | - if line == "File contents:" { |
87 | | - section = .fileContents |
88 | | - continue |
89 | | - } |
90 | | - if try contextualRequestRegex.wholeMatch(in: line) != nil { |
91 | | - section = .contextualRequest |
92 | | - contextualRequests.append("") |
| 60 | + isInFileContentSection = true |
93 | 61 | continue |
94 | 62 | } |
95 | 63 | if line == "--- End Chunk" { |
96 | 64 | continue |
97 | 65 | } |
98 | | - switch section { |
99 | | - case .request: |
100 | | - request += line + "\n" |
101 | | - case .fileContents: |
| 66 | + if isInFileContentSection { |
102 | 67 | fileContents += line + "\n" |
103 | | - case .contextualRequest: |
104 | | - if !contextualRequests.isEmpty { |
105 | | - contextualRequests[contextualRequests.count - 1] += line + "\n" |
106 | | - } else { |
107 | | - // Should never happen because we have appended at least one element to `contextualRequests` when switching |
108 | | - // to the `contextualRequest` section. |
109 | | - logger.fault("Dropping contextual request line: \(line)") |
110 | | - } |
| 68 | + } else { |
| 69 | + request += line + "\n" |
111 | 70 | } |
112 | 71 | } |
113 | 72 | } |
114 | 73 |
|
115 | 74 | var requestInfo = try RequestInfo(request: request) |
116 | | - |
117 | | - let contextualRequestInfos = contextualRequests.compactMap { contextualRequest in |
118 | | - orLog("Processsing contextual request") { |
119 | | - try RequestInfo(request: contextualRequest) |
120 | | - } |
121 | | - }.filter { contextualRequest in |
122 | | - if contextualRequest.fileContents != requestInfo.fileContents { |
123 | | - logger.error("Contextual request concerns a different file than the crashed request. Ignoring it") |
124 | | - return false |
125 | | - } |
126 | | - return true |
127 | | - } |
128 | | - requestInfo.contextualRequestTemplates = contextualRequestInfos.map(\.requestTemplate) |
129 | | - if requestInfo.compilerArgs.isEmpty { |
130 | | - requestInfo.compilerArgs = contextualRequestInfos.last(where: { !$0.compilerArgs.isEmpty })?.compilerArgs ?? [] |
131 | | - } |
132 | 75 | requestInfo.fileContents = fileContents |
133 | | - |
134 | 76 | return requestInfo |
135 | 77 | } |
136 | 78 |
|
|
0 commit comments