From 8831c1ecd6bb3ef633bb7efdb12186a0381af162 Mon Sep 17 00:00:00 2001 From: Andrey Ovsyankin Date: Tue, 10 Sep 2024 15:41:42 +0300 Subject: [PATCH 1/3] =?UTF-8?q?=D0=98=D0=B3=D0=BD=D0=BE=D1=80=D0=B8=D1=80?= =?UTF-8?q?=D0=BE=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D1=81=D0=B5=D1=80=D0=B2?= =?UTF-8?q?=D0=B5=D1=80=D0=BD=D1=8B=D1=85=20=D0=BC=D0=BE=D0=B4=D1=83=D0=BB?= =?UTF-8?q?=D0=B5=D0=B9=20=D0=BF=D1=80=D0=B8=20=D0=B4=D0=B8=D0=B0=D0=B3?= =?UTF-8?q?=D0=BD=D0=BE=D1=81=D1=82=D0=B8=D0=BA=D0=B5=20UsingSynchronousCa?= =?UTF-8?q?llsDiagnostic?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UsingSynchronousCallsDiagnostic.java | 29 ++++ .../UsingSynchronousCallsDiagnosticTest.java | 21 ++- ...0\266\320\265\321\200\320\276\320\274.xml" | 126 ++++++++++++++++++ .../Ext/ManagerModule.bsl" | 1 + .../Ext/ObjectModule.bsl" | 1 + 5 files changed, 176 insertions(+), 2 deletions(-) create mode 100644 "src/test/resources/metadata/designer/Catalogs/\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\272\320\241\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\276\320\274.xml" create mode 100644 "src/test/resources/metadata/designer/Catalogs/\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\272\320\241\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\276\320\274/Ext/ManagerModule.bsl" create mode 100644 "src/test/resources/metadata/designer/Catalogs/\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\272\320\241\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\276\320\274/Ext/ObjectModule.bsl" diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnostic.java index 3c65954060d..b07f9db977b 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnostic.java @@ -29,14 +29,18 @@ 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.mdclasses.Configuration; +import com.github._1c_syntax.bsl.mdo.CommonModule; +import com.github._1c_syntax.bsl.mdo.MD; import com.github._1c_syntax.bsl.mdo.support.UseMode; import com.github._1c_syntax.bsl.parser.BSLParser; +import com.github._1c_syntax.bsl.types.ModuleType; import com.github._1c_syntax.utils.CaseInsensitivePattern; import org.antlr.v4.runtime.tree.ParseTree; import java.util.EnumSet; import java.util.HashMap; import java.util.Locale; +import java.util.Optional; import java.util.Set; import java.util.regex.Pattern; @@ -134,9 +138,34 @@ public ParseTree visitFile(BSLParser.FileContext ctx) { return ctx; } + if (isServerModule(documentContext.getModuleType(), documentContext.getMdObject())) { + return ctx; + } + return super.visitFile(ctx); } + private boolean isServerModule(ModuleType moduleType, Optional mdObject) { + + switch (moduleType) { + case ApplicationModule: + case CommandModule: + case FormModule: + case ManagedApplicationModule: + return false; + case CommonModule: { + if (mdObject.isPresent()) { + var md = (CommonModule) mdObject.get(); + return !(md.isClientManagedApplication() || md.isClientOrdinaryApplication()); + } else { + return false; // Мы не знаем, что за модуль, проверяем, как обычно. + } + } + default: + return true; // Все прочие модули это строго серверные и в них синхронные вызовы разрешены (и только они возможны) + } + } + @Override public ParseTree visitSub(BSLParser.SubContext ctx) { var methodSymbol = documentContext.getSymbolTree().getMethodSymbol(ctx); diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnosticTest.java index 6afaa9194aa..9ba4d1129ac 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnosticTest.java @@ -29,6 +29,8 @@ import com.github._1c_syntax.utils.Absolute; import org.eclipse.lsp4j.Diagnostic; import org.junit.jupiter.api.Test; +import org.junit.jupiter.params.ParameterizedTest; +import org.junit.jupiter.params.provider.ValueSource; import org.springframework.test.annotation.DirtiesContext; import java.nio.file.Paths; @@ -45,7 +47,9 @@ class UsingSynchronousCallsDiagnosticTest extends AbstractDiagnosticTest diagnostics = getDiagnostics(context); + assertThat(diagnostics).isEmpty(); + } + private DocumentContext getDocumentContextWithUseFlag(UseMode useMode) { + return getDocumentContextWithUseFlag(useMode, PATH_TO_MODULE_FILE); + } + + private DocumentContext getDocumentContextWithUseFlag(UseMode useMode, String moduleFile) { var path = Absolute.path(PATH_TO_METADATA); - var testFile = Paths.get(PATH_TO_MODULE_FILE).toAbsolutePath(); + var testFile = Paths.get(moduleFile).toAbsolutePath(); initServerContext(path); var serverContext = spy(context); diff --git "a/src/test/resources/metadata/designer/Catalogs/\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\272\320\241\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\276\320\274.xml" "b/src/test/resources/metadata/designer/Catalogs/\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\272\320\241\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\276\320\274.xml" new file mode 100644 index 00000000000..d0a7c1002cf --- /dev/null +++ "b/src/test/resources/metadata/designer/Catalogs/\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\272\320\241\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\276\320\274.xml" @@ -0,0 +1,126 @@ + + + + + + cd5d9910-c790-46e8-8c99-a0f38f3f9e39 + b69e7b91-a362-429c-b5b4-39e1fd765840 + + + c3d8d716-ce70-459f-9a75-2b8c77a0194b + e4215019-0558-438e-b225-b0f926f42b8a + + + 604fe1d0-b22f-48a6-8335-c86562ba654c + fa9ac073-8e89-47de-8aab-9a3badb9a894 + + + e2756a94-423f-4fff-ab71-622cd2d99f62 + 23864a50-78d1-48ab-88a6-e3f4d212b34f + + + 227a9ad8-b4aa-4d7d-8cc0-bed15e263277 + d2fae109-dc57-483e-a56a-f2baf0515b86 + + + + СправочникСМенеджером + + + false + HierarchyFoldersAndItems + false + 2 + true + true + + ToItems + 9 + 25 + String + Variable + WholeCatalog + true + true + AsDescription + + Auto + InDialog + false + BothWays + + Catalog.СправочникСМенеджером.StandardAttribute.Description + Catalog.СправочникСМенеджером.StandardAttribute.Code + + Begin + DontUse + Directly + + + + + + + + + + + false + + + Managed + Use + + + + + + Use + Auto + DontUse + false + false + + + + + Реквизит1 + + + + xs:string + + 10 + Variable + + + false + + + + false + + false + false + + + false + + DontCheck + Items + + + Auto + Auto + + + Auto + ForItem + DontIndex + Use + Use + + + + + \ No newline at end of file diff --git "a/src/test/resources/metadata/designer/Catalogs/\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\272\320\241\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\276\320\274/Ext/ManagerModule.bsl" "b/src/test/resources/metadata/designer/Catalogs/\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\272\320\241\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\276\320\274/Ext/ManagerModule.bsl" new file mode 100644 index 00000000000..5f282702bb0 --- /dev/null +++ "b/src/test/resources/metadata/designer/Catalogs/\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\272\320\241\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\276\320\274/Ext/ManagerModule.bsl" @@ -0,0 +1 @@ + \ No newline at end of file diff --git "a/src/test/resources/metadata/designer/Catalogs/\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\272\320\241\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\276\320\274/Ext/ObjectModule.bsl" "b/src/test/resources/metadata/designer/Catalogs/\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\272\320\241\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\276\320\274/Ext/ObjectModule.bsl" new file mode 100644 index 00000000000..5f282702bb0 --- /dev/null +++ "b/src/test/resources/metadata/designer/Catalogs/\320\241\320\277\321\200\320\260\320\262\320\276\321\207\320\275\320\270\320\272\320\241\320\234\320\265\320\275\320\265\320\264\320\266\320\265\321\200\320\276\320\274/Ext/ObjectModule.bsl" @@ -0,0 +1 @@ + \ No newline at end of file From fbe740048767dbb03ed13279f9d78cfc4c98df87 Mon Sep 17 00:00:00 2001 From: Andrey Ovsyankin Date: Tue, 10 Sep 2024 16:24:35 +0300 Subject: [PATCH 2/3] =?UTF-8?q?=D0=A0=D1=83=D0=B3=D0=B0=D0=BD=D1=8C=20?= =?UTF-8?q?=D0=A1=D0=BE=D0=BD=D0=B0=D1=80=D0=B0?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../UsingSynchronousCallsDiagnostic.java | 37 ++++++++----------- .../UsingSynchronousCallsDiagnosticTest.java | 7 ++-- 2 files changed, 19 insertions(+), 25 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnostic.java index b07f9db977b..b59d988649a 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnostic.java @@ -21,6 +21,7 @@ */ package com.github._1c_syntax.bsl.languageserver.diagnostics; +import com.github._1c_syntax.bsl.languageserver.context.DocumentContext; import com.github._1c_syntax.bsl.languageserver.context.symbol.annotations.CompilerDirectiveKind; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticCompatibilityMode; import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticMetadata; @@ -30,17 +31,14 @@ import com.github._1c_syntax.bsl.languageserver.diagnostics.metadata.DiagnosticType; import com.github._1c_syntax.bsl.mdclasses.Configuration; import com.github._1c_syntax.bsl.mdo.CommonModule; -import com.github._1c_syntax.bsl.mdo.MD; import com.github._1c_syntax.bsl.mdo.support.UseMode; import com.github._1c_syntax.bsl.parser.BSLParser; -import com.github._1c_syntax.bsl.types.ModuleType; import com.github._1c_syntax.utils.CaseInsensitivePattern; import org.antlr.v4.runtime.tree.ParseTree; import java.util.EnumSet; import java.util.HashMap; import java.util.Locale; -import java.util.Optional; import java.util.Set; import java.util.regex.Pattern; @@ -138,32 +136,27 @@ public ParseTree visitFile(BSLParser.FileContext ctx) { return ctx; } - if (isServerModule(documentContext.getModuleType(), documentContext.getMdObject())) { + if (isServerModule(documentContext)) { return ctx; } return super.visitFile(ctx); } - private boolean isServerModule(ModuleType moduleType, Optional mdObject) { + private static boolean isServerModule(DocumentContext documentContext) { + return switch (documentContext.getModuleType()) { + case ApplicationModule, CommandModule, FormModule, ManagedApplicationModule -> false; + case CommonModule -> isServerCommonModule(documentContext); + default -> true; // Все прочие модули это строго серверные и в них синхронные вызовы разрешены + }; + } - switch (moduleType) { - case ApplicationModule: - case CommandModule: - case FormModule: - case ManagedApplicationModule: - return false; - case CommonModule: { - if (mdObject.isPresent()) { - var md = (CommonModule) mdObject.get(); - return !(md.isClientManagedApplication() || md.isClientOrdinaryApplication()); - } else { - return false; // Мы не знаем, что за модуль, проверяем, как обычно. - } - } - default: - return true; // Все прочие модули это строго серверные и в них синхронные вызовы разрешены (и только они возможны) - } + private static boolean isServerCommonModule(DocumentContext documentContext) { + var mdObject = documentContext.getMdObject(); + + return mdObject.map(mdo -> (CommonModule) mdo) + .filter(commonModule -> !(commonModule.isClientManagedApplication() || commonModule.isClientOrdinaryApplication())) + .isPresent(); } @Override diff --git a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnosticTest.java b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnosticTest.java index 9ba4d1129ac..7281cc1c758 100644 --- a/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnosticTest.java +++ b/src/test/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnosticTest.java @@ -47,7 +47,8 @@ class UsingSynchronousCallsDiagnosticTest extends AbstractDiagnosticTest Date: Tue, 10 Sep 2024 17:04:41 +0300 Subject: [PATCH 3/3] =?UTF-8?q?=D0=95=D1=89=D0=B5=20=D0=A1=D0=BE=D0=BD?= =?UTF-8?q?=D0=B0=D1=80?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../diagnostics/UsingSynchronousCallsDiagnostic.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnostic.java b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnostic.java index b59d988649a..3cb4320e566 100644 --- a/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnostic.java +++ b/src/main/java/com/github/_1c_syntax/bsl/languageserver/diagnostics/UsingSynchronousCallsDiagnostic.java @@ -154,8 +154,9 @@ private static boolean isServerModule(DocumentContext documentContext) { private static boolean isServerCommonModule(DocumentContext documentContext) { var mdObject = documentContext.getMdObject(); - return mdObject.map(mdo -> (CommonModule) mdo) - .filter(commonModule -> !(commonModule.isClientManagedApplication() || commonModule.isClientOrdinaryApplication())) + return mdObject.map(CommonModule.class::cast) + .filter(commonModule -> !(commonModule.isClientManagedApplication() || + commonModule.isClientOrdinaryApplication())) .isPresent(); }