mirror of
https://github.com/1C-Company/v8-code-style.git
synced 2024-11-28 09:33:06 +02:00
* Доработана проверка SelfReferenceCheck: добавлена опция, позволяющая пропускать проверку для модулей объектов, наборов записей, менеджеров значений. * Исключение некоторых типов модулей из проверки Модули, в которых ключевое слово "ЭтотОбъект" не является ссылкой на модуль/объект-владельца, исключены из проверки. --------- Co-authored-by: Dmitriy Marmyshev <dmar@1c.ru>
This commit is contained in:
parent
03db874a42
commit
ea1029c0ae
@ -28,6 +28,7 @@
|
||||
- Использование устаревшего метода Найти
|
||||
- Отсутствует комментарий к экспортной процедуре (функции)
|
||||
- Документирующий комментарий не содержит секцию "Описание" для экспортной процедуры (функции)
|
||||
- В проверку "module-self-reference" добавлен параметр, позволяющий пропускать проверку для модулей объектов, наборов записей и менеджеров значений
|
||||
- Проверка корректного наименования переменных
|
||||
- Обращение к несуществующему параметру формы
|
||||
- Необязательный параметр процедуры/функции стоит перед обязательным
|
||||
|
@ -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
|
||||
|
||||
|
@ -1,9 +1,13 @@
|
||||
# Избыточное использование псевдонима "ЭтотОбъект"
|
||||
|
||||
Избыточное обращение внутри модуля через псевдоним "ЭтотОбъект" (к методу, свойству или реквизиту)
|
||||
Избыточное обращение внутри модуля через псевдоним "ЭтотОбъект" (к методу, свойству или реквизиту).
|
||||
|
||||
Проверяются общие модули, модули объектов, наборов записей, модули менеджеров значений и модули форм.
|
||||
Проверку модулей объектов, наборов записей и менеджеров значений можно отключить
|
||||
через параметр `Проверять модули объектов (наборов записей, менеджеров значений)`.
|
||||
|
||||
Для модулей форм проверяется только обращение к методам и существующим свойствам
|
||||
(в случае если установлен параметр `Проверять только существовующие свойства в форме`, инчае проверяются все случаи)
|
||||
(в случае если установлен параметр `Проверять только существовующие свойства в форме`, иначе проверяются все случаи).
|
||||
|
||||
## Неправильно
|
||||
|
||||
|
@ -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;
|
||||
|
@ -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())));
|
||||
}
|
||||
|
@ -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'
|
||||
|
@ -452,6 +452,8 @@ SelfReferenceCheck_Issue = Избыточное обращение внутри
|
||||
|
||||
SelfReferenceCheck_Title = Избыточное использование псевдонима "ЭтотОбъект"
|
||||
|
||||
SelfReferenceCheck_check_object_module = Проверять модули объектов (наборов записей, менеджеров значений)
|
||||
|
||||
SelfReferenceCheck_check_only_existing_form_properties = Проверять только существующие свойства в форме
|
||||
|
||||
ServerExecutionSafeModeCheck_description = Отсутствует включение безопасного режима перед вызовом метода "Выполнить" или "Вычислить"
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user