diff --git a/CHANGELOG.md b/CHANGELOG.md index 6ffd44af..0fd6f885 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -79,6 +79,7 @@ - Ложное срабатывание проверки для динамических списков с произвольным запросом: У реквизита "Ссылка" динамического списка выключен признак "Использовать всегда" #1071 - Проверка: right-... не находит ошибку для роли с включением по умолчанию #815 - Отключение проверок для заимствованных объектов в расширении #1076 +- Проверка: form-self-reference не находит ошибку #1086 ## 0.2.0 diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/form-self-reference.md b/bundles/com.e1c.v8codestyle.bsl/markdown/form-self-reference.md index 3c0fddb0..0f45c58e 100644 --- a/bundles/com.e1c.v8codestyle.bsl/markdown/form-self-reference.md +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/form-self-reference.md @@ -1,6 +1,6 @@ # Outdated alias used -Usage of outdated self reference `ThisForm` (when referencing method, property or attribute) +You should use the alias `ThisObject` instead of the obsolete `ThisForm` in the form module ## Noncompliant Code Example @@ -14,6 +14,13 @@ EndFunction ThisForm.myParam = ThisForm.test(); ``` +## Noncompliant Code Example + +```bsl + Notification = New NotifyDescription("ShowQueryEnding", ThisForm); + ShowQuery(Notification, QuestionText, ...); +``` + ## Compliant Solution ```bsl @@ -26,5 +33,12 @@ EndFunction ThisObject.myParam = ThisObject.test(); ``` +## Compliant Solution + +```bsl + Notification = New NotifyDescription("ShowQueryEnding", ThisObject); + ShowQuery(Notification, QuestionText, ...); +``` + ## See diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/ru/form-self-reference.md b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/form-self-reference.md index 203cb8b6..32982985 100644 --- a/bundles/com.e1c.v8codestyle.bsl/markdown/ru/form-self-reference.md +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/form-self-reference.md @@ -14,6 +14,14 @@ ЭтаФорма.мояПеременная = ЭтаФорма.тест(); ``` +## Неправильно + +```bsl + Оповещение = Новый ОписаниеОповещения("ВопросЗавершение", ЭтаФорма); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); +``` + + ## Правильно ```bsl @@ -26,4 +34,11 @@ ЭтотОбъект.мояПеременная = ЭтотОбъект.тест(); ``` +## Правильно + +```bsl + Оповещение = Новый ОписаниеОповещения("ВопросЗавершение", ЭтотОбъект); + ПоказатьВопрос(Оповещение, ТекстВопроса, РежимДиалогаВопрос.ДаНет, , КодВозвратаДиалога.Да); +``` + ## См. diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/FormSelfReferenceOutdatedCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/FormSelfReferenceOutdatedCheck.java index 993f3cb6..72aa8cc8 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/FormSelfReferenceOutdatedCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/FormSelfReferenceOutdatedCheck.java @@ -12,16 +12,12 @@ *******************************************************************************/ package com.e1c.v8codestyle.bsl.check; -import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.DYNAMIC_FEATURE_ACCESS; - -import java.util.Collection; -import java.util.Set; +import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.FEATURE_ACCESS__NAME; +import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.STATIC_FEATURE_ACCESS; import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.xtext.EcoreUtil2; -import com._1c.g5.v8.dt.bsl.model.DynamicFeatureAccess; -import com._1c.g5.v8.dt.bsl.model.Expression; import com._1c.g5.v8.dt.bsl.model.Module; import com._1c.g5.v8.dt.bsl.model.ModuleType; import com._1c.g5.v8.dt.bsl.model.StaticFeatureAccess; @@ -44,7 +40,8 @@ public class FormSelfReferenceOutdatedCheck { private static final String CHECK_ID = "form-self-reference"; //$NON-NLS-1$ - private static final Collection OUTDATED_ALIASES = Set.of("ЭтаФорма", "ThisForm"); //$NON-NLS-1$ //$NON-NLS-2$ + private static final String THIS_FORM = "ThisForm"; //$NON-NLS-1$ + private static final String THIS_FORM_RU = "ЭтаФорма"; //$NON-NLS-1$ @Override public String getCheckId() @@ -62,30 +59,30 @@ public class FormSelfReferenceOutdatedCheck .issueType(IssueType.CODE_STYLE) .extension(new StandardCheckExtension(getCheckId(), BslPlugin.PLUGIN_ID)) .module() - .checkedObjectType(DYNAMIC_FEATURE_ACCESS); + .checkedObjectType(STATIC_FEATURE_ACCESS); } @Override protected void check(Object object, ResultAcceptor resultAceptor, ICheckParameters parameters, IProgressMonitor monitor) { - Expression featureAccessSource = ((DynamicFeatureAccess)object).getSource(); - if (monitor.isCanceled() || !(featureAccessSource instanceof StaticFeatureAccess)) - { - return; - } - - StaticFeatureAccess source = (StaticFeatureAccess)featureAccessSource; + StaticFeatureAccess source = (StaticFeatureAccess)object; if (isAliasOutdated(source)) { - resultAceptor.addIssue(Messages.FormSelfReferenceOutdatedCheck_Issue, source); + resultAceptor.addIssue(Messages.FormSelfReferenceOutdatedCheck_Issue, source, FEATURE_ACCESS__NAME); } } - private boolean isAliasOutdated(StaticFeatureAccess source) + private boolean isAliasOutdated(StaticFeatureAccess object) { - Module module = EcoreUtil2.getContainerOfType(source, Module.class); - return module.getModuleType() == ModuleType.FORM_MODULE && OUTDATED_ALIASES.contains(source.getName()); + String name = object.getName(); + if (THIS_FORM_RU.equalsIgnoreCase(name) || THIS_FORM.equalsIgnoreCase(name)) + { + Module module = EcoreUtil2.getContainerOfType(object, Module.class); + return module.getModuleType() == ModuleType.FORM_MODULE; + } + + return false; } } diff --git a/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/FormSelfReferenceOutdatedCheckTest.java b/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/FormSelfReferenceOutdatedCheckTest.java index 9ed15d46..0c491280 100644 --- a/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/FormSelfReferenceOutdatedCheckTest.java +++ b/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/FormSelfReferenceOutdatedCheckTest.java @@ -61,9 +61,10 @@ public class FormSelfReferenceOutdatedCheckTest public void testFormModule() throws Exception { List markers = getModuleMarkers(); - assertEquals(2, markers.size()); + assertEquals(3, markers.size()); assertEquals("11", markers.get(0).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY)); assertEquals("12", markers.get(1).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY)); + assertEquals("13", markers.get(2).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY)); } } diff --git a/tests/com.e1c.v8codestyle.bsl.itests/workspace/FormSelfReferenceOutdatedCheck/src/CommonForms/MyForm/Module.bsl b/tests/com.e1c.v8codestyle.bsl.itests/workspace/FormSelfReferenceOutdatedCheck/src/CommonForms/MyForm/Module.bsl index f1999da4..2a8d5af5 100644 --- a/tests/com.e1c.v8codestyle.bsl.itests/workspace/FormSelfReferenceOutdatedCheck/src/CommonForms/MyForm/Module.bsl +++ b/tests/com.e1c.v8codestyle.bsl.itests/workspace/FormSelfReferenceOutdatedCheck/src/CommonForms/MyForm/Module.bsl @@ -10,4 +10,5 @@ Процедура Тест() ЭтаФорма.МойРеквизит = ЭтотОбъект.МояФункция(); ThisForm.МойРеквизит = ThisObject.МояФункция(); + Notification = New NotifyDescription("ShowQueryEnding", ThisForm); КонецПроцедуры \ No newline at end of file