Search in sources :

Example 1 with SDBLTokenizer

use of com.github._1c_syntax.bsl.parser.SDBLTokenizer in project bsl-language-server by 1c-syntax.

the class QueryComputer method visitString.

@Override
public ParseTree visitString(BSLParser.StringContext ctx) {
    // проверка на минимальную длину
    if (ctx.getText().length() < MINIMAL_QUERY_STRING_LENGTH) {
        return ctx;
    }
    int startLine = 0;
    var startEmptyLines = "";
    if (!ctx.getTokens().isEmpty()) {
        startLine = ctx.getTokens().get(0).getLine();
        startEmptyLines = "\n".repeat(startLine - 1);
    }
    boolean isQuery = false;
    // конкатенация строк в одну
    int prevTokenLine = -1;
    String partString = "";
    var strings = new StringJoiner("\n");
    for (Token token : ctx.getTokens()) {
        // добавляем часть строки только в случае находления ее на другой строке файла
        if (token.getLine() != prevTokenLine && prevTokenLine != -1) {
            strings.add(partString);
            partString = "";
        }
        // если новый токен строки находится на той же строке файла, что и предыдущий, то добавляем его к ней
        if (token.getLine() == prevTokenLine && prevTokenLine != -1) {
            String newString = getString(startLine, token);
            partString = newString.substring(partString.length());
        } else {
            partString = getString(startLine, token);
        }
        // проверяем подстроку на вероятность запроса
        if (!isQuery) {
            isQuery = QUERIES_ROOT_KEY.matcher(partString).find() && !NON_QUERIES_START.matcher(partString).find();
        }
        startLine = token.getLine();
        prevTokenLine = token.getLine();
    }
    // последнюю часть тоже необходимо добавить к общему тексту
    if (!partString.isEmpty()) {
        strings.add(partString);
    }
    if (isQuery) {
        queries.add(new SDBLTokenizer(startEmptyLines + removeDoubleQuotes(strings.toString())));
    }
    return ctx;
}
Also used : SDBLTokenizer(com.github._1c_syntax.bsl.parser.SDBLTokenizer) Token(org.antlr.v4.runtime.Token) StringJoiner(java.util.StringJoiner)

Example 2 with SDBLTokenizer

use of com.github._1c_syntax.bsl.parser.SDBLTokenizer in project bsl-language-server by 1c-syntax.

the class DocumentContextLazyDataMeasurer method handleEvent.

/**
 * Обработчик события {@link DocumentContextContentChangedEvent}. Вызывает основную логику выполнения замеров.
 *
 * @param event Событие
 */
@EventListener
@Order
@SneakyThrows
public void handleEvent(DocumentContextContentChangedEvent event) {
    var documentContext = event.getSource();
    LOGGER.debug("Take measurements for {}", documentContext.getUri());
    measureCollector.measureIt(documentContext::getAst, "context: ast");
    measureCollector.measureIt(documentContext::getQueries, "context: queries");
    for (SDBLTokenizer sdblTokenizer : documentContext.getQueries()) {
        measureCollector.measureIt(sdblTokenizer::getAst, "context: queryAst");
    }
    measureCollector.measureIt(documentContext::getSymbolTree, "context: symbolTree");
    measureCollector.measureIt(documentContext::getDiagnosticIgnorance, "context: diagnosticIgnorance");
    measureCollector.measureIt(documentContext::getCognitiveComplexityData, "context: cognitiveComplexity");
    measureCollector.measureIt(documentContext::getCyclomaticComplexityData, "context: cyclomaticComplexity");
    measureCollector.measureIt(documentContext::getMetrics, "context: metrics");
}
Also used : SDBLTokenizer(com.github._1c_syntax.bsl.parser.SDBLTokenizer) Order(org.springframework.core.annotation.Order) SneakyThrows(lombok.SneakyThrows) EventListener(org.springframework.context.event.EventListener)

Aggregations

SDBLTokenizer (com.github._1c_syntax.bsl.parser.SDBLTokenizer)2 StringJoiner (java.util.StringJoiner)1 SneakyThrows (lombok.SneakyThrows)1 Token (org.antlr.v4.runtime.Token)1 EventListener (org.springframework.context.event.EventListener)1 Order (org.springframework.core.annotation.Order)1