# Generated by the protocol buffer compiler.  DO NOT EDIT!
# source: warnings.proto

import sys
_b = sys.version_info[0] < 3 and (lambda x: x) or (lambda x: x.encode('latin1'))
from google.protobuf import descriptor as _descriptor
from google.protobuf import message as _message
from google.protobuf import reflection as _reflection
from google.protobuf import symbol_database as _symbol_database
from google.protobuf import descriptor_pb2
# @@protoc_insertion_point(imports)

_sym_db = _symbol_database.Default()

DESCRIPTOR = _descriptor.FileDescriptor(
    name='warnings.proto',
    package='clang_tidy',
    syntax='proto2',
    serialized_pb=_b(
        '\n\x0ewarnings.proto\x12\nclang_tidy\"\xad\x02\n\x07Warning\x12\x33\n\x08severity\x18\x01 \x01(\x0e\x32!.clang_tidy.Warning.SeverityClass\x12\x14\n\x0cwarning_text\x18\x02 \x01(\t\x12\x11\n\tfile_path\x18\x04 \x01(\t\x12\x13\n\x0bline_number\x18\x05 \x01(\x05\x12\x12\n\ncol_number\x18\x06 \x01(\x05\x12 \n\x18matching_compiler_output\x18\x07 \x01(\t\"y\n\rSeverityClass\x12\x0b\n\x07UNKNOWN\x10\x00\x12\x0c\n\x08\x46IXMENOW\x10\x01\x12\x08\n\x04HIGH\x10\x02\x12\n\n\x06MEDIUM\x10\x03\x12\x07\n\x03LOW\x10\x04\x12\x0c\n\x08\x41NALYZER\x10\x05\x12\x08\n\x04TIDY\x10\x06\x12\x0c\n\x08HARMLESS\x10\x07\x12\x08\n\x04SKIP\x10\x08'
    ))

_WARNING_SEVERITYCLASS = _descriptor.EnumDescriptor(
    name='SeverityClass',
    full_name='clang_tidy.Warning.SeverityClass',
    filename=None,
    file=DESCRIPTOR,
    values=[
        _descriptor.EnumValueDescriptor(
            name='UNKNOWN', index=0, number=0, options=None, type=None),
        _descriptor.EnumValueDescriptor(
            name='FIXMENOW', index=1, number=1, options=None, type=None),
        _descriptor.EnumValueDescriptor(
            name='HIGH', index=2, number=2, options=None, type=None),
        _descriptor.EnumValueDescriptor(
            name='MEDIUM', index=3, number=3, options=None, type=None),
        _descriptor.EnumValueDescriptor(
            name='LOW', index=4, number=4, options=None, type=None),
        _descriptor.EnumValueDescriptor(
            name='ANALYZER', index=5, number=5, options=None, type=None),
        _descriptor.EnumValueDescriptor(
            name='TIDY', index=6, number=6, options=None, type=None),
        _descriptor.EnumValueDescriptor(
            name='HARMLESS', index=7, number=7, options=None, type=None),
        _descriptor.EnumValueDescriptor(
            name='SKIP', index=8, number=8, options=None, type=None),
    ],
    containing_type=None,
    options=None,
    serialized_start=211,
    serialized_end=332,
)
_sym_db.RegisterEnumDescriptor(_WARNING_SEVERITYCLASS)

_WARNING = _descriptor.Descriptor(
    name='Warning',
    full_name='clang_tidy.Warning',
    filename=None,
    file=DESCRIPTOR,
    containing_type=None,
    fields=[
        _descriptor.FieldDescriptor(
            name='severity',
            full_name='clang_tidy.Warning.severity',
            index=0,
            number=1,
            type=14,
            cpp_type=8,
            label=1,
            has_default_value=False,
            default_value=0,
            message_type=None,
            enum_type=None,
            containing_type=None,
            is_extension=False,
            extension_scope=None,
            options=None),
        _descriptor.FieldDescriptor(
            name='warning_text',
            full_name='clang_tidy.Warning.warning_text',
            index=1,
            number=2,
            type=9,
            cpp_type=9,
            label=1,
            has_default_value=False,
            default_value=_b("").decode('utf-8'),
            message_type=None,
            enum_type=None,
            containing_type=None,
            is_extension=False,
            extension_scope=None,
            options=None),
        _descriptor.FieldDescriptor(
            name='file_path',
            full_name='clang_tidy.Warning.file_path',
            index=2,
            number=4,
            type=9,
            cpp_type=9,
            label=1,
            has_default_value=False,
            default_value=_b("").decode('utf-8'),
            message_type=None,
            enum_type=None,
            containing_type=None,
            is_extension=False,
            extension_scope=None,
            options=None),
        _descriptor.FieldDescriptor(
            name='line_number',
            full_name='clang_tidy.Warning.line_number',
            index=3,
            number=5,
            type=5,
            cpp_type=1,
            label=1,
            has_default_value=False,
            default_value=0,
            message_type=None,
            enum_type=None,
            containing_type=None,
            is_extension=False,
            extension_scope=None,
            options=None),
        _descriptor.FieldDescriptor(
            name='col_number',
            full_name='clang_tidy.Warning.col_number',
            index=4,
            number=6,
            type=5,
            cpp_type=1,
            label=1,
            has_default_value=False,
            default_value=0,
            message_type=None,
            enum_type=None,
            containing_type=None,
            is_extension=False,
            extension_scope=None,
            options=None),
        _descriptor.FieldDescriptor(
            name='matching_compiler_output',
            full_name='clang_tidy.Warning.matching_compiler_output',
            index=5,
            number=7,
            type=9,
            cpp_type=9,
            label=1,
            has_default_value=False,
            default_value=_b("").decode('utf-8'),
            message_type=None,
            enum_type=None,
            containing_type=None,
            is_extension=False,
            extension_scope=None,
            options=None),
    ],
    extensions=[],
    nested_types=[],
    enum_types=[
        _WARNING_SEVERITYCLASS,
    ],
    options=None,
    is_extendable=False,
    syntax='proto2',
    extension_ranges=[],
    oneofs=[],
    serialized_start=31,
    serialized_end=332,
)

_WARNING.fields_by_name['severity'].enum_type = _WARNING_SEVERITYCLASS
_WARNING_SEVERITYCLASS.containing_type = _WARNING
DESCRIPTOR.message_types_by_name['Warning'] = _WARNING
_sym_db.RegisterFileDescriptor(DESCRIPTOR)

Warning = _reflection.GeneratedProtocolMessageType(
    'Warning',
    (_message.Message,),
    dict(
        DESCRIPTOR=_WARNING,
        __module__='warnings_pb2'
        # @@protoc_insertion_point(class_scope:clang_tidy.Warning)
    ))
_sym_db.RegisterMessage(Warning)

# @@protoc_insertion_point(module_scope)
