use of com.github._1c_syntax.bsl.parser.BSLParserRuleContext in project bsl-language-server by 1c-syntax.
the class CognitiveComplexityComputer method flattenExpression.
private List<Token> flattenExpression(BSLParser.ExpressionContext ctx) {
ignoredContexts.add(ctx);
List<Token> result = new ArrayList<>();
final List<Tree> children = Trees.getChildren(ctx);
for (Tree tree : children) {
if (!(tree instanceof BSLParserRuleContext)) {
continue;
}
BSLParserRuleContext parserRule = ((BSLParserRuleContext) tree);
if (parserRule instanceof BSLParser.MemberContext) {
flattenMember(result, (BSLParser.MemberContext) parserRule);
} else if (parserRule instanceof BSLParser.OperationContext) {
flattenOperation(result, (BSLParser.OperationContext) parserRule);
}
}
return result;
}
use of com.github._1c_syntax.bsl.parser.BSLParserRuleContext in project bsl-language-server by 1c-syntax.
the class CyclomaticComplexityComputer method flattenExpression.
private static List<Token> flattenExpression(BSLParser.ExpressionContext ctx) {
List<Token> result = new ArrayList<>();
final List<Tree> children = Trees.getChildren(ctx);
for (Tree tree : children) {
if (!(tree instanceof BSLParserRuleContext)) {
continue;
}
BSLParserRuleContext parserRule = ((BSLParserRuleContext) tree);
if (parserRule instanceof BSLParser.MemberContext) {
flattenMember(result, (BSLParser.MemberContext) parserRule);
} else if (parserRule instanceof BSLParser.OperationContext) {
flattenOperation(result, (BSLParser.OperationContext) parserRule);
}
}
return result;
}
use of com.github._1c_syntax.bsl.parser.BSLParserRuleContext in project bsl-language-server by 1c-syntax.
the class CreateQueryInCycleDiagnostic method visitAccessCall.
@Override
public ParseTree visitAccessCall(BSLParser.AccessCallContext ctx) {
if (!EXECUTE_CALL_PATTERN.matcher(ctx.methodCall().methodName().getText()).matches()) {
return super.visitAccessCall(ctx);
}
if (!currentScope.codeFlowInCycle()) {
return super.visitAccessCall(ctx);
}
String variableName = null;
BSLParserRuleContext errorContext = null;
BSLParserRuleContext parent = ctx.getParent();
if (parent instanceof BSLParser.CallStatementContext) {
errorContext = parent;
variableName = getVariableNameFromCallStatementContext((BSLParser.CallStatementContext) parent);
} else if (parent instanceof BSLParser.ModifierContext) {
BSLParser.ModifierContext callModifier = (BSLParser.ModifierContext) parent;
errorContext = callModifier.getParent();
variableName = getVariableNameFromModifierContext(callModifier);
}
Optional<VariableDefinition> variableDefinition = currentScope.getVariableByName(variableName);
BSLParserRuleContext finalErrorContext = errorContext;
if (finalErrorContext != null) {
variableDefinition.ifPresent((VariableDefinition definition) -> {
if (definition.types.contains(QUERY_BUILDER_TYPE) || definition.types.contains(REPORT_BUILDER_TYPE) || definition.types.contains(QUERY_TYPE)) {
diagnosticStorage.addDiagnostic(finalErrorContext);
}
});
}
return super.visitAccessCall(ctx);
}
use of com.github._1c_syntax.bsl.parser.BSLParserRuleContext in project bsl-language-server by 1c-syntax.
the class SymbolTree method getMethodSymbol.
/**
* Попытка поиска символа метода по узлу дерева разбора.
* <p>
* Implementation note - Поиск осуществляется по месту определения метода (declaration).
*
* @param ctx узел дерева разбора документа.
* @return найденный символ метода.
*/
public Optional<MethodSymbol> getMethodSymbol(BSLParserRuleContext ctx) {
BSLParserRuleContext subNameNode;
if (Trees.nodeContainsErrors(ctx)) {
subNameNode = ctx;
} else if (ctx instanceof BSLParser.SubContext) {
if (((BSLParser.SubContext) ctx).function() == null) {
subNameNode = ((BSLParser.SubContext) ctx).procedure().procDeclaration().subName();
} else {
subNameNode = ((BSLParser.SubContext) ctx).function().funcDeclaration().subName();
}
} else {
subNameNode = ctx;
}
Range subNameRange = Ranges.create(subNameNode);
return getMethods().stream().filter(methodSymbol -> methodSymbol.getSubNameRange().equals(subNameRange)).findAny();
}
use of com.github._1c_syntax.bsl.parser.BSLParserRuleContext in project bsl-language-server by 1c-syntax.
the class SymbolTree method getVariableSymbol.
/**
* Попытка поиска символа переменной по узлу дерева разбора.
* <p>
* Implementation note Поиск осуществляется по месту определения переменной (declaration).
*
* @param ctx узел дерева разбора документа.
* @return найденный символ переменной.
*/
public Optional<VariableSymbol> getVariableSymbol(BSLParserRuleContext ctx) {
BSLParserRuleContext varNameNode;
if (Trees.nodeContainsErrors(ctx)) {
varNameNode = ctx;
} else if (ctx instanceof BSLParser.ModuleVarDeclarationContext) {
varNameNode = ((BSLParser.ModuleVarDeclarationContext) ctx).var_name();
} else if (ctx instanceof BSLParser.SubVarDeclarationContext) {
varNameNode = ((BSLParser.SubVarDeclarationContext) ctx).var_name();
} else {
varNameNode = ctx;
}
Range variableNameRange = Ranges.create(varNameNode);
return getVariables().stream().filter(variableSymbol -> variableSymbol.getVariableNameRange().equals(variableNameRange)).findAny();
}
Aggregations