# Path: pygls/lsp/types/basic_structures.py
# class Model(BaseModel):
#     class Config:
#         alias_generator = snake_to_camel
#         allow_population_by_field_name = True
#         fields = {
#             'from_': 'from'
#         }
# 
# class PartialResultParams(Model):
#     partial_result_token: Optional[ProgressToken]
# 
# class Position(Model):
#     line: int
#     character: int
# 
#     def __eq__(self, other):
#         return (
#             isinstance(other, Position)
#             and self.line == other.line
#             and self.character == other.character)
# 
#     def __ge__(self, other):
#         line_gt = self.line > other.line
# 
#         if line_gt:
#             return line_gt
# 
#         if self.line == other.line:
#             return self.character >= other.character
# 
#         return False
# 
#     def __gt__(self, other):
#         line_gt = self.line > other.line
# 
#         if line_gt:
#             return line_gt
# 
#         if self.line == other.line:
#             return self.character > other.character
# 
#         return False
# 
#     def __le__(self, other):
#         line_lt = self.line < other.line
# 
#         if line_lt:
#             return line_lt
# 
#         if self.line == other.line:
#             return self.character <= other.character
# 
#         return False
# 
#     def __lt__(self, other):
#         line_lt = self.line < other.line
# 
#         if line_lt:
#             return line_lt
# 
#         if self.line == other.line:
#             return self.character < other.character
# 
#         return False
# 
#     def __ne__(self, other):
#         return not self.__eq__(other)
# 
#     def __hash__(self):
#         return hash((self.line, self.character))
# 
#     def __iter__(self):
#         return iter((self.line, self.character))
# 
#     def __repr__(self):
#         return f'{self.line}:{self.character}'
# 
# class Range(Model):
#     start: Position
#     end: Position
# 
#     def __eq__(self, other):
#         return (
#             isinstance(other, Range)
#             and self.start == other.start
#             and self.end == other.end)
# 
#     def __hash__(self):
#         return hash((self.start, self.end))
# 
#     def __iter__(self):
#         return iter((self.start, self.end))
# 
#     def __repr__(self):
#         return f'{self.start!r}-{self.end!r}'
# 
# class StaticRegistrationOptions(Model):
#     id: Optional[str]
# 
# class TextDocumentIdentifier(Model):
#     uri: str
# 
# class TextDocumentRegistrationOptions(Model):
#     document_selector: Optional[DocumentSelector]
# 
# class WorkDoneProgressOptions(Model):
#     work_done_progress: Optional[ProgressToken]
# 
# class WorkDoneProgressParams(Model):
#     work_done_token: Optional[ProgressToken]


from typing import List, Optional
from pygls.lsp.types.basic_structures import (Model, PartialResultParams, Position, Range,
                                              StaticRegistrationOptions, TextDocumentIdentifier,
                                              TextDocumentRegistrationOptions,
                                              WorkDoneProgressOptions, WorkDoneProgressParams)
https://microsoft.github.io/language-server-protocol/specification

-- Language Features - Selection Range --

Class attributes are named with camel case notation because client is expecting
that.
"""



class SelectionRangeClientCapabilities(Model):
    dynamic_registration: Optional[bool]


class SelectionRangeOptions(WorkDoneProgressOptions):
    pass


class SelectionRangeRegistrationOptions(SelectionRangeOptions,
                                        TextDocumentRegistrationOptions,
                                        StaticRegistrationOptions):
    pass


class SelectionRangeParams(WorkDoneProgressParams, PartialResultParams):
    query: str
    text_document: TextDocumentIdentifier
    positions: List[Position]



# Path: pygls/lsp/types/basic_structures.py
# class Model(BaseModel):
#     class Config:
#         alias_generator = snake_to_camel
#         allow_population_by_field_name = True
#         fields = {
#             'from_': 'from'
#         }
# 
# class PartialResultParams(Model):
#     partial_result_token: Optional[ProgressToken]
# 
# class Position(Model):
#     line: int
#     character: int
# 
#     def __eq__(self, other):
#         return (
#             isinstance(other, Position)
#             and self.line == other.line
#             and self.character == other.character)
# 
#     def __ge__(self, other):
#         line_gt = self.line > other.line
# 
#         if line_gt:
#             return line_gt
# 
#         if self.line == other.line:
#             return self.character >= other.character
# 
#         return False
# 
#     def __gt__(self, other):
#         line_gt = self.line > other.line
# 
#         if line_gt:
#             return line_gt
# 
#         if self.line == other.line:
#             return self.character > other.character
# 
#         return False
# 
#     def __le__(self, other):
#         line_lt = self.line < other.line
# 
#         if line_lt:
#             return line_lt
# 
#         if self.line == other.line:
#             return self.character <= other.character
# 
#         return False
# 
#     def __lt__(self, other):
#         line_lt = self.line < other.line
# 
#         if line_lt:
#             return line_lt
# 
#         if self.line == other.line:
#             return self.character < other.character
# 
#         return False
# 
#     def __ne__(self, other):
#         return not self.__eq__(other)
# 
#     def __hash__(self):
#         return hash((self.line, self.character))
# 
#     def __iter__(self):
#         return iter((self.line, self.character))
# 
#     def __repr__(self):
#         return f'{self.line}:{self.character}'
# 
# class Range(Model):
#     start: Position
#     end: Position
# 
#     def __eq__(self, other):
#         return (
#             isinstance(other, Range)
#             and self.start == other.start
#             and self.end == other.end)
# 
#     def __hash__(self):
#         return hash((self.start, self.end))
# 
#     def __iter__(self):
#         return iter((self.start, self.end))
# 
#     def __repr__(self):
#         return f'{self.start!r}-{self.end!r}'
# 
# class StaticRegistrationOptions(Model):
#     id: Optional[str]
# 
# class TextDocumentIdentifier(Model):
#     uri: str
# 
# class TextDocumentRegistrationOptions(Model):
#     document_selector: Optional[DocumentSelector]
# 
# class WorkDoneProgressOptions(Model):
#     work_done_progress: Optional[ProgressToken]
# 
# class WorkDoneProgressParams(Model):
#     work_done_token: Optional[ProgressToken]


# Path: pygls/lsp/types/language_features/selection_range.py
from typing import List, Optional
from pygls.lsp.types.basic_structures import (Model, PartialResultParams, Position, Range,
                                              StaticRegistrationOptions, TextDocumentIdentifier,
                                              TextDocumentRegistrationOptions,
                                              WorkDoneProgressOptions, WorkDoneProgressParams)

https://microsoft.github.io/language-server-protocol/specification

-- Language Features - Selection Range --

Class attributes are named with camel case notation because client is expecting
that.
"""



class SelectionRangeClientCapabilities(Model):
    dynamic_registration: Optional[bool]


class SelectionRangeOptions(WorkDoneProgressOptions):
    pass


class SelectionRangeRegistrationOptions(SelectionRangeOptions,
                                        TextDocumentRegistrationOptions,
                                        StaticRegistrationOptions):
    pass


class SelectionRangeParams(WorkDoneProgressParams, PartialResultParams):
    query: str
    text_document: TextDocumentIdentifier
    positions: List[Position]



class SelectionRange(Model):