diff --git a/.github/workflows/gradle.yml b/.github/workflows/gradle.yml index bc55da3b33f..8291c6c0fa5 100644 --- a/.github/workflows/gradle.yml +++ b/.github/workflows/gradle.yml @@ -48,8 +48,26 @@ jobs: - name: Build with Gradle run: ./gradlew check --stacktrace - name: Archive test results - if: failure() + if: always() uses: actions/upload-artifact@v5 with: - name: junit_report_${{ matrix.os }}_${{ matrix.java_version }} - path: build/reports/tests/test + name: Test Results (Java ${{ matrix.java_version }}.${{ matrix.os }}) + path: "**/test-results/test/**/*.xml" + publish-test-results: + needs: [gatekeeper, check-pr-exists, build] + runs-on: ubuntu-latest + permissions: + checks: write + pull-requests: write + contents: read + issues: read + if: always() + steps: + - name: Download Artifacts + uses: actions/download-artifact@v6 + with: + path: artifacts + - name: Publish Test Results + uses: EnricoMi/publish-unit-test-result-action@v2 + with: + junit_files: "artifacts/**/*.xml" diff --git a/build.gradle.kts b/build.gradle.kts index b95730e3d38..c44cefa6a55 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -453,6 +453,8 @@ tasks.withType { } tasks.register("updateLicenses") { + description = "Wrapper for licenseFormat" + group = "license" dependsOn(tasks.licenseFormat) } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServer.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServer.java index 69ffb674eca..e09e91c7c64 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServer.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLLanguageServer.java @@ -67,6 +67,7 @@ import org.eclipse.lsp4j.services.LanguageServer; import org.eclipse.lsp4j.services.TextDocumentService; import org.eclipse.lsp4j.services.WorkspaceService; +import org.jspecify.annotations.Nullable; import org.springframework.stereotype.Component; import java.io.File; @@ -106,7 +107,7 @@ public class BSLLanguageServer implements LanguageServer, ProtocolExtension { public CompletableFuture initialize(InitializeParams params) { clientCapabilitiesHolder.setCapabilities(params.getCapabilities()); - + setConfigurationRoot(params); var capabilities = new ServerCapabilities(); @@ -142,7 +143,7 @@ private void setConfigurationRoot(InitializeParams params) { return; } - String rootUri = workspaceFolders.get(0).getUri(); + var rootUri = workspaceFolders.get(0).getUri(); Path rootPath; try { rootPath = new File(new URI(rootUri).getPath()).getCanonicalFile().toPath(); @@ -151,7 +152,7 @@ private void setConfigurationRoot(InitializeParams params) { return; } - Path configurationRoot = LanguageServerConfiguration.getCustomConfigurationRoot( + var configurationRoot = LanguageServerConfiguration.getCustomConfigurationRoot( configuration, rootPath); context.setConfigurationRoot(configurationRoot); @@ -163,7 +164,7 @@ public void initialized(InitializedParams params) { var executorService = new ForkJoinPool(ForkJoinPool.getCommonPoolParallelism(), factory, null, true); CompletableFuture .runAsync(context::populateContext, executorService) - .whenComplete((unused, throwable) -> { + .whenComplete((Void unused, @Nullable Throwable throwable) -> { executorService.shutdown(); if (throwable != null) { LOGGER.error("Error populating context", throwable); diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java index 7a51bbef6c2..58cfa9c6550 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/BSLTextDocumentService.java @@ -94,10 +94,10 @@ import org.eclipse.lsp4j.ReferenceParams; import org.eclipse.lsp4j.RelatedFullDocumentDiagnosticReport; import org.eclipse.lsp4j.RenameParams; -import org.eclipse.lsp4j.SemanticTokens; -import org.eclipse.lsp4j.SemanticTokensParams; import org.eclipse.lsp4j.SelectionRange; import org.eclipse.lsp4j.SelectionRangeParams; +import org.eclipse.lsp4j.SemanticTokens; +import org.eclipse.lsp4j.SemanticTokensParams; import org.eclipse.lsp4j.SymbolInformation; import org.eclipse.lsp4j.TextDocumentClientCapabilities; import org.eclipse.lsp4j.TextDocumentContentChangeEvent; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/ClientCapabilitiesHolder.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/ClientCapabilitiesHolder.java index ac9c3fba311..9212dda994a 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/ClientCapabilitiesHolder.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/ClientCapabilitiesHolder.java @@ -27,6 +27,7 @@ import lombok.ToString; import org.eclipse.lsp4j.ClientCapabilities; import org.eclipse.lsp4j.InitializeParams; +import org.jspecify.annotations.Nullable; import org.springframework.stereotype.Component; import java.util.Optional; @@ -46,7 +47,7 @@ public class ClientCapabilitiesHolder { * Возможности клиента. */ @Setter - private ClientCapabilities capabilities; + private @Nullable ClientCapabilities capabilities; /** * Получить возможности клиента, если было произведено подключение клиента к серверу. diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/LanguageClientHolder.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/LanguageClientHolder.java index d80d9c1cced..c327583ef7c 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/LanguageClientHolder.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/LanguageClientHolder.java @@ -21,10 +21,10 @@ */ package com.github._1c_syntax.bsl.languageserver; -import org.jspecify.annotations.Nullable; import lombok.NoArgsConstructor; import org.eclipse.lsp4j.services.LanguageClient; import org.eclipse.lsp4j.services.LanguageClientAware; +import org.jspecify.annotations.Nullable; import org.springframework.stereotype.Component; import java.util.Optional; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/EventPublisherAspect.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/EventPublisherAspect.java index 1b783a76a73..fbc7a12d0ad 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/EventPublisherAspect.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/EventPublisherAspect.java @@ -37,6 +37,7 @@ import org.aspectj.lang.annotation.Aspect; import org.eclipse.lsp4j.InitializeParams; import org.eclipse.lsp4j.services.LanguageServer; +import org.jspecify.annotations.Nullable; import org.springframework.context.ApplicationEvent; import org.springframework.context.ApplicationEventPublisher; import org.springframework.context.ApplicationEventPublisherAware; @@ -57,6 +58,7 @@ public class EventPublisherAspect implements ApplicationEventPublisherAware { private boolean active; + @SuppressWarnings("NullAway.Init") private ApplicationEventPublisher applicationEventPublisher; @PreDestroy @@ -100,7 +102,7 @@ public void languageServerInitialize(JoinPoint joinPoint, InitializeParams initi } private void publishEvent(ApplicationEvent event) { - if (!active) { + if (!active || applicationEventPublisher == null) { LOGGER.warn("Trying to send event in not active event publisher."); return; } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/MeasuresAspect.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/MeasuresAspect.java index 27efe5b59ca..9f0c3be9bf7 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/MeasuresAspect.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/MeasuresAspect.java @@ -34,6 +34,7 @@ import org.aspectj.lang.annotation.Around; import org.aspectj.lang.annotation.Aspect; import org.aspectj.lang.annotation.Before; +import org.jspecify.annotations.Nullable; import org.springframework.beans.factory.annotation.Autowired; import java.io.File; @@ -50,7 +51,7 @@ public class MeasuresAspect { @Setter(onMethod = @__({@Autowired})) - private MeasureCollector measureCollector; + private @Nullable MeasureCollector measureCollector; @PreDestroy void destroy() { diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/SentryAspect.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/SentryAspect.java index 62a48c475d2..fe6b0218a1b 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/SentryAspect.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/SentryAspect.java @@ -23,7 +23,6 @@ import com.github._1c_syntax.bsl.languageserver.LanguageClientHolder; import com.github._1c_syntax.bsl.languageserver.utils.Resources; -import org.jspecify.annotations.Nullable; import io.sentry.Sentry; import io.sentry.protocol.SentryId; import jakarta.annotation.PostConstruct; @@ -34,6 +33,7 @@ import org.aspectj.lang.annotation.Aspect; import org.eclipse.lsp4j.MessageParams; import org.eclipse.lsp4j.MessageType; +import org.jspecify.annotations.Nullable; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.concurrent.CustomizableThreadFactory; @@ -82,19 +82,21 @@ public void logThrowingLSPCall(Throwable ex) { private void logException(Throwable ex) { CompletableFuture.runAsync(() -> { - SentryId sentryId = Sentry.captureException(ex); - if (sentryId.equals(SentryId.EMPTY_ID)) { - return; - } - if (languageClientHolder == null) { - return; - } - var messageType = MessageType.Info; - var message = resources.getResourceString(getClass(), "logMessage", sentryId); - var messageParams = new MessageParams(messageType, message); + var sentryId = Sentry.captureException(ex); + if (sentryId.equals(SentryId.EMPTY_ID)) { + return; + } + + if (languageClientHolder == null) { + return; + } + var messageType = MessageType.Info; + var message = resources.getResourceString(getClass(), "logMessage", sentryId); + var messageParams = new MessageParams(messageType, message); - languageClientHolder.execIfConnected(languageClient -> languageClient.showMessage(messageParams)); - }, executorService); + languageClientHolder.execIfConnected(languageClient -> languageClient.showMessage(messageParams)); + }, + executorService); } } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/sentry/PermissionFilterBeforeSendCallback.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/sentry/PermissionFilterBeforeSendCallback.java index 06e61ece710..8a7cac2aa83 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/sentry/PermissionFilterBeforeSendCallback.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/aop/sentry/PermissionFilterBeforeSendCallback.java @@ -27,11 +27,9 @@ import com.github._1c_syntax.bsl.languageserver.configuration.LanguageServerConfiguration; import com.github._1c_syntax.bsl.languageserver.configuration.SendErrorsMode; import com.github._1c_syntax.bsl.languageserver.utils.Resources; -import org.jspecify.annotations.Nullable; import io.sentry.Hint; import io.sentry.SentryEvent; import io.sentry.SentryOptions.BeforeSendCallback; -import lombok.NonNull; import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.eclipse.lsp4j.MessageActionItem; @@ -39,6 +37,7 @@ import org.eclipse.lsp4j.ServerInfo; import org.eclipse.lsp4j.ShowMessageRequestParams; import org.eclipse.lsp4j.services.LanguageClient; +import org.jspecify.annotations.Nullable; import org.springframework.stereotype.Component; import java.util.LinkedHashMap; @@ -71,7 +70,7 @@ public class PermissionFilterBeforeSendCallback implements BeforeSendCallback { private final AtomicBoolean questionWasSend = new AtomicBoolean(false); @Override - public SentryEvent execute(@NonNull SentryEvent event, @NonNull Hint hint) { + public @Nullable SentryEvent execute(SentryEvent event, Hint hint) { if (sendToSentry()) { return event; } @@ -132,8 +131,7 @@ private CompletableFuture askUserForPermission(LanguageClient return languageClient.showMessageRequest(requestParams); } - @Nullable - private MessageActionItem waitForPermission(CompletableFuture sendQuestion) { + @Nullable private MessageActionItem waitForPermission(CompletableFuture sendQuestion) { try { return sendQuestion.get(); } catch (InterruptedException e) { diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/cfg/CfgBuildingParseTreeVisitor.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/cfg/CfgBuildingParseTreeVisitor.java index f15945e8c45..4494b8d8a23 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/cfg/CfgBuildingParseTreeVisitor.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/cfg/CfgBuildingParseTreeVisitor.java @@ -28,8 +28,8 @@ import org.antlr.v4.runtime.tree.ParseTree; import org.jspecify.annotations.NullUnmarked; -import java.util.ArrayList; import java.util.ArrayDeque; +import java.util.ArrayList; import java.util.Deque; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/cfg/ControlFlowGraph.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/cfg/ControlFlowGraph.java index ff1c5afae1c..4c0995b62bc 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/cfg/ControlFlowGraph.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/cfg/ControlFlowGraph.java @@ -29,6 +29,7 @@ public class ControlFlowGraph extends DefaultDirectedGraph { @Setter + @SuppressWarnings("NullAway.Init") private CfgVertex entryPoint; private final ExitVertex exitPoint; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/cfg/ControlFlowGraphWalker.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/cfg/ControlFlowGraphWalker.java index acc42026a7f..d0b6003a8f1 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/cfg/ControlFlowGraphWalker.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/cfg/ControlFlowGraphWalker.java @@ -24,6 +24,7 @@ import lombok.Getter; import lombok.RequiredArgsConstructor; +import java.util.Objects; import java.util.Set; @RequiredArgsConstructor @@ -34,7 +35,7 @@ public class ControlFlowGraphWalker { private CfgVertex currentNode; public void start() { - currentNode = graph.getEntryPoint(); + currentNode = Objects.requireNonNull(graph.getEntryPoint()); } public Set availableRoutes() { diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/cli/lsp/FileAwarePrintWriter.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/cli/lsp/FileAwarePrintWriter.java index 4b673ec6ff1..9427ca5746c 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/cli/lsp/FileAwarePrintWriter.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/cli/lsp/FileAwarePrintWriter.java @@ -22,9 +22,9 @@ package com.github._1c_syntax.bsl.languageserver.cli.lsp; import com.github._1c_syntax.bsl.languageserver.configuration.events.LanguageServerConfigurationChangedEvent; -import org.jspecify.annotations.Nullable; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; +import org.jspecify.annotations.Nullable; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codelenses/AbstractRunTestsCodeLensSupplier.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codelenses/AbstractRunTestsCodeLensSupplier.java index d6974c54646..9277a8f5c87 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/codelenses/AbstractRunTestsCodeLensSupplier.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/codelenses/AbstractRunTestsCodeLensSupplier.java @@ -27,10 +27,10 @@ import com.github._1c_syntax.bsl.languageserver.context.FileType; import com.github._1c_syntax.bsl.languageserver.events.LanguageServerInitializeRequestReceivedEvent; import com.github._1c_syntax.utils.Absolute; -import org.jspecify.annotations.Nullable; import lombok.RequiredArgsConstructor; import org.eclipse.lsp4j.ClientInfo; import org.eclipse.lsp4j.InitializeParams; +import org.jspecify.annotations.Nullable; import org.springframework.cache.annotation.CacheConfig; import org.springframework.cache.annotation.CacheEvict; import org.springframework.cache.annotation.Cacheable; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/LanguageServerConfiguration.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/LanguageServerConfiguration.java index 1e141c50a87..12826196162 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/LanguageServerConfiguration.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/LanguageServerConfiguration.java @@ -34,7 +34,6 @@ import com.github._1c_syntax.bsl.languageserver.configuration.inlayhints.InlayHintOptions; import com.github._1c_syntax.bsl.languageserver.configuration.references.ReferencesOptions; import com.github._1c_syntax.utils.Absolute; -import org.jspecify.annotations.Nullable; import jakarta.annotation.PostConstruct; import lombok.AccessLevel; import lombok.AllArgsConstructor; @@ -45,6 +44,7 @@ import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import org.apache.commons.beanutils.PropertyUtils; +import org.jspecify.annotations.Nullable; import org.springframework.beans.factory.annotation.Value; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.annotation.Role; @@ -163,9 +163,9 @@ public void reset() { * * @param configuration Конфигурация language server * @param srcDir Директория исходных файлов - * @return Корневой каталог для анализа + * @return Корневой каталог для анализа, или {@code null} если конфигурация находится вне srcDir */ - public static Path getCustomConfigurationRoot(LanguageServerConfiguration configuration, Path srcDir) { + public static @Nullable Path getCustomConfigurationRoot(LanguageServerConfiguration configuration, Path srcDir) { Path rootPath = null; var pathFromConfiguration = configuration.getConfigurationRoot(); diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/capabilities/package-info.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/capabilities/package-info.java index 7921aca7f98..d4cab44b4a5 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/capabilities/package-info.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/capabilities/package-info.java @@ -25,4 +25,4 @@ @NullMarked package com.github._1c_syntax.bsl.languageserver.configuration.capabilities; -import org.jspecify.annotations.NullMarked; \ No newline at end of file +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/codelens/package-info.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/codelens/package-info.java index f0e96b72650..e1e05ceb2da 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/codelens/package-info.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/codelens/package-info.java @@ -25,4 +25,4 @@ @NullMarked package com.github._1c_syntax.bsl.languageserver.configuration.codelens; -import org.jspecify.annotations.NullMarked; \ No newline at end of file +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/diagnostics/DiagnosticsOptions.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/diagnostics/DiagnosticsOptions.java index dd7ce9d54b8..e9d898e8cd6 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/diagnostics/DiagnosticsOptions.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/diagnostics/DiagnosticsOptions.java @@ -27,12 +27,12 @@ import com.github._1c_syntax.bsl.languageserver.configuration.databind.DiagnosticMetadataMapDeserializer; import com.github._1c_syntax.bsl.languageserver.configuration.databind.ParametersDeserializer; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata; -import org.eclipse.lsp4j.DiagnosticSeverity; -import org.jspecify.annotations.Nullable; import lombok.AllArgsConstructor; import lombok.Data; import lombok.NoArgsConstructor; +import org.eclipse.lsp4j.DiagnosticSeverity; import org.eclipse.lsp4j.jsonrpc.messages.Either; +import org.jspecify.annotations.Nullable; import java.util.HashMap; import java.util.Map; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/diagnostics/package-info.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/diagnostics/package-info.java index 282bfd03a09..1d55381a28a 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/diagnostics/package-info.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/diagnostics/package-info.java @@ -25,4 +25,4 @@ @NullMarked package com.github._1c_syntax.bsl.languageserver.configuration.diagnostics; -import org.jspecify.annotations.NullMarked; \ No newline at end of file +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/documentlink/package-info.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/documentlink/package-info.java index 6ca792b0e96..2a73a7cf702 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/documentlink/package-info.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/documentlink/package-info.java @@ -25,4 +25,4 @@ @NullMarked package com.github._1c_syntax.bsl.languageserver.configuration.documentlink; -import org.jspecify.annotations.NullMarked; \ No newline at end of file +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/formating/package-info.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/formating/package-info.java index a2affa5cfa7..e30d5d92f48 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/formating/package-info.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/formating/package-info.java @@ -25,4 +25,4 @@ @NullMarked package com.github._1c_syntax.bsl.languageserver.configuration.formating; -import org.jspecify.annotations.NullMarked; \ No newline at end of file +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/package-info.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/package-info.java index faae51d6de4..b3547289dee 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/package-info.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/configuration/package-info.java @@ -30,4 +30,4 @@ @NullMarked package com.github._1c_syntax.bsl.languageserver.configuration; -import org.jspecify.annotations.NullMarked; \ No newline at end of file +import org.jspecify.annotations.NullMarked; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/ServerContext.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/ServerContext.java index ce781976444..ad11ae37b83 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/ServerContext.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/ServerContext.java @@ -31,12 +31,12 @@ import com.github._1c_syntax.bsl.types.ModuleType; import com.github._1c_syntax.utils.Absolute; import com.github._1c_syntax.utils.Lazy; -import org.jspecify.annotations.Nullable; import lombok.Getter; import lombok.RequiredArgsConstructor; import lombok.Setter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; +import org.jspecify.annotations.Nullable; import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Component; @@ -66,6 +66,11 @@ @Component @RequiredArgsConstructor public class ServerContext { + private static final MDCReadSettings SOLUTION_READ_SETTINGS = MDCReadSettings.builder() + .skipDataCompositionSchema(true) + .skipXdtoPackage(true) + .build(); + private final ObjectProvider documentContextProvider; private final WorkDoneProgressHelper workDoneProgressHelper; private final LanguageServerConfiguration languageServerConfiguration; @@ -84,10 +89,6 @@ public class ServerContext { private final Map states = new ConcurrentHashMap<>(); private final Set openedDocuments = ConcurrentHashMap.newKeySet(); - private static final MDCReadSettings SOLUTION_READ_SETTINGS = MDCReadSettings.builder() - .skipDataCompositionSchema(true) - .skipXdtoPackage(true) - .build(); public void populateContext() { if (configurationRoot == null) { diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/CognitiveComplexityComputer.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/CognitiveComplexityComputer.java index 293cdaf08f0..2acbfce7133 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/CognitiveComplexityComputer.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/CognitiveComplexityComputer.java @@ -321,6 +321,8 @@ private List flattenExpression(BSLParser.ExpressionContext ctx) { flattenMember(result, memberContext); } else if (tree instanceof BSLParser.OperationContext operationContext) { flattenOperation(result, operationContext); + } else { + // no-op } } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/CyclomaticComplexityComputer.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/CyclomaticComplexityComputer.java index 73aca82cbf3..6e4c35886eb 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/CyclomaticComplexityComputer.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/CyclomaticComplexityComputer.java @@ -244,6 +244,8 @@ private static List flattenExpression(BSLParser.ExpressionContext ctx) { flattenMember(result, memberContext); } else if (tree instanceof BSLParser.OperationContext operationContext) { flattenOperation(result, operationContext); + } else { + // no-op } } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/DiagnosticIgnoranceComputer.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/DiagnosticIgnoranceComputer.java index 885a0f3885e..6fea85c0059 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/DiagnosticIgnoranceComputer.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/DiagnosticIgnoranceComputer.java @@ -28,11 +28,11 @@ import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticCode; import com.github._1c_syntax.bsl.parser.BSLLexer; import com.github._1c_syntax.utils.CaseInsensitivePattern; -import org.jspecify.annotations.Nullable; import lombok.AllArgsConstructor; import org.antlr.v4.runtime.Token; import org.apache.commons.lang3.Range; import org.eclipse.lsp4j.Diagnostic; +import org.jspecify.annotations.Nullable; import java.util.ArrayDeque; import java.util.ArrayList; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/MethodSymbolComputer.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/MethodSymbolComputer.java index 88ef106542a..f2dafdc588d 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/MethodSymbolComputer.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/MethodSymbolComputer.java @@ -22,7 +22,6 @@ package com.github._1c_syntax.bsl.languageserver.context.computer; import com.github._1c_syntax.bsl.languageserver.context.DocumentContext; -import com.github._1c_syntax.bsl.languageserver.context.symbol.AnnotationSymbol; import com.github._1c_syntax.bsl.languageserver.context.symbol.MethodSymbol; import com.github._1c_syntax.bsl.languageserver.context.symbol.ParameterDefinition; import com.github._1c_syntax.bsl.languageserver.context.symbol.ParameterDefinition.ParameterType; @@ -36,14 +35,14 @@ import com.github._1c_syntax.bsl.languageserver.utils.Trees; import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.bsl.parser.BSLParserBaseVisitor; -import org.eclipse.lsp4j.jsonrpc.messages.Either; -import org.jspecify.annotations.Nullable; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.Token; import org.antlr.v4.runtime.tree.ErrorNode; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.TerminalNode; import org.eclipse.lsp4j.Range; +import org.eclipse.lsp4j.jsonrpc.messages.Either; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/ModuleSymbolComputer.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/ModuleSymbolComputer.java index a4c6da8f8ae..9311dc840aa 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/ModuleSymbolComputer.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/ModuleSymbolComputer.java @@ -27,7 +27,6 @@ import com.github._1c_syntax.bsl.parser.BSLLexer; import com.github._1c_syntax.bsl.types.ModuleType; import org.antlr.v4.runtime.Token; -import org.eclipse.lsp4j.SymbolKind; import java.util.EnumSet; import java.util.Set; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/MethodSymbol.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/MethodSymbol.java index 911f865dc81..f6e9fea6916 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/MethodSymbol.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/MethodSymbol.java @@ -26,7 +26,6 @@ import com.github._1c_syntax.bsl.languageserver.context.symbol.annotations.CompilerDirectiveKind; import com.github._1c_syntax.bsl.languageserver.context.symbol.description.MethodDescription; import com.github._1c_syntax.bsl.languageserver.utils.Ranges; -import org.jspecify.annotations.Nullable; import lombok.AccessLevel; import lombok.Builder; import lombok.Builder.Default; @@ -38,6 +37,7 @@ import lombok.experimental.NonFinal; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.SymbolKind; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/ModuleSymbol.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/ModuleSymbol.java index 16afdefcc55..99abd9044f7 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/ModuleSymbol.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/ModuleSymbol.java @@ -23,12 +23,11 @@ import com.github._1c_syntax.bsl.languageserver.context.DocumentContext; import lombok.Builder; +import lombok.Builder.Default; import lombok.EqualsAndHashCode; -import lombok.Getter; -import lombok.Setter; +import lombok.EqualsAndHashCode.Include; import lombok.ToString; import lombok.Value; -import lombok.experimental.NonFinal; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.SymbolKind; @@ -53,7 +52,7 @@ public class ModuleSymbol implements SourceDefinedSymbol { */ String name; - @EqualsAndHashCode.Include + @Include DocumentContext owner; Range range; @@ -61,10 +60,10 @@ public class ModuleSymbol implements SourceDefinedSymbol { /** * Область первого токена модуля */ - @EqualsAndHashCode.Include + @Include Range selectionRange; - @Builder.Default + @Default List children = new ArrayList<>(); @Override diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/description/DescriptionReader.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/description/DescriptionReader.java index 0fabed74d0b..3805f7230ed 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/description/DescriptionReader.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/description/DescriptionReader.java @@ -22,9 +22,9 @@ package com.github._1c_syntax.bsl.languageserver.context.symbol.description; import com.github._1c_syntax.bsl.parser.BSLMethodDescriptionParser; -import org.jspecify.annotations.Nullable; import lombok.experimental.UtilityClass; import org.antlr.v4.runtime.ParserRuleContext; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collections; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/variable/VariableDescription.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/variable/VariableDescription.java index 0cf58703da7..b6d88c9f8c6 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/variable/VariableDescription.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/symbol/variable/VariableDescription.java @@ -26,7 +26,6 @@ import com.github._1c_syntax.bsl.languageserver.context.symbol.description.SourceDefinedSymbolDescription; import com.github._1c_syntax.bsl.languageserver.utils.Ranges; import com.github._1c_syntax.bsl.parser.BSLMethodDescriptionTokenizer; -import lombok.NonNull; import lombok.Value; import org.antlr.v4.runtime.Token; import org.eclipse.lsp4j.Range; @@ -97,7 +96,7 @@ public VariableDescription(List comments, Optional trailingComment trailingDescription = trailingComment.map(List::of).map(VariableDescription::new); } - public VariableDescription(@NonNull ParameterDescription param) { + public VariableDescription(ParameterDescription param) { description = ""; deprecationInfo = ""; deprecated = false; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/AbstractMagicValueDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/AbstractMagicValueDiagnostic.java index b20c583e6da..db528b1d499 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/AbstractMagicValueDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/AbstractMagicValueDiagnostic.java @@ -21,16 +21,16 @@ */ package com.github._1c_syntax.bsl.languageserver.diagnostics; -import java.util.Optional; -import java.util.regex.Pattern; - -import org.antlr.v4.runtime.ParserRuleContext; - import com.github._1c_syntax.bsl.languageserver.utils.DiagnosticHelper; import com.github._1c_syntax.bsl.languageserver.utils.Trees; import com.github._1c_syntax.bsl.languageserver.utils.bsl.Constructors; import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.utils.CaseInsensitivePattern; +import org.antlr.v4.runtime.ParserRuleContext; +import org.jspecify.annotations.Nullable; + +import java.util.Optional; +import java.util.regex.Pattern; /** * Абстрактный базовый класс для диагностик магических значений (чисел и дат). @@ -70,7 +70,7 @@ protected static Optional getExpression(ParserRuleC * @param constValue ConstValueContext * @return Optional с ExpressionContext, если найден */ - protected static Optional getExpression(BSLParser.ConstValueContext constValue) { + protected static Optional getExpression(BSLParser.@Nullable ConstValueContext constValue) { if (constValue == null) { return Optional.empty(); } @@ -95,20 +95,12 @@ protected static Optional getExpression(BSLParser.C * @param expression выражение для проверки * @return true, если выражение находится внутри структуры или соответствия */ - protected boolean insideStructureOrCorrespondence(BSLParser.ExpressionContext expression) { - if (checkInsideStructureInsertOrAdd(expression)) { - return true; - } - if (checkInsideStructureConstructor(expression)) { - return true; - } - if (checkInsideStructurePropertyAssignment(expression)) { - return true; - } - if (checkInsideCorrespondenceInsert(expression)) { - return true; - } - return checkInsideCorrespondenceInsertFirstParam(expression); + protected boolean insideStructureOrCorrespondence(BSLParser.ExpressionContext expression) { + return checkInsideStructureInsertOrAdd(expression) + || checkInsideStructureConstructor(expression) + || checkInsideStructurePropertyAssignment(expression) + || checkInsideCorrespondenceInsert(expression) + || checkInsideCorrespondenceInsertFirstParam(expression); } /** @@ -134,19 +126,15 @@ private static boolean isSecondParameterOfStructureInsert(BSLParser.CallParamCon return false; } var callParamList = callParamListOpt.get(); - var callParams = callParamList.callParam(); - var paramIndex = callParams.indexOf(callParam); + var paramIndex = callParamList.callParam().indexOf(callParam); if (paramIndex != 1) { return false; } - var variableType = getVariableTypeFromCallParamList(callParamList); - if (variableType.isPresent()) { - return !variableType.get(); - } - - return false; + return getVariableTypeFromCallParamList(callParamList) + .map(typeIsCorrespondence -> !typeIsCorrespondence) + .orElse(false); } /** @@ -234,10 +222,7 @@ private static Optional getVariableTypeFromCallParamList(BSLParser.Call return Optional.empty(); } var methodCallOpt = isInsertMethod(doCallOpt.get()); - if (methodCallOpt.isEmpty()) { - return Optional.empty(); - } - return getVariableTypeFromCallStatement(methodCallOpt.get()); + return methodCallOpt.flatMap(AbstractMagicValueDiagnostic::getVariableTypeFromCallStatement); } /** @@ -269,25 +254,23 @@ private static Optional isInsertMethod(BSLParser.Do */ private static Optional getVariableTypeFromCallStatement(BSLParser.MethodCallContext methodCall) { var callStatementOpt = findCallStatement(methodCall); - if (callStatementOpt.isEmpty()) { - return Optional.empty(); - } + return callStatementOpt.flatMap(AbstractMagicValueDiagnostic::getVariableTypeFromAST); - return getVariableTypeFromAST(callStatementOpt.get()); } /** * Информация о параметре вызова метода. * - * @param callParam контекст параметра вызова - * @param paramIndex индекс параметра в списке параметров + * @param callParam контекст параметра вызова + * @param paramIndex индекс параметра в списке параметров * @param callParamList контекст списка параметров вызова */ private record CallParamInfo( BSLParser.CallParamContext callParam, int paramIndex, BSLParser.CallParamListContext callParamList - ) {} + ) { + } /** * Получает CallParamContext и его индекс из ExpressionContext. @@ -325,13 +308,10 @@ private static Optional getVariableTypeFromAST(BSLParser.CallStatementC if (assignmentOpt.isEmpty() || assignmentOpt.get().expression() == null) { return Optional.empty(); } - + var typeNameOpt = extractTypeNameFromExpression(assignmentOpt.get().expression()); - if (typeNameOpt.isEmpty()) { - return Optional.empty(); - } + return typeNameOpt.flatMap(AbstractMagicValueDiagnostic::determineVariableType); - return determineVariableType(typeNameOpt.get()); } /** @@ -380,7 +360,7 @@ private static Optional determineVariableType(String typeName) { * Находит AssignmentContext для переменной с указанным именем. * Ищет в пределах того же блока кода (CodeBlockContext), поднимаясь по AST вверх. * - * @param startNode начальный узел для поиска + * @param startNode начальный узел для поиска * @param variableName имя переменной * @return Optional с AssignmentContext или empty, если не найден */ @@ -405,8 +385,8 @@ && isAssignmentForVariable(assignmentContext, variableName)) { /** * Находит AssignmentContext для переменной в пределах блока кода до указанного узла. * - * @param codeBlock блок кода для поиска - * @param beforeNode узел, до которого нужно искать + * @param codeBlock блок кода для поиска + * @param beforeNode узел, до которого нужно искать * @param variableName имя переменной * @return Optional с AssignmentContext или empty, если не найден */ @@ -435,9 +415,9 @@ private static Optional findAssignmentInCodeBlock( /** * Находит AssignmentContext для переменной в statement до указанной позиции. * - * @param statement statement для поиска - * @param beforeLine номер строки, до которой нужно искать - * @param beforeChar позиция символа, до которой нужно искать + * @param statement statement для поиска + * @param beforeLine номер строки, до которой нужно искать + * @param beforeChar позиция символа, до которой нужно искать * @param variableName имя переменной * @return Optional с AssignmentContext или empty, если не найден */ @@ -479,7 +459,7 @@ private static boolean isAssignmentBeforePosition( /** * Проверяет, является ли присваивание присваиванием указанной переменной. * - * @param assignment контекст присваивания + * @param assignment контекст присваивания * @param variableName имя переменной * @return true, если это присваивание указанной переменной */ @@ -508,12 +488,11 @@ private static boolean checkInsideStructureConstructor(BSLParser.ExpressionConte return false; } - var typeNameOpt = getStructureTypeName(callParamContextOpt.get()); - if (typeNameOpt.isEmpty()) { - return false; - } - - return isValidStructureConstructorParameter(callParamContextOpt.get(), typeNameOpt.get()); + var callParamContext = callParamContextOpt.get(); + var typeNameOpt = getStructureTypeName(callParamContext); + return typeNameOpt + .map(typeName -> isValidStructureConstructorParameter(callParamContext, typeName)) + .orElse(false); } /** @@ -566,7 +545,7 @@ private static Optional getStructureTypeName(BSLParse * Проверяет, является ли параметр валидным параметром конструктора структуры. * * @param callParamContext контекст параметра вызова - * @param typeName тип структуры + * @param typeName тип структуры * @return true, если параметр валиден */ private static boolean isValidStructureConstructorParameter( @@ -578,16 +557,16 @@ private static boolean isValidStructureConstructorParameter( return false; } var callParams = callParamList.callParam(); - + var paramIndex = callParams.indexOf(callParamContext); if (paramIndex == 0) { return false; } - + if (DiagnosticHelper.isFixedStructureType(typeName)) { return true; } - + var firstParam = callParams.get(0); var tokens = firstParam.getTokens(); if (tokens.isEmpty()) { @@ -655,11 +634,8 @@ private static boolean checkInsideCorrespondenceInsert(BSLParser.ExpressionConte } var variableType = getVariableTypeFromCallParamList(callParamInfo.callParamList()); - if (variableType.isPresent()) { - return variableType.get(); - } + return variableType.orElse(false); - return false; } /** @@ -683,11 +659,7 @@ private static boolean checkInsideCorrespondenceInsertFirstParam(BSLParser.Expre return false; } var variableType = getVariableTypeFromCallParamList(callParamListOpt.get()); - if (variableType.isPresent()) { - return variableType.get(); - } - - return false; + return variableType.orElse(false); } /** @@ -708,10 +680,7 @@ private static boolean isFirstParameterOfInsertMethod(BSLParser.ExpressionContex } var doCallOpt = getDoCall(callParamInfo.callParamList()); - if (doCallOpt.isEmpty()) { - return false; - } - return isInsertMethod(doCallOpt.get()).isPresent(); + return doCallOpt.flatMap(AbstractMagicValueDiagnostic::isInsertMethod).isPresent(); } /** @@ -720,7 +689,7 @@ private static boolean isFirstParameterOfInsertMethod(BSLParser.ExpressionContex * @param expression выражение для проверки * @return true, если выражение находится в простом присваивании */ - protected static boolean insideSimpleAssignment(BSLParser.ExpressionContext expression) { + protected static boolean insideSimpleAssignment(BSLParser.@Nullable ExpressionContext expression) { return insideContext(expression, BSLParser.AssignmentContext.class); } @@ -730,24 +699,23 @@ protected static boolean insideSimpleAssignment(BSLParser.ExpressionContext expr * @param expression выражение для проверки * @return true, если выражение находится в return statement */ - protected static boolean insideReturnStatement(BSLParser.ExpressionContext expression) { + protected static boolean insideReturnStatement(BSLParser.@Nullable ExpressionContext expression) { return insideContext(expression, BSLParser.ReturnStatementContext.class); } /** * Универсальный метод для проверки контекста. * - * @param expression выражение для проверки + * @param expression выражение для проверки * @param contextClass класс контекста для проверки * @return true, если выражение находится в указанном контексте */ - protected static boolean insideContext(BSLParser.ExpressionContext expression, - Class contextClass) { + protected static boolean insideContext(BSLParser.@Nullable ExpressionContext expression, + Class contextClass) { if (expression == null) { return false; } - var parent = expression.getParent(); - return parent != null && contextClass.isInstance(parent); + return contextClass.isInstance(expression.getParent()); } } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/BeginTransactionBeforeTryCatchDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/BeginTransactionBeforeTryCatchDiagnostic.java index 334869298cb..10d1bf79e31 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/BeginTransactionBeforeTryCatchDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/BeginTransactionBeforeTryCatchDiagnostic.java @@ -30,6 +30,7 @@ import com.github._1c_syntax.utils.CaseInsensitivePattern; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTree; +import org.jspecify.annotations.Nullable; import java.util.Optional; import java.util.regex.Pattern; @@ -48,8 +49,8 @@ public class BeginTransactionBeforeTryCatchDiagnostic extends AbstractVisitorDia "^НачатьТранзакцию$|^BeginTransaction$" ); - private ParserRuleContext nodeBeginTransaction; - private BSLParser.StatementContext nodeEndFile; + private @Nullable ParserRuleContext nodeBeginTransaction; + private BSLParser.@Nullable StatementContext nodeEndFile; public BeginTransactionBeforeTryCatchDiagnostic() { nodeBeginTransaction = null; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CommentedCodeDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CommentedCodeDiagnostic.java index ed0f1cf42ff..5374d7c6107 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CommentedCodeDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CommentedCodeDiagnostic.java @@ -80,6 +80,7 @@ public class CommentedCodeDiagnostic extends AbstractDiagnostic implements Quick public CommentedCodeDiagnostic() { codeRecognizer = new CodeRecognizer(threshold, new BSLFootprint()); + methodDescriptions = Collections.emptyList(); // non-null } @Override diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CommitTransactionOutsideTryCatchDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CommitTransactionOutsideTryCatchDiagnostic.java index 4283e151233..3acf6e80b1a 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CommitTransactionOutsideTryCatchDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CommitTransactionOutsideTryCatchDiagnostic.java @@ -30,6 +30,7 @@ import com.github._1c_syntax.utils.CaseInsensitivePattern; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTree; +import org.jspecify.annotations.Nullable; import java.util.regex.Pattern; import java.util.stream.Stream; @@ -48,8 +49,8 @@ public class CommitTransactionOutsideTryCatchDiagnostic extends AbstractVisitorD "ЗафиксироватьТранзакцию|CommitTransaction" ); - private ParserRuleContext nodeEndTransaction; - private BSLParser.StatementContext nodeEndFile; + private @Nullable ParserRuleContext nodeEndTransaction; + private BSLParser.@Nullable StatementContext nodeEndFile; public CommitTransactionOutsideTryCatchDiagnostic() { nodeEndTransaction = null; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CreateQueryInCycleDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CreateQueryInCycleDiagnostic.java index 1367e26e751..037097b967c 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CreateQueryInCycleDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/CreateQueryInCycleDiagnostic.java @@ -29,12 +29,12 @@ import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.bsl.parser.BSLParser.AssignmentContext; import com.github._1c_syntax.utils.CaseInsensitivePattern; -import org.jspecify.annotations.Nullable; import lombok.Getter; import lombok.ToString; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.RuleContext; import org.antlr.v4.runtime.tree.ParseTree; +import org.jspecify.annotations.Nullable; import java.util.ArrayDeque; import java.util.Collection; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/DataExchangeLoadingDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/DataExchangeLoadingDiagnostic.java index 9d2d70aa33a..d9d1669c31a 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/DataExchangeLoadingDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/DataExchangeLoadingDiagnostic.java @@ -34,6 +34,7 @@ import com.github._1c_syntax.utils.CaseInsensitivePattern; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTree; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Optional; @@ -128,7 +129,7 @@ private boolean foundReturnStatement(BSLParser.IfBranchContext ifBranch) { .orElse(false); } - private ParserRuleContext getSubContext(BSLParser.ProcDeclarationContext ctx) { + private static @Nullable ParserRuleContext getSubContext(BSLParser.ProcDeclarationContext ctx) { return Trees.getAncestorByRuleIndex(ctx.getRuleContext(), BSLParser.RULE_sub); } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/DuplicatedInsertionIntoCollectionDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/DuplicatedInsertionIntoCollectionDiagnostic.java index 8bd5b0fadf1..56529118003 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/DuplicatedInsertionIntoCollectionDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/DuplicatedInsertionIntoCollectionDiagnostic.java @@ -33,12 +33,12 @@ import com.github._1c_syntax.bsl.parser.BSLParser.AssignmentContext; import com.github._1c_syntax.bsl.parser.BSLParser.CallParamContext; import com.github._1c_syntax.utils.CaseInsensitivePattern; -import org.jspecify.annotations.Nullable; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.TerminalNode; import org.apache.commons.collections4.map.CaseInsensitiveMap; import org.eclipse.lsp4j.Range; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FieldsFromJoinsWithoutIsNullDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FieldsFromJoinsWithoutIsNullDiagnostic.java index 14ce1369b4f..5d396ab2b10 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FieldsFromJoinsWithoutIsNullDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/FieldsFromJoinsWithoutIsNullDiagnostic.java @@ -29,11 +29,11 @@ import com.github._1c_syntax.bsl.languageserver.utils.RelatedInformation; import com.github._1c_syntax.bsl.languageserver.utils.Trees; import com.github._1c_syntax.bsl.parser.SDBLParser; -import org.jspecify.annotations.Nullable; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.TerminalNode; import org.eclipse.lsp4j.DiagnosticRelatedInformation; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; @@ -100,7 +100,6 @@ public ParseTree visitJoinPart(SDBLParser.JoinPartContext joinPartCtx) { private static Stream joinedTables(SDBLParser.JoinPartContext joinPartCtx) { return Optional.of(joinPartCtx) .stream().flatMap(joinPartContext -> joinedDataSourceContext(joinPartContext).stream()) - .filter(Objects::nonNull) .map(SDBLParser.DataSourceContext::alias) .filter(Objects::nonNull) .map(SDBLParser.AliasContext::identifier) @@ -175,7 +174,6 @@ private void checkStatements(String tableName, ParserRuleContext expression, Col Integer rootForStatement, boolean checkIsNullOperator) { Trees.findAllRuleNodes(expression, SDBLParser.RULE_column).stream() - .filter(Objects::nonNull) .filter(SDBLParser.ColumnContext.class::isInstance) .map(SDBLParser.ColumnContext.class::cast) .filter(columnContext -> checkColumn(tableName, columnContext, statements, rootForStatement, checkIsNullOperator)) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/IncorrectUseLikeInQueryDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/IncorrectUseLikeInQueryDiagnostic.java index f6a0948b938..1f5ca49c8d5 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/IncorrectUseLikeInQueryDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/IncorrectUseLikeInQueryDiagnostic.java @@ -28,10 +28,10 @@ import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType; import com.github._1c_syntax.bsl.languageserver.utils.Trees; import com.github._1c_syntax.bsl.parser.SDBLParser; -import org.jspecify.annotations.Nullable; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.TerminalNode; +import org.jspecify.annotations.Nullable; import java.util.List; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/IncorrectUseOfStrTemplateDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/IncorrectUseOfStrTemplateDiagnostic.java index 17154f95976..3ba7e1fd8bb 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/IncorrectUseOfStrTemplateDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/IncorrectUseOfStrTemplateDiagnostic.java @@ -28,8 +28,8 @@ import com.github._1c_syntax.bsl.languageserver.utils.Trees; import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.utils.CaseInsensitivePattern; -import org.jspecify.annotations.Nullable; import org.antlr.v4.runtime.ParserRuleContext; +import org.jspecify.annotations.Nullable; import java.util.HashSet; import java.util.Objects; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/IsInRoleMethodDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/IsInRoleMethodDiagnostic.java index c681847ebd0..8a8e356c31d 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/IsInRoleMethodDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/IsInRoleMethodDiagnostic.java @@ -29,9 +29,9 @@ import com.github._1c_syntax.bsl.languageserver.utils.Trees; import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.utils.CaseInsensitivePattern; -import org.jspecify.annotations.Nullable; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTree; +import org.jspecify.annotations.Nullable; import java.util.HashSet; import java.util.Set; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MagicDateDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MagicDateDiagnostic.java index d04005a0278..70d23c842c1 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MagicDateDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MagicDateDiagnostic.java @@ -21,15 +21,6 @@ */ package com.github._1c_syntax.bsl.languageserver.diagnostics; -import java.util.Arrays; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.regex.Pattern; -import java.util.stream.Collectors; - -import org.antlr.v4.runtime.tree.ParseTree; - import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticParameter; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity; @@ -37,6 +28,15 @@ import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType; import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.utils.CaseInsensitivePattern; +import org.antlr.v4.runtime.tree.ParseTree; +import org.jspecify.annotations.Nullable; + +import java.util.Arrays; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.regex.Pattern; +import java.util.stream.Collectors; @DiagnosticMetadata( type = DiagnosticType.CODE_SMELL, @@ -119,7 +119,7 @@ private static boolean isInsideDefaultValue(BSLParser.ConstValueContext ctx) { return false; } - private static boolean shouldAddDiagnostic(BSLParser.ExpressionContext expressionContext) { + private static boolean shouldAddDiagnostic(BSLParser.@Nullable ExpressionContext expressionContext) { return !insideSimpleAssignment(expressionContext) && !insideReturnStatement(expressionContext) && !insideAssignmentWithDateMethodForSimpleDate(expressionContext); @@ -172,7 +172,7 @@ private boolean isExcluded(String text) { return authorizedDates.contains(s); } - private static boolean insideAssignmentWithDateMethodForSimpleDate(BSLParser.ExpressionContext expression) { + private static boolean insideAssignmentWithDateMethodForSimpleDate(BSLParser.@Nullable ExpressionContext expression) { if (expression == null) { return false; } @@ -183,10 +183,8 @@ private static boolean insideAssignmentWithDateMethodForSimpleDate(BSLParser.Exp } var doCall = callParamList.getParent(); // doCall var globalCall = doCall.getParent(); // globalCall - метод Дата(ХХХ) - if (!(globalCall instanceof BSLParser.GlobalMethodCallContext globalMethodCall)) { - return false; - } - if (!METHOD_PATTERN.matcher(globalMethodCall.methodName().getText()).matches()) { + if (!(globalCall instanceof BSLParser.GlobalMethodCallContext globalMethodCall) + || (!METHOD_PATTERN.matcher(globalMethodCall.methodName().getText()).matches())) { return false; } var complexId = globalCall.getParent(); // complexId diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MagicNumberDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MagicNumberDiagnostic.java index caa7aaf7838..32c9c68d941 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MagicNumberDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MagicNumberDiagnostic.java @@ -21,13 +21,6 @@ */ package com.github._1c_syntax.bsl.languageserver.diagnostics; -import java.util.ArrayList; -import java.util.Arrays; -import java.util.List; -import java.util.Map; - -import org.antlr.v4.runtime.tree.ParseTree; - import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticParameter; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity; @@ -36,6 +29,12 @@ import com.github._1c_syntax.bsl.languageserver.utils.DiagnosticHelper; import com.github._1c_syntax.bsl.parser.BSLParser; import org.antlr.v4.runtime.ParserRuleContext; +import org.antlr.v4.runtime.tree.ParseTree; + +import java.util.ArrayList; +import java.util.Arrays; +import java.util.List; +import java.util.Map; @DiagnosticMetadata( type = DiagnosticType.CODE_SMELL, @@ -97,7 +96,7 @@ public ParseTree visitNumeric(BSLParser.NumericContext ctx) { } current = current.getParent(); } - + if (!isDefaultValue && isWrongExpression(ctx, ctx.getParent())) { diagnosticStorage.addDiagnostic(ctx.stop, info.getMessage(checked)); } @@ -118,18 +117,19 @@ private boolean isWrongExpression(BSLParser.NumericContext ctx, ParserRuleContex if (mayBeNumberAccess(ctx)) { return true; } - + var expression = getExpression(numericContextParent); - if (expression.isPresent() && insideStructureOrCorrespondence(expression.get())) { - return false; - } - if (expression.isPresent() && insideReturnStatement(expression.get())) { - return true; + if (expression.isPresent()) { + var context = expression.get(); + if (insideStructureOrCorrespondence(context)) { + return false; + } + if (insideReturnStatement(context)) { + return true; + } + return !isNumericExpression(context) || insideCallParam(context); } - return expression - .filter((BSLParser.ExpressionContext expr) -> - (!isNumericExpression(expr) || insideCallParam(expr))) - .isPresent(); + return false; } private boolean mayBeNumberAccess(BSLParser.NumericContext ctx) { diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MissingTempStorageDeletionDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MissingTempStorageDeletionDiagnostic.java index 94c2af8ee55..a14271db060 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MissingTempStorageDeletionDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MissingTempStorageDeletionDiagnostic.java @@ -33,8 +33,8 @@ import com.github._1c_syntax.bsl.parser.BSLParser.StatementContext; import com.github._1c_syntax.bsl.parser.BSLParser.SubContext; import com.github._1c_syntax.utils.CaseInsensitivePattern; -import org.jspecify.annotations.Nullable; import org.antlr.v4.runtime.tree.ParseTree; +import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.Collections; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MissingTemporaryFileDeletionDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MissingTemporaryFileDeletionDiagnostic.java index 91f372b5267..f07523ca936 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MissingTemporaryFileDeletionDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MissingTemporaryFileDeletionDiagnostic.java @@ -30,6 +30,7 @@ import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.utils.CaseInsensitivePattern; import org.antlr.v4.runtime.tree.ParseTree; +import org.jspecify.annotations.Nullable; import java.util.List; import java.util.Map; @@ -167,7 +168,7 @@ private static boolean foundVariableInCallParams(BSLParser.DoCallContext doCallC return result; } - private static String getVariableName(BSLParser.GlobalMethodCallContext ctx) { + private static @Nullable String getVariableName(BSLParser.GlobalMethodCallContext ctx) { BSLParser.AssignmentContext assignment = Trees.getAncestorByRuleIndex(ctx, BSLParser.RULE_assignment); diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/NestedFunctionInParametersDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/NestedFunctionInParametersDiagnostic.java index 96f6e717bd8..4bae368ec83 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/NestedFunctionInParametersDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/NestedFunctionInParametersDiagnostic.java @@ -28,9 +28,9 @@ import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType; import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.utils.CaseInsensitivePattern; -import org.jspecify.annotations.Nullable; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTree; +import org.jspecify.annotations.Nullable; import java.util.Map; import java.util.regex.Pattern; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ParseErrorDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ParseErrorDiagnostic.java index f2d0c208f87..e7cf6ac2f12 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ParseErrorDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ParseErrorDiagnostic.java @@ -30,11 +30,7 @@ import com.github._1c_syntax.bsl.parser.BSLLexer; import com.github._1c_syntax.bsl.parser.BSLParser; import org.antlr.v4.runtime.ParserRuleContext; -import org.antlr.v4.runtime.Token; -import org.antlr.v4.runtime.misc.IntervalSet; import org.antlr.v4.runtime.tree.ErrorNode; -import org.antlr.v4.runtime.tree.ErrorNodeImpl; -import org.antlr.v4.runtime.tree.TerminalNodeImpl; import java.util.StringJoiner; import java.util.stream.IntStream; @@ -54,8 +50,7 @@ public class ParseErrorDiagnostic extends AbstractListenerDiagnostic { @Override public void visitErrorNode(ErrorNode node) { - - if (((ErrorNodeImpl) node).symbol.getTokenIndex() == -1) { + if (node.getSymbol().getTokenIndex() == -1) { diagnosticStorage.addDiagnostic( ((ParserRuleContext) node.getParent()).getStart(), info.getMessage(node.getText()) @@ -65,22 +60,22 @@ public void visitErrorNode(ErrorNode node) { @Override public void enterFile(BSLParser.FileContext ctx) { - BSLParser.FileContext ast = this.documentContext.getAst(); - String initialExpectedString = info.getResourceString("expectedTokens") + " "; + var ast = this.documentContext.getAst(); + var initialExpectedString = info.getResourceString("expectedTokens") + " "; Trees.getDescendants(ast).stream() - .filter(parseTree -> !(parseTree instanceof TerminalNodeImpl)) - .map(parseTree -> (ParserRuleContext) parseTree) + .filter(ParserRuleContext.class::isInstance) + .map(ParserRuleContext.class::cast) .filter(node -> node.exception != null) .forEach((ParserRuleContext node) -> { - IntervalSet expectedTokens = node.exception.getExpectedTokens(); - StringJoiner sj = new StringJoiner(", "); + var expectedTokens = node.exception.getExpectedTokens(); + var sj = new StringJoiner(", "); expectedTokens.getIntervals().stream() - .flatMapToInt(interval -> IntStream.range(interval.a, interval.b)) + .flatMapToInt(interval -> IntStream.rangeClosed(interval.a, interval.b)) .mapToObj(ParseErrorDiagnostic::getTokenName) .forEachOrdered(sj::add); - Token errorToken = node.exception.getOffendingToken(); + var errorToken = node.exception.getOffendingToken(); if (errorToken.getType() == EOF) { errorToken = node.getStart(); } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java index 953856af81a..5769952362c 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryNestedFieldsByDotDiagnostic.java @@ -36,7 +36,6 @@ DiagnosticTag.SQL, DiagnosticTag.PERFORMANCE } - ) public class QueryNestedFieldsByDotDiagnostic extends AbstractSDBLListenerDiagnostic { @@ -58,7 +57,7 @@ public void exitVirtualTableParameter(SDBLParser.VirtualTableParameterContext ct @Override public void enterFunctionCall(SDBLParser.FunctionCallContext ctx) { //Контролируем разыменование в функциях (ВЫРАЗИТЬ, ЕСТЬNULL и т.д.) - if(ctx.identifier != null && ctx.columnNames.size() > 1){ + if (ctx.identifier != null && ctx.columnNames.size() > 1) { diagnosticStorage.addDiagnostic(ctx); } super.enterFunctionCall(ctx); @@ -66,13 +65,13 @@ public void enterFunctionCall(SDBLParser.FunctionCallContext ctx) { @Override public void enterColumn(SDBLParser.ColumnContext ctx) { - /*Если взведен флаг обработки виртуальной таблицы + /* + Если взведен флаг обработки виртуальной таблицы и определен контекст метаданных, то проверяем заполненность контекста имен колонок. В противном случае считаем что работаем со стандартным полем выборки или соединения и выводим ошибку когда список имен колонки содержит более одного идентификатора */ - if((isVirtualTable && ctx.mdoName != null && !ctx.columnNames.isEmpty()) || ctx.columnNames.size() > 1){ - + if ((isVirtualTable && ctx.mdoName != null && !ctx.columnNames.isEmpty()) || ctx.columnNames.size() > 1) { diagnosticStorage.addDiagnostic(ctx); } super.enterColumn(ctx); diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryToMissingMetadataDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryToMissingMetadataDiagnostic.java index 800e64ee14f..a3660ddf02f 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryToMissingMetadataDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/QueryToMissingMetadataDiagnostic.java @@ -75,7 +75,7 @@ public ParseTree visitDataSources(SDBLParser.DataSourcesContext ctx) { .filter(Objects::nonNull) .filter(eds -> eds.cubeName != null) .filter(eds -> eds.mdo() != null && eds.mdo().tableName != null) - .forEach(eds -> { + .forEach((SDBLParser.ExternalDataSourceTableContext eds) -> { if (nonCubeExists(eds)) { diagnosticStorage.addDiagnostic(eds.cubeName, info.getMessage(eds.cubeName.getText())); } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnostic.java index 3230f10cf09..2084aa5df88 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/RefOveruseDiagnostic.java @@ -35,9 +35,9 @@ import com.github._1c_syntax.bsl.types.MDOType; import com.github._1c_syntax.bsl.types.MdoReference; import com.github._1c_syntax.utils.CaseInsensitivePattern; -import org.jspecify.annotations.Nullable; import org.antlr.v4.runtime.tree.ParseTree; import org.eclipse.lsp4j.Range; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; @@ -115,8 +115,11 @@ public ParseTree visitQuery(SDBLParser.QueryContext ctx) { private Stream checkQuery(SDBLParser.QueryContext ctx) { var columns = Trees.findAllTopLevelDescendantNodes(ctx, RULE_COLUMNS).stream() .filter(parserRuleContext -> parserRuleContext.getRuleIndex() == SDBLParser.RULE_column) - .filter(parserRuleContext -> Trees.getRootParent(parserRuleContext, EXCLUDED_COLUMNS_ROOT) - .getRuleIndex() == SDBLParser.RULE_query) + .filter(parserRuleContext -> + Optional.ofNullable(Trees.getRootParent(parserRuleContext, EXCLUDED_COLUMNS_ROOT)) + .map(root -> root.getRuleIndex() == SDBLParser.RULE_query) + .orElse(false) + ) .map(SDBLParser.ColumnContext.class::cast) .collect(Collectors.toList()); diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/SelectTopWithoutOrderByDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/SelectTopWithoutOrderByDiagnostic.java index 2f66728783d..d71a6bb2dcb 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/SelectTopWithoutOrderByDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/SelectTopWithoutOrderByDiagnostic.java @@ -29,8 +29,8 @@ import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType; import com.github._1c_syntax.bsl.languageserver.utils.Trees; import com.github._1c_syntax.bsl.parser.SDBLParser; -import org.jspecify.annotations.Nullable; import org.antlr.v4.runtime.tree.ParseTree; +import org.jspecify.annotations.Nullable; @DiagnosticMetadata( type = DiagnosticType.CODE_SMELL, diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ServerCallsInFormEventsDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ServerCallsInFormEventsDiagnostic.java index 40707458959..f5824130fed 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ServerCallsInFormEventsDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ServerCallsInFormEventsDiagnostic.java @@ -36,7 +36,7 @@ /** * Диагностика для проверки вызовов серверных процедур в событиях форм. - * + *
* Проверяет, что в событиях ПриАктивизацииСтроки и НачалоВыбора не вызываются * серверные процедуры, что может привести к проблемам в работе формы. * @@ -89,7 +89,7 @@ public ServerCallsInFormEventsDiagnostic() { /** * Обрабатывает вход в процедуру или функцию. - * + *
* Проверяет, является ли процедура или функция событием ПриАктивизацииСтроки или НачалоВыбора, * и устанавливает флаг для отслеживания контекста. * @@ -110,7 +110,7 @@ public void enterSub(BSLParser.SubContext ctx) { /** * Обрабатывает выход из процедуры или функции. - * + *
* Автоматически сбрасывает флаг отслеживания контекста при выходе из любого узла процедуры. * Это обеспечивает корректную работу диагностики даже при вложенных процедурах. * @@ -123,7 +123,7 @@ public void exitSub(BSLParser.SubContext ctx) { /** * Обрабатывает вход в вызов глобального метода. - * + *
* Проверяет, вызывается ли серверная процедура из событий ПриАктивизацииСтроки * или НачалоВыбора, и добавляет диагностическое сообщение при обнаружении нарушения. * @@ -142,7 +142,7 @@ public void enterGlobalMethodCall(BSLParser.GlobalMethodCallContext ctx) { /** * Проверяет, является ли метод серверным. - * + *
* Метод считается серверным, если он имеет директиву компиляции &НаСервере * или &НаСервереБезКонтекста. * diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/TimeoutsInExternalResourcesDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/TimeoutsInExternalResourcesDiagnostic.java index f6234d8ab1d..60be21ea7e2 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/TimeoutsInExternalResourcesDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/TimeoutsInExternalResourcesDiagnostic.java @@ -32,8 +32,8 @@ import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.bsl.support.CompatibilityMode; import com.github._1c_syntax.utils.CaseInsensitivePattern; -import org.jspecify.annotations.Nullable; import org.antlr.v4.runtime.tree.ParseTree; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/TransferringParametersBetweenClientAndServerDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/TransferringParametersBetweenClientAndServerDiagnostic.java index 97cff5c3a52..8606d3c8ba0 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/TransferringParametersBetweenClientAndServerDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/TransferringParametersBetweenClientAndServerDiagnostic.java @@ -144,12 +144,12 @@ private boolean isCachedValueParameter(ParameterDefinition parameterDefinition) if (cachedValueNames.isEmpty()) { return false; } - + var paramName = parameterDefinition.getName(); if (!cachedValueNames.contains(paramName.toUpperCase(Locale.ENGLISH))) { return false; } - + // Check if module has a client variable with this name return hasClientModuleVariable(paramName); } @@ -159,17 +159,17 @@ private boolean hasClientModuleVariable(String variableName) { .filter(BSLParser.ModuleVarContext.class::isInstance) .map(BSLParser.ModuleVarContext.class::cast) .filter(ctx -> hasVariableWithName(ctx, variableName)) - .anyMatch(this::hasClientCompilerDirective); + .anyMatch(TransferringParametersBetweenClientAndServerDiagnostic::hasClientCompilerDirective); } - private boolean hasVariableWithName(BSLParser.ModuleVarContext ctx, String variableName) { + private static boolean hasVariableWithName(BSLParser.ModuleVarContext ctx, String variableName) { return Trees.findAllRuleNodes(ctx, BSLParser.RULE_moduleVarDeclaration).stream() .filter(BSLParser.ModuleVarDeclarationContext.class::isInstance) .map(BSLParser.ModuleVarDeclarationContext.class::cast) .anyMatch(decl -> decl.var_name().getText().equalsIgnoreCase(variableName)); } - private boolean hasClientCompilerDirective(BSLParser.ModuleVarContext ctx) { + private static boolean hasClientCompilerDirective(BSLParser.ModuleVarContext ctx) { return ctx.compilerDirective().stream() .map(BSLParser.CompilerDirectiveContext::getStop) .map(Token::getType) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UnsafeFindByCodeDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UnsafeFindByCodeDiagnostic.java index ba4643b466a..6ad51e24d29 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UnsafeFindByCodeDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UnsafeFindByCodeDiagnostic.java @@ -105,7 +105,7 @@ public ParseTree visitComplexIdentifier(BSLParser.ComplexIdentifierContext ctx) * Если вызов является методом FindByCode/НайтиПоКоду и объект метаданных имеет небезопасное использование, * добавляется диагностика на имя метода. * - * @param ctx контекст вызова метода + * @param ctx контекст вызова метода * @param mdoRef ссылка на объект метаданных в формате "Catalog.ИмяКаталога", * "ChartOfCharacteristicTypes.ИмяПлана" или "ChartOfAccounts.ИмяПлана" */ @@ -159,19 +159,16 @@ private boolean checkMetadataObject(String mdoRef) { var mdo = mdoOpt.get(); var mdoType = mdo.getMdoType(); - var result = false; if (mdoType == MDOType.CATALOG) { - result = isUnsafeCatalogUsage((Catalog) mdo); + return isUnsafeCatalogUsage((Catalog) mdo); } else if (mdoType == MDOType.CHART_OF_CHARACTERISTIC_TYPES) { - result = isUnsafeChartOfCharacteristicTypesUsage((ChartOfCharacteristicTypes) mdo); + return isUnsafeChartOfCharacteristicTypesUsage((ChartOfCharacteristicTypes) mdo); } else if (mdoType == MDOType.CHART_OF_ACCOUNTS) { - result = isUnsafeChartOfAccountsUsage((ChartOfAccounts) mdo); + return isUnsafeChartOfAccountsUsage((ChartOfAccounts) mdo); } else { - result = false; + return false; } - - return result; } /** diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UnusedParametersDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UnusedParametersDiagnostic.java index cb972229a63..4c26f71351b 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UnusedParametersDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UnusedParametersDiagnostic.java @@ -73,8 +73,6 @@ public ParseTree visitSubCodeBlock(BSLParser.SubCodeBlockContext ctx) { .collect(Collectors.toList()); Trees.findAllTokenNodes(ctx, BSLParser.IDENTIFIER) - .stream() - .filter(Objects::nonNull) .forEach(node -> paramsNames.remove((node.getText().toLowerCase(Locale.getDefault()))) ); diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsageWriteLogEventDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsageWriteLogEventDiagnostic.java index 3e6fd4816e1..bcb8340a3fa 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsageWriteLogEventDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsageWriteLogEventDiagnostic.java @@ -28,9 +28,9 @@ import com.github._1c_syntax.bsl.languageserver.utils.Trees; import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.utils.CaseInsensitivePattern; -import org.jspecify.annotations.Nullable; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTree; +import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.List; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UselessTernaryOperatorDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UselessTernaryOperatorDiagnostic.java index 420d8805176..325e913610b 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UselessTernaryOperatorDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UselessTernaryOperatorDiagnostic.java @@ -71,6 +71,8 @@ public ParseTree visitTernaryOperator(BSLParser.TernaryOperatorContext ctx) { DiagnosticStorage.createAdditionalData(getAdaptedText(exp.get(0).getText()))); } else if (trueBranch != SKIPPED_RULE_INDEX || falseBranch != SKIPPED_RULE_INDEX) { diagnosticStorage.addDiagnostic(ctx); + } else { + // остальное - не ошибка } } @@ -108,7 +110,7 @@ private String getAdaptedText(String text) { return info.getResourceString("quickFixAdaptedText", text); } - private int getBooleanToken(BSLParser.ExpressionContext expCtx) { + private static int getBooleanToken(BSLParser.ExpressionContext expCtx) { var tmpCtx = Optional.of(expCtx) .filter(ctx -> ctx.children.size() == 1) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingExternalCodeToolsDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingExternalCodeToolsDiagnostic.java index 969770f5c8c..6cc1f4c01b9 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingExternalCodeToolsDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingExternalCodeToolsDiagnostic.java @@ -31,6 +31,7 @@ import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.TerminalNode; +import org.jspecify.annotations.Nullable; import java.util.regex.Pattern; @@ -68,7 +69,7 @@ public ParseTree visitComplexIdentifier(BSLParser.ComplexIdentifierContext ctx) return super.visitComplexIdentifier(ctx); } - private void checkUseExternalCodeTools(ParserRuleContext ctx, TerminalNode identifier) { + private void checkUseExternalCodeTools(ParserRuleContext ctx, @Nullable TerminalNode identifier) { if (identifier != null && externalCodeToolsName.matcher(identifier.getText()).matches() && Trees.findAllRuleNodes(ctx, BSLParser.RULE_methodCall) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingThisFormDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingThisFormDiagnostic.java index fc43bc885b6..aaf55a4c0eb 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingThisFormDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingThisFormDiagnostic.java @@ -90,7 +90,7 @@ private static boolean needCheck(ParserRuleContext declaration) { } private static List getParams(ParserRuleContext declaration) { - BSLParser.ParamListContext paramList = declaration.getRuleContext(BSLParser.ParamListContext.class, 0); + var paramList = declaration.getRuleContext(BSLParser.ParamListContext.class, 0); if (paramList == null) { return Collections.emptyList(); } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/metadata/DiagnosticInfo.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/metadata/DiagnosticInfo.java index 549f860aafa..23aa1c60045 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/metadata/DiagnosticInfo.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/metadata/DiagnosticInfo.java @@ -27,10 +27,10 @@ import com.github._1c_syntax.bsl.languageserver.utils.Resources; import com.github._1c_syntax.bsl.types.ModuleType; import com.github._1c_syntax.utils.StringInterner; -import org.jspecify.annotations.Nullable; import lombok.Getter; import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.IOUtils; +import org.jspecify.annotations.Nullable; import java.io.IOException; import java.nio.charset.StandardCharsets; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/folding/CodeBlockFoldingRangeSupplier.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/folding/CodeBlockFoldingRangeSupplier.java index 97f79cd4896..13ab6dbb440 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/folding/CodeBlockFoldingRangeSupplier.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/folding/CodeBlockFoldingRangeSupplier.java @@ -24,12 +24,12 @@ import com.github._1c_syntax.bsl.languageserver.context.DocumentContext; import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.bsl.parser.BSLParserBaseVisitor; -import org.jspecify.annotations.Nullable; import lombok.Getter; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.TerminalNode; import org.eclipse.lsp4j.FoldingRange; import org.eclipse.lsp4j.FoldingRangeKind; +import org.jspecify.annotations.Nullable; import org.springframework.stereotype.Component; import java.util.ArrayList; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/DescriptionFormatter.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/DescriptionFormatter.java index a0ca7ca79c2..1e68b16fa51 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/DescriptionFormatter.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/DescriptionFormatter.java @@ -321,15 +321,15 @@ public String parameterToString(ParameterDescription parameterDescription, int l public String parameterToString(ParameterDefinition parameterDefinition) { var level = 0; var parameterDescription = parameterDefinition.getDescription(); - if (parameterDescription.isPresent()) { - return parameterToString(parameterDescription.get(), level); - } + return parameterDescription + .map(description -> parameterToString(description, level)) + .orElseGet(() -> String.format( + PARAMETER_TEMPLATE, + parameterDefinition.getName(), + "" + ) + ); - return String.format( - PARAMETER_TEMPLATE, - parameterDefinition.getName(), - "" - ); } private Map typesToMap(List parameterTypes, int level) { diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilder.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilder.java index d1463a028ce..075d958bacf 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilder.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/ModuleSymbolMarkupContentBuilder.java @@ -31,6 +31,7 @@ import org.springframework.stereotype.Component; import java.util.ArrayList; +import java.util.List; import java.util.StringJoiner; /** @@ -87,6 +88,31 @@ private String getModuleInfo(ModuleSymbol symbol) { } // Флаги доступности + var flags = getModuleFlags(commonModule); + + if (!flags.isEmpty()) { + var flagsHeader = "**" + getResourceString("availability") + ":** "; + moduleInfoBuilder.add(flagsHeader + String.join(", ", flags)); + moduleInfoBuilder.add(""); + } + + // Режим повторного использования + var returnValueReuse = commonModule.getReturnValuesReuse(); + var reuseKey = switch (returnValueReuse) { + case DURING_REQUEST -> "duringRequest"; + case DURING_SESSION -> "duringSession"; + case DONT_USE, UNKNOWN -> ""; + }; + + if (!reuseKey.isEmpty()) { + var reuseHeader = "**" + getResourceString("returnValuesReuse") + ":** "; + moduleInfoBuilder.add(reuseHeader + getResourceString(reuseKey)); + } + + return moduleInfoBuilder.toString(); + } + + private List getModuleFlags(CommonModule commonModule) { var flags = new ArrayList(); if (commonModule.isServer()) { @@ -110,27 +136,7 @@ private String getModuleInfo(ModuleSymbol symbol) { if (commonModule.isGlobal()) { flags.add(getResourceString("global")); } - - if (!flags.isEmpty()) { - var flagsHeader = "**" + getResourceString("availability") + ":** "; - moduleInfoBuilder.add(flagsHeader + String.join(", ", flags)); - moduleInfoBuilder.add(""); - } - - // Режим повторного использования - var returnValueReuse = commonModule.getReturnValuesReuse(); - var reuseKey = switch (returnValueReuse) { - case DURING_REQUEST -> "duringRequest"; - case DURING_SESSION -> "duringSession"; - case DONT_USE, UNKNOWN -> ""; - }; - - if (!reuseKey.isEmpty()) { - var reuseHeader = "**" + getResourceString("returnValuesReuse") + ":** "; - moduleInfoBuilder.add(reuseHeader + getResourceString(reuseKey)); - } - - return moduleInfoBuilder.toString(); + return flags; } private String getResourceString(String key) { diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/infrastructure/CacheConfiguration.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/infrastructure/CacheConfiguration.java index 8b653e83885..c8cc29f566a 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/infrastructure/CacheConfiguration.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/infrastructure/CacheConfiguration.java @@ -48,8 +48,8 @@ @Configuration @EnableCaching public class CacheConfiguration { - private static final String TYPO_CACHE_NAME = "typoCache"; + private static final int MAX_CACHE_INSTANCES = 10; /** * Основной менеджер кэша, использующий Caffeine для кэширования в памяти. @@ -94,8 +94,6 @@ public org.ehcache.CacheManager ehcacheManager( return createEhcacheManagerWithRetry(cachePathProvider, basePath, fullPath); } - private static final int MAX_CACHE_INSTANCES = 10; - /** * Создаёт менеджер EhCache, пробуя пути с разными номерами экземпляров при блокировке. *

diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/infrastructure/CachePathProvider.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/infrastructure/CachePathProvider.java index 4ca657bc0aa..6ec606debad 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/infrastructure/CachePathProvider.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/infrastructure/CachePathProvider.java @@ -21,6 +21,7 @@ */ package com.github._1c_syntax.bsl.languageserver.infrastructure; +import org.jspecify.annotations.Nullable; import org.springframework.stereotype.Component; import java.io.IOException; @@ -76,7 +77,7 @@ public Path getCachePath(String basePath, String fullPath) { * @param instanceNumber номер экземпляра (0 для основного, 1+ для дополнительных) * @return путь к каталогу кэша */ - public Path getCachePath(String basePath, String fullPath, int instanceNumber) { + public Path getCachePath(String basePath, @Nullable String fullPath, int instanceNumber) { if (fullPath != null && !fullPath.isEmpty()) { return Path.of(fullPath); } @@ -95,7 +96,7 @@ public Path getCachePath(String basePath, String fullPath, int instanceNumber) { * * @return абсолютный путь к текущей директории */ - private String getCurrentDirectory() { + private static String getCurrentDirectory() { try { return Path.of(".").toRealPath().toString(); } catch (IOException e) { diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/infrastructure/EhCacheAdapter.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/infrastructure/EhCacheAdapter.java index 726480f27ed..035de8aacd5 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/infrastructure/EhCacheAdapter.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/infrastructure/EhCacheAdapter.java @@ -21,6 +21,7 @@ */ package com.github._1c_syntax.bsl.languageserver.infrastructure; +import org.jspecify.annotations.Nullable; import org.springframework.cache.Cache; import org.springframework.cache.support.AbstractValueAdaptingCache; @@ -81,11 +82,12 @@ public Object getNativeCache() { public T get(Object key, Callable valueLoader) { var typedKey = (K) key; var value = nativeCache.get(typedKey); - + if (value != null) { return (T) value; } - + + // если нет в кеше (value == null), то загружаем из valueLoader try { T newValue = valueLoader.call(); if (newValue != null) { @@ -98,7 +100,7 @@ public T get(Object key, Callable valueLoader) { } @Override - public void put(Object key, Object value) { + public void put(Object key, @Nullable Object value) { @SuppressWarnings("unchecked") var typedKey = (K) key; @SuppressWarnings("unchecked") diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/infrastructure/LanguageClientAwareAppender.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/infrastructure/LanguageClientAwareAppender.java index 7168bd6b73f..3b78a9f983e 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/infrastructure/LanguageClientAwareAppender.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/infrastructure/LanguageClientAwareAppender.java @@ -25,10 +25,10 @@ import ch.qos.logback.classic.spi.ILoggingEvent; import ch.qos.logback.core.ConsoleAppender; import com.github._1c_syntax.bsl.languageserver.LanguageClientHolder; -import org.jspecify.annotations.Nullable; import lombok.Setter; import org.eclipse.lsp4j.MessageParams; import org.eclipse.lsp4j.MessageType; +import org.jspecify.annotations.Nullable; import org.springframework.beans.factory.annotation.Autowired; import java.io.IOException; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/jsonrpc/DiagnosticParams.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/jsonrpc/DiagnosticParams.java index 7c8057c258b..f9c8ba0a52a 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/jsonrpc/DiagnosticParams.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/jsonrpc/DiagnosticParams.java @@ -21,7 +21,6 @@ */ package com.github._1c_syntax.bsl.languageserver.jsonrpc; -import org.jspecify.annotations.Nullable; import lombok.AllArgsConstructor; import lombok.EqualsAndHashCode; import lombok.Getter; @@ -30,6 +29,7 @@ import lombok.ToString; import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.TextDocumentIdentifier; +import org.jspecify.annotations.Nullable; /** * Параметры запроса textDocument/x-diagnostics. diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CommandProvider.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CommandProvider.java index 7c65483d18d..9584fe3199a 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CommandProvider.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CommandProvider.java @@ -27,6 +27,7 @@ import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; import org.eclipse.lsp4j.ExecuteCommandParams; +import org.jspecify.annotations.Nullable; import org.springframework.stereotype.Component; import java.util.List; @@ -55,7 +56,7 @@ public class CommandProvider { * * @return Результат выполнения команды. */ - public Object executeCommand(CommandArguments arguments) { + public @Nullable Object executeCommand(CommandArguments arguments) { var commandId = arguments.getId(); var commandSupplier = commandSuppliersById.get(commandId); diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/DiagnosticProvider.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/DiagnosticProvider.java index 23f72a60dd0..60a5acded36 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/DiagnosticProvider.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/DiagnosticProvider.java @@ -35,6 +35,7 @@ import org.eclipse.lsp4j.PublishDiagnosticsParams; import org.eclipse.lsp4j.RelatedFullDocumentDiagnosticReport; import org.eclipse.lsp4j.WorkspaceClientCapabilities; +import org.eclipse.lsp4j.services.LanguageClient; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; @@ -62,7 +63,7 @@ public final class DiagnosticProvider { private final LanguageClientHolder clientHolder; private final ClientCapabilitiesHolder clientCapabilitiesHolder; - + private boolean clientSupportsRefresh; /** @@ -121,7 +122,7 @@ public void handleInitializeEvent(LanguageServerInitializeRequestReceivedEvent e @EventListener public void handleConfigurationChangedEvent(LanguageServerConfigurationChangedEvent event) { if (clientSupportsRefresh) { - clientHolder.execIfConnected(languageClient -> { + clientHolder.execIfConnected((LanguageClient languageClient) -> { LOGGER.debug("Requesting diagnostic refresh from client"); languageClient.refreshDiagnostics(); }); diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java index d36f7d5912c..a3c1ffe3c64 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/RenameProvider.java @@ -34,6 +34,7 @@ import org.eclipse.lsp4j.TextDocumentPositionParams; import org.eclipse.lsp4j.TextEdit; import org.eclipse.lsp4j.WorkspaceEdit; +import org.jspecify.annotations.Nullable; import org.springframework.stereotype.Component; import java.util.Collection; @@ -98,10 +99,8 @@ private static Reference referenceOf(SourceDefinedSymbol symbol) { * @param params Параметры вызова. * @return Range */ - public Range getPrepareRename(DocumentContext documentContext, TextDocumentPositionParams params) { - - return referenceResolver.findReference( - documentContext.getUri(), params.getPosition()) + public @Nullable Range getPrepareRename(DocumentContext documentContext, TextDocumentPositionParams params) { + return referenceResolver.findReference(documentContext.getUri(), params.getPosition()) .filter(Reference::isSourceDefinedSymbolReference) .map(Reference::getSelectionRange) .orElse(null); diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SelectionRangeProvider.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SelectionRangeProvider.java index fe89371b1db..acfcfd45395 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SelectionRangeProvider.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SelectionRangeProvider.java @@ -25,11 +25,11 @@ import com.github._1c_syntax.bsl.languageserver.utils.Ranges; import com.github._1c_syntax.bsl.languageserver.utils.Trees; import com.github._1c_syntax.bsl.parser.BSLParser; -import org.jspecify.annotations.Nullable; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.tree.ParseTree; import org.eclipse.lsp4j.SelectionRange; import org.eclipse.lsp4j.SelectionRangeParams; +import org.jspecify.annotations.Nullable; import org.springframework.stereotype.Component; import java.util.ArrayList; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SemanticTokensProvider.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SemanticTokensProvider.java index 212e2c36808..3d4fc64f3ba 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SemanticTokensProvider.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/SemanticTokensProvider.java @@ -36,7 +36,6 @@ import com.github._1c_syntax.bsl.parser.BSLLexer; import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.bsl.parser.BSLParser.AnnotationContext; -import com.github._1c_syntax.bsl.parser.BSLParser.AnnotationParamNameContext; import com.github._1c_syntax.bsl.parser.BSLParser.CompilerDirectiveContext; import com.github._1c_syntax.bsl.parser.BSLParser.Preproc_nativeContext; import com.github._1c_syntax.bsl.parser.BSLParser.PreprocessorContext; @@ -62,6 +61,7 @@ import org.eclipse.lsp4j.SemanticTokensParams; import org.eclipse.lsp4j.SymbolKind; import org.eclipse.lsp4j.TextDocumentClientCapabilities; +import org.jspecify.annotations.Nullable; import org.springframework.context.event.EventListener; import org.springframework.stereotype.Component; @@ -168,7 +168,7 @@ public void onClientCapabilitiesChanged(LanguageServerInitializeRequestReceivedE * Получить семантические токены для всего документа. * * @param documentContext Контекст документа - * @param params Параметры запроса + * @param params Параметры запроса * @return Семантические токены в дельта-кодированном формате */ public SemanticTokens getSemanticTokensFull(DocumentContext documentContext, @SuppressWarnings("unused") SemanticTokensParams params) { @@ -311,32 +311,21 @@ private static void markLines(BitSet lines, Range range) { private void addAnnotationsFromAst(List entries, ParseTree parseTree) { // compiler directives: single Decorator from '&' through directive symbol for (var compilerDirective : Trees.findAllRuleNodes(parseTree, BSLParser.RULE_compilerDirective)) { - var ampersand = compilerDirective.AMPERSAND().getSymbol(); // '&' - if (compilerDirective.compilerDirectiveSymbol() != null) { - var symbolToken = compilerDirective.compilerDirectiveSymbol().getStart(); - addRange(entries, Ranges.create(ampersand, symbolToken), SemanticTokenTypes.Decorator); - } else { - addRange(entries, Ranges.create(ampersand), SemanticTokenTypes.Decorator); - } + addAmpersandRange(entries, compilerDirective.AMPERSAND(), compilerDirective.compilerDirectiveSymbol()); } // annotations: single Decorator from '&' through annotation name; params identifiers as Parameter for (var annotation : Trees.findAllRuleNodes(parseTree, BSLParser.RULE_annotation)) { - var ampersand = annotation.AMPERSAND().getSymbol(); // '&' - if (annotation.annotationName() != null) { - var annotationNameToken = annotation.annotationName().getStart(); - addRange(entries, Ranges.create(ampersand, annotationNameToken), SemanticTokenTypes.Decorator); - } else { - addRange(entries, Ranges.create(ampersand), SemanticTokenTypes.Decorator); - } + addAmpersandRange(entries, annotation.AMPERSAND(), annotation.annotationName()); var annotationParams = annotation.annotationParams(); - if (annotationParams != null) { - for (var annotationParam : annotationParams.annotationParam()) { - var annotationParamName = annotationParam.annotationParamName(); - if (annotationParamName == null) { - continue; - } + if (annotationParams == null) { + continue; + } + + for (var annotationParam : annotationParams.annotationParam()) { + var annotationParamName = annotationParam.annotationParamName(); + if (annotationParamName != null) { addRange(entries, Ranges.create(annotationParamName.IDENTIFIER()), SemanticTokenTypes.Parameter); } } @@ -349,7 +338,9 @@ private void addPreprocessorFromAst(List entries, ParseTree parseTre // Namespace only for '#'+keyword part to avoid overlap with region name token var preprocessor = Trees.getAncestorByRuleIndex(regionStart, BSLParser.RULE_preprocessor); if (preprocessor != null && regionStart.PREPROC_REGION() != null) { - addRange(entries, Ranges.create(preprocessor.getStart(), regionStart.PREPROC_REGION().getSymbol()), SemanticTokenTypes.Namespace); + addRange(entries, + Ranges.create(preprocessor.getStart(), regionStart.PREPROC_REGION().getSymbol()), + SemanticTokenTypes.Namespace); } else { addNamespaceForPreprocessorNode(entries, regionStart); } @@ -429,6 +420,17 @@ private void addNamespaceForUse(List entries, UseContext useCtx) { .ifPresent(id -> addRange(entries, Ranges.create(id), SemanticTokenTypes.Variable)); } + // общий для аннотаций и директив компиляции способ добавления + private void addAmpersandRange(List entries, TerminalNode node, @Nullable ParserRuleContext name) { + var ampersand = node.getSymbol(); // '&' + if (name != null) { + var symbolToken = name.getStart(); + addRange(entries, Ranges.create(ampersand, symbolToken), SemanticTokenTypes.Decorator); + } else { + addRange(entries, Ranges.create(ampersand), SemanticTokenTypes.Decorator); + } + } + private void addRange(List entries, Range range, String type) { addRange(entries, range, type, NO_MODIFIERS); } @@ -558,5 +560,6 @@ private void addLexicalTokens(List tokens, List entries) { } } - private record TokenEntry(int line, int start, int length, int type, int modifiers) {} + private record TokenEntry(int line, int start, int length, int type, int modifiers) { + } } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/AnnotationReferenceFinder.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/AnnotationReferenceFinder.java index daff795723e..794dbdc00da 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/AnnotationReferenceFinder.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/AnnotationReferenceFinder.java @@ -92,8 +92,10 @@ private void findAndRegisterAnnotation(DocumentContext documentContext) { // In normal case this method may be called twice per each document context: // 1. When the document context is created during the server context population or document opening // 2. When server context is fully populated. - // This can lead to the situation when annotations registered from opened documents are cleared after populateContext step. - // Due to limitation of mechanism to only OS files, we can leave it as is for now, but it should be refactored in the future. + // This can lead to the situation when annotations registered from opened documents are cleared after + // populateContext step. + // Due to limitation of mechanism to only OS files, we can leave it as is for now, but it should be refactored + // in the future. if (documentContext.getFileType() != FileType.OS) { return; } @@ -107,8 +109,9 @@ private void findAndRegisterAnnotation(DocumentContext documentContext) { .map(Pair::getRight) .flatMap(AnnotationReferenceFinder::getAnnotationName) .flatMap(annotationName -> methodSymbolAnnotationPair.map(Pair::getLeft) - .map(methodSymbol -> AnnotationSymbol.from(annotationName, methodSymbol))) - .ifPresent(annotationSymbol -> registeredAnnotations.put(annotationSymbol.getName(), annotationSymbol)); + .map(methodSymbol -> AnnotationSymbol.from(annotationName, methodSymbol))) + .ifPresent(annotationSymbol -> + registeredAnnotations.put(annotationSymbol.getName(), annotationSymbol)); } private void removeAnnotationsRegisteredForUri(URI uri) { @@ -147,13 +150,15 @@ public Optional findReference(URI uri, Position position) { var annotationParamValueContext = parentContext instanceof BSLParser.AnnotationParamValueContext apv ? apv : Trees.getAncestorByRuleIndex( - parentContext, BSLParser.RULE_annotationParamValue); + parentContext, BSLParser.RULE_annotationParamValue); return Optional.ofNullable(annotationParamValueContext) .flatMap(apv -> getReferenceToAnnotationParamSymbol(apv, documentContext)); } - private Optional getReferenceToAnnotationSymbol(URI uri, BSLParser.AnnotationNameContext annotationName, DocumentContext documentContext) { + private Optional getReferenceToAnnotationSymbol(URI uri, + BSLParser.AnnotationNameContext annotationName, + DocumentContext documentContext) { var annotationNode = (BSLParser.AnnotationContext) annotationName.getParent(); return getAnnotationSymbol(annotationName) @@ -164,19 +169,29 @@ private Optional getReferenceToAnnotationSymbol(URI uri, BSLParser.An )); } - private Optional getReferenceToAnnotationParamSymbol(BSLParser.AnnotationParamNameContext annotationParamName, DocumentContext documentContext) { + private Optional getReferenceToAnnotationParamSymbol( + BSLParser.AnnotationParamNameContext annotationParamName, + DocumentContext documentContext) { + return Optional.of(annotationParamName) .map(ParserRuleContext::getParent) // BSLParser.AnnotationParamContext .map(BSLParser.AnnotationParamContext.class::cast) - .flatMap(annotationParamContext -> getReferenceToAnnotationParam(documentContext, Optional.of(annotationParamContext))); + .flatMap(annotationParamContext -> getReferenceToAnnotationParam( + documentContext, + Optional.of(annotationParamContext)) + ); } - private Optional getReferenceToAnnotationParamSymbol(BSLParser.AnnotationParamValueContext annotationParamValue, DocumentContext documentContext) { + private Optional getReferenceToAnnotationParamSymbol( + BSLParser.AnnotationParamValueContext annotationParamValue, + DocumentContext documentContext) { + return Optional.of(annotationParamValue) .map(ParserRuleContext::getParent) // BSLParser.AnnotationParamContext .filter(BSLParser.AnnotationParamContext.class::isInstance) .map(BSLParser.AnnotationParamContext.class::cast) - .flatMap(annotationParamContext -> getReferenceToAnnotationParam(documentContext, Optional.of(annotationParamContext))); + .flatMap(annotationParamContext -> + getReferenceToAnnotationParam(documentContext, Optional.of(annotationParamContext))); } private Optional getAnnotationSymbol(BSLParser.AnnotationNameContext annotationNode) { @@ -210,7 +225,8 @@ private Optional getReferenceToAnnotationParam( .flatMap(AnnotationSymbol::getParent) .filter(MethodSymbol.class::isInstance) .map(MethodSymbol.class::cast) - .map(annotationDefinitionMethodSymbol -> AnnotationParamSymbol.from(annotationParamName, annotationDefinitionMethodSymbol)) + .map(annotationDefinitionMethodSymbol -> + AnnotationParamSymbol.from(annotationParamName, annotationDefinitionMethodSymbol)) .map(annotationParamSymbol -> Reference.of( documentContext.getSymbolTree().getModule(), annotationParamSymbol, @@ -231,6 +247,5 @@ private static Optional getAnnotationName(Annotation annotation) { return Optional.of(annotationParameterDefinition) .map(AnnotationParameterDefinition::value) .map(Either::getLeft); - } } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndexFiller.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndexFiller.java index 0dbcd7e6e22..acdb08769a5 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndexFiller.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndexFiller.java @@ -247,14 +247,14 @@ private void addModuleReferenceForCommonModuleIdentifier(@Nullable TerminalNode documentContext.getServerContext() .getConfiguration() .findCommonModule(identifierText) - .ifPresent(commonModule -> { + .ifPresent(commonModule -> index.addModuleReference( documentContext.getUri(), commonModule.getMdoReference().getMdoRef(), ModuleType.CommonModule, Ranges.create(identifier) - ); - }); + ) + ); } private void addMethodCall(String mdoRef, ModuleType moduleType, String methodName, Range range) { diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/model/Symbol.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/model/Symbol.java index 51d9b2df25a..b2d015b6b62 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/model/Symbol.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/model/Symbol.java @@ -24,9 +24,9 @@ import com.github._1c_syntax.bsl.languageserver.context.symbol.SourceDefinedSymbol; import com.github._1c_syntax.bsl.types.ModuleType; import com.github._1c_syntax.utils.GenericInterner; -import org.jspecify.annotations.Nullable; import lombok.Builder; import org.eclipse.lsp4j.SymbolKind; +import org.jspecify.annotations.Nullable; /** * Облегченные данные символа для поиска без кросс-ссылок между файлами. diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/model/SymbolOccurrence.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/model/SymbolOccurrence.java index 6ab7adc018d..3a1e3c4f28f 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/model/SymbolOccurrence.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/model/SymbolOccurrence.java @@ -22,8 +22,8 @@ package com.github._1c_syntax.bsl.languageserver.references.model; import com.github._1c_syntax.bsl.languageserver.utils.Ranges; -import org.jspecify.annotations.Nullable; import lombok.Builder; +import org.jspecify.annotations.Nullable; /** * Обращение к символу в файле. diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/DiagnosticHelper.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/DiagnosticHelper.java index 061b50e5e6a..4b663f31e57 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/DiagnosticHelper.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/DiagnosticHelper.java @@ -21,24 +21,23 @@ */ package com.github._1c_syntax.bsl.languageserver.utils; -import java.util.HashMap; -import java.util.HashSet; -import java.util.Map; -import java.util.Set; -import java.util.StringJoiner; -import java.util.regex.Pattern; - -import org.antlr.v4.runtime.tree.ParseTree; -import org.antlr.v4.runtime.tree.TerminalNode; -import org.antlr.v4.runtime.tree.Tree; - import com.github._1c_syntax.bsl.languageserver.diagnostics.BSLDiagnostic; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticParameterInfo; import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.utils.CaseInsensitivePattern; - import lombok.experimental.UtilityClass; import lombok.extern.slf4j.Slf4j; +import org.antlr.v4.runtime.tree.ParseTree; +import org.antlr.v4.runtime.tree.TerminalNode; +import org.antlr.v4.runtime.tree.Tree; +import org.jspecify.annotations.Nullable; + +import java.util.HashMap; +import java.util.HashSet; +import java.util.Map; +import java.util.Set; +import java.util.StringJoiner; +import java.util.regex.Pattern; /** * Вспомогательный класс для работы с диагностиками. @@ -53,7 +52,7 @@ public final class DiagnosticHelper { /** * Проверить равенство двух узлов синтаксического дерева. * - * @param leftNode Первый узел для сравнения + * @param leftNode Первый узел для сравнения * @param rightNode Второй узел для сравнения * @return true, если узлы эквивалентны */ @@ -151,10 +150,10 @@ public static boolean isInternetMailProfileType(ParseTree tnc) { /** * Настроить параметры диагностики из конфигурации. * - * @param diagnostic Диагностика для настройки + * @param diagnostic Диагностика для настройки * @param configuration Карта конфигурации с параметрами */ - public static void configureDiagnostic(BSLDiagnostic diagnostic, Map configuration) { + public static void configureDiagnostic(BSLDiagnostic diagnostic, @Nullable Map configuration) { if (configuration == null || configuration.isEmpty()) { return; } @@ -183,9 +182,9 @@ public static void configureDiagnostic(BSLDiagnostic diagnostic, Map configuration, diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/MdoRefBuilder.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/MdoRefBuilder.java index 4fa0b9547fd..8ef3b66cbf6 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/MdoRefBuilder.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/MdoRefBuilder.java @@ -27,10 +27,10 @@ import com.github._1c_syntax.bsl.types.MDOType; import com.github._1c_syntax.bsl.types.MdoReference; import com.github._1c_syntax.utils.StringInterner; -import org.jspecify.annotations.Nullable; import lombok.experimental.UtilityClass; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.TerminalNode; +import org.jspecify.annotations.Nullable; import java.util.List; @@ -99,8 +99,7 @@ public String getMdoRef(DocumentContext documentContext, BSLParser.ComplexIdenti */ public String getMdoRef( DocumentContext documentContext, - @Nullable - TerminalNode identifier, + @Nullable TerminalNode identifier, List modifiers ) { if (identifier == null) { diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/MultilingualStringAnalyser.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/MultilingualStringAnalyser.java index fa9dfeaa9e3..0607c41fca1 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/MultilingualStringAnalyser.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/MultilingualStringAnalyser.java @@ -24,6 +24,7 @@ import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.utils.CaseInsensitivePattern; import org.antlr.v4.runtime.ParserRuleContext; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Arrays; @@ -64,7 +65,7 @@ public final class MultilingualStringAnalyser { private BSLParser.GlobalMethodCallContext globalMethodCallContext; private boolean isParentTemplate; - private String variableName; + private @Nullable String variableName; private final ArrayList expectedLanguages; private final Set expandedMultilingualString = new HashSet<>(); private ArrayList missingLanguages = new ArrayList<>(); @@ -75,10 +76,8 @@ public final class MultilingualStringAnalyser { * @param declaredLanguages Строка с объявленными языками через запятую */ public MultilingualStringAnalyser(String declaredLanguages) { - Matcher matcher = WHITE_SPACE_PATTERN.matcher(declaredLanguages); this.expectedLanguages = new ArrayList<>(Arrays.asList(matcher.replaceAll("").split(","))); - } private static boolean isNotMultilingualString(BSLParser.GlobalMethodCallContext globalMethodCallContext) { @@ -106,11 +105,11 @@ private static boolean isTemplate(BSLParser.GlobalMethodCallContext parent) { return TEMPLATE_METHOD_NAME_PATTERN.matcher(parent.methodName().getText()).find(); } - private static String getVariableName(BSLParser.GlobalMethodCallContext ctx) { + private static @Nullable String getVariableName(BSLParser.GlobalMethodCallContext ctx) { BSLParser.AssignmentContext assignment = Trees.getAncestorByRuleIndex(ctx, BSLParser.RULE_assignment); if (assignment != null) { - BSLParser.LValueContext lValue = assignment.lValue(); + var lValue = assignment.lValue(); if (lValue != null) { return lValue.getText(); } @@ -221,7 +220,7 @@ private boolean istVariableUsingInTemplate() { .anyMatch(cp -> cp.stream().anyMatch(p -> p.getText().equalsIgnoreCase(variableName))); } - private BSLParser.CodeBlockContext getCodeBlock() { + private BSLParser.@Nullable CodeBlockContext getCodeBlock() { return Trees.getAncestorByRuleIndex(globalMethodCallContext, BSLParser.RULE_codeBlock); } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Ranges.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Ranges.java index a967c4b9974..ad0f7fd63e2 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Ranges.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Ranges.java @@ -32,6 +32,7 @@ import org.eclipse.lsp4j.Range; import org.eclipse.lsp4j.jsonrpc.util.Preconditions; import org.eclipse.lsp4j.util.Positions; +import org.jspecify.annotations.Nullable; import java.util.Collection; import java.util.List; @@ -115,7 +116,7 @@ public Range create(ParserRuleContext startCtx, ParserRuleContext endCtx) { * @param endToken Конечный токен * @return Диапазон между токенами */ - public Range create(Token startToken, Token endToken) { + public Range create(Token startToken, @Nullable Token endToken) { int startLine = startToken.getLine() - 1; int startChar = startToken.getCharPositionInLine(); var tokenToCalculateEnd = endToken == null ? startToken : endToken; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java index f856ecd1b17..4c308ebc490 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/Trees.java @@ -22,7 +22,6 @@ package com.github._1c_syntax.bsl.languageserver.utils; import com.github._1c_syntax.bsl.parser.BSLParser; -import org.jspecify.annotations.Nullable; import lombok.experimental.UtilityClass; import org.antlr.v4.runtime.ParserRuleContext; import org.antlr.v4.runtime.Token; @@ -31,9 +30,11 @@ import org.antlr.v4.runtime.tree.Tree; import org.eclipse.lsp4j.Position; import org.eclipse.lsp4j.util.Positions; +import org.jspecify.annotations.Nullable; import java.util.ArrayList; import java.util.Collection; +import java.util.Collections; import java.util.List; import java.util.Optional; import java.util.Set; @@ -93,7 +94,10 @@ public static List getChildren(Tree t) { * @param tree Дерево разбора * @return Список токенов */ - public static List getTokens(ParseTree tree) { + public static List getTokens(@Nullable ParseTree tree) { + if (tree == null) { + return Collections.emptyList(); + } return org.antlr.v4.runtime.tree.Trees.getTokens(tree); } @@ -311,7 +315,7 @@ public static Optional findTerminalNodeContainsPosition(ParserRule return Optional.of(terminalNode); } } else { - Optional node = findTerminalNodeContainsPosition((ParserRuleContext) child, position); + var node = findTerminalNodeContainsPosition((ParserRuleContext) child, position); if (node.isPresent()) { return node; } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/UTF8Control.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/UTF8Control.java index 7c9ee4ecac7..a1bcbda90f2 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/UTF8Control.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/UTF8Control.java @@ -21,11 +21,11 @@ */ package com.github._1c_syntax.bsl.languageserver.utils; +import org.jspecify.annotations.Nullable; + import java.io.IOException; import java.io.InputStream; import java.io.InputStreamReader; -import java.net.URL; -import java.net.URLConnection; import java.nio.charset.StandardCharsets; import java.util.Locale; import java.util.PropertyResourceBundle; @@ -39,17 +39,20 @@ */ public class UTF8Control extends ResourceBundle.Control { @Override - public ResourceBundle newBundle - (String baseName, Locale locale, String format, ClassLoader loader, boolean reload) throws IOException { + public @Nullable ResourceBundle newBundle(String baseName, + Locale locale, + String format, + ClassLoader loader, + boolean reload) throws IOException { // The below is a copy of the default implementation. - String bundleName = toBundleName(baseName, locale); - String resourceName = toResourceName(bundleName, "properties"); + var bundleName = toBundleName(baseName, locale); + var resourceName = toResourceName(bundleName, "properties"); ResourceBundle bundle = null; InputStream stream = null; if (reload) { - URL url = loader.getResource(resourceName); + var url = loader.getResource(resourceName); if (url != null) { - URLConnection connection = url.openConnection(); + var connection = url.openConnection(); if (connection != null) { connection.setUseCaches(false); stream = connection.getInputStream(); @@ -58,8 +61,9 @@ public class UTF8Control extends ResourceBundle.Control { } else { stream = loader.getResourceAsStream(resourceName); } + if (stream != null) { - try (InputStreamReader reader = new InputStreamReader(stream, StandardCharsets.UTF_8)) { + try (var reader = new InputStreamReader(stream, StandardCharsets.UTF_8)) { // Only this line is changed to make it to read properties files as UTF-8. bundle = new PropertyResourceBundle(reader); } finally { diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/expressiontree/BslExpression.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/expressiontree/BslExpression.java index 3ce10025183..8f0f6ba301d 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/expressiontree/BslExpression.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/expressiontree/BslExpression.java @@ -28,6 +28,7 @@ import lombok.Setter; import lombok.ToString; import org.antlr.v4.runtime.tree.ParseTree; +import org.jspecify.annotations.Nullable; /** * Базовый класс для узлов дерева выражений. @@ -40,11 +41,11 @@ @AllArgsConstructor(access = AccessLevel.PROTECTED) public abstract class BslExpression { private final ExpressionNodeType nodeType; - private ParseTree representingAst; + private @Nullable ParseTree representingAst; @ToString.Exclude @Setter(AccessLevel.PACKAGE) - private BslExpression parent; + private @Nullable BslExpression parent; /** * Синтаксический-помощник для более удобных downcast-ов diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/expressiontree/ErrorExpressionNode.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/expressiontree/ErrorExpressionNode.java index 57981373aa2..6c4258ba1ea 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/expressiontree/ErrorExpressionNode.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/expressiontree/ErrorExpressionNode.java @@ -26,6 +26,7 @@ import lombok.Value; import lombok.experimental.NonFinal; import org.antlr.v4.runtime.tree.ParseTree; +import org.jspecify.annotations.Nullable; /** * Узел дерева выражений с ошибкой разбора. @@ -43,7 +44,7 @@ protected ErrorExpressionNode() { super(ExpressionNodeType.ERROR); } - protected ErrorExpressionNode(ParseTree sourceCodeOperator) { + protected ErrorExpressionNode(@Nullable ParseTree sourceCodeOperator) { super(ExpressionNodeType.ERROR, sourceCodeOperator, null); } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/expressiontree/ExpressionTreeBuildingVisitor.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/expressiontree/ExpressionTreeBuildingVisitor.java index c1df852addf..e726b7a3ada 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/expressiontree/ExpressionTreeBuildingVisitor.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/expressiontree/ExpressionTreeBuildingVisitor.java @@ -28,6 +28,7 @@ import org.antlr.v4.runtime.tree.ErrorNode; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.TerminalNode; +import org.jspecify.annotations.Nullable; import java.util.ArrayDeque; import java.util.Collections; @@ -56,7 +57,7 @@ public int getPriority() { private final Deque operands = new ArrayDeque<>(); private final Deque operatorsInFly = new ArrayDeque<>(); - private BslExpression resultExpression; + private @Nullable BslExpression resultExpression; private int recursionLevel = -1; /** @@ -68,13 +69,15 @@ public int getPriority() { public static BslExpression buildExpressionTree(BSLParser.ExpressionContext ctx) { var instance = new ExpressionTreeBuildingVisitor(); instance.visitExpression(ctx); - return instance.getExpressionTree(); + var result = instance.getExpressionTree(); + assert result != null; + return result; } /** * @return результирующее выражение в виде дерева вычисления операций */ - public BslExpression getExpressionTree() { + public @Nullable BslExpression getExpressionTree() { return resultExpression; } @@ -104,12 +107,12 @@ public ParseTree visitExpression(BSLParser.ExpressionContext ctx) { if (count > 1) { for (var i = 1; i < count; ++i) { var child = ctx.getChild(i); - if (child.getClass() == BSLParser.OperationContext.class) { - visitOperation((BSLParser.OperationContext) child); - } else if (child.getClass() == BSLParser.MemberContext.class) { - visitMember((BSLParser.MemberContext) child); - } else if (child.getClass() == BSLParser.PreprocessorContext.class) { - continue; + if (child instanceof BSLParser.OperationContext operationContext) { + visitOperation(operationContext); + } else if (child instanceof BSLParser.MemberContext memberContext) { + visitMember(memberContext); + } else if (child instanceof BSLParser.PreprocessorContext) { + // просто пропускаем } else { throw new IllegalStateException(); } @@ -154,10 +157,10 @@ public ParseTree visitMember(BSLParser.MemberContext ctx) { // нужен ручной dispatch на конкретного child, // т.к. нет отдельного правила для подвыражения в скобках // constValue - // | complexIdentifier - // | (( LPAREN expression RPAREN ) modifier*) // нечего оверрайдить ! - // | (IDENTIFIER | globalMethodCall) // нечего оверрайдить ! - // | waitExpression + // | complexIdentifier + // | (( LPAREN expression RPAREN ) modifier*) // нечего оверрайдить ! + // | (IDENTIFIER | globalMethodCall) // нечего оверрайдить ! + // | waitExpression var unaryModifier = ctx.unaryModifier(); var childIndex = 0; @@ -190,7 +193,7 @@ public ParseTree visitMember(BSLParser.MemberContext ctx) { return ctx; } - private void visitParenthesis(BSLParser.ExpressionContext expression, + private void visitParenthesis(BSLParser.@Nullable ExpressionContext expression, List modifiers) { // Handle the case where expression is empty (empty parentheses)