1
0
mirror of https://github.com/1C-Company/v8-code-style.git synced 2025-02-15 17:13:51 +02:00

Общая компонента для фильтрации проверок по типу модуля

This commit is contained in:
Dmitriy Marmyshev 2022-07-29 16:04:22 +03:00
parent 1642ee75be
commit 4bafbe4e6f
4 changed files with 120 additions and 35 deletions

View File

@ -27,7 +27,6 @@ import java.util.Set;
import java.util.TreeSet;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.xtext.EcoreUtil2;
import com._1c.g5.v8.dt.bsl.model.BinaryExpression;
import com._1c.g5.v8.dt.bsl.model.BinaryOperation;
@ -37,7 +36,6 @@ import com._1c.g5.v8.dt.bsl.model.Expression;
import com._1c.g5.v8.dt.bsl.model.FeatureAccess;
import com._1c.g5.v8.dt.bsl.model.IfStatement;
import com._1c.g5.v8.dt.bsl.model.Invocation;
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.Pragma;
import com._1c.g5.v8.dt.bsl.model.Procedure;
@ -107,6 +105,7 @@ public class EventDataExchangeLoadCheck
.severity(IssueSeverity.MAJOR)
.issueType(IssueType.PORTABILITY)
.extension(new StandardCheckExtension(getCheckId(), BslPlugin.PLUGIN_ID))
.extension(ModuleTypeFilter.onlyTypes(ModuleType.OBJECT_MODULE, ModuleType.RECORDSET_MODULE))
.module()
.checkedObjectType(PROCEDURE)
.parameter(PARAM_CHECK_AT_BEGINNING, Boolean.class, DEFAULT_CHECK_AT_BEGINNING,
@ -126,13 +125,6 @@ public class EventDataExchangeLoadCheck
return;
}
Module module = EcoreUtil2.getContainerOfType(procedure, Module.class);
if (!checkModuleType(module))
{
return;
}
List<Statement> statements = procedure.allStatements();
if (statements.isEmpty())
{
@ -234,12 +226,6 @@ public class EventDataExchangeLoadCheck
return false;
}
private boolean checkModuleType(Module module)
{
return module.getModuleType() == ModuleType.OBJECT_MODULE
|| module.getModuleType() == ModuleType.RECORDSET_MODULE;
}
private boolean hasReturnStatement(IfStatement statement, IProgressMonitor monitor)
{
Conditional conditional = statement.getIfPart();

View File

@ -23,7 +23,6 @@ import org.eclipse.xtext.EcoreUtil2;
import com._1c.g5.v8.dt.bsl.model.DeclareStatement;
import com._1c.g5.v8.dt.bsl.model.ExplicitVariable;
import com._1c.g5.v8.dt.bsl.model.Method;
import com._1c.g5.v8.dt.bsl.model.Module;
import com._1c.g5.v8.dt.bsl.model.ModuleType;
import com.e1c.g5.v8.dt.check.CheckComplexity;
import com.e1c.g5.v8.dt.check.ICheckParameters;
@ -59,6 +58,7 @@ public class FormModuleMissingPragmaCheck
.severity(IssueSeverity.MINOR)
.issueType(IssueType.ERROR)
.extension(new StandardCheckExtension(getCheckId(), BslPlugin.PLUGIN_ID))
.extension(ModuleTypeFilter.onlyTypes(ModuleType.FORM_MODULE, ModuleType.COMMAND_MODULE))
.module()
.checkedObjectType(METHOD, DECLARE_STATEMENT);
}
@ -67,15 +67,6 @@ public class FormModuleMissingPragmaCheck
protected void check(Object object, ResultAcceptor resultAceptor, ICheckParameters parameters,
IProgressMonitor monitor)
{
Module module = EcoreUtil2.getContainerOfType((EObject)object, Module.class);
ModuleType type = module.getModuleType();
if (type != ModuleType.FORM_MODULE && type != ModuleType.COMMAND_MODULE)
{
return;
}
if (object instanceof Method)
{
Method method = (Method)object;

View File

@ -17,13 +17,10 @@ import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.INVOCATION;
import java.util.List;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.EcoreUtil2;
import com._1c.g5.v8.dt.bsl.model.FeatureAccess;
import com._1c.g5.v8.dt.bsl.model.FeatureEntry;
import com._1c.g5.v8.dt.bsl.model.Invocation;
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.Procedure;
import com._1c.g5.v8.dt.bsl.model.StaticFeatureAccess;
@ -68,6 +65,7 @@ public final class InvocationFormEventHandlerCheck
.severity(IssueSeverity.TRIVIAL)
.issueType(IssueType.CODE_STYLE)
.extension(new StandardCheckExtension(getCheckId(), BslPlugin.PLUGIN_ID))
.extension(ModuleTypeFilter.onlyTypes(ModuleType.FORM_MODULE))
.module()
.checkedObjectType(INVOCATION);
}
@ -76,13 +74,6 @@ public final class InvocationFormEventHandlerCheck
protected void check(Object object, ResultAcceptor resultAceptor, ICheckParameters parameters,
IProgressMonitor monitor)
{
Module module = EcoreUtil2.getContainerOfType((EObject)object, Module.class);
ModuleType type = module.getModuleType();
if (type != ModuleType.FORM_MODULE)
{
return;
}
FeatureAccess method = ((Invocation)object).getMethodAccess();
if (!(method instanceof StaticFeatureAccess))
{

View File

@ -0,0 +1,117 @@
/*******************************************************************************
* Copyright (C) 2022, 1C-Soft LLC and others.
*
* This program and the accompanying materials are made
* available under the terms of the Eclipse Public License 2.0
* which is available at https://www.eclipse.org/legal/epl-2.0/
*
* SPDX-License-Identifier: EPL-2.0
*
* Contributors:
* 1C-Soft LLC - initial API and implementation
*******************************************************************************/
package com.e1c.v8codestyle.bsl.check;
import java.util.Set;
import java.util.stream.Collectors;
import org.eclipse.core.runtime.Assert;
import org.eclipse.core.runtime.IProgressMonitor;
import org.eclipse.emf.ecore.EObject;
import org.eclipse.xtext.EcoreUtil2;
import com._1c.g5.v8.dt.bsl.documentation.comment.BslDocumentationComment;
import com._1c.g5.v8.dt.bsl.documentation.comment.IDescriptionPart;
import com._1c.g5.v8.dt.bsl.model.Module;
import com._1c.g5.v8.dt.bsl.model.ModuleType;
import com.e1c.g5.v8.dt.check.ICheckParameters;
import com.e1c.g5.v8.dt.check.components.IBasicCheckExtension;
/**
* The extension allows to skip checking the module by it's type.
*
* @author Dmitriy Marmyshev
*/
public final class ModuleTypeFilter
implements IBasicCheckExtension
{
/**
* Create extension that allows to check module with certain types.
*
* @param types the types, cannot be {@code null}.
* @return the module type filter, cannot return {@code null}.
*/
public static ModuleTypeFilter onlyTypes(ModuleType... types)
{
Assert.isNotNull(types);
Set<ModuleType> include = Set.of(types);
return new ModuleTypeFilter(include);
}
/**
* Create extension that allows to check module with all types excluding specified.
*
* @param types the types, cannot be {@code null}.
* @return the module type filter, cannot return {@code null}.
*/
public static ModuleTypeFilter excludeTypes(ModuleType... types)
{
Assert.isNotNull(types);
Set<ModuleType> exclude = Set.of(types);
Set<ModuleType> include =
Set.copyOf(ModuleType.VALUES.stream().filter(t -> !exclude.contains(t)).collect(Collectors.toSet()));
return new ModuleTypeFilter(include);
}
private final Set<ModuleType> types;
private ModuleTypeFilter(Set<ModuleType> types)
{
this.types = types;
}
@Override
public boolean preCheck(Object object, ICheckParameters parameters, IProgressMonitor progressMonitor)
{
ModuleType type = null;
if (object instanceof EObject)
{
type = getModuleType((EObject)object);
}
else if (object instanceof IDescriptionPart)
{
type = getModuleType((IDescriptionPart)object);
}
return type != null && types.contains(type);
}
private ModuleType getModuleType(EObject context)
{
Module module = EcoreUtil2.getContainerOfType(context, Module.class);
if (module == null)
{
return null;
}
return module.getModuleType();
}
private ModuleType getModuleType(IDescriptionPart context)
{
IDescriptionPart parent = context;
while (parent != null)
{
if (parent instanceof BslDocumentationComment)
{
BslDocumentationComment root = (BslDocumentationComment)parent;
return getModuleType(root.getModule());
}
parent = parent.getParent();
}
return null;
}
}