22
22
package com .github ._1c_syntax .bsl .languageserver .context .computer ;
23
23
24
24
import com .github ._1c_syntax .bsl .languageserver .context .DocumentContext ;
25
+ import com .github ._1c_syntax .bsl .languageserver .context .symbol .MethodSymbol ;
26
+ import com .github ._1c_syntax .bsl .languageserver .context .symbol .annotations .Annotation ;
27
+ import com .github ._1c_syntax .bsl .languageserver .context .symbol .annotations .AnnotationKind ;
25
28
import com .github ._1c_syntax .bsl .languageserver .diagnostics .metadata .DiagnosticCode ;
29
+ import com .github ._1c_syntax .bsl .parser .BSLLexer ;
26
30
import com .github ._1c_syntax .utils .CaseInsensitivePattern ;
27
31
import lombok .AllArgsConstructor ;
28
32
import org .antlr .v4 .runtime .Token ;
38
42
import java .util .List ;
39
43
import java .util .Map ;
40
44
import java .util .Set ;
45
+ import java .util .TreeMap ;
41
46
import java .util .function .Predicate ;
42
47
import java .util .regex .Matcher ;
43
48
import java .util .regex .Pattern ;
44
49
import java .util .stream .Collectors ;
45
50
51
+ import static org .antlr .v4 .runtime .Token .HIDDEN_CHANNEL ;
52
+
46
53
public class DiagnosticIgnoranceComputer implements Computer <DiagnosticIgnoranceComputer .Data > {
47
54
48
55
private static final DiagnosticCode ALL_DIAGNOSTICS_KEY = new DiagnosticCode ("all" );
@@ -82,6 +89,54 @@ public Data compute() {
82
89
if (codeTokens .isEmpty ()) {
83
90
return new Data (diagnosticIgnorance );
84
91
}
92
+
93
+ computeCommentsIgnorance (codeTokens );
94
+ computeExtensionIgnorance ();
95
+
96
+ return new Data (diagnosticIgnorance );
97
+ }
98
+
99
+ private void computeExtensionIgnorance () {
100
+ var lines = new TreeMap <Integer , Boolean >();
101
+
102
+ documentContext .getSymbolTree ()
103
+ .getMethods ().stream ()
104
+ .filter (
105
+ method -> method .getAnnotations ().stream ()
106
+ .map (Annotation ::getKind )
107
+ .anyMatch (kind -> kind == AnnotationKind .CHANGEANDVALIDATE )
108
+ ).forEach ((MethodSymbol methodSymbol ) -> {
109
+ lines .put (methodSymbol .getRange ().getStart ().getLine (), true );
110
+ lines .put (methodSymbol .getRange ().getEnd ().getLine (), false );
111
+ });
112
+
113
+ // not extended method
114
+ if (lines .isEmpty ()) {
115
+ return ;
116
+ }
117
+
118
+ documentContext .getTokens ().stream ()
119
+ .filter (token -> token .getChannel () == HIDDEN_CHANNEL )
120
+ .filter (token -> token .getType () == BSLLexer .PREPROC_INSERT || token .getType () == BSLLexer .PREPROC_ENDINSERT )
121
+ .forEach (token -> lines .put (token .getLine (), token .getType () == BSLLexer .PREPROC_ENDINSERT ));
122
+
123
+ var lastTokenLine = -1 ;
124
+ var tokenLine = -1 ;
125
+
126
+ for (Map .Entry <Integer , Boolean > entry : lines .entrySet ()) {
127
+
128
+ if (Boolean .TRUE .equals (entry .getValue ())) {
129
+ tokenLine = entry .getKey ();
130
+ } else {
131
+ lastTokenLine = entry .getKey ();
132
+ addIgnoredRange (ALL_DIAGNOSTICS_KEY , tokenLine , lastTokenLine );
133
+ }
134
+
135
+ }
136
+
137
+ }
138
+
139
+ private void computeCommentsIgnorance (List <Token > codeTokens ) {
85
140
Set <Integer > codeLines = codeTokens .stream ().map (Token ::getLine ).collect (Collectors .toSet ());
86
141
87
142
List <Token > comments = documentContext .getComments ();
@@ -102,8 +157,6 @@ public Data compute() {
102
157
ignoranceStack .forEach ((DiagnosticCode diagnosticKey , Deque <Integer > ignoreRangeStarts ) ->
103
158
ignoreRangeStarts .forEach (ignoreRangeStart -> addIgnoredRange (diagnosticKey , ignoreRangeStart , lastTokenLine ))
104
159
);
105
-
106
- return new Data (diagnosticIgnorance );
107
160
}
108
161
109
162
private boolean checkTrailingComment (Set <Integer > codeLines , Token comment ) {
0 commit comments