1
0
mirror of https://github.com/1C-Company/v8-code-style.git synced 2024-11-28 09:33:06 +02:00

#1117 Доработана проверка SelfReferenceCheck (#1271)

* Доработана проверка SelfReferenceCheck: добавлена опция, позволяющая
пропускать проверку для модулей объектов, наборов записей, менеджеров
значений.
* Исключение некоторых типов модулей из проверки
Модули, в которых ключевое слово "ЭтотОбъект" не является ссылкой на
модуль/объект-владельца, исключены из проверки.

---------

Co-authored-by: Dmitriy Marmyshev <dmar@1c.ru>
This commit is contained in:
Vadim Goncharov 2023-04-17 06:19:03 +03:00 committed by GitHub
parent 03db874a42
commit ea1029c0ae
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
8 changed files with 69 additions and 21 deletions

View File

@ -28,6 +28,7 @@
- Использование устаревшего метода Найти
- Отсутствует комментарий к экспортной процедуре (функции)
- Документирующий комментарий не содержит секцию "Описание" для экспортной процедуры (функции)
- В проверку "module-self-reference" добавлен параметр, позволяющий пропускать проверку для модулей объектов, наборов записей и менеджеров значений
- Проверка корректного наименования переменных
- Обращение к несуществующему параметру формы
- Необязательный параметр процедуры/функции стоит перед обязательным

View File

@ -1,9 +1,13 @@
# Self reference is excessive
Excessive usage of self reference with use of `ThisObject` (when referencing method, property or attribute)
Excessive usage of self reference with use of `ThisObject` (when referencing method, property or attribute).
Check common module, object module, recordset module, value manager module, form module.
Check of onject module, recordset module and value manager module can be disable, if
`Check object (recordset, value manager) module` isn't set.
For form modules only check self reference for methods and existing properties
(if `Check only existing form properties` parameter is set, otherwise, check for all cases)
(if `Check only existing form properties` parameter is set, otherwise, check for all cases).
## Noncompliant Code Example

View File

@ -1,9 +1,13 @@
# Избыточное использование псевдонима "ЭтотОбъект"
Избыточное обращение внутри модуля через псевдоним "ЭтотОбъект" (к методу, свойству или реквизиту)
Избыточное обращение внутри модуля через псевдоним "ЭтотОбъект" (к методу, свойству или реквизиту).
Проверяются общие модули, модули объектов, наборов записей, модули менеджеров значений и модули форм.
Проверку модулей объектов, наборов записей и менеджеров значений можно отключить
через параметр `Проверять модули объектов (наборов записей, менеджеров значений)`.
Для модулей форм проверяется только обращение к методам и существующим свойствам
(в случае если установлен параметр `Проверять только существовующие свойства в форме`, инчае проверяются все случаи)
(в случае если установлен параметр `Проверять только существовующие свойства в форме`, иначе проверяются все случаи).
## Неправильно

View File

@ -289,6 +289,8 @@ final class Messages
public static String QueryInLoop_Loop_has_query;
public static String QueryInLoop_title;
public static String SelfReferenceCheck_check_object_module;
public static String SelfReferenceCheck_check_only_existing_form_properties;
public static String SelfReferenceCheck_Description;

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (C) 2022, 1C-Soft LLC and others.
* Copyright (C) 2023, 1C-Soft LLC and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
@ -47,6 +47,7 @@ import com.google.inject.Inject;
* (if PARAMETER_CHECK_ONLY_EXISTING_FORM_PROPERTIES is set, otherwise, check for all cases)
*
* @author Maxim Galios
* @author Vadim Goncharov
*
*/
public class SelfReferenceCheck
@ -57,8 +58,13 @@ public class SelfReferenceCheck
private static final Collection<String> EXCESSIVE_NAMES = Set.of("ЭтотОбъект", "ThisObject"); //$NON-NLS-1$ //$NON-NLS-2$
private static final Set<ModuleType> OBJECT_MODULE_TYPE_LIST =
Set.of(ModuleType.OBJECT_MODULE, ModuleType.RECORDSET_MODULE, ModuleType.VALUE_MANAGER_MODULE);
public static final String PARAMETER_CHECK_ONLY_EXISTING_FORM_PROPERTIES = "checkOnlyExistingFormProperties"; //$NON-NLS-1$
public static final String PARAMETER_CHEKC_OBJECT_MODULE = "checkObjectModule"; //$NON-NLS-1$
private DynamicFeatureAccessComputer dynamicFeatureAccessComputer;
/**
@ -88,10 +94,16 @@ public class SelfReferenceCheck
.severity(IssueSeverity.MINOR)
.issueType(IssueType.CODE_STYLE)
.extension(new StandardCheckExtension(467, getCheckId(), BslPlugin.PLUGIN_ID))
.extension(ModuleTypeFilter.excludeTypes(ModuleType.ORDINARY_APP_MODULE, ModuleType.MANAGED_APP_MODULE,
ModuleType.EXTERNAL_CONN_MODULE, ModuleType.SESSION_MODULE, ModuleType.MANAGER_MODULE,
ModuleType.WEB_SERVICE_MODULE, ModuleType.HTTP_SERVICE_MODULE, ModuleType.INTEGRATION_SERVICE_MODULE,
ModuleType.BOT_MODULE))
.module()
.checkedObjectType(DYNAMIC_FEATURE_ACCESS)
.parameter(PARAMETER_CHECK_ONLY_EXISTING_FORM_PROPERTIES, Boolean.class, Boolean.TRUE.toString(),
Messages.SelfReferenceCheck_check_only_existing_form_properties);
Messages.SelfReferenceCheck_check_only_existing_form_properties)
.parameter(PARAMETER_CHEKC_OBJECT_MODULE, Boolean.class, Boolean.TRUE.toString(),
Messages.SelfReferenceCheck_check_object_module);
}
@Override
@ -108,28 +120,35 @@ public class SelfReferenceCheck
StaticFeatureAccess source = (StaticFeatureAccess)featureAccessSource;
if (isReferenceExcessive(dynamicFeatureAccess, source,
parameters.getBoolean(PARAMETER_CHECK_ONLY_EXISTING_FORM_PROPERTIES)))
if (isReferenceExcessive(dynamicFeatureAccess, source, parameters))
{
resultAceptor.addIssue(Messages.SelfReferenceCheck_Issue,
source);
resultAceptor.addIssue(Messages.SelfReferenceCheck_Issue, source);
}
}
private boolean isReferenceExcessive(DynamicFeatureAccess dynamicFeatureAccess, StaticFeatureAccess source,
boolean checkOnlyExistingFormProperties)
ICheckParameters parameters)
{
boolean checkOnlyExistingFormProperties = parameters.getBoolean(PARAMETER_CHECK_ONLY_EXISTING_FORM_PROPERTIES);
boolean checkObjectModule = parameters.getBoolean(PARAMETER_CHEKC_OBJECT_MODULE);
if (!EXCESSIVE_NAMES.contains(source.getName()))
{
return false;
}
Module module = EcoreUtil2.getContainerOfType(dynamicFeatureAccess, Module.class);
if (!checkObjectModule && OBJECT_MODULE_TYPE_LIST.contains(module.getModuleType()))
{
return false;
}
if (!checkOnlyExistingFormProperties || (dynamicFeatureAccess.eContainer() instanceof Invocation))
{
return true;
}
Module module = EcoreUtil2.getContainerOfType(dynamicFeatureAccess, Module.class);
return !(module.getModuleType() == ModuleType.FORM_MODULE
&& isEmptySource(dynamicFeatureAccessComputer.resolveObject(dynamicFeatureAccess, module.environments())));
}

View File

@ -452,6 +452,8 @@ SelfReferenceCheck_Issue = Excessive usage of self reference (when referencing m
SelfReferenceCheck_Title = Excessive self reference
SelfReferenceCheck_check_object_module = Check object (recordset, value manager) module
SelfReferenceCheck_check_only_existing_form_properties = Check only existing form properties
ServerExecutionSafeModeCheck_description = Safe mode is not enabled when calling "Execute" or "Eval'

View File

@ -452,6 +452,8 @@ SelfReferenceCheck_Issue = Избыточное обращение внутри
SelfReferenceCheck_Title = Избыточное использование псевдонима "ЭтотОбъект"
SelfReferenceCheck_check_object_module = Проверять модули объектов (наборов записей, менеджеров значений)
SelfReferenceCheck_check_only_existing_form_properties = Проверять только существующие свойства в форме
ServerExecutionSafeModeCheck_description = Отсутствует включение безопасного режима перед вызовом метода "Выполнить" или "Вычислить"

View File

@ -1,5 +1,5 @@
/*******************************************************************************
* Copyright (C) 2022, 1C-Soft LLC and others.
* Copyright (C) 2023, 1C-Soft LLC and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
@ -35,6 +35,7 @@ import com.e1c.v8codestyle.internal.bsl.BslPlugin;
* The test for class {@link SelfReferenceCheck}.
*
* @author Maxim Galios
* @author Vadim Goncharov
*
*/
public class SelfReferenceCheckTest
@ -94,12 +95,8 @@ public class SelfReferenceCheckTest
IDtProject dtProject = getProject();
IProject project = dtProject.getWorkspaceProject();
ICheckSettings settings = checkRepository.getSettings(new CheckUid(getCheckId(), BslPlugin.PLUGIN_ID), project);
settings.getParameters()
.get(SelfReferenceCheck.PARAMETER_CHECK_ONLY_EXISTING_FORM_PROPERTIES)
.setValue(Boolean.toString(false));
checkRepository.applyChanges(Collections.singleton(settings), project);
changeProjectSetting(project, SelfReferenceCheck.PARAMETER_CHECK_ONLY_EXISTING_FORM_PROPERTIES,
Boolean.toString(false));
waitForDD(dtProject);
List<Marker> markersAfterSettingsChange = getMarkers(FORM_MODULE_FILE_NAME);
@ -132,6 +129,15 @@ public class SelfReferenceCheckTest
assertEquals("8", markers.get(1).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
assertEquals("9", markers.get(2).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
assertEquals("9", markers.get(3).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
IDtProject dtProject = getProject();
IProject project = dtProject.getWorkspaceProject();
changeProjectSetting(project, SelfReferenceCheck.PARAMETER_CHEKC_OBJECT_MODULE, Boolean.toString(false));
waitForDD(dtProject);
List<Marker> markersAfterSettingsChange = getMarkers(OBJECT_MODULE_FILE_NAME);
assertEquals(0, markersAfterSettingsChange.size());
}
private List<Marker> getMarkers(String moduleFileName)
@ -146,4 +152,12 @@ public class SelfReferenceCheckTest
.filter(marker -> chekcId.equals(getCheckIdFromMarker(marker, getProject())))
.collect(Collectors.toList());
}
private void changeProjectSetting(IProject project, String parameter, String value)
{
ICheckSettings settings = checkRepository.getSettings(new CheckUid(getCheckId(), BslPlugin.PLUGIN_ID), project);
settings.getParameters().get(parameter).setValue(value);
checkRepository.applyChanges(Collections.singleton(settings), project);
}
}