(self, file: str, is_typeshed: bool = False)
| 906 | self.has_blockers.remove(path) |
| 907 | |
| 908 | def generate_unused_ignore_errors(self, file: str, is_typeshed: bool = False) -> None: |
| 909 | if is_typeshed or file in self.ignored_files: |
| 910 | return |
| 911 | ignored_lines = self.ignored_lines[file] |
| 912 | used_ignored_lines = self.used_ignored_lines[file] |
| 913 | for line, ignored_codes in ignored_lines.items(): |
| 914 | if line in self.skipped_lines[file]: |
| 915 | continue |
| 916 | if codes.UNUSED_IGNORE.code in ignored_codes: |
| 917 | continue |
| 918 | used_ignored_codes = set(used_ignored_lines[line]) |
| 919 | unused_ignored_codes = [c for c in ignored_codes if c not in used_ignored_codes] |
| 920 | # `ignore` is used |
| 921 | if not ignored_codes and used_ignored_codes: |
| 922 | continue |
| 923 | # All codes appearing in `ignore[...]` are used |
| 924 | if ignored_codes and not unused_ignored_codes: |
| 925 | continue |
| 926 | # Display detail only when `ignore[...]` specifies more than one error code |
| 927 | unused_codes_message = "" |
| 928 | if len(ignored_codes) > 1 and unused_ignored_codes: |
| 929 | unused_codes_message = f"[{', '.join(unused_ignored_codes)}]" |
| 930 | message = f'Unused "type: ignore{unused_codes_message}" comment' |
| 931 | for unused in unused_ignored_codes: |
| 932 | narrower = set(used_ignored_codes) & codes.sub_code_map[unused] |
| 933 | if narrower: |
| 934 | message += f", use narrower [{', '.join(narrower)}] instead of [{unused}] code" |
| 935 | # Don't use report() since add_error_info will ignore the error! |
| 936 | self.report_simple_error(file, line, message, code=codes.UNUSED_IGNORE) |
| 937 | |
| 938 | def generate_ignore_without_code_errors( |
| 939 | self, file: str, is_warning_unused_ignores: bool, is_typeshed: bool = False |
no test coverage detected