167 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Python
		
	
	
	
			
		
		
	
	
			167 lines
		
	
	
		
			7.2 KiB
		
	
	
	
		
			Python
		
	
	
	
# python3
 | 
						|
# Copyright (C) 2019 The Android Open Source Project
 | 
						|
#
 | 
						|
# Licensed under the Apache License, Version 2.0 (the "License");
 | 
						|
# you may not use this file except in compliance with the License.
 | 
						|
# You may obtain a copy of the License at
 | 
						|
#
 | 
						|
#      http://www.apache.org/licenses/LICENSE-2.0
 | 
						|
#
 | 
						|
# Unless required by applicable law or agreed to in writing, software
 | 
						|
# distributed under the License is distributed on an "AS IS" BASIS,
 | 
						|
# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
 | 
						|
# See the License for the specific language governing permissions and
 | 
						|
# limitations under the License.
 | 
						|
 | 
						|
"""Warning patterns from other tools."""
 | 
						|
 | 
						|
# No need of doc strings for trivial small functions.
 | 
						|
# pylint:disable=missing-function-docstring
 | 
						|
 | 
						|
# pylint:disable=relative-beyond-top-level
 | 
						|
from .cpp_warn_patterns import compile_patterns
 | 
						|
from .severity import Severity
 | 
						|
 | 
						|
 | 
						|
def warn(name, severity, description, pattern_list):
 | 
						|
  return {
 | 
						|
      'category': name,
 | 
						|
      'severity': severity,
 | 
						|
      'description': name + ': ' + description,
 | 
						|
      'patterns': pattern_list
 | 
						|
  }
 | 
						|
 | 
						|
 | 
						|
def aapt(description, pattern_list):
 | 
						|
  return warn('aapt', Severity.MEDIUM, description, pattern_list)
 | 
						|
 | 
						|
 | 
						|
def misc(description, pattern_list):
 | 
						|
  return warn('logtags', Severity.LOW, description, pattern_list)
 | 
						|
 | 
						|
 | 
						|
def asm(description, pattern_list):
 | 
						|
  return warn('asm', Severity.MEDIUM, description, pattern_list)
 | 
						|
 | 
						|
 | 
						|
def kotlin(description, pattern):
 | 
						|
  return warn('Kotlin', Severity.MEDIUM, description,
 | 
						|
              [r'.*\.kt:.*: warning: ' + pattern])
 | 
						|
 | 
						|
 | 
						|
def yacc(description, pattern_list):
 | 
						|
  return warn('yacc', Severity.MEDIUM, description, pattern_list)
 | 
						|
 | 
						|
 | 
						|
def rust(severity, description, pattern):
 | 
						|
  return warn('Rust', severity, description,
 | 
						|
              [r'.*\.rs:.*: warning: ' + pattern])
 | 
						|
 | 
						|
 | 
						|
warn_patterns = [
 | 
						|
    # pylint does not recognize g-inconsistent-quotes
 | 
						|
    # pylint:disable=line-too-long,bad-option-value,g-inconsistent-quotes
 | 
						|
    # aapt warnings
 | 
						|
    aapt('No comment for public symbol',
 | 
						|
         [r".*: warning: No comment for public symbol .+"]),
 | 
						|
    aapt('No default translation',
 | 
						|
         [r".*: warning: string '.+' has no default translation in .*"]),
 | 
						|
    aapt('Missing default or required localization',
 | 
						|
         [r".*: warning: \*\*\*\* string '.+' has no default or required localization for '.+' in .+"]),
 | 
						|
    aapt('String marked untranslatable, but translation exists',
 | 
						|
         [r".*: warning: string '.+' in .* marked untranslatable but exists in locale '??_??'"]),
 | 
						|
    aapt('empty span in string',
 | 
						|
         [r".*: warning: empty '.+' span found in text '.+"]),
 | 
						|
    # misc warnings
 | 
						|
    misc('Duplicate logtag',
 | 
						|
         [r".*: warning: tag \".+\" \(.+\) duplicated in .+"]),
 | 
						|
    # Assembler warnings
 | 
						|
    asm('ASM value size does not match register size',
 | 
						|
        [r".*: warning: value size does not match register size specified by the constraint and modifier"]),
 | 
						|
    asm('IT instruction is deprecated',
 | 
						|
        [r".*: warning: applying IT instruction .* is deprecated"]),
 | 
						|
    asm('section flags ignored',
 | 
						|
        [r".*: warning: section flags ignored on section redeclaration"]),
 | 
						|
    asm('setjmp/longjmp/vfork changed binding',
 | 
						|
        [r".*: warning: .*(setjmp|longjmp|vfork) changed binding to .*"]),
 | 
						|
    # NDK warnings
 | 
						|
    {'category': 'NDK', 'severity': Severity.HIGH,
 | 
						|
     'description': 'NDK: Generate guard with empty availability, obsoleted',
 | 
						|
     'patterns': [r".*: warning: .* generate guard with empty availability: obsoleted ="]},
 | 
						|
    # Protoc warnings
 | 
						|
    {'category': 'Protoc', 'severity': Severity.MEDIUM,
 | 
						|
     'description': 'Proto: Enum name collision after strip',
 | 
						|
     'patterns': [r".*: warning: Enum .* has the same name .* ignore case and strip"]},
 | 
						|
    {'category': 'Protoc', 'severity': Severity.MEDIUM,
 | 
						|
     'description': 'Proto: Import not used',
 | 
						|
     'patterns': [r".*: warning: Import .*/.*\.proto but not used.$"]},
 | 
						|
    # Kotlin warnings
 | 
						|
    kotlin('never used parameter or variable', '.+ \'.*\' is never used'),
 | 
						|
    kotlin('multiple labels', '.+ more than one label .+ in this scope'),
 | 
						|
    kotlin('type mismatch', 'type mismatch: '),
 | 
						|
    kotlin('is always true', '.+ is always \'true\''),
 | 
						|
    kotlin('no effect', '.+ annotation has no effect for '),
 | 
						|
    kotlin('no cast needed', 'no cast needed'),
 | 
						|
    kotlin('accessor not generated', 'an accessor will not be generated '),
 | 
						|
    kotlin('initializer is redundant', '.* initializer is redundant$'),
 | 
						|
    kotlin('elvis operator always returns ...',
 | 
						|
           'elvis operator (?:) always returns .+'),
 | 
						|
    kotlin('shadowed name', 'name shadowed: .+'),
 | 
						|
    kotlin('unchecked cast', 'unchecked cast: .* to .*$'),
 | 
						|
    kotlin('unreachable code', 'unreachable code'),
 | 
						|
    kotlin('unnecessary assertion', 'unnecessary .+ assertion .+'),
 | 
						|
    kotlin('unnecessary safe call on a non-null receiver',
 | 
						|
           'unnecessary safe call on a non-null receiver'),
 | 
						|
    kotlin('Deprecated in Java',
 | 
						|
           '\'.*\' is deprecated. Deprecated in Java'),
 | 
						|
    kotlin('Replacing Handler for Executor',
 | 
						|
           '.+ Replacing Handler for Executor in '),
 | 
						|
    kotlin('library has Kotlin runtime',
 | 
						|
           '.+ has Kotlin runtime (bundled|library)'),
 | 
						|
    warn('Kotlin', Severity.MEDIUM, 'bundled Kotlin runtime',
 | 
						|
         ['.*warning: .+ (has|have the) Kotlin (runtime|Runtime library) bundled']),
 | 
						|
    kotlin('other warnings', '.+'),  # catch all other Kotlin warnings
 | 
						|
    # Yacc warnings
 | 
						|
    yacc('deprecate directive',
 | 
						|
         [r".*\.yy?:.*: warning: deprecated directive: "]),
 | 
						|
    yacc('reduce/reduce conflicts',
 | 
						|
         [r".*\.yy?: warning: .+ reduce/reduce conflicts "]),
 | 
						|
    yacc('shift/reduce conflicts',
 | 
						|
         [r".*\.yy?: warning: .+ shift/reduce conflicts "]),
 | 
						|
    {'category': 'yacc', 'severity': Severity.SKIP,
 | 
						|
     'description': 'yacc: fix-its can be applied',
 | 
						|
     'patterns': [r".*\.yy?: warning: fix-its can be applied."]},
 | 
						|
    # Rust warnings
 | 
						|
    rust(Severity.HIGH, 'Does not derive Copy', '.+ does not derive Copy'),
 | 
						|
    rust(Severity.MEDIUM, '... are deprecated',
 | 
						|
         ('(.+ are deprecated$|' +
 | 
						|
          'use of deprecated item .* (use .* instead|is now preferred))')),
 | 
						|
    rust(Severity.MEDIUM, 'never used', '.* is never used:'),
 | 
						|
    rust(Severity.MEDIUM, 'unused import', 'unused import: '),
 | 
						|
    rust(Severity.MEDIUM, 'unnecessary attribute',
 | 
						|
         '.+ no longer requires an attribute'),
 | 
						|
    rust(Severity.MEDIUM, 'unnecessary parentheses',
 | 
						|
         'unnecessary parentheses around'),
 | 
						|
    # Catch all RenderScript warnings
 | 
						|
    {'category': 'RenderScript', 'severity': Severity.LOW,
 | 
						|
     'description': 'RenderScript warnings',
 | 
						|
     'patterns': [r'.*\.rscript:.*: warning: ']},
 | 
						|
    {'category': 'RenderScript', 'severity': Severity.HIGH,
 | 
						|
     'description': 'RenderScript is deprecated',
 | 
						|
     'patterns': [r'.*: warning: Renderscript is deprecated:.+']},
 | 
						|
    # Broken/partial warning messages will be skipped.
 | 
						|
    {'category': 'Misc', 'severity': Severity.SKIP,
 | 
						|
     'description': 'skip, ,',
 | 
						|
     'patterns': [r".*: warning: ,?$"]},
 | 
						|
    {'category': 'C/C++', 'severity': Severity.SKIP,
 | 
						|
     'description': 'skip, In file included from ...',
 | 
						|
     'patterns': [r".*: warning: In file included from .+,"]},
 | 
						|
    # catch-all for warnings this script doesn't know about yet
 | 
						|
    {'category': 'C/C++', 'severity': Severity.UNMATCHED,
 | 
						|
     'description': 'Unclassified/unrecognized warnings',
 | 
						|
     'patterns': [r".*: warning: .+"]},
 | 
						|
]
 | 
						|
 | 
						|
 | 
						|
compile_patterns(warn_patterns)
 |