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