# Python Slop Detection
# Detects method names from other languages (JS/Java/Ruby/Go/C#/PHP) used in Python.
# These are syntactically valid calls but don't exist on Python objects — runtime AttributeError.
id: python-cross-language-method
name: Cross-Language Method Leakage
severity: warning
category: correctness
defect_class: hallucination
inline_tier: warning
language: python

message: "'{METHOD}' is not a Python method — likely a {LANG} idiom leaking in"

description: |
  A method name from another language is being called on a Python object.
  These cause AttributeError at runtime. Common AI confusion pattern.

  Examples by language:
  - JavaScript: .push() → .append(), .forEach() → for loop, .includes() → in
  - Java: .equals() → ==, .isEmpty() → not obj, .println() → print()
  - Ruby: .each() → for loop, .collect() → list comprehension
  - C#: .Add() → .append(), .Contains() → in, .ToLower() → .lower()
  - PHP: strlen() as method → len()

query: |
  (call
    function: (attribute
      object: (_) @OBJ
      attribute: (identifier) @METHOD)
    (#match? @METHOD "^(push|forEach|indexOf|charAt|substring|hasOwnProperty|unshift|flatMap|padStart|padEnd|trimStart|trimEnd|equals|isEmpty|println|printf|getClass|hashCode|toCharArray|getBytes|compareTo|equalsIgnoreCase|startsWith|endsWith|each|collect|select|reject|detect|inject|chomp|chop|gsub|upcase|downcase|present|blank|Add|Contains|ToLower|ToUpper|Trim|Substring|WriteLine|ReadLine|TryParse|forEach|includes|assign|freeze|splice|unshift|shift|flatMap)$"))

metavars:
  - OBJ
  - METHOD

post_filter: match_captures
post_filter_params:
  METHOD: "^(push|forEach|indexOf|charAt|substring|hasOwnProperty|unshift|flatMap|padStart|padEnd|trimStart|trimEnd|equals|isEmpty|println|printf|getClass|hashCode|toCharArray|getBytes|compareTo|equalsIgnoreCase|startsWith|endsWith|each|collect|select|reject|detect|inject|chomp|chop|gsub|upcase|downcase|present|blank|Add|Contains|ToLower|ToUpper|Trim|Substring|WriteLine|ReadLine|TryParse|forEach|includes|assign|freeze|splice|unshift|shift|flatMap)$"

has_fix: false

tags:
  - python
  - correctness
  - hallucination
  - slop
  - cross-language
  - ai-generated

examples:
  bad: |
    items.push(x)
    name.equals("foo")
    lst.forEach(lambda x: print(x))
    s.isEmpty()

  good: |
    items.append(x)
    name == "foo"
    for x in lst: print(x)
    not s
