@@ -39,6 +39,22 @@ class Range:
3939 end : Position
4040
4141
42+ @dataclass (frozen = True )
43+ class TextEdit :
44+ """A text edit to apply to a file."""
45+
46+ range : Range
47+ new_text : str
48+
49+
50+ @dataclass (frozen = True )
51+ class Fix :
52+ """A fix that can be applied to resolve a rule violation."""
53+
54+ title : str
55+ edits : t .List [TextEdit ]
56+
57+
4258class _Rule (abc .ABCMeta ):
4359 def __new__ (cls : Type [_Rule ], clsname : str , bases : t .Tuple , attrs : t .Dict ) -> _Rule :
4460 attrs ["name" ] = clsname .lower ()
@@ -66,10 +82,14 @@ def violation(
6682 self ,
6783 violation_msg : t .Optional [str ] = None ,
6884 violation_range : t .Optional [Range ] = None ,
85+ fixes : t .Optional [t .List [Fix ]] = None ,
6986 ) -> RuleViolation :
7087 """Create a RuleViolation instance for this rule"""
7188 return RuleViolation (
72- rule = self , violation_msg = violation_msg or self .summary , violation_range = violation_range
89+ rule = self ,
90+ violation_msg = violation_msg or self .summary ,
91+ violation_range = violation_range ,
92+ fixes = fixes ,
7393 )
7494
7595 def get_definition_location (self ) -> RuleLocation :
@@ -103,11 +123,16 @@ def __repr__(self) -> str:
103123
104124class RuleViolation :
105125 def __init__ (
106- self , rule : Rule , violation_msg : str , violation_range : t .Optional [Range ] = None
126+ self ,
127+ rule : Rule ,
128+ violation_msg : str ,
129+ violation_range : t .Optional [Range ] = None ,
130+ fixes : t .Optional [t .List [Fix ]] = None ,
107131 ) -> None :
108132 self .rule = rule
109133 self .violation_msg = violation_msg
110134 self .violation_range = violation_range
135+ self .fixes = fixes or []
111136
112137 def __repr__ (self ) -> str :
113138 return f"{ self .rule .name } : { self .violation_msg } "
0 commit comments