Skip to content

Commit

Permalink
Уточнен состав референса для модулей и классов оскрипта
Browse files Browse the repository at this point in the history
  • Loading branch information
nixel2007 committed Jan 3, 2024
1 parent d69dde6 commit 863d672
Showing 1 changed file with 21 additions and 14 deletions.
Original file line number Diff line number Diff line change
Expand Up @@ -23,11 +23,13 @@

import com.github._1c_syntax.bsl.languageserver.context.DocumentState;
import com.github._1c_syntax.bsl.languageserver.context.ServerContext;
import com.github._1c_syntax.bsl.languageserver.context.symbol.SourceDefinedSymbol;
import com.github._1c_syntax.bsl.languageserver.references.model.OccurrenceType;
import com.github._1c_syntax.bsl.languageserver.references.model.Reference;
import com.github._1c_syntax.bsl.languageserver.utils.Ranges;
import com.github._1c_syntax.bsl.languageserver.utils.Trees;
import com.github._1c_syntax.bsl.parser.BSLParser;
import com.github._1c_syntax.bsl.parser.BSLParserRuleContext;
import com.github._1c_syntax.bsl.types.ModuleType;
import lombok.RequiredArgsConstructor;
import org.antlr.v4.runtime.tree.TerminalNode;
Expand Down Expand Up @@ -55,36 +57,41 @@ public Optional<Reference> findReference(URI uri, Position position) {
return Optional.empty();
}

var node = Trees.findTerminalNodeContainsPosition(document.getAst(), position);
var maybeTerminalNode = Trees.findTerminalNodeContainsPosition(document.getAst(), position);

if (node.isEmpty()) {
if (maybeTerminalNode.isEmpty()) {
return Optional.empty();
}

var terminalNode = maybeTerminalNode.get();

var sub = (BSLParser.SubContext) Trees.getAncestorByRuleIndex((BSLParserRuleContext) terminalNode.getParent().getRuleContext(), BSLParser.RULE_sub);
var symbolTree = document.getSymbolTree();
var from = Optional.ofNullable(sub)
.flatMap(symbolTree::getMethodSymbol)
.map(SourceDefinedSymbol.class::cast)
.orElse(symbolTree.getModule());

return serverContext.getDocuments().values().stream()
.filter(documentContext -> documentContext.getTypeName().equals(node.get().getText()))
.filter(documentContext -> filterByType(node, documentContext.getModuleType()))
.filter(documentContext -> documentContext.getTypeName().equals(terminalNode.getText()))
.filter(documentContext -> filterByType(terminalNode, documentContext.getModuleType()))
.map(documentContext -> new Reference(
documentContext.getSymbolTree().getModule(),
// todo: было бы здорово сохранить эту информацию в ReferenceIndex вместо поиска напрямую.
from,
documentContext.getSymbolTree().getModule(),
documentContext.getUri(),
Ranges.create(0, 0, 0, 0),
Ranges.create(terminalNode),
OccurrenceType.DEFINITION)
).findAny();

}

private boolean filterByType(Optional<TerminalNode> node, ModuleType moduleType) {

if (node.isEmpty()) {
return false;
}

if ((node.get().getParent() instanceof BSLParser.TypeNameContext)
private boolean filterByType(TerminalNode node, ModuleType moduleType) {
if ((node.getParent() instanceof BSLParser.TypeNameContext)
&& moduleType == ModuleType.OScriptClass) {
return true;
} else {
return (node.get().getParent() instanceof BSLParser.ComplexIdentifierContext)
return (node.getParent() instanceof BSLParser.ComplexIdentifierContext)
&& moduleType == ModuleType.OScriptModule;
}
}
Expand Down

0 comments on commit 863d672

Please sign in to comment.