Search in sources :

Example 1 with LanguageServerConfiguration

use of com.github._1c_syntax.bsl.languageserver.configuration.LanguageServerConfiguration in project sonar-bsl-plugin-community by 1c-syntax.

the class BSLCoreSensor method execute.

@Override
public void execute(SensorContext context) {
    LOGGER.info("Parsing files...");
    FileSystem fileSystem = context.fileSystem();
    File baseDir = fileSystem.baseDir();
    var absoluteSourceDirs = sourcesList.stream().map((String sourceDir) -> {
        Path sourcePath = Path.of(sourceDir.trim());
        if (sourcePath.isAbsolute()) {
            return sourcePath;
        } else {
            return Path.of(baseDir.toString(), sourceDir);
        }
    }).map(Absolute::path).collect(Collectors.toList());
    FilePredicates predicates = fileSystem.predicates();
    Iterable<InputFile> inputFiles = fileSystem.inputFiles(predicates.hasLanguage(BSLLanguage.KEY));
    Map<Path, List<InputFile>> inputFilesByPath = StreamSupport.stream(inputFiles.spliterator(), true).collect(Collectors.groupingBy((InputFile inputFile) -> {
        var filePath = Absolute.path(inputFile.uri());
        return absoluteSourceDirs.stream().filter(filePath::startsWith).findAny().orElse(baseDir.toPath());
    }));
    LanguageServerConfiguration languageServerConfiguration = getLanguageServerConfiguration();
    inputFilesByPath.forEach((Path sourceDir, List<InputFile> inputFilesList) -> {
        LOGGER.info("Source dir: {}", sourceDir);
        Path configurationRoot = LanguageServerConfiguration.getCustomConfigurationRoot(languageServerConfiguration, sourceDir);
        var bslServerContext = BSLLSBinding.getServerContext();
        bslServerContext.setConfigurationRoot(configurationRoot);
        bslServerContext.populateContext();
        try (ProgressBar pb = new ProgressBarBuilder().setTaskName("").setInitialMax(inputFilesList.size()).setStyle(ProgressBarStyle.ASCII).build()) {
            inputFilesList.parallelStream().forEach((InputFile inputFile) -> {
                URI uri = inputFile.uri();
                LOGGER.debug(uri.toString());
                pb.step();
                processFile(inputFile, bslServerContext);
            });
        }
        bslServerContext.clear();
    });
    BSLLSBinding.getApplicationContext().close();
}
Also used : Path(java.nio.file.Path) LanguageServerConfiguration(com.github._1c_syntax.bsl.languageserver.configuration.LanguageServerConfiguration) URI(java.net.URI) InputFile(org.sonar.api.batch.fs.InputFile) ProgressBarBuilder(me.tongfei.progressbar.ProgressBarBuilder) FileSystem(org.sonar.api.batch.fs.FileSystem) FilePredicates(org.sonar.api.batch.fs.FilePredicates) List(java.util.List) ArrayList(java.util.ArrayList) InputFile(org.sonar.api.batch.fs.InputFile) File(java.io.File) ProgressBar(me.tongfei.progressbar.ProgressBar)

Example 2 with LanguageServerConfiguration

use of com.github._1c_syntax.bsl.languageserver.configuration.LanguageServerConfiguration in project sonar-bsl-plugin-community by 1c-syntax.

the class BSLCoreSensor method getLanguageServerConfiguration.

private LanguageServerConfiguration getLanguageServerConfiguration() {
    boolean overrideConfiguration = context.config().get(BSLCommunityProperties.LANG_SERVER_OVERRIDE_CONFIGURATION_KEY).map(Boolean::parseBoolean).orElse(BSLCommunityProperties.LANG_SERVER_OVERRIDE_CONFIGURATION_DEFAULT_VALUE);
    var configuration = BSLLSBinding.getLanguageServerConfiguration();
    if (overrideConfiguration) {
        String configurationPath = context.config().get(BSLCommunityProperties.LANG_SERVER_CONFIGURATION_PATH_KEY).orElse(BSLCommunityProperties.LANG_SERVER_CONFIGURATION_PATH_DEFAULT_VALUE);
        File configurationFile = new File(configurationPath);
        if (configurationFile.exists()) {
            LOGGER.info("BSL LS configuration file exists. Overriding SonarQube rules' settings...");
            configuration.update(configurationFile);
            return configuration;
        } else {
            LOGGER.error("Can't find bsl configuration file {}. Using SonarQube config instead.", configurationPath);
        }
    }
    String diagnosticLanguageCode = context.config().get(BSLCommunityProperties.LANG_SERVER_DIAGNOSTIC_LANGUAGE_KEY).orElse(BSLCommunityProperties.LANG_SERVER_DIAGNOSTIC_LANGUAGE_DEFAULT_VALUE);
    configuration.setLanguage(Language.valueOf(diagnosticLanguageCode.toUpperCase(Locale.ENGLISH)));
    SkipSupport skipSupport = context.config().get(BSLCommunityProperties.LANG_SERVER_COMPUTE_DIAGNOSTICS_SKIP_SUPPORT_KEY).map(value -> value.toUpperCase(Locale.ENGLISH).replace(" ", "_")).map(SkipSupport::valueOf).orElse(SkipSupport.valueOf(BSLCommunityProperties.LANG_SERVER_COMPUTE_DIAGNOSTICS_SKIP_SUPPORT_DEFAULT_VALUE.toUpperCase(Locale.ENGLISH)));
    configuration.getDiagnosticsOptions().setSkipSupport(skipSupport);
    ActiveRules activeRules = context.activeRules();
    Map<String, Either<Boolean, Map<String, Object>>> diagnostics = new HashMap<>();
    Collection<DiagnosticInfo> diagnosticInfos = BSLLSBinding.getDiagnosticInfos();
    for (DiagnosticInfo diagnosticInfo : diagnosticInfos) {
        String diagnosticCode = diagnosticInfo.getCode().getStringValue();
        ActiveRule activeRule = activeRules.find(RuleKey.of(BSLLanguageServerRuleDefinition.REPOSITORY_KEY, diagnosticCode));
        if (activeRule == null) {
            diagnostics.put(diagnosticCode, Either.forLeft(false));
        } else {
            Map<String, String> params = activeRule.params();
            List<DiagnosticParameterInfo> diagnosticParameters = diagnosticInfo.getParameters();
            Map<String, Object> diagnosticConfiguration = new HashMap<>(diagnosticParameters.size());
            params.forEach((String key, String value) -> diagnosticInfo.getParameter(key).ifPresent(diagnosticParameterInfo -> diagnosticConfiguration.put(key, castDiagnosticParameterValue(value, diagnosticParameterInfo.getType()))));
            diagnostics.put(diagnosticCode, Either.forRight(diagnosticConfiguration));
        }
    }
    configuration.getDiagnosticsOptions().setParameters(diagnostics);
    return configuration;
}
Also used : ActiveRule(org.sonar.api.batch.rule.ActiveRule) Arrays(java.util.Arrays) Language(com.github._1c_syntax.bsl.languageserver.configuration.Language) Token(org.antlr.v4.runtime.Token) ActiveRules(org.sonar.api.batch.rule.ActiveRules) StringUtils(org.apache.commons.lang3.StringUtils) FilePredicates(org.sonar.api.batch.fs.FilePredicates) Absolute(com.github._1c_syntax.utils.Absolute) FileLinesContext(org.sonar.api.measures.FileLinesContext) FileLinesContextFactory(org.sonar.api.measures.FileLinesContextFactory) Loggers(org.sonar.api.utils.log.Loggers) LanguageServerConfiguration(com.github._1c_syntax.bsl.languageserver.configuration.LanguageServerConfiguration) Locale(java.util.Locale) Map(java.util.Map) Either(org.eclipse.lsp4j.jsonrpc.messages.Either) URI(java.net.URI) MetricStorage(com.github._1c_syntax.bsl.languageserver.context.MetricStorage) Path(java.nio.file.Path) ServerContext(com.github._1c_syntax.bsl.languageserver.context.ServerContext) DiagnosticInfo(com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticInfo) Collection(java.util.Collection) FileSystem(org.sonar.api.batch.fs.FileSystem) SensorContext(org.sonar.api.batch.sensor.SensorContext) Collectors(java.util.stream.Collectors) CoreMetrics(org.sonar.api.measures.CoreMetrics) StandardCharsets(java.nio.charset.StandardCharsets) SensorDescriptor(org.sonar.api.batch.sensor.SensorDescriptor) IOUtils(org.apache.commons.io.IOUtils) List(java.util.List) RuleKey(org.sonar.api.rule.RuleKey) SkipSupport(com.github._1c_syntax.bsl.languageserver.configuration.diagnostics.SkipSupport) ProgressBarBuilder(me.tongfei.progressbar.ProgressBarBuilder) InputFile(org.sonar.api.batch.fs.InputFile) Sensor(org.sonar.api.batch.sensor.Sensor) HashMap(java.util.HashMap) DocumentContext(com.github._1c_syntax.bsl.languageserver.context.DocumentContext) BSLLSBinding(com.github._1c_syntax.bsl.languageserver.BSLLSBinding) BSLLanguage(com.github._1c_syntax.bsl.sonar.language.BSLLanguage) ArrayList(java.util.ArrayList) StreamSupport(java.util.stream.StreamSupport) Logger(org.sonar.api.utils.log.Logger) ProgressBar(me.tongfei.progressbar.ProgressBar) BSLLexer(com.github._1c_syntax.bsl.parser.BSLLexer) IOException(java.io.IOException) File(java.io.File) ProgressBarStyle(me.tongfei.progressbar.ProgressBarStyle) DiagnosticParameterInfo(com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticParameterInfo) BSLLanguageServerRuleDefinition(com.github._1c_syntax.bsl.sonar.language.BSLLanguageServerRuleDefinition) Collections(java.util.Collections) HashMap(java.util.HashMap) DiagnosticInfo(com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticInfo) ActiveRule(org.sonar.api.batch.rule.ActiveRule) DiagnosticParameterInfo(com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticParameterInfo) SkipSupport(com.github._1c_syntax.bsl.languageserver.configuration.diagnostics.SkipSupport) ActiveRules(org.sonar.api.batch.rule.ActiveRules) Either(org.eclipse.lsp4j.jsonrpc.messages.Either) InputFile(org.sonar.api.batch.fs.InputFile) File(java.io.File)

Aggregations

LanguageServerConfiguration (com.github._1c_syntax.bsl.languageserver.configuration.LanguageServerConfiguration)2 File (java.io.File)2 URI (java.net.URI)2 Path (java.nio.file.Path)2 ArrayList (java.util.ArrayList)2 List (java.util.List)2 ProgressBar (me.tongfei.progressbar.ProgressBar)2 ProgressBarBuilder (me.tongfei.progressbar.ProgressBarBuilder)2 FilePredicates (org.sonar.api.batch.fs.FilePredicates)2 FileSystem (org.sonar.api.batch.fs.FileSystem)2 InputFile (org.sonar.api.batch.fs.InputFile)2 BSLLSBinding (com.github._1c_syntax.bsl.languageserver.BSLLSBinding)1 Language (com.github._1c_syntax.bsl.languageserver.configuration.Language)1 SkipSupport (com.github._1c_syntax.bsl.languageserver.configuration.diagnostics.SkipSupport)1 DocumentContext (com.github._1c_syntax.bsl.languageserver.context.DocumentContext)1 MetricStorage (com.github._1c_syntax.bsl.languageserver.context.MetricStorage)1 ServerContext (com.github._1c_syntax.bsl.languageserver.context.ServerContext)1 DiagnosticInfo (com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticInfo)1 DiagnosticParameterInfo (com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticParameterInfo)1 BSLLexer (com.github._1c_syntax.bsl.parser.BSLLexer)1