From 9f8d05bd5d1a710cf8c877c1d593c11a46c6d8ac Mon Sep 17 00:00:00 2001 From: Nikita Gryzlov Date: Fri, 9 Jul 2021 12:50:58 +0300 Subject: [PATCH] wip --- .../languageserver/context/ServerContext.java | 6 +++--- .../references/ReferenceIndex.java | 19 +++++++++++++++---- .../references/ReferenceIndexTest.java | 4 ++-- 3 files changed, 20 insertions(+), 9 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/ServerContext.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/ServerContext.java index 1db41cc85d0..8e9d875e7a4 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/ServerContext.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/ServerContext.java @@ -23,7 +23,7 @@ import com.github._1c_syntax.bsl.languageserver.utils.MdoRefBuilder; import com.github._1c_syntax.mdclasses.Configuration; -import com.github._1c_syntax.mdclasses.mdo.AbstractMDObjectBase; +import com.github._1c_syntax.mdclasses.mdo.AbstractMDObjectBSL; import com.github._1c_syntax.mdclasses.mdo.MDCommonModule; import com.github._1c_syntax.mdclasses.mdo.support.MDOModule; import com.github._1c_syntax.mdclasses.mdo.support.ModuleType; @@ -166,9 +166,9 @@ public Configuration getConfiguration() { return configurationMetadata.getOrCompute(); } - public Set getGlobalModules() { + public Set getGlobalModules() { - Set globalModules = new HashSet<>(); + Set globalModules = new HashSet<>(); getConfiguration().getCommonModules().values().stream() .filter(MDCommonModule::isGlobal) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndex.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndex.java index ed910d602cf..606936143aa 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndex.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndex.java @@ -28,6 +28,8 @@ import com.github._1c_syntax.bsl.languageserver.context.symbol.SymbolTree; import com.github._1c_syntax.bsl.languageserver.utils.MdoRefBuilder; import com.github._1c_syntax.bsl.languageserver.utils.Ranges; +import com.github._1c_syntax.mdclasses.mdo.AbstractMDObjectBSL; +import com.github._1c_syntax.mdclasses.mdo.support.MDOModule; import com.github._1c_syntax.mdclasses.mdo.support.ModuleType; import lombok.RequiredArgsConstructor; import lombok.Synchronized; @@ -50,6 +52,7 @@ import java.util.Map; import java.util.Optional; import java.util.stream.Collectors; +import java.util.stream.Stream; @Component @RequiredArgsConstructor @@ -204,11 +207,19 @@ private Optional getSourceDefinedSymbol(MultiKey mu ModuleType moduleType = ModuleType.valueOf(multikey.getKey(1)); String symbolName = multikey.getKey(2); - return serverContext.getDocument(mdoRef, moduleType) + Stream reffedModules = serverContext.getDocument(mdoRef, moduleType).stream(); + Stream globalModules = serverContext.getGlobalModules().stream() + .map(AbstractMDObjectBSL::getModules) + .flatMap(Collection::stream) + .map(MDOModule::getUri) + .map(serverContext::getDocument); + + return Stream.concat(reffedModules, globalModules) .map(DocumentContext::getSymbolTree) - // TODO: SymbolTree#getSymbol(Position)? - // Для поиска не только методов, но и переменных, которые могут иметь одинаковые имена - .flatMap(symbolTree -> symbolTree.getMethodSymbol(symbolName)); + .flatMap(symbolTree -> symbolTree.getMethodSymbol(symbolName).stream()) + .map(SourceDefinedSymbol.class::cast) + .findAny(); + } private SourceDefinedSymbol getFromSymbol(URI uri, Position position) { diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndexTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndexTest.java index d983cedd163..18342d1b878 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndexTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndexTest.java @@ -174,7 +174,7 @@ void testGetReferenceToGlobalMethodFromApplicationModule() { // then assertThat(reference.getFrom()).isEqualTo(methodSymbol); assertThat(reference.getSymbol()).isEqualTo(calledMethodSymbol); - assertThat(reference.getSelectionRange()).isEqualTo(Ranges.create(5, 4, 41)); + assertThat(reference.getSelectionRange()).isEqualTo(Ranges.create(5, 4, 29)); assertThat(reference.getUri()).isEqualTo(uri); } @@ -215,7 +215,7 @@ void testGetReferencesFromLocalMethodSymbol() { // then assertThat(references) - .hasSize(3) + .hasSize(5) .contains(Reference.of(localMethodSymbol, localMethodSymbol, locationLocal)) .contains(Reference.of(localMethodSymbol, commonModuleMethodSymbol, locationCommonModule)) .contains(Reference.of(localMethodSymbol, managerModuleMethodSymbol, locationManagerModule))