diff --git a/build.gradle.kts b/build.gradle.kts index ae361cf22a6..8a7ce4cc0f0 100644 --- a/build.gradle.kts +++ b/build.gradle.kts @@ -86,7 +86,7 @@ dependencies { exclude("org.antlr", "antlr-runtime") } api("io.github.1c-syntax", "utils", "0.6.2") - api("io.github.1c-syntax", "mdclasses", "0.15.0") + api("io.github.1c-syntax", "mdclasses", "develop-SNAPSHOT") api("io.github.1c-syntax", "bsl-common-library", "0.8.0") api("io.github.1c-syntax", "supportconf", "0.14.2") api("io.github.1c-syntax", "bsl-parser-core", "0.3.0") diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/cli/AnalyzeCommand.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/cli/AnalyzeCommand.java index b748bdff8e3..f9146ef8e8d 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/cli/AnalyzeCommand.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/cli/AnalyzeCommand.java @@ -26,8 +26,6 @@ import com.github._1c_syntax.bsl.languageserver.reporters.ReportersAggregator; import com.github._1c_syntax.bsl.languageserver.reporters.data.AnalysisInfo; import com.github._1c_syntax.bsl.languageserver.reporters.data.FileInfo; -import com.github._1c_syntax.bsl.mdo.MD; -import com.github._1c_syntax.bsl.types.MdoReference; import com.github._1c_syntax.utils.Absolute; import lombok.RequiredArgsConstructor; import lombok.SneakyThrows; @@ -205,10 +203,7 @@ private FileInfo getFileInfoFromFile(Path srcDir, File file) { var filePath = srcDir.relativize(Absolute.path(file)); var diagnostics = documentContext.getDiagnostics(); var metrics = documentContext.getMetrics(); - var mdoRef = documentContext.getMdObject() - .map(MD::getMdoReference) - .map(MdoReference::getMdoRef) - .orElse(""); + var mdoRef = documentContext.getMdoRef(); var fileInfo = new FileInfo(filePath, mdoRef, diagnostics, metrics); diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/DocumentContext.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/DocumentContext.java index 26a112d8448..70afff67500 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/DocumentContext.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/DocumentContext.java @@ -32,6 +32,7 @@ import com.github._1c_syntax.bsl.languageserver.context.computer.SymbolTreeComputer; import com.github._1c_syntax.bsl.languageserver.context.symbol.MethodSymbol; 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.Trees; import com.github._1c_syntax.bsl.mdo.MD; import com.github._1c_syntax.bsl.mdo.support.ScriptVariant; @@ -256,6 +257,16 @@ public Optional getMdObject() { return getServerContext().getConfiguration().findChild(getUri()); } + /** + * Возвращает строковое представление ссылки связанного с объектом объекта метаданных 1С либо строку URI для + * остальных случаев + * + * @return Строковое представление ссылки + */ + public String getMdoRef() { + return MdoRefBuilder.getMdoRef(this); + } + public List getQueries() { return queries.getOrCompute(); } 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 1473e115340..d4b6310f50b 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,6 @@ import com.github._1c_syntax.bsl.languageserver.WorkDoneProgressHelper; import com.github._1c_syntax.bsl.languageserver.configuration.LanguageServerConfiguration; -import com.github._1c_syntax.bsl.languageserver.utils.MdoRefBuilder; import com.github._1c_syntax.bsl.languageserver.utils.NamedForkJoinWorkerThreadFactory; import com.github._1c_syntax.bsl.languageserver.utils.Resources; import com.github._1c_syntax.bsl.mdclasses.CF; @@ -307,7 +306,7 @@ private CF computeConfigurationMetadata() { } private void addMdoRefByUri(URI uri, DocumentContext documentContext) { - String mdoRef = MdoRefBuilder.getMdoRef(documentContext); + var mdoRef = documentContext.getMdoRef(); mdoRefs.put(uri, mdoRef); documentsByMDORef.computeIfAbsent( diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/ModuleSymbolComputer.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/ModuleSymbolComputer.java index eead7c8c435..b1a77369aff 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/ModuleSymbolComputer.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/context/computer/ModuleSymbolComputer.java @@ -23,7 +23,6 @@ import com.github._1c_syntax.bsl.languageserver.context.DocumentContext; import com.github._1c_syntax.bsl.languageserver.context.symbol.ModuleSymbol; -import com.github._1c_syntax.bsl.languageserver.utils.MdoRefBuilder; import com.github._1c_syntax.bsl.languageserver.utils.Ranges; import com.github._1c_syntax.bsl.parser.BSLLexer; import com.github._1c_syntax.bsl.types.ModuleType; @@ -69,7 +68,7 @@ public ModuleSymbol compute() { } private static String getName(DocumentContext documentContext) { - String name = MdoRefBuilder.getMdoRef(documentContext); + var name = documentContext.getMdoRef(); var moduleType = documentContext.getModuleType(); if (MODULE_TYPES_TO_APPEND_NAME.contains(moduleType)) { name += "." + moduleType.name(); diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/AbstractMetadataDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/AbstractMetadataDiagnostic.java index 3f612a83af6..c65ba74b46a 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/AbstractMetadataDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/AbstractMetadataDiagnostic.java @@ -103,6 +103,10 @@ protected void addDiagnostic(String message) { diagnosticStorage.addDiagnostic(diagnosticRange, message); } + protected String getMdoRefLocal(MD mdo) { + return documentContext.getServerContext().getConfiguration().getMdoRefLocal(mdo); + } + protected abstract void checkMetadata(MD mdo); private void checkMetadataWithModules() { diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/DenyIncompleteValuesDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/DenyIncompleteValuesDiagnostic.java index c71a33eed50..85ebfbc177f 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/DenyIncompleteValuesDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/DenyIncompleteValuesDiagnostic.java @@ -26,7 +26,6 @@ import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType; -import com.github._1c_syntax.bsl.languageserver.utils.MdoRefBuilder; import com.github._1c_syntax.bsl.mdo.MD; import com.github._1c_syntax.bsl.mdo.Register; import com.github._1c_syntax.bsl.mdo.children.Dimension; @@ -59,11 +58,11 @@ public DenyIncompleteValuesDiagnostic() { @Override protected void checkMetadata(MD mdo) { if (mdo instanceof Register register) { + var mdoRefLocal = getMdoRefLocal(mdo); register.getDimensions().stream() .filter(dimension -> !dimension.isDenyIncompleteValues()) .forEach((Dimension dimension) -> { - var ownerMDOName = MdoRefBuilder.getLocaleOwnerMdoName(documentContext, mdo); - addDiagnostic(info.getMessage(dimension.getName(), ownerMDOName)); + addDiagnostic(info.getMessage(dimension.getName(), mdoRefLocal)); }); } } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ForbiddenMetadataNameDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ForbiddenMetadataNameDiagnostic.java index 991e4003f27..d01b43a7206 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ForbiddenMetadataNameDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ForbiddenMetadataNameDiagnostic.java @@ -21,7 +21,6 @@ */ package com.github._1c_syntax.bsl.languageserver.diagnostics; -import com.github._1c_syntax.bsl.languageserver.configuration.Language; import com.github._1c_syntax.bsl.languageserver.configuration.LanguageServerConfiguration; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticScope; @@ -29,9 +28,7 @@ import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType; import com.github._1c_syntax.bsl.mdo.AttributeOwner; -import com.github._1c_syntax.bsl.mdo.ChildrenOwner; import com.github._1c_syntax.bsl.mdo.MD; -import com.github._1c_syntax.bsl.types.MdoReference; import com.github._1c_syntax.bsl.types.ModuleType; import com.github._1c_syntax.utils.CaseInsensitivePattern; import lombok.RequiredArgsConstructor; @@ -134,23 +131,18 @@ public class ForbiddenMetadataNameDiagnostic extends AbstractMetadataDiagnostic protected void checkMetadata(MD mdo) { // проверка имени метаданного - checkName(mdo.getName(), mdo.getMdoReference()); + checkName(mdo.getName(), mdo); // проверка имен реквизитов и табличных частей if (mdo instanceof AttributeOwner childrenOwner) { childrenOwner.getPlainStorageFields() - .forEach(child -> checkName(child.getName(), child.getMdoReference())); + .forEach(child -> checkName(child.getName(), child)); } } - private void checkName(String name, MdoReference mdoReference) { + private void checkName(String name, MD md) { if (FORBIDDEN_NAMES_PATTERN.matcher(name).matches()) { - String mdoRef; - if (serverConfiguration.getLanguage() == Language.RU) { - mdoRef = mdoReference.getMdoRefRu(); - } else { - mdoRef = mdoReference.getMdoRef(); - } + var mdoRef = getMdoRefLocal(md); addDiagnostic(info.getMessage(name, mdoRef)); } } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MetadataObjectNameLengthDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MetadataObjectNameLengthDiagnostic.java index 0ada0944c3a..1a03cf33bb7 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MetadataObjectNameLengthDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MetadataObjectNameLengthDiagnostic.java @@ -21,7 +21,6 @@ */ package com.github._1c_syntax.bsl.languageserver.diagnostics; -import com.github._1c_syntax.bsl.languageserver.configuration.Language; import com.github._1c_syntax.bsl.languageserver.configuration.LanguageServerConfiguration; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticParameter; @@ -65,7 +64,7 @@ public class MetadataObjectNameLengthDiagnostic extends AbstractMetadataDiagnost @Override protected void checkMetadata(MD mdo) { if (mdo.getName().length() > maxMetadataObjectNameLength) { - addAttributeDiagnostic(mdo); + addDiagnostic(info.getMessage(getMdoRefLocal(mdo), maxMetadataObjectNameLength)); } } @@ -81,14 +80,4 @@ protected void check() { super.check(); } } - - private void addAttributeDiagnostic(MD attribute) { - String mdoRef; - if (serverConfiguration.getLanguage() == Language.RU) { - mdoRef = attribute.getMdoReference().getMdoRefRu(); - } else { - mdoRef = attribute.getMdoReference().getMdoRef(); - } - addDiagnostic(info.getMessage(mdoRef, maxMetadataObjectNameLength)); - } } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MissingCommonModuleMethodDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MissingCommonModuleMethodDiagnostic.java index 17c8ca7b277..71fad872c37 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MissingCommonModuleMethodDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MissingCommonModuleMethodDiagnostic.java @@ -65,7 +65,7 @@ private static String getMethodNameByLocation(BSLParserRuleContext node, Range r @Override protected void check() { - if (documentContext.getServerContext().getConfiguration().getConfigurationSource() == ConfigurationSource.EMPTY){ + if (documentContext.getServerContext().getConfiguration().getConfigurationSource() == ConfigurationSource.EMPTY) { return; } locationRepository.getSymbolOccurrencesByLocationUri(documentContext.getUri()) @@ -88,7 +88,7 @@ private Optional getReferenceToMethodCall(SymbolOccurrence symbolOccur // т.к. через refIndex.getReferences нельзя получить приватные методы, приходится обходить символы модуля final var methodSymbol = document.get() .getSymbolTree().getMethodSymbol(symbol.getSymbolName()); - if (methodSymbol.isEmpty()){ + if (methodSymbol.isEmpty()) { final var location = symbolOccurrence.getLocation(); // Нельзя использовать symbol.getSymbolName(), т.к. имя в нижнем регистре return Optional.of( @@ -97,7 +97,7 @@ private Optional getReferenceToMethodCall(SymbolOccurrence symbolOccur location.getRange(), false, false)); } // вызовы приватных методов внутри самого модуля пропускаем - if (document.get().getUri().equals(documentContext.getUri())){ + if (document.get().getUri().equals(documentContext.getUri())) { return Optional.empty(); } return methodSymbol @@ -109,7 +109,7 @@ private Optional getReferenceToMethodCall(SymbolOccurrence symbolOccur private void fireIssue(CallData callData) { final String message; - if (!callData.exists){ + if (!callData.exists) { message = info.getMessage(callData.methodName, callData.moduleName); } else { message = info.getResourceString(PRIVATE_METHOD_MESSAGE, callData.methodName, callData.moduleName); diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MissingEventSubscriptionHandlerDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MissingEventSubscriptionHandlerDiagnostic.java index 24825a050c0..b58ab950cf7 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MissingEventSubscriptionHandlerDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/MissingEventSubscriptionHandlerDiagnostic.java @@ -109,7 +109,7 @@ protected void check() { private void checkMethod(EventSubscription eventSubs, String methodName, CommonModule commonModule) { documentContext.getServerContext() - .getDocument(commonModule.getMdoReference().getMdoRef(), ModuleType.CommonModule) + .getDocument(commonModule.getMdoRef(), ModuleType.CommonModule) .ifPresent((DocumentContext commonModuleContext) -> { var method = commonModuleContext.getSymbolTree().getMethods().stream() .filter(methodSymbol -> methodSymbol.getName().equalsIgnoreCase(methodName)) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/PrivilegedModuleMethodCallDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/PrivilegedModuleMethodCallDiagnostic.java index 3dd51db76c4..371c647bd43 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/PrivilegedModuleMethodCallDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/PrivilegedModuleMethodCallDiagnostic.java @@ -85,8 +85,7 @@ private List getPrivilegedModuleSymbols() { } private Optional getPrivilegedModuleSymbol(CommonModule mdCommonModule) { - return documentContext.getServerContext().getDocument( - mdCommonModule.getMdoReference().getMdoRef(), ModuleType.CommonModule) + return documentContext.getServerContext().getDocument(mdCommonModule.getMdoRef(), ModuleType.CommonModule) .map(documentContext1 -> documentContext1.getSymbolTree().getModule()); } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ProtectedModuleDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ProtectedModuleDiagnostic.java index 19c5d0e5547..c0fe3f42d71 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ProtectedModuleDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ProtectedModuleDiagnostic.java @@ -27,7 +27,6 @@ import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticSeverity; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticTag; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType; -import com.github._1c_syntax.bsl.languageserver.utils.MdoRefBuilder; import com.github._1c_syntax.bsl.languageserver.utils.Ranges; import com.github._1c_syntax.bsl.mdo.Module; import com.github._1c_syntax.bsl.mdo.ModuleOwner; @@ -79,13 +78,8 @@ protected void check() { .filter(Module::isProtected) .findAny(); if (hasProtected.isPresent()) { - addDiagnostic(moduleOwner); + diagnosticStorage.addDiagnostic(diagnosticRange, info.getMessage(configuration.getMdoRefLocal(moduleOwner))); } }); } - - private void addDiagnostic(ModuleOwner moduleOwner) { - var ownerMDOName = MdoRefBuilder.getLocaleOwnerMdoName(documentContext, moduleOwner); - diagnosticStorage.addDiagnostic(diagnosticRange, info.getMessage(ownerMDOName)); - } } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/SameMetadataObjectAndChildNamesDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/SameMetadataObjectAndChildNamesDiagnostic.java index 37b8913ab4d..bfa54ce8894 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/SameMetadataObjectAndChildNamesDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/SameMetadataObjectAndChildNamesDiagnostic.java @@ -21,7 +21,6 @@ */ package com.github._1c_syntax.bsl.languageserver.diagnostics; -import com.github._1c_syntax.bsl.languageserver.configuration.Language; import com.github._1c_syntax.bsl.languageserver.configuration.LanguageServerConfiguration; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticScope; @@ -92,30 +91,20 @@ protected void checkMetadata(MD mdo) { if (mdo instanceof AttributeOwner attributeOwner && !attributeOwner.getAllAttributes().isEmpty()) { var mdoName = stringInterner.intern(mdo.getName()); - checkkAttributes(attributeOwner.getAllAttributes(), mdoName); + checkAttributes(attributeOwner.getAllAttributes(), mdoName); } if (mdo instanceof TabularSectionOwner tabularSectionOwner && !tabularSectionOwner.getTabularSections().isEmpty()) { tabularSectionOwner.getTabularSections().forEach((TabularSection table) -> { var tableName = stringInterner.intern(table.getName()); - checkkAttributes(table.getAllAttributes(), tableName); + checkAttributes(table.getAllAttributes(), tableName); }); } } - private void checkkAttributes(List attributeOwner, String mdoName) { + private void checkAttributes(List attributeOwner, String mdoName) { attributeOwner.stream() .filter(attribute -> mdoName.equalsIgnoreCase(attribute.getName())) - .forEach(attribute -> addAttributeDiagnostic(attribute, mdoName)); - } - - private void addAttributeDiagnostic(Attribute attribute, String mdoName) { - String mdoRef; - if (serverConfiguration.getLanguage() == Language.RU) { - mdoRef = attribute.getMdoReference().getMdoRefRu(); - } else { - mdoRef = attribute.getMdoReference().getMdoRef(); - } - addDiagnostic(info.getMessage(mdoRef, mdoName)); + .forEach(attribute -> addDiagnostic(info.getMessage(getMdoRefLocal(attribute), mdoName))); } } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ScheduledJobHandlerDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ScheduledJobHandlerDiagnostic.java index 9ac63290da1..37cf6bbdabe 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ScheduledJobHandlerDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/ScheduledJobHandlerDiagnostic.java @@ -134,8 +134,7 @@ private void checkMethod(ScheduledJob scheduleJob, CommonModule mdCommonModule, final var fullName = getFullName(mdCommonModule, methodName); scheduledJobHandlers.computeIfAbsent(fullName, k -> new ArrayList<>()).add(scheduleJob); - documentContext.getServerContext().getDocument( - mdCommonModule.getMdoReference().getMdoRef(), ModuleType.CommonModule) + documentContext.getServerContext().getDocument(mdCommonModule.getMdoRef(), ModuleType.CommonModule) .ifPresent((DocumentContext commonModuleContext) -> { var method = commonModuleContext.getSymbolTree().getMethods().stream() .filter(methodSymbol -> methodSymbol.getName().equalsIgnoreCase(methodName)) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/WrongDataPathForFormElementsDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/WrongDataPathForFormElementsDiagnostic.java index 8d1e23504ec..af320202d79 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/WrongDataPathForFormElementsDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/WrongDataPathForFormElementsDiagnostic.java @@ -30,7 +30,6 @@ import com.github._1c_syntax.bsl.mdo.Form; import com.github._1c_syntax.bsl.mdo.MD; import com.github._1c_syntax.bsl.mdo.storage.form.FormItem; -import com.github._1c_syntax.bsl.mdo.support.ScriptVariant; import com.github._1c_syntax.bsl.types.ModuleType; import org.eclipse.lsp4j.Range; @@ -108,9 +107,6 @@ private void checkForm(Form form) { } private String getMdoRef(Form form) { - if (documentContext.getServerContext().getConfiguration().getScriptVariant() == ScriptVariant.ENGLISH) { - return form.getMdoReference().getMdoRef(); - } - return form.getMdoReference().getMdoRefRu(); + return documentContext.getServerContext().getConfiguration().getMdoRefLocal(form); } } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/WrongHttpServiceHandlerDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/WrongHttpServiceHandlerDiagnostic.java index 30ae3c06bda..2bf47f19267 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/WrongHttpServiceHandlerDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/WrongHttpServiceHandlerDiagnostic.java @@ -73,7 +73,7 @@ private void checkService(HTTPService httpService) { httpService.getUrlTemplates().stream() .flatMap(httpServiceURLTemplate -> httpServiceURLTemplate.getMethods().stream()) .forEach((HTTPServiceMethod service) -> { - final var serviceName = service.getMdoReference().getMdoRef(); + final var serviceName = service.getMdoRef(); if (service.getHandler().isEmpty()) { addMissingHandlerDiagnostic(serviceName); return; diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/DescriptionFormatter.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/DescriptionFormatter.java index 7018cf05778..71d45400795 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/DescriptionFormatter.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/hover/DescriptionFormatter.java @@ -29,7 +29,6 @@ import com.github._1c_syntax.bsl.languageserver.context.symbol.description.MethodDescription; import com.github._1c_syntax.bsl.languageserver.context.symbol.description.ParameterDescription; import com.github._1c_syntax.bsl.languageserver.context.symbol.description.TypeDescription; -import com.github._1c_syntax.bsl.languageserver.utils.MdoRefBuilder; import com.github._1c_syntax.bsl.languageserver.utils.Resources; import lombok.RequiredArgsConstructor; import org.eclipse.lsp4j.SymbolKind; @@ -142,7 +141,7 @@ public String getSectionWithCodeFences(Collection codeBlocks, String res public String getLocation(MethodSymbol symbol) { var documentContext = symbol.getOwner(); var startPosition = symbol.getSelectionRange().getStart(); - String mdoRef = MdoRefBuilder.getMdoRef(documentContext); + var mdoRef = documentContext.getMdoRef(); return String.format( "[%s](%s#%d)", @@ -155,7 +154,7 @@ public String getLocation(MethodSymbol symbol) { public String getLocation(VariableSymbol symbol) { var documentContext = symbol.getOwner(); var startPosition = symbol.getSelectionRange().getStart(); - String mdoRef = MdoRefBuilder.getMdoRef(documentContext); + var mdoRef = documentContext.getMdoRef(); String parentPostfix = symbol.getRootParent(SymbolKind.Method) .map(sourceDefinedSymbol -> "." + sourceDefinedSymbol.getName()) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CallHierarchyProvider.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CallHierarchyProvider.java index ba179e2454b..fb02ac1092b 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CallHierarchyProvider.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/providers/CallHierarchyProvider.java @@ -27,7 +27,6 @@ import com.github._1c_syntax.bsl.languageserver.references.ReferenceIndex; import com.github._1c_syntax.bsl.languageserver.references.ReferenceResolver; import com.github._1c_syntax.bsl.languageserver.references.model.Reference; -import com.github._1c_syntax.bsl.languageserver.utils.MdoRefBuilder; import com.github._1c_syntax.bsl.languageserver.utils.Ranges; import lombok.RequiredArgsConstructor; import org.eclipse.lsp4j.CallHierarchyIncomingCall; @@ -126,7 +125,7 @@ public List outgoingCalls( } private static CallHierarchyItem getCallHierarchyItem(SourceDefinedSymbol sourceDefinedSymbol) { - String detail = MdoRefBuilder.getMdoRef(sourceDefinedSymbol.getOwner()); + String detail = sourceDefinedSymbol.getOwner().getMdoRef(); CallHierarchyItem item = new CallHierarchyItem(); item.setName(sourceDefinedSymbol.getName()); 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 edd7dd243d2..44e19319ca1 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 @@ -33,7 +33,6 @@ import com.github._1c_syntax.bsl.languageserver.references.model.Symbol; import com.github._1c_syntax.bsl.languageserver.references.model.SymbolOccurrence; import com.github._1c_syntax.bsl.languageserver.references.model.SymbolOccurrenceRepository; -import com.github._1c_syntax.bsl.languageserver.utils.MdoRefBuilder; import com.github._1c_syntax.bsl.languageserver.utils.Ranges; import com.github._1c_syntax.bsl.types.ModuleType; import com.github._1c_syntax.utils.StringInterner; @@ -67,7 +66,7 @@ public class ReferenceIndex { * @return Список ссылок на символ. */ public List getReferencesTo(SourceDefinedSymbol symbol) { - var mdoRef = MdoRefBuilder.getMdoRef(symbol.getOwner()); + var mdoRef = symbol.getOwner().getMdoRef(); var moduleType = symbol.getOwner().getModuleType(); var symbolName = symbol.getName().toLowerCase(Locale.ENGLISH); String scopeName = ""; @@ -201,7 +200,7 @@ public void addMethodCall(URI uri, String mdoRef, ModuleType moduleType, String * @param methodName Имя метода, к которому относиться перменная. Пустой если переменная относиться к модулю. * @param variableName Имя переменной, к которой происходит обращение. * @param range Диапазон, в котором происходит обращение к символу. - * @param definition Признак обновления значения переменной. + * @param definition Признак обновления значения переменной. */ public void addVariableUsage(URI uri, String mdoRef, @@ -259,8 +258,8 @@ private Optional getSourceDefinedSymbol(Symbol symbolEntity return serverContext.getDocument(mdoRef, moduleType) .map(DocumentContext::getSymbolTree) .flatMap(symbolTree -> symbolTree.getMethodSymbol(symbolEntity.getScopeName()) - .flatMap(method -> symbolTree.getVariableSymbol(symbolName, method)) - .or(() -> symbolTree.getVariableSymbol(symbolName, symbolTree.getModule()))); + .flatMap(method -> symbolTree.getVariableSymbol(symbolName, method)) + .or(() -> symbolTree.getVariableSymbol(symbolName, symbolTree.getModule()))); } return serverContext.getDocument(mdoRef, moduleType) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndexFiller.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndexFiller.java index 38f539fefb3..15325e3fe41 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndexFiller.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/references/ReferenceIndexFiller.java @@ -32,6 +32,7 @@ import com.github._1c_syntax.bsl.languageserver.utils.Ranges; import com.github._1c_syntax.bsl.languageserver.utils.Strings; import com.github._1c_syntax.bsl.languageserver.utils.Trees; +import com.github._1c_syntax.bsl.mdo.MD; import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.bsl.parser.BSLParserBaseVisitor; import com.github._1c_syntax.bsl.parser.BSLParserRuleContext; @@ -132,7 +133,7 @@ public BSLParserRuleContext visitComplexIdentifier(BSLParser.ComplexIdentifierCo @Override public BSLParserRuleContext visitGlobalMethodCall(BSLParser.GlobalMethodCallContext ctx) { - var mdoRef = MdoRefBuilder.getMdoRef(documentContext); + var mdoRef = documentContext.getMdoRef(); var moduleType = documentContext.getModuleType(); var methodName = ctx.methodName().getStart(); var methodNameText = methodName.getText(); @@ -210,7 +211,7 @@ private void addCallbackMethodCall(BSLParser.CallParamContext methodName, String return; } Methods.getMethodName(methodName).ifPresent((Token methodNameToken) -> { - if (!mdoRef.equals(MdoRefBuilder.getMdoRef(documentContext))) { + if (!mdoRef.equals(documentContext.getMdoRef())) { checkCall(mdoRef, methodNameToken); } @@ -234,7 +235,7 @@ private String getModule(BSLParser.CallParamContext callParamContext) { return complexIdentifierContext1 .filter(Predicate.not(Modules::isThisObject)) .map(complexIdentifier -> MdoRefBuilder.getMdoRef(documentContext, complexIdentifier)) - .orElse(MdoRefBuilder.getMdoRef(documentContext)); + .orElse(documentContext.getMdoRef()); } private Set calcParams(@Nullable BSLParser.ParamListContext paramList) { @@ -249,7 +250,7 @@ private Set calcParams(@Nullable BSLParser.ParamListContext paramList) { .map(configuration::findCommonModule) .filter(Optional::isPresent) .flatMap(Optional::stream) - .map(mdCommonModule -> mdCommonModule.getMdoReference().getMdoRef()) + .map(MD::getMdoRef) .collect(Collectors.toSet()); } } @@ -423,7 +424,7 @@ private void addVariableUsage(Optional methodSymbol, index.addVariableUsage( documentContext.getUri(), - MdoRefBuilder.getMdoRef(documentContext), + documentContext.getMdoRef(), documentContext.getModuleType(), methodName, variableName, diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/reporters/data/FileInfo.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/reporters/data/FileInfo.java index e71bd5c9f9e..c247079b345 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/reporters/data/FileInfo.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/reporters/data/FileInfo.java @@ -24,6 +24,7 @@ import com.fasterxml.jackson.annotation.JsonInclude; import com.github._1c_syntax.bsl.languageserver.context.DocumentContext; import com.github._1c_syntax.bsl.languageserver.context.MetricStorage; +import com.github._1c_syntax.bsl.mdo.MD; import com.github._1c_syntax.utils.Absolute; import lombok.AllArgsConstructor; import lombok.Value; @@ -48,10 +49,6 @@ public FileInfo(String sourceDir, DocumentContext documentContext, List(diagnostics); metrics = documentContext.getMetrics(); var mdo = documentContext.getMdObject(); - if (mdo.isPresent()) { - mdoRef = mdo.get().getMdoReference().getMdoRef(); - } else { - mdoRef = ""; - } + mdoRef = mdo.map(MD::getMdoRef).orElse(""); } } diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/MdoRefBuilder.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/MdoRefBuilder.java index b97259968d7..d7ac0e6cd6d 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/MdoRefBuilder.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/utils/MdoRefBuilder.java @@ -22,126 +22,113 @@ package com.github._1c_syntax.bsl.languageserver.utils; import com.github._1c_syntax.bsl.languageserver.context.DocumentContext; -import com.github._1c_syntax.bsl.mdo.CommonModule; import com.github._1c_syntax.bsl.mdo.MD; -import com.github._1c_syntax.bsl.mdo.support.ScriptVariant; import com.github._1c_syntax.bsl.parser.BSLParser; import com.github._1c_syntax.bsl.types.MDOType; import com.github._1c_syntax.bsl.types.MdoReference; -import com.github._1c_syntax.bsl.types.ModuleType; import com.github._1c_syntax.utils.StringInterner; -import edu.umd.cs.findbugs.annotations.Nullable; import lombok.experimental.UtilityClass; import org.antlr.v4.runtime.tree.ParseTree; import org.antlr.v4.runtime.tree.TerminalNode; +import javax.annotation.Nullable; import java.util.List; -import java.util.Optional; -import java.util.concurrent.atomic.AtomicReference; +/** + * Хелпер для MD ссылок + */ @UtilityClass public class MdoRefBuilder { + /** + * Для оптимизации хранения одинаковых строк + */ private final StringInterner stringInterner = new StringInterner(); - public String getMdoRef(DocumentContext documentContext, BSLParser.CallStatementContext callStatement) { - if (callStatement.globalMethodCall() != null) { - return getMdoRef(documentContext); - } else { - return getMdoRef(documentContext, callStatement.IDENTIFIER(), callStatement.modifier()); - } - } - + /** + * Вычисляет ссылку для документа (файла). + * Если документ имеет связь с MDClasses, то используется представление ссылки связанного объекта метаданных + * иначе - используется строковое представление URI + * + * @param documentContext Документ (файл) + * @return Строковое представление ссылки + */ public static String getMdoRef(DocumentContext documentContext) { + // осторожно! не менять на вызов documentContext.getMdoRef, а то зациклится var mdoRef = documentContext.getMdObject() - .map(MD::getMdoReference) - .map(MdoReference::getMdoRef) + .map(MD::getMdoRef) .orElseGet(() -> documentContext.getUri().toString()); return stringInterner.intern(mdoRef); } - public String getMdoRef(DocumentContext documentContext, BSLParser.ComplexIdentifierContext complexIdentifier) { - return getMdoRef(documentContext, complexIdentifier.IDENTIFIER(), complexIdentifier.modifier()); - } - - public String getMdoRef( - DocumentContext documentContext, - @Nullable - TerminalNode identifier, - List modifiers - ) { - - AtomicReference mdoRef = new AtomicReference<>(""); - - Optional.ofNullable(identifier) - .map(ParseTree::getText) - .flatMap(commonModuleName -> getCommonModuleMdoRef(documentContext, commonModuleName)) - .or(() -> - Optional.ofNullable(identifier) - .map(ParseTree::getText) - .flatMap(MDOType::fromValue) - .filter(mdoType -> ModuleType.byMDOType(mdoType) - .contains(ModuleType.ManagerModule)) - .map(mdoType -> getMdoRef(mdoType, getMdoName(modifiers))) - ) - .ifPresent(mdoRef::set); - - return stringInterner.intern(mdoRef.get()); - } - /** - * Получить mdoRef в языке конфигурации + * Формирует ссылку на объект-владелец метода * - * @param documentContext the document context - * @param mdo the mdo - * @return the locale mdoRef + * @param documentContext Документ (модуль) + * @param ctx Узел вызова метода + * @return Ссылка на объект-владелец */ - public String getLocaleMdoRef(DocumentContext documentContext, MD mdo) { - final var mdoReference = mdo.getMdoReference(); - final String result; - if (documentContext.getServerContext().getConfiguration().getScriptVariant() == ScriptVariant.ENGLISH) { - result = mdoReference.getMdoRef(); + public String getMdoRef(DocumentContext documentContext, BSLParser.CallStatementContext ctx) { + if (ctx.globalMethodCall() != null) { + // todo возвращается ссылка на документ, что не позволяет нормально с глобальными методами работать + return getMdoRef(documentContext); } else { - result = mdoReference.getMdoRefRu(); + return getMdoRef(documentContext, ctx.IDENTIFIER(), ctx.modifier()); } - return stringInterner.intern(result); } /** - * Получить имя родителя метаданного в языке конфигурации. + * Формирует ссылку на объект-владелец свойства * - * @param documentContext the document context - * @param mdo the mdo - * @return the locale owner mdo name + * @param documentContext Документ (файл) + * @param ctx Узел + * @return Ссылка на объект-владелец */ - public String getLocaleOwnerMdoName(DocumentContext documentContext, MD mdo) { - final var names = getLocaleMdoRef(documentContext, mdo).split("\\."); - if (names.length <= 1) { - return ""; - } - return stringInterner.intern(names[0].concat(".").concat(names[1])); + public String getMdoRef(DocumentContext documentContext, BSLParser.ComplexIdentifierContext ctx) { + return getMdoRef(documentContext, ctx.IDENTIFIER(), ctx.modifier()); } - private Optional getCommonModuleMdoRef(DocumentContext documentContext, String commonModuleName) { - return documentContext.getServerContext() - .getConfiguration() - .findCommonModule(commonModuleName) - .map(CommonModule::getMdoReference) - .map(MdoReference::getMdoRef); - } + /** + * Формирует ссылку на объект-владелец метода или свойства по идентификатору и модификаторам узла + * + * @param documentContext Документ (файл) + * @param identifier Имя общего модуля или типа объекта метаданных + * @param modifiers "Модификаторы", т.е. части имени между "точками" (используется только второй) + * @return Ссылка + */ + public String getMdoRef( + DocumentContext documentContext, // todo переделать при переходе на проект + @Nullable + TerminalNode identifier, + List modifiers + ) { - private String getMdoRef(MDOType mdoType, String identifier) { - if (identifier.isEmpty()) { + if (identifier == null) { return ""; } - return mdoType.getName() + "." + identifier; + // предполагаем, что это вызов метода общего модуля + var commonModule = documentContext.getServerContext().getConfiguration().findCommonModule(identifier.getText()); + if (commonModule.isPresent()) { + return commonModule.get().getMdoRef(); + } + + // раз не общий модуль, то нужно определить тип метаданного и, если у него есть модуль менеджера, вызвать метод + // todo такой подход не дает использовать ссылки на методы платформенных объектов + var mdoType = MDOType.fromValue(identifier.getText()); + if (mdoType.isPresent()) { + var mdoName = getMdoName(modifiers); + if (!mdoName.isEmpty()) { + return MdoReference.create(mdoType.get(), mdoName).getMdoRef(); + } + } + return ""; } private String getMdoName(List modifiers) { return modifiers.stream() .limit(1) - .findAny() + .findFirst() .map(BSLParser.ModifierContext::accessProperty) .map(BSLParser.AccessPropertyContext::IDENTIFIER) .map(ParseTree::getText) diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/context/computer/ModuleSymbolComputerTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/context/computer/ModuleSymbolComputerTest.java index 295ab8d885b..5455c465240 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/context/computer/ModuleSymbolComputerTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/context/computer/ModuleSymbolComputerTest.java @@ -65,13 +65,13 @@ void testModuleName() { var documentContext = spy(TestUtils.getDocumentContextFromFile("./src/test/resources/context/symbol/ModuleSymbol.bsl")); var computer = new ModuleSymbolComputer(documentContext); - var mdoReference = mock(MdoReference.class); - when(mdoReference.getMdoRef()).thenReturn("Document.Document1"); + var mdoReference = MdoReference.create("Document.Document1"); var mdObject = mock(MD.class); when(mdObject.getMdoReference()).thenReturn(mdoReference); doReturn(Optional.of(mdObject)).when(documentContext).getMdObject(); + doReturn(mdoReference.getMdoRef()).when(documentContext).getMdoRef(); // when-then pairs: