def parseFile(self, inputStream): self.lineNumber = 1 pprev = None prev = None temp = None isEmptyLine = False prevEmptyLine = False multiline = False for validator in self.simpleValidators: validator.reset(self.path) for rawLine in inputStream: line = rawLine.decode('utf8') line = line.strip('\n') pprev = prev prev = temp temp = re.sub('\t', ' ', line) for validator in self.simpleValidators: validator.check(self.lineNumber, line) prevEmptyLine = isEmptyLine isEmptyLine = True if re.match(self.patternEmptyLine, line) else False if isEmptyLine and prevEmptyLine: self.errorReporter( 'consecutiveEmpty', Line(self.path, pprev + prev + temp, self.lineNumber)) if multiline: multiline = self.processContinuation(line) else: if re.match(self.patternInclude, line): self.parseInclude(line) self.fixes.append( IndentFix(MultilineMacro.PpLine, self.lineNumber, line)) elif re.match(self.patternPreprocessor, line): self.parsePreprocessor(line) multiline = self.processPreprocessor(line) elif re.match(self.patternExtern, line): self.parseExtern(line) self.lineNumber += 1 if prev and not prev.strip(): self.errorReporter( 'emptyNearEnd', Line(self.path, pprev + prev + temp, self.lineNumber)) for validator in self.simpleValidators: validator.finalize()
def parse_file(self, input_stream): self.line_number = 1 pprev = None prev = None temp = None is_empty_line = False prev_empty_line = False multiline = False for validator in self.simple_validators: validator.reset(self.path, self.error_reporter) for raw_line in input_stream: line = raw_line.decode('utf8') line = line.strip('\n') pprev = prev prev = temp temp = re.sub('\t', ' ', line) for validator in self.simple_validators: validator.check(self.line_number, line) prev_empty_line = is_empty_line is_empty_line = bool(self.PATTERN_EMPTY_LINE.match(line)) if is_empty_line and prev_empty_line: self.error_reporter( 'consecutiveEmpty', Line(self.path, pprev + prev + temp, self.line_number)) if multiline: multiline = self.process_continuation(line) else: if self.PATTERN_INCLUDE.match(line): self.parse_include(line) self.fixes.append( IndentFix(MultilineMacro.PPLINE, self.line_number, line)) elif self.PATTERN_PREPROCESSOR.match(line): self.parse_preprocessor(line) multiline = self.process_preprocessor(line) elif self.PATTERN_EXTERN.match(line): self.parse_extern(line) self.line_number += 1 if prev and not prev.strip(): self.error_reporter( 'emptyNearEnd', Line(self.path, pprev + prev + temp, self.line_number)) for validator in self.simple_validators: validator.finalize()
def reportIndents(self): firstContinuation = False for fix in self.fixes: if MultilineMacro.PpLine == fix.type: if re.match(r'\s+', fix.line): errorMsg = 'preprocessor should be aligned to column 0' self.errorReporter('indentedPreprocessor', Line(self.path, fix.line.strip('\n\r'), fix.lineno, errorMsg)) firstContinuation = True else: if firstContinuation: tabsMatch = re.match(r'^\t+', fix.line) tabsCount = len(tabsMatch.group(0)) if tabsMatch else 0 if 1 != tabsCount: errorMsg = 'first continuation must have single indent' self.errorReporter('indentedPreprocessor', Line(self.path, fix.line.strip('\n\r'), fix.lineno, errorMsg)) firstContinuation = False
def _parseNormalPrecompMacro(self, tok): if self.namespaceStack and tok.value.startswith('#include'): self.namespaceStack[-1].hadInclude = True info('HAD INCLUDE') if not self.namespaceStack and re.match(r'#define [A-Z_]*TEST_CLASS ', tok.value): errorMsg = '`#define TEST_CLASS` outside of any namespace' self.errorReporter('preprocessorOther', Line(self.path, '', tok.lineno, errorMsg))
def addNamespace(self): name = '::'.join(map(lambda c: c.current, self.namespaceStack)) if ANON_NS_FAKENAME in name: if self.path.endswith('.h'): self.errorReporter('anonNamespace', Line(self.path, name, self.tok.lineno)) current = self.namespaceStack.pop() current.name = name dummy = NamespaceInfo('') dummy.name = name if dummy not in self.namespaces: self.namespaces.add(current) info('adding namespace ', current) else: for i in self.namespaces: if i != dummy: continue i |= current info('merging namespace ', current)