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()
Esempio n. 3
0
 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
Esempio n. 4
0
    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))
Esempio n. 5
0
    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)