use of com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticCode in project bsl-language-server by 1c-syntax.
the class DiagnosticIgnoranceComputer method checkTrailingComment.
private boolean checkTrailingComment(Set<Integer> codeLines, Token comment) {
int commentLine = comment.getLine();
if (!codeLines.contains(commentLine)) {
return false;
}
DiagnosticCode key = checkIgnoreOff(IGNORE_ALL_OFF, comment);
if (key == null) {
key = checkIgnoreOff(IGNORE_DIAGNOSTIC_OFF, comment);
}
if (key == null) {
return false;
}
Deque<Integer> stack = ignoranceStack.get(key);
stack.pop();
addIgnoredRange(key, commentLine, commentLine);
return true;
}
use of com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticCode in project bsl-language-server by 1c-syntax.
the class DiagnosticIgnoranceComputer method compute.
@Override
public Data compute() {
diagnosticIgnorance.clear();
ignoranceStack.clear();
List<Token> codeTokens = documentContext.getTokensFromDefaultChannel();
if (codeTokens.isEmpty()) {
return new Data(diagnosticIgnorance);
}
Set<Integer> codeLines = codeTokens.stream().map(Token::getLine).collect(Collectors.toSet());
List<Token> comments = documentContext.getComments();
for (Token comment : comments) {
// Variable is used for short circuit evaluation.
// noinspection unused
boolean ignored = checkTrailingComment(codeLines, comment) || checkIgnoreOff(IGNORE_ALL_OFF, comment) != null || checkIgnoreOn(IGNORE_ALL_ON, comment) || checkIgnoreOff(IGNORE_DIAGNOSTIC_OFF, comment) != null || checkIgnoreOn(IGNORE_DIAGNOSTIC_ON, comment);
}
int lastTokenLine = codeTokens.get(codeTokens.size() - 1).getLine();
ignoranceStack.forEach((DiagnosticCode diagnosticKey, Deque<Integer> ignoreRangeStarts) -> ignoreRangeStarts.forEach(ignoreRangeStart -> addIgnoredRange(diagnosticKey, ignoreRangeStart, lastTokenLine)));
return new Data(diagnosticIgnorance);
}
use of com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticCode in project bsl-language-server by 1c-syntax.
the class FixAllCodeActionSupplier method getFixAllCodeAction.
private List<CodeAction> getFixAllCodeAction(Either<String, Integer> diagnosticCode, CodeActionParams params, DocumentContext documentContext) {
Optional<Class<? extends QuickFixProvider>> quickFixClass = quickFixSupplier.getQuickFixClass(diagnosticCode);
if (quickFixClass.isEmpty()) {
return Collections.emptyList();
}
List<Diagnostic> suitableDiagnostics = documentContext.getComputedDiagnostics().stream().filter(diagnostic -> diagnosticCode.equals(diagnostic.getCode())).collect(Collectors.toList());
// if incomingDiagnostics list has size = 1 - it will be displayed as regular quick fix
if (suitableDiagnostics.size() < ADD_FIX_ALL_DIAGNOSTICS_THRESHOLD) {
return Collections.emptyList();
}
CodeActionContext fixAllContext = new CodeActionContext();
fixAllContext.setDiagnostics(suitableDiagnostics);
fixAllContext.setOnly(Collections.singletonList(CodeActionKind.QuickFix));
CodeActionParams fixAllParams = new CodeActionParams();
fixAllParams.setTextDocument(params.getTextDocument());
fixAllParams.setRange(params.getRange());
fixAllParams.setContext(fixAllContext);
Class<? extends QuickFixProvider> quickFixProviderClass = quickFixClass.get();
QuickFixProvider quickFixInstance = quickFixSupplier.getQuickFixInstance(quickFixProviderClass);
return quickFixInstance.getQuickFixes(suitableDiagnostics, fixAllParams, documentContext);
}
use of com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticCode in project bsl-language-server by 1c-syntax.
the class CodeActionProviderTest method testGetCodeActions.
@Test
void testGetCodeActions() {
// given
DiagnosticInfo diagnosticInfo = new DiagnosticInfo(CanonicalSpellingKeywordsDiagnostic.class, configuration);
DiagnosticCode diagnosticCode = diagnosticInfo.getCode();
List<Diagnostic> diagnostics = documentContext.getDiagnostics().stream().filter(diagnostic -> diagnostic.getCode().equals(diagnosticCode)).peek(diagnostic -> diagnostic.setTags(null)).collect(Collectors.toList());
CodeActionParams params = new CodeActionParams();
TextDocumentIdentifier textDocumentIdentifier = new TextDocumentIdentifier(documentContext.getUri().toString());
CodeActionContext codeActionContext = new CodeActionContext();
codeActionContext.setDiagnostics(diagnostics);
params.setRange(new Range());
params.setTextDocument(textDocumentIdentifier);
params.setContext(codeActionContext);
// when
List<Either<Command, CodeAction>> codeActions = codeActionProvider.getCodeActions(params, documentContext);
// then
assertThat(codeActions).extracting(Either::getRight).hasSizeGreaterThanOrEqualTo(3).anyMatch(codeAction -> codeAction.getDiagnostics().contains(diagnostics.get(0))).anyMatch(codeAction -> codeAction.getDiagnostics().contains(diagnostics.get(1))).anyMatch(codeAction -> codeAction.getKind().equals(CodeActionKind.QuickFix)).allMatch(codeAction -> (codeAction.getDiagnostics().size() == 1) == toBoolean(codeAction.getIsPreferred()));
}
use of com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticCode in project bsl-language-server by 1c-syntax.
the class SmokyTest method testIAllDiagnostics.
@SneakyThrows
@Test
void testIAllDiagnostics() {
// прочитаем все файлы ресурсов
var srcDir = "./src/test/resources/";
var fixtures = FileUtils.listFiles(new File(srcDir), new String[] { "bsl", "os" }, true);
// получим все возможные коды диагностик и положим в мапу "включенным"
Map<String, Either<Boolean, Map<String, Object>>> diagnostics = diagnosticInfos.stream().map(DiagnosticInfo::getCode).collect(Collectors.toMap(diagnosticCode -> diagnosticCode.getStringValue(), diagnosticCode -> Either.forLeft(true), (a, b) -> b));
// создадим новый конфиг, в котором включим все диагностики
configuration.getDiagnosticsOptions().setParameters(diagnostics);
// для каждой фикстуры расчитаем диагностики
// если упадет, запомним файл и текст ошибки
Map<File, Exception> diagnosticErrors = new HashMap<>();
fixtures.forEach(filePath -> {
try {
var documentContext = TestUtils.getDocumentContextFromFile(filePath.toString());
documentContext.getDiagnostics();
} catch (Exception e) {
diagnosticErrors.put(filePath, e);
}
});
assertThat(diagnosticErrors).isEmpty();
}
Aggregations