(language: Language, r: string)
| 1190 | } |
| 1191 | |
| 1192 | function buildLocalReceiverTypePatterns(language: Language, r: string): RegExp[] { |
| 1193 | switch (language) { |
| 1194 | case 'typescript': |
| 1195 | case 'javascript': |
| 1196 | case 'tsx': |
| 1197 | case 'jsx': |
| 1198 | case 'arkts': |
| 1199 | return [ |
| 1200 | new RegExp(`\\b${r}\\b\\s*=\\s*new\\s+([A-Za-z_$][\\w.$]*)`), // = new Logger() |
| 1201 | // No keyword requirement, so this matches BOTH a local annotation |
| 1202 | // (`const lg: Logger`) and a typed parameter (`function use(lg: Logger)` |
| 1203 | // / `(lg: Logger) =>`) — the parameter case the old `const|let|var` |
| 1204 | // prefix excluded (#1125). Mirrors Kotlin/Swift/Scala; the capture stops |
| 1205 | // at `<` so a generic-typed param (`repo: Repository<User>`) still yields |
| 1206 | // `Repository`. resolveMethodOnType validates the type actually declares |
| 1207 | // the method, so the looser match produces no edge on a mis-inference. |
| 1208 | new RegExp(`\\b${r}\\b\\s*:\\s*([A-Z][\\w.$]*)`), // lg: Logger (annotation or typed param) |
| 1209 | ]; |
| 1210 | case 'python': |
| 1211 | return [ |
| 1212 | new RegExp(`\\b${r}\\b\\s*=\\s*([A-Z][\\w.]*)\\s*\\(`), // lg = Logger(...) |
| 1213 | new RegExp(`\\b${r}\\b\\s*:\\s*([A-Z][\\w.]*)`), // lg: Logger (PEP 526) |
| 1214 | ]; |
| 1215 | case 'java': |
| 1216 | return [ |
| 1217 | new RegExp(`\\b${r}\\b\\s*=\\s*new\\s+([A-Za-z_][\\w.]*)`), // = new Logger() |
| 1218 | new RegExp(`\\b([A-Z][\\w.]*)\\s+${r}\\b\\s*[=;,)]`), // Logger lg; / param |
| 1219 | ]; |
| 1220 | case 'kotlin': |
| 1221 | return [ |
| 1222 | new RegExp(`\\b${r}\\b\\s*=\\s*([A-Z][\\w.]*)\\s*\\(`), // val lg = Logger(...) |
| 1223 | new RegExp(`\\b${r}\\b\\s*:\\s*([A-Z][\\w.]*)`), // val lg: Logger / param |
| 1224 | ]; |
| 1225 | case 'csharp': |
| 1226 | return [ |
| 1227 | new RegExp(`\\b${r}\\b\\s*=\\s*new\\s+([A-Za-z_][\\w.]*)`), // = new Logger() |
| 1228 | new RegExp(`\\b([A-Z][\\w.]*)\\s+${r}\\b\\s*[=;,)]`), // Logger lg; / param |
| 1229 | ]; |
| 1230 | case 'swift': |
| 1231 | return [ |
| 1232 | new RegExp(`\\b${r}\\b\\s*=\\s*([A-Z][\\w.]*)\\s*\\(`), // let lg = Logger(...) |
| 1233 | new RegExp(`\\b${r}\\b\\s*:\\s*([A-Z][\\w.]*)`), // let lg: Logger / param |
| 1234 | ]; |
| 1235 | case 'rust': |
| 1236 | return [ |
| 1237 | new RegExp(`\\blet\\s+(?:mut\\s+)?${r}\\b(?:\\s*:[^=]+)?=\\s*&?(?:mut\\s+)?([A-Z][\\w]*)`), // let lg = Logger::new()/Logger{}/Logger |
| 1238 | // No `let`, so this covers a `let lg: Logger` binding AND a typed |
| 1239 | // parameter (`fn use(lg: &Logger)`, a closure `|lg: Logger|`) — the |
| 1240 | // parameter case the old `let`-anchored pattern excluded (#1125). |
| 1241 | new RegExp(`\\b${r}\\s*:\\s*&?(?:mut\\s+)?([A-Z][\\w]*)`), // lg: Logger (binding or typed param) |
| 1242 | ]; |
| 1243 | case 'go': |
| 1244 | return [ |
| 1245 | new RegExp(`\\b${r}\\b\\s*:=\\s*&?([A-Za-z_][\\w.]*)\\s*{`), // lg := Logger{} / &Logger{} |
| 1246 | new RegExp(`\\bvar\\s+${r}\\s+\\*?([A-Za-z_][\\w.]*)`), // var lg Logger / *Logger |
| 1247 | // A typed parameter / method receiver (`func use(lg Logger)`, |
| 1248 | // `func (l Logger) M()`) — name-before-type with no `var`/`:=` (#1125). |
| 1249 | // PascalCase-guarded (unlike the anchored patterns above) to keep the |
no outgoing calls
no test coverage detected