mirror of
https://github.com/1C-Company/v8-code-style.git
synced 2025-04-28 17:55:53 +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
|
# 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
|
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
|
## 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_Loop_has_query;
|
||||||
public static String QueryInLoop_title;
|
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_check_only_existing_form_properties;
|
||||||
|
|
||||||
public static String SelfReferenceCheck_Description;
|
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
|
* This program and the accompanying materials are made
|
||||||
* available under the terms of the Eclipse Public License 2.0
|
* 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)
|
* (if PARAMETER_CHECK_ONLY_EXISTING_FORM_PROPERTIES is set, otherwise, check for all cases)
|
||||||
*
|
*
|
||||||
* @author Maxim Galios
|
* @author Maxim Galios
|
||||||
|
* @author Vadim Goncharov
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class SelfReferenceCheck
|
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 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_CHECK_ONLY_EXISTING_FORM_PROPERTIES = "checkOnlyExistingFormProperties"; //$NON-NLS-1$
|
||||||
|
|
||||||
|
public static final String PARAMETER_CHEKC_OBJECT_MODULE = "checkObjectModule"; //$NON-NLS-1$
|
||||||
|
|
||||||
private DynamicFeatureAccessComputer dynamicFeatureAccessComputer;
|
private DynamicFeatureAccessComputer dynamicFeatureAccessComputer;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
@ -88,10 +94,16 @@ public class SelfReferenceCheck
|
|||||||
.severity(IssueSeverity.MINOR)
|
.severity(IssueSeverity.MINOR)
|
||||||
.issueType(IssueType.CODE_STYLE)
|
.issueType(IssueType.CODE_STYLE)
|
||||||
.extension(new StandardCheckExtension(467, getCheckId(), BslPlugin.PLUGIN_ID))
|
.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()
|
.module()
|
||||||
.checkedObjectType(DYNAMIC_FEATURE_ACCESS)
|
.checkedObjectType(DYNAMIC_FEATURE_ACCESS)
|
||||||
.parameter(PARAMETER_CHECK_ONLY_EXISTING_FORM_PROPERTIES, Boolean.class, Boolean.TRUE.toString(),
|
.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
|
@Override
|
||||||
@ -108,28 +120,35 @@ public class SelfReferenceCheck
|
|||||||
|
|
||||||
StaticFeatureAccess source = (StaticFeatureAccess)featureAccessSource;
|
StaticFeatureAccess source = (StaticFeatureAccess)featureAccessSource;
|
||||||
|
|
||||||
if (isReferenceExcessive(dynamicFeatureAccess, source,
|
if (isReferenceExcessive(dynamicFeatureAccess, source, parameters))
|
||||||
parameters.getBoolean(PARAMETER_CHECK_ONLY_EXISTING_FORM_PROPERTIES)))
|
|
||||||
{
|
{
|
||||||
resultAceptor.addIssue(Messages.SelfReferenceCheck_Issue,
|
resultAceptor.addIssue(Messages.SelfReferenceCheck_Issue, source);
|
||||||
source);
|
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
private boolean isReferenceExcessive(DynamicFeatureAccess dynamicFeatureAccess, StaticFeatureAccess 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()))
|
if (!EXCESSIVE_NAMES.contains(source.getName()))
|
||||||
{
|
{
|
||||||
return false;
|
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))
|
if (!checkOnlyExistingFormProperties || (dynamicFeatureAccess.eContainer() instanceof Invocation))
|
||||||
{
|
{
|
||||||
return true;
|
return true;
|
||||||
}
|
}
|
||||||
|
|
||||||
Module module = EcoreUtil2.getContainerOfType(dynamicFeatureAccess, Module.class);
|
|
||||||
|
|
||||||
return !(module.getModuleType() == ModuleType.FORM_MODULE
|
return !(module.getModuleType() == ModuleType.FORM_MODULE
|
||||||
&& isEmptySource(dynamicFeatureAccessComputer.resolveObject(dynamicFeatureAccess, module.environments())));
|
&& 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_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
|
SelfReferenceCheck_check_only_existing_form_properties = Check only existing form properties
|
||||||
|
|
||||||
ServerExecutionSafeModeCheck_description = Safe mode is not enabled when calling "Execute" or "Eval'
|
ServerExecutionSafeModeCheck_description = Safe mode is not enabled when calling "Execute" or "Eval'
|
||||||
|
@ -452,6 +452,8 @@ SelfReferenceCheck_Issue = Избыточное обращение внутри
|
|||||||
|
|
||||||
SelfReferenceCheck_Title = Избыточное использование псевдонима "ЭтотОбъект"
|
SelfReferenceCheck_Title = Избыточное использование псевдонима "ЭтотОбъект"
|
||||||
|
|
||||||
|
SelfReferenceCheck_check_object_module = Проверять модули объектов (наборов записей, менеджеров значений)
|
||||||
|
|
||||||
SelfReferenceCheck_check_only_existing_form_properties = Проверять только существующие свойства в форме
|
SelfReferenceCheck_check_only_existing_form_properties = Проверять только существующие свойства в форме
|
||||||
|
|
||||||
ServerExecutionSafeModeCheck_description = Отсутствует включение безопасного режима перед вызовом метода "Выполнить" или "Вычислить"
|
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
|
* This program and the accompanying materials are made
|
||||||
* available under the terms of the Eclipse Public License 2.0
|
* 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}.
|
* The test for class {@link SelfReferenceCheck}.
|
||||||
*
|
*
|
||||||
* @author Maxim Galios
|
* @author Maxim Galios
|
||||||
|
* @author Vadim Goncharov
|
||||||
*
|
*
|
||||||
*/
|
*/
|
||||||
public class SelfReferenceCheckTest
|
public class SelfReferenceCheckTest
|
||||||
@ -94,12 +95,8 @@ public class SelfReferenceCheckTest
|
|||||||
|
|
||||||
IDtProject dtProject = getProject();
|
IDtProject dtProject = getProject();
|
||||||
IProject project = dtProject.getWorkspaceProject();
|
IProject project = dtProject.getWorkspaceProject();
|
||||||
|
changeProjectSetting(project, SelfReferenceCheck.PARAMETER_CHECK_ONLY_EXISTING_FORM_PROPERTIES,
|
||||||
ICheckSettings settings = checkRepository.getSettings(new CheckUid(getCheckId(), BslPlugin.PLUGIN_ID), project);
|
Boolean.toString(false));
|
||||||
settings.getParameters()
|
|
||||||
.get(SelfReferenceCheck.PARAMETER_CHECK_ONLY_EXISTING_FORM_PROPERTIES)
|
|
||||||
.setValue(Boolean.toString(false));
|
|
||||||
checkRepository.applyChanges(Collections.singleton(settings), project);
|
|
||||||
waitForDD(dtProject);
|
waitForDD(dtProject);
|
||||||
|
|
||||||
List<Marker> markersAfterSettingsChange = getMarkers(FORM_MODULE_FILE_NAME);
|
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("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(2).getExtraInfo().get(IExtraInfoKeys.TEXT_EXTRA_INFO_LINE_KEY));
|
||||||
assertEquals("9", markers.get(3).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)
|
private List<Marker> getMarkers(String moduleFileName)
|
||||||
@ -146,4 +152,12 @@ public class SelfReferenceCheckTest
|
|||||||
.filter(marker -> chekcId.equals(getCheckIdFromMarker(marker, getProject())))
|
.filter(marker -> chekcId.equals(getCheckIdFromMarker(marker, getProject())))
|
||||||
.collect(Collectors.toList());
|
.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…
x
Reference in New Issue
Block a user