From 5b8bde6c1c5bff4507139add65f82ab5d68a6df4 Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Sun, 12 Jun 2022 00:20:56 +0300 Subject: [PATCH 1/2] =?UTF-8?q?=D0=9F=D0=BE=D0=B4=D0=BA=D0=BB=D1=8E=D1=87?= =?UTF-8?q?=D0=B5=D0=BD=D0=B8=D0=B5=20spring-native?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 13 ++++++++++++ lombok.config | 1 + settings.gradle.kts | 1 + .../languageserver/cli/AnalyzeCommand.java | 7 ++++++- .../languageserver/context/ServerContext.java | 10 ++++------ .../context/computer/DiagnosticComputer.java | 13 ++++++------ .../DiagnosticInfosConfiguration.java | 20 +++++++++++++------ .../DiagnosticsConfiguration.java | 13 ++++++------ .../reporters/ReportersAggregator.java | 6 ------ .../ReportersConfiguration.java | 2 -- src/main/resources/application.properties | 1 + .../resources/application-measures.properties | 1 + src/test/resources/application.properties | 1 + 13 files changed, 56 insertions(+), 33 deletions(-) diff --git a/build.gradle.kts b/build.gradle.kts index e27d9ec64a8..f6e1cb6c86f 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -17,6 +17,7 @@ plugins { id("me.qoomon.git-versioning") version "6.1.4" id("com.github.ben-manes.versions") version "0.42.0" id("org.springframework.boot") version "2.6.7" + id("org.springframework.experimental.aot") version "0.11.5" id("io.spring.dependency-management") version "1.0.11.RELEASE" id("io.github.1c-syntax.bslls-dev-tools") version "0.7.0" id("ru.vyarus.pom") version "2.2.1" @@ -27,6 +28,7 @@ repositories { mavenLocal() mavenCentral() maven(url = "https://jitpack.io") + maven(url = "https://repo.spring.io/release") } group = "io.github.1c-syntax" @@ -81,6 +83,7 @@ dependencies { // AOP implementation("org.aspectj", "aspectjrt", "1.9.7") + aotMainImplementation("org.aspectj", "aspectjrt", "1.9.7") // commons utils implementation("commons-io", "commons-io", "2.11.0") @@ -347,3 +350,13 @@ nexusStaging { tasks.withType { enabled = false } + +graalvmNative { + binaries { + named("main") { + sharedLibrary.set(false) + buildArgs.add("--trace-class-initialization=com.github._1c_syntax.mdclasses.common.CompatibilityMode") + buildArgs.add("--initialize-at-build-time=com.github._1c_syntax.mdclasses.common.CompatibilityMode") + } + } +} \ No newline at end of file diff --git a/lombok.config b/lombok.config index 0206de4de79..6c506976797 100644 --- a/lombok.config +++ b/lombok.config @@ -2,3 +2,4 @@ lombok.anyConstructor.addConstructorProperties=true lombok.addLombokGeneratedAnnotation=true lombok.log.fieldName=LOGGER lombok.extern.findbugs.addSuppressFBWarnings = true +lombok.copyableannotations += org.springframework.beans.factory.annotation.Qualifier \ No newline at end of file diff --git a/settings.gradle.kts b/settings.gradle.kts index 5d52f354c34..c341490bf49 100644 --- a/settings.gradle.kts +++ b/settings.gradle.kts @@ -4,6 +4,7 @@ pluginManagement { repositories { gradlePluginPortal() maven(url = "https://jitpack.io") + maven(url = "https://repo.spring.io/release") mavenLocal() } } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/cli/AnalyzeCommand.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/cli/AnalyzeCommand.java index 512804fbb5c..9309b397177 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/cli/AnalyzeCommand.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/cli/AnalyzeCommand.java @@ -30,6 +30,7 @@ import com.github._1c_syntax.mdclasses.mdo.AbstractMDObjectBase; import com.github._1c_syntax.utils.Absolute; import lombok.RequiredArgsConstructor; +import lombok.Setter; import lombok.SneakyThrows; import lombok.extern.slf4j.Slf4j; import me.tongfei.progressbar.ProgressBar; @@ -37,6 +38,8 @@ import me.tongfei.progressbar.ProgressBarStyle; import org.apache.commons.io.FileUtils; import org.eclipse.lsp4j.Diagnostic; +import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import picocli.CommandLine.Command; @@ -141,7 +144,9 @@ private static class ReportersKeys extends ArrayList { description = "Silent mode") private boolean silentMode; - private final ReportersAggregator aggregator; + @Setter(onMethod = @__({@Autowired, @Lazy})) + private ReportersAggregator aggregator; + private final LanguageServerConfiguration configuration; private final ServerContext context; 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 d9e5d5f2631..2ffc13c13b4 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 @@ -32,7 +32,7 @@ import lombok.extern.slf4j.Slf4j; import org.apache.commons.io.FileUtils; import org.eclipse.lsp4j.TextDocumentItem; -import org.springframework.beans.factory.annotation.Lookup; +import org.springframework.beans.factory.ObjectProvider; import org.springframework.stereotype.Component; import javax.annotation.CheckForNull; @@ -54,7 +54,7 @@ @Slf4j @Component @RequiredArgsConstructor -public abstract class ServerContext { +public class ServerContext { private final Map documents = Collections.synchronizedMap(new HashMap<>()); private final Lazy configurationMetadata = new Lazy<>(this::computeConfigurationMetadata); @CheckForNull @@ -64,6 +64,7 @@ public abstract class ServerContext { private final Map> documentsByMDORef = Collections.synchronizedMap(new HashMap<>()); private final ReadWriteLock contextLock = new ReentrantReadWriteLock(); + private final ObjectProvider documentContextProvider; public void populateContext() { if (configurationRoot == null) { @@ -162,9 +163,6 @@ public Configuration getConfiguration() { return configurationMetadata.getOrCompute(); } - @Lookup - protected abstract DocumentContext lookupDocumentContext(URI absoluteURI); - @SneakyThrows private DocumentContext createDocumentContext(File file, int version) { String content = FileUtils.readFileToString(file, StandardCharsets.UTF_8); @@ -174,7 +172,7 @@ private DocumentContext createDocumentContext(File file, int version) { private DocumentContext createDocumentContext(URI uri, String content, int version) { URI absoluteURI = Absolute.uri(uri); - var documentContext = lookupDocumentContext(absoluteURI); + var documentContext = documentContextProvider.getObject(absoluteURI); documentContext.rebuild(content, version); documents.put(absoluteURI, documentContext); diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/DiagnosticComputer.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/DiagnosticComputer.java index b38162add0a..b555c37ea34 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/DiagnosticComputer.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/DiagnosticComputer.java @@ -26,7 +26,8 @@ import lombok.RequiredArgsConstructor; import lombok.extern.slf4j.Slf4j; import org.eclipse.lsp4j.Diagnostic; -import org.springframework.beans.factory.annotation.Lookup; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.stereotype.Component; import java.util.List; @@ -36,13 +37,16 @@ @Component @RequiredArgsConstructor @Slf4j -public abstract class DiagnosticComputer { +public class DiagnosticComputer { + + @Qualifier("diagnostics") + private final ObjectProvider> diagnosticsProvider; public List compute(DocumentContext documentContext) { DiagnosticIgnoranceComputer.Data diagnosticIgnorance = documentContext.getDiagnosticIgnorance(); - return diagnostics(documentContext).parallelStream() + return diagnosticsProvider.getObject(documentContext).parallelStream() .flatMap((BSLDiagnostic diagnostic) -> { try { return diagnostic.getDiagnostics(documentContext).stream(); @@ -62,7 +66,4 @@ public List compute(DocumentContext documentContext) { .collect(Collectors.toList()); } - - @Lookup("diagnostics") - protected abstract List diagnostics(DocumentContext documentContext); } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/infrastructure/DiagnosticInfosConfiguration.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/infrastructure/DiagnosticInfosConfiguration.java index 51635f28a63..3e36d30f846 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/infrastructure/DiagnosticInfosConfiguration.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/infrastructure/DiagnosticInfosConfiguration.java @@ -28,6 +28,7 @@ import com.github._1c_syntax.utils.StringInterner; import lombok.RequiredArgsConstructor; import org.springframework.beans.factory.annotation.Autowired; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.beans.factory.config.BeanDefinition; import org.springframework.context.ApplicationContext; import org.springframework.context.annotation.Bean; @@ -68,21 +69,28 @@ public Map diagnosticInfosByCode() { @Bean("diagnosticInfosByDiagnosticClass") @Role(BeanDefinition.ROLE_INFRASTRUCTURE) - public Map, DiagnosticInfo> diagnosticInfosByDiagnosticClass() { - return diagnosticInfosByCode().values().stream() + public Map, DiagnosticInfo> diagnosticInfosByDiagnosticClass( + @Qualifier("diagnosticInfosByCode") Map diagnosticInfosByCode + ) { + return diagnosticInfosByCode.values().stream() .collect(Collectors.toMap(DiagnosticInfo::getDiagnosticClass, Function.identity())); } @Bean("diagnosticInfos") @Role(BeanDefinition.ROLE_INFRASTRUCTURE) - public Collection diagnosticInfos() { - return diagnosticInfosByCode().values(); + public Collection diagnosticInfos( + @Qualifier("diagnosticInfosByCode") Map diagnosticInfosByCode + ) { + return diagnosticInfosByCode.values(); } @Bean @Scope("prototype") - public DiagnosticInfo diagnosticInfo(@Autowired(required = false) Class diagnosticClass) { - return diagnosticInfosByDiagnosticClass().get(diagnosticClass); + public DiagnosticInfo diagnosticInfo( + @Autowired(required = false) Class diagnosticClass, + Map, DiagnosticInfo> diagnosticInfosByDiagnosticClass + ) { + return diagnosticInfosByDiagnosticClass.get(diagnosticClass); } private DiagnosticInfo createDiagnosticInfo( diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/infrastructure/DiagnosticsConfiguration.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/infrastructure/DiagnosticsConfiguration.java index 5620845e37d..20e65966728 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/infrastructure/DiagnosticsConfiguration.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/infrastructure/DiagnosticsConfiguration.java @@ -39,7 +39,8 @@ import com.github._1c_syntax.mdclasses.supportconf.SupportVariant; import lombok.RequiredArgsConstructor; import org.eclipse.lsp4j.jsonrpc.messages.Either; -import org.springframework.beans.factory.annotation.Lookup; +import org.springframework.beans.factory.ObjectProvider; +import org.springframework.beans.factory.annotation.Qualifier; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Scope; @@ -54,16 +55,19 @@ @Configuration @RequiredArgsConstructor -public abstract class DiagnosticsConfiguration { +public class DiagnosticsConfiguration { private final LanguageServerConfiguration configuration; private final DiagnosticObjectProvider diagnosticObjectProvider; + @Qualifier("diagnosticInfos") + private final ObjectProvider> diagnosticInfosProvider; + @Bean @Scope("prototype") public List diagnostics(DocumentContext documentContext) { - Collection diagnosticInfos = diagnosticInfos(); + Collection diagnosticInfos = diagnosticInfosProvider.getObject(); DiagnosticsOptions diagnosticsOptions = configuration.getDiagnosticsOptions(); @@ -88,9 +92,6 @@ public List diagnostics(DocumentContext documentContext) { } } - @Lookup("diagnosticInfos") - protected abstract Collection diagnosticInfos(); - private static boolean needToComputeDiagnostics( DocumentContext documentContext, DiagnosticsOptions diagnosticsOptions diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/reporters/ReportersAggregator.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/reporters/ReportersAggregator.java index c7d4ce204a4..4d9ccc2a805 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/reporters/ReportersAggregator.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/reporters/ReportersAggregator.java @@ -23,9 +23,7 @@ import com.github._1c_syntax.bsl.languageserver.reporters.data.AnalysisInfo; import lombok.RequiredArgsConstructor; -import org.springframework.beans.factory.annotation.Autowired; import org.springframework.beans.factory.annotation.Qualifier; -import org.springframework.context.annotation.Lazy; import org.springframework.stereotype.Component; import java.nio.file.Path; @@ -36,13 +34,9 @@ @RequiredArgsConstructor public class ReportersAggregator { - @Autowired private final List reporters; - @Autowired @Qualifier("filteredReporters") - @Lazy - // Don't remove @Autowired annotation. It's needed for injecting filteredReporters bean correctly. private final List filteredReporters; public void report(AnalysisInfo analysisInfo, Path outputDir) { diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/reporters/infrastructure/ReportersConfiguration.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/reporters/infrastructure/ReportersConfiguration.java index 0eb876cdb90..a240b56450e 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/reporters/infrastructure/ReportersConfiguration.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/reporters/infrastructure/ReportersConfiguration.java @@ -25,7 +25,6 @@ import com.github._1c_syntax.bsl.languageserver.reporters.DiagnosticReporter; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; -import org.springframework.context.annotation.Lazy; import java.util.Arrays; import java.util.Collection; @@ -36,7 +35,6 @@ public class ReportersConfiguration { @Bean - @Lazy public List filteredReporters( Collection allReporters, AnalyzeCommand command diff --git a/src/main/resources/application.properties b/src/main/resources/application.properties index a67dd2df49f..1b362f2348f 100644 --- a/src/main/resources/application.properties +++ b/src/main/resources/application.properties @@ -3,6 +3,7 @@ spring.main.banner-mode=off spring.main.log-startup-info=false logging.level.org.springframework.boot.autoconfigure.logging=INFO logging.level.org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler=warn +logging.level.org.springframework.nativex.NativeListener=warn logging.level.com.zaxxer.hikari=warn logging.level.org.hibernate=warn logging.level.org.hibernate.engine.jdbc.spi.SqlExceptionHelper=fatal diff --git a/src/test/resources/application-measures.properties b/src/test/resources/application-measures.properties index 9e87d3d52a8..ee0899ae47a 100644 --- a/src/test/resources/application-measures.properties +++ b/src/test/resources/application-measures.properties @@ -3,6 +3,7 @@ spring.main.banner-mode=off spring.main.log-startup-info=false logging.level.org.springframework.boot.autoconfigure.logging=INFO logging.level.org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler=warn +logging.level.org.springframework.nativex.NativeListener=warn logging.level.com.zaxxer.hikari=warn logging.level.org.hibernate=warn logging.level.org.hibernate.engine.jdbc.spi.SqlExceptionHelper=fatal diff --git a/src/test/resources/application.properties b/src/test/resources/application.properties index b9d9d03fe18..d350dd72ea6 100644 --- a/src/test/resources/application.properties +++ b/src/test/resources/application.properties @@ -3,6 +3,7 @@ spring.main.banner-mode=off spring.main.log-startup-info=false logging.level.org.springframework.boot.autoconfigure.logging=INFO logging.level.org.springframework.scheduling.concurrent.ThreadPoolTaskScheduler=warn +logging.level.org.springframework.nativex.NativeListener=warn logging.level.com.zaxxer.hikari=warn logging.level.org.hibernate=warn logging.level.org.hibernate.engine.jdbc.spi.SqlExceptionHelper=fatal From 290c5b0cf6b90c02b52c66862abcdb9ceb63f9df Mon Sep 17 00:00:00 2001 From: Nikita Fedkin Date: Fri, 17 Jun 2022 20:12:37 +0300 Subject: [PATCH 2/2] =?UTF-8?q?=D0=9F=D0=B5=D1=80=D0=B5=D0=B4=D0=B0=D1=87?= =?UTF-8?q?=D0=B0=20=D1=81=D0=B3=D0=B5=D0=BD=D0=B5=D1=80=D0=B8=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=BD=D1=8B=D1=85=20json'=D0=BE=D0=B2=20?= =?UTF-8?q?=D0=B4=D0=BB=D1=8F=20=D0=BA=D0=BE=D0=BC=D0=BF=D0=B8=D0=BB=D1=8F?= =?UTF-8?q?=D1=82=D0=BE=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- build.gradle.kts | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/build.gradle.kts b/build.gradle.kts index f6e1cb6c86f..07629ab1b0b 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -355,8 +355,14 @@ graalvmNative { binaries { named("main") { sharedLibrary.set(false) + buildArgs.add("--tool:lsp") buildArgs.add("--trace-class-initialization=com.github._1c_syntax.mdclasses.common.CompatibilityMode") buildArgs.add("--initialize-at-build-time=com.github._1c_syntax.mdclasses.common.CompatibilityMode") + + buildArgs.add("-H:JNIConfigurationFiles=$rootDir/graalvm/jni-config.json") + buildArgs.add("-H:DynamicProxyConfigurationFiles=$rootDir/graalvm/proxy-config.json") + buildArgs.add("-H:ReflectionConfigurationFiles=$rootDir/graalvm/reflect-config.json") + buildArgs.add("-H:ResourceConfigurationFiles=$rootDir/graalvm/resource-config.json") } } } \ No newline at end of file