use of com.github._1c_syntax.bsl.languageserver.context.symbol.RegionSymbol in project bsl-language-server by 1c-syntax.
the class DuplicateRegionDiagnostic method visitFile.
@Override
public ParseTree visitFile(BSLParser.FileContext ctx) {
List<RegionSymbol> regions = documentContext.getSymbolTree().getModuleLevelRegions();
// анализировать модуль без областей не будем
if (regions.isEmpty()) {
return ctx;
}
// считаем дубли с учетом альтернативных имен для стандартных областей
regions.stream().collect(Collectors.groupingBy(regionSymbol -> regionNames.getOrDefault(regionSymbol.getName(), regionSymbol.getName()))).forEach((String name, List<RegionSymbol> regionsList) -> {
if (regionsList.size() > 1) {
List<DiagnosticRelatedInformation> relatedInformation = new ArrayList<>();
RegionSymbol currentRegion = regionsList.get(0);
Range currentRange = currentRegion.getStartRange();
regionsList.stream().map(region -> RelatedInformation.create(documentContext.getUri(), region.getStartRange(), "+1")).collect(Collectors.toCollection(() -> relatedInformation));
diagnosticStorage.addDiagnostic(currentRange, info.getMessage(currentRegion.getName()), relatedInformation);
}
});
return ctx;
}
use of com.github._1c_syntax.bsl.languageserver.context.symbol.RegionSymbol in project bsl-language-server by 1c-syntax.
the class RegionSymbolComputer method visitRegionEnd.
@Override
public ParseTree visitRegionEnd(BSLParser.RegionEndContext ctx) {
if (regionStack.isEmpty()) {
return super.visitRegionEnd(ctx);
}
var pair = regionStack.pop();
RegionSymbol.RegionSymbolBuilder builder = pair.getLeft();
BSLParser.RegionStartContext regionStartContext = pair.getRight();
Range range = Ranges.create(regionStartContext, ctx);
builder.range(range).endRange(Ranges.create(ctx));
RegionSymbol region = builder.build();
regions.add(region);
return super.visitRegionEnd(ctx);
}
use of com.github._1c_syntax.bsl.languageserver.context.symbol.RegionSymbol in project bsl-language-server by 1c-syntax.
the class SymbolTreeComputer method compute.
@Override
public SymbolTree compute() {
ModuleSymbol moduleSymbol = new ModuleSymbolComputer(documentContext).compute();
List<MethodSymbol> methods = new MethodSymbolComputer(documentContext).compute();
List<RegionSymbol> regions = new RegionSymbolComputer(documentContext).compute();
List<VariableSymbol> variables = new VariableSymbolComputer(documentContext).compute();
List<SourceDefinedSymbol> allOfThem = new ArrayList<>(methods);
allOfThem.addAll(regions);
allOfThem.addAll(variables);
allOfThem.sort(Comparator.comparingInt(symbol -> symbol.getRange().getStart().getLine()));
List<SourceDefinedSymbol> topLevelSymbols = new ArrayList<>();
SourceDefinedSymbol currentParent = moduleSymbol;
for (SourceDefinedSymbol symbol : allOfThem) {
currentParent = placeSymbol(topLevelSymbols, currentParent, symbol);
}
return new SymbolTree(moduleSymbol);
}
use of com.github._1c_syntax.bsl.languageserver.context.symbol.RegionSymbol in project bsl-language-server by 1c-syntax.
the class GenerateStandardRegionsSupplier method getCodeActions.
/**
* При необходимости создает {@code CodeAction} для генерации отсутствующих
* стандартных областей 1С
*
* @param params параметры вызова генерации {@code codeAction}
* @param documentContext представление программного модуля
* @return {@code List<CodeAction>} если модуль не содержит всех стандартных областей,
* пустой {@code List} если генерация областей не требуется
*/
@Override
public List<CodeAction> getCodeActions(CodeActionParams params, DocumentContext documentContext) {
ModuleType moduleType = documentContext.getModuleType();
FileType fileType = documentContext.getFileType();
ScriptVariant regionsLanguage = getRegionsLanguage(documentContext, fileType);
Set<String> neededStandardRegions;
if (fileType == FileType.BSL) {
neededStandardRegions = Regions.getStandardRegionsNamesByModuleType(moduleType, regionsLanguage);
} else {
neededStandardRegions = Regions.getOneScriptStandardRegions(regionsLanguage);
}
Set<String> documentRegionsNames = documentContext.getSymbolTree().getModuleLevelRegions().stream().map(RegionSymbol::getName).collect(Collectors.toSet());
neededStandardRegions.removeAll(documentRegionsNames);
if (neededStandardRegions.isEmpty()) {
return Collections.emptyList();
}
String regionFormat = regionsLanguage == ScriptVariant.ENGLISH ? "#Region %s%n%n#EndRegion%n" : "#Область %s%n%n#КонецОбласти%n";
String result = neededStandardRegions.stream().map(s -> String.format(regionFormat, s)).collect(Collectors.joining("\n"));
TextEdit textEdit = new TextEdit(calculateFixRange(params.getRange()), result);
WorkspaceEdit edit = new WorkspaceEdit();
Map<String, List<TextEdit>> changes = Map.of(documentContext.getUri().toString(), Collections.singletonList(textEdit));
edit.setChanges(changes);
CodeAction codeAction = new CodeAction("Generate missing regions");
codeAction.setDiagnostics(new ArrayList<>());
codeAction.setKind(CodeActionKind.Refactor);
codeAction.setEdit(edit);
return List.of(codeAction);
}
Aggregations