From 4180068a43f26f7a0aa050d0a3fd09b21c1d120b Mon Sep 17 00:00:00 2001 From: IvanSergeev Date: Mon, 20 Oct 2025 11:01:07 +0400 Subject: [PATCH 01/23] Add checks missing and extra semicolon, qfix. --- .../e1c/v8codestyle/bsl/ui/qfix/Messages.java | 9 + .../bsl/ui/qfix/MethodSemicolonExtraFix.java | 91 ++++++++ .../bsl/ui/qfix/SemicolonMissingFix.java | 63 ++++++ .../bsl/ui/qfix/messages.properties | 6 + .../bsl/ui/qfix/messages_ru.properties | 12 ++ .../e1c/v8codestyle/bsl/check/Messages.java | 14 +- .../bsl/check/MethodSemicolonExtraCheck.java | 108 ++++++++++ .../bsl/check/SemicolonMissingCheck.java | 194 ++++++++++++++++++ .../v8codestyle/bsl/check/messages.properties | 18 ++ .../bsl/check/messages_ru.properties | 18 ++ .../extra-semicolon-method-after.bsl | 13 ++ .../extra-semicolon-method-before.bsl | 13 ++ .../method-declaration-contain-semicolon.bsl | 8 + .../missing-semicolon-statement-after.bsl | 18 ++ .../missing-semicolon-statement-before.bsl | 12 ++ ...sing-semicolon-statement-sub-statement.bsl | 14 ++ .../resources/missing-semicolon-statement.bsl | 10 + .../non-contain-extra-semicolon-method.bsl | 8 + .../non-missing-semicolon-statement.bsl | 10 + .../itests/MethodSemicolonExtraCheckTest.java | 102 +++++++++ .../itests/SemicolonMissingCheckTest.java | 119 +++++++++++ 21 files changed, 859 insertions(+), 1 deletion(-) create mode 100644 bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/MethodSemicolonExtraFix.java create mode 100644 bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/SemicolonMissingFix.java create mode 100644 bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/MethodSemicolonExtraCheck.java create mode 100644 bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/extra-semicolon-method-after.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/extra-semicolon-method-before.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/method-declaration-contain-semicolon.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-after.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-before.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-sub-statement.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/non-contain-extra-semicolon-method.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/non-missing-semicolon-statement.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/MethodSemicolonExtraCheckTest.java create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/SemicolonMissingCheckTest.java diff --git a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/Messages.java b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/Messages.java index 317373122..eec0f337f 100644 --- a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/Messages.java +++ b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/Messages.java @@ -44,6 +44,12 @@ final class Messages public static String OpenBslDocCommentViewFix_Details; + public static String MethodSemicolonExtraFix_Details; + public static String MethodSemicolonExtraFix_Description; + + public static String SemicolonMissngFix_Details; + public static String SemicolonMissingFix_Description; + public static String SelfReferenceFix_description; public static String SelfReferenceFix_details; @@ -59,6 +65,9 @@ final class Messages public static String UndefinedVariableFix_title; public static String UndefinedVariableFix_desc; + public static String SelfAssignFix_Description; + public static String SelfAssignFix_Details; + static { // initialize resource bundle diff --git a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/MethodSemicolonExtraFix.java b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/MethodSemicolonExtraFix.java new file mode 100644 index 000000000..fb83b0b8f --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/MethodSemicolonExtraFix.java @@ -0,0 +1,91 @@ +/******************************************************************************* + * Copyright (C) 2025, 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.ui.qfix; + +import java.util.List; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.text.edits.DeleteEdit; +import org.eclipse.text.edits.TextEdit; +import org.eclipse.xtext.nodemodel.INode; +import org.eclipse.xtext.nodemodel.util.NodeModelUtils; +import org.eclipse.xtext.resource.XtextResource; + +import com._1c.g5.v8.dt.bsl.model.EmptyStatement; +import com._1c.g5.v8.dt.bsl.model.Method; +import com._1c.g5.v8.dt.bsl.model.Statement; +import com._1c.g5.v8.dt.bsl.model.util.BslUtil; +import com.e1c.g5.v8.dt.bsl.check.qfix.IXtextBslModuleFixModel; +import com.e1c.g5.v8.dt.bsl.check.qfix.SingleVariantXtextBslModuleFix; +import com.e1c.g5.v8.dt.check.qfix.components.QuickFix; + +/** + * Removes extra semicolon + * + * @author Ivan Sergeev + */ +@QuickFix(checkId = "method-semicolon-extra", supplierId = "com.e1c.v8codestyle.bsl") +public class MethodSemicolonExtraFix + extends SingleVariantXtextBslModuleFix +{ + + @Override + protected void configureFix(FixConfigurer configurer) + { + configurer.interactive(true) + .description(Messages.MethodSemicolonExtraFix_Description) + .details(Messages.MethodSemicolonExtraFix_Description); + } + + @Override + protected TextEdit fixIssue(XtextResource state, IXtextBslModuleFixModel model) throws BadLocationException + { + EObject eobject = model.getElement(); + if (!(eobject instanceof Method)) + { + return null; + } + + List allItems = BslUtil.allStatements(eobject); + + INode node = NodeModelUtils.findActualNodeFor(allItems.get(0)); + + int size = allItems.size(); + + for (int i = 0; i < size; i++) + { + if (allItems.get(i) instanceof EmptyStatement) + { + node = NodeModelUtils.findActualNodeFor(allItems.get(i)); + + if (node == null) + { + return null; + } + INode checkNode = node.getNextSibling(); + String checkText = checkNode.getText(); + INode checkNextNode = checkNode.getNextSibling(); + if (checkText.contains(";")) //$NON-NLS-1$ + { + return new DeleteEdit(checkNode.getTotalOffset(), checkNode.getTotalLength()); + } + else if (checkNextNode.getText().contains(";")) //$NON-NLS-1$ + { + return new DeleteEdit(checkNextNode.getTotalOffset(), checkNextNode.getTotalLength()); + } + } + } + return null; + } +} diff --git a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/SemicolonMissingFix.java b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/SemicolonMissingFix.java new file mode 100644 index 000000000..06635482e --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/SemicolonMissingFix.java @@ -0,0 +1,63 @@ +/******************************************************************************* + * Copyright (C) 2025, 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.ui.qfix; + +import org.eclipse.emf.ecore.EObject; +import org.eclipse.jface.text.BadLocationException; +import org.eclipse.text.edits.ReplaceEdit; +import org.eclipse.text.edits.TextEdit; +import org.eclipse.xtext.nodemodel.INode; +import org.eclipse.xtext.nodemodel.util.NodeModelUtils; +import org.eclipse.xtext.resource.XtextResource; + +import com._1c.g5.v8.dt.bsl.model.Conditional; +import com._1c.g5.v8.dt.bsl.model.Statement; +import com.e1c.g5.v8.dt.bsl.check.qfix.IXtextBslModuleFixModel; +import com.e1c.g5.v8.dt.bsl.check.qfix.SingleVariantXtextBslModuleFix; +import com.e1c.g5.v8.dt.check.qfix.components.QuickFix; + +/** + * Add missing semicolon + * + * @author Ivan Sergeev + */ +@QuickFix(checkId = "semicolon-missing", supplierId = "com.e1c.v8codestyle.bsl") +public class SemicolonMissingFix + extends SingleVariantXtextBslModuleFix +{ + + @Override + protected void configureFix(FixConfigurer configurer) + { + configurer.interactive(true) + .description(Messages.SemicolonMissingFix_Description) + .details(Messages.SemicolonMissngFix_Details); + } + + @Override + protected TextEdit fixIssue(XtextResource state, IXtextBslModuleFixModel model) throws BadLocationException + { + EObject eobject = model.getElement(); + if (!(eobject instanceof Statement) & !(eobject instanceof Conditional)) + { + return null; + } + + INode node = NodeModelUtils.findActualNodeFor(eobject); + if (node == null) + { + return null; + } + return new ReplaceEdit(node.getTotalOffset(), node.getTotalLength(), node.getText() + ";"); //$NON-NLS-1$ + } +} diff --git a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/messages.properties b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/messages.properties index fc779b05e..a755f05b1 100644 --- a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/messages.properties +++ b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/messages.properties @@ -23,8 +23,14 @@ ManagerModuleNamedSelfReferenceFix_description=Remove excessive named self refer ManagerModuleNamedSelfReferenceFix_details=Remove excessive named self reference from manager module OpenBslDocCommentViewFix_Details=Open documentation comment data structure view and show current probleme object. OpenBslDocCommentViewFix_Description=Open documentation comment structure view +MethodSemicolonExtraFix_Details = Remove extra semicolon +MethodSemicolonExtraFix_Description = Remove extra semicolon +SemicolonMissingFix_Details = Add missing semicolon +SemicolonMissingFix_Description = Add missing semicolon SelfReferenceFix_description=Remove excessive self reference SelfReferenceFix_details=Remove excessive self reference +SelfAssignFix_Description = Remove self assign variable +SelfAssignFix_Details = Remove self assign variable ServerExecutionSafeModeFix_description = Enable safe mode ServerExecutionSafeModeFix_details = Insert safe mode enable statement before "Execute" or "Eval" method call UndefinedMethodFix_func_title=Create function diff --git a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/messages_ru.properties b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/messages_ru.properties index dff861b3e..2b5ea8ca2 100644 --- a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/messages_ru.properties +++ b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/messages_ru.properties @@ -33,10 +33,22 @@ SelfReferenceFix_description=Удалить избыточное обращен SelfReferenceFix_details=Удалить избыточное обращение внутри модуля через псевдоним "ЭтотОбъект" +SelfAssignFix_Description = Удалить переменную присвоенную саму себе + +SelfAssignFix_Details = Удалить переменную присвоенную саму себе + ServerExecutionSafeModeFix_description = Включить безопасный режим ServerExecutionSafeModeFix_details = Добавить включение безопасного режима перед вызовом метода "Выполнить" или "Вычислить" +MethodSemicolonExtraFix_Details = Удалить лишнюю точку с запятой + +MethodSemicolonExtraFix_Description = Удалить лишнюю точку с запятой + +SemicolonMissingFix_Details = Добавить пропущенную точку с запятой + +SemicolonMissingFix_Description = Добавить пропущенную точку с запятой + UndefinedMethodFix_func_desc = Создать новую функцию в модуле UndefinedMethodFix_func_title = Создать функцию diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java index f5d3b1d22..91f5d6bff 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java @@ -289,6 +289,14 @@ final class Messages public static String QueryInLoop_Loop_has_query; public static String QueryInLoop_title; + public static String SelfAssignCheck_Title; + public static String SelfAssignCheck_Description; + public static String SelfAssignCheck_Self_assign_issue; + + public static String SemicolonMissingCheck_Description; + public static String SemicolonMissingCheck_Title; + public static String SemicolonMissingCheck_Issue; + public static String SelfReferenceCheck_check_object_module; public static String SelfReferenceCheck_check_only_existing_form_properties; @@ -394,6 +402,10 @@ final class Messages public static String MethodTooManyPramsCheck_title; + public static String MethodSemicolonExtraCheck_Description; + public static String MethodSemicolonExtraCheck_Title; + public static String MethodSemicolonExtraCheck_Issue; + public static String MissingTemporaryFileDeletionCheck_Delete_File_Methods; public static String MissingTemporaryFileDeletionCheck_description; @@ -453,7 +465,7 @@ final class Messages public static String IsInRoleMethodRoleExistCheck_Role_named_not_exists_in_configuration; public static String IsInRoleMethodRoleExistCheck_title; - + public static String ModuleUndefinedVariableCheck_Title; public static String ModuleUndefinedVariableCheck_Description; public static String ModuleUndefinedVariable_msg; diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/MethodSemicolonExtraCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/MethodSemicolonExtraCheck.java new file mode 100644 index 000000000..923f167cf --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/MethodSemicolonExtraCheck.java @@ -0,0 +1,108 @@ +/******************************************************************************* + * Copyright (C) 2025, 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 static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.METHOD; +import static com._1c.g5.v8.dt.mcore.McorePackage.Literals.NAMED_ELEMENT__NAME; + +import java.util.List; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.xtext.nodemodel.INode; +import org.eclipse.xtext.nodemodel.util.NodeModelUtils; + +import com._1c.g5.v8.dt.bsl.model.EmptyStatement; +import com._1c.g5.v8.dt.bsl.model.Method; +import com._1c.g5.v8.dt.bsl.model.Statement; +import com._1c.g5.v8.dt.bsl.model.util.BslUtil; +import com.e1c.g5.v8.dt.check.CheckComplexity; +import com.e1c.g5.v8.dt.check.ICheckParameters; +import com.e1c.g5.v8.dt.check.components.ModuleTopObjectNameFilterExtension; +import com.e1c.g5.v8.dt.check.settings.IssueSeverity; +import com.e1c.g5.v8.dt.check.settings.IssueType; +import com.e1c.v8codestyle.check.CommonSenseCheckExtension; +import com.e1c.v8codestyle.internal.bsl.BslPlugin; + +/** + * Checks method declaration contain extra semicolon + * + * @author Ivan Sergeev + */ +public class MethodSemicolonExtraCheck + extends AbstractModuleStructureCheck +{ + private static final String CHECK_ID = "method-semicolon-extra"; //$NON-NLS-1$ + + @Override + public String getCheckId() + { + return CHECK_ID; + } + + @Override + protected void configureCheck(CheckConfigurer builder) + { + builder.title(Messages.MethodSemicolonExtraCheck_Title) + .description(Messages.MethodSemicolonExtraCheck_Description) + .complexity(CheckComplexity.NORMAL) + .severity(IssueSeverity.MINOR) + .issueType(IssueType.CODE_STYLE) + .extension(new ModuleTopObjectNameFilterExtension()) + .extension(new CommonSenseCheckExtension(getCheckId(), BslPlugin.PLUGIN_ID)) + .module() + .checkedObjectType(METHOD); + } + + @Override + protected void check(Object object, ResultAcceptor resultAceptor, ICheckParameters parameters, + IProgressMonitor monitor) + { + Method method = (Method)object; + List allItems = BslUtil.allStatements(method); + INode node = NodeModelUtils.findActualNodeFor(allItems.get(0)); + + if (allItems.get(0) instanceof EmptyStatement) + { + node = NodeModelUtils.findActualNodeFor(allItems.get(0)); + + if (node == null) + { + return; + } + INode checkNode = node.getNextSibling(); + + if (checkNode == null) + { + return; + } + + String checkText = checkNode.getText(); + + if (checkText.contains(";")) //$NON-NLS-1$ + { + resultAceptor.addIssue(Messages.MethodSemicolonExtraCheck_Issue, NAMED_ELEMENT__NAME); + } + INode checkNodeNext = checkNode.getNextSibling(); + + if (checkNodeNext == null) + { + return; + } + String checkNextText = checkNodeNext.getText(); + if (checkNextText.contains(";")) //$NON-NLS-1$ + { + resultAceptor.addIssue(Messages.MethodSemicolonExtraCheck_Issue, NAMED_ELEMENT__NAME); + } + } + } +} diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java new file mode 100644 index 000000000..6ad2ecbe1 --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java @@ -0,0 +1,194 @@ +/******************************************************************************* + * Copyright (C) 2025, 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 static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.STATEMENT; + +import java.util.LinkedList; +import java.util.List; + +import org.eclipse.core.runtime.IProgressMonitor; +import org.eclipse.emf.ecore.EObject; +import org.eclipse.xtext.nodemodel.ILeafNode; +import org.eclipse.xtext.nodemodel.INode; +import org.eclipse.xtext.nodemodel.util.NodeModelUtils; + +import com._1c.g5.v8.dt.bsl.model.Conditional; +import com._1c.g5.v8.dt.bsl.model.RegionPreprocessorStatement; +import com._1c.g5.v8.dt.bsl.model.Statement; +import com.e1c.g5.v8.dt.check.CheckComplexity; +import com.e1c.g5.v8.dt.check.ICheckParameters; +import com.e1c.g5.v8.dt.check.components.ModuleTopObjectNameFilterExtension; +import com.e1c.g5.v8.dt.check.settings.IssueSeverity; +import com.e1c.g5.v8.dt.check.settings.IssueType; +import com.e1c.v8codestyle.check.CommonSenseCheckExtension; +import com.e1c.v8codestyle.internal.bsl.BslPlugin; + +/** + * Checks in method missing semicolon + * + * @author Ivan Sergeev + */ +public class SemicolonMissingCheck + extends AbstractModuleStructureCheck +{ + private static final String CHECK_ID = "semicolon-missing"; //$NON-NLS-1$ + + @Override + public String getCheckId() + { + return CHECK_ID; + } + + @Override + protected void configureCheck(CheckConfigurer builder) + { + builder.title(Messages.SemicolonMissingCheck_Title) + .description(Messages.SemicolonMissingCheck_Description) + .complexity(CheckComplexity.NORMAL) + .severity(IssueSeverity.MINOR) + .issueType(IssueType.CODE_STYLE) + .extension(new ModuleTopObjectNameFilterExtension()) + .extension(new CommonSenseCheckExtension(getCheckId(), BslPlugin.PLUGIN_ID)) + .module() + .checkedObjectType(STATEMENT); + } + + @Override + protected void check(Object object, ResultAcceptor resultAceptor, ICheckParameters parameters, + IProgressMonitor monitor) + { + INode node = null; + + Statement statement = (Statement)object; + + if (statement instanceof Statement | statement instanceof Conditional + && !(statement instanceof RegionPreprocessorStatement)) + { + node = NodeModelUtils.findActualNodeFor(statement); + + if (node == null) + { + return; + } + + String nodeText = node.getText(); + INode checkNode = node.getNextSibling(); + + if (checkNode == null) + { + return; + } + + String checkText = checkNode.getText(); + + if (checkText.equals(" ")) //$NON-NLS-1$ + { + INode checkNextNode = checkNode.getNextSibling(); + + if (checkNextNode == null) + { + return; + } + String checkText2 = checkNextNode.getText(); + if (checkText2.contains(";")) //$NON-NLS-1$ + { + return; + } + } + if (!checkText.contains(";") && !nodeText.isEmpty()) //$NON-NLS-1$ + { + resultAceptor.addIssue(Messages.SemicolonMissingCheck_Issue); + } + + List eObJects = statement.eContents(); + checkSemicolon(eObJects, resultAceptor); + } + } + + private void checkSemicolon(List eObjects, ResultAcceptor resultAceptor) + { + if (eObjects.isEmpty()) + { + return; + } + + for (EObject eObject : eObjects) + { + List ListObjectsInside = eObject.eContents(); + + if (eObject instanceof Statement | eObject instanceof Conditional) + { + INode statementNode = NodeModelUtils.findActualNodeFor(eObject); + if (statementNode == null) + { + return; + } + + String nodeText = statementNode.getText(); + + if (eObject instanceof Conditional) + { + LinkedList allLeafNodes = new LinkedList<>(); + statementNode.getLeafNodes().forEach(allLeafNodes::add); + ILeafNode lastNode = allLeafNodes.pollLast(); + + if (lastNode == null) + { + return; + } + + String checkText = lastNode.getText(); + + if (!checkText.contains(";") && !nodeText.isEmpty()) //$NON-NLS-1$ + { + if (checkText.contains("#EndRegion") | checkText.contains("#КонецОбласти")) //$NON-NLS-1$//$NON-NLS-2$ + { + checkSemicolon(ListObjectsInside, resultAceptor); + } + else + { + resultAceptor.addIssue(Messages.SemicolonMissingCheck_Issue, eObject); + } + + } + checkSemicolon(ListObjectsInside, resultAceptor); + } + else if (eObject instanceof RegionPreprocessorStatement) + { + checkSemicolon(ListObjectsInside, resultAceptor); + } + else + { + INode checkNode = statementNode.getNextSibling(); + if (checkNode == null) + { + if (!nodeText.contains(";") && !nodeText.isEmpty()) //$NON-NLS-1$ + { + resultAceptor.addIssue(Messages.SemicolonMissingCheck_Issue, eObject); + } + return; + } + + String checkText = checkNode.getText(); + + if (!checkText.contains(";") && !nodeText.isEmpty()) //$NON-NLS-1$ + { + resultAceptor.addIssue(Messages.SemicolonMissingCheck_Issue, eObject); + } + } + } + checkSemicolon(ListObjectsInside, resultAceptor); + } + } +} diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages.properties b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages.properties index 2b2d397bb..d73c5697d 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages.properties +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages.properties @@ -408,6 +408,18 @@ OptionalFormParameterAccessCheck_Optional_form_parameter_access = Optional form OptionalFormParameterAccessCheck_title = Optional form parameter access +MethodSemicolonExtraCheck_Description = Extra Semicolon + +MethodSemicolonExtraCheck_Title = Extra Semicolon + +MethodSemicolonExtraCheck_Issue = Method declaration contain extra semicolon + +SemicolonMissingCheck_Description = Missing semicolon + +SemicolonMissingCheck_Title = Missing semicolon + +SemicolonMissingCheck_Issue = Semicolon is missing + QueryInLoop_Loop_has_method_with_query__0 = Loop has method with query "{0}" QueryInLoop_Loop_has_query = Loop has query @@ -452,6 +464,12 @@ RollbackTransactionCheck_Transactions_is_broken = Rollback transaction is incorr RollbackTransactionCheck_Transactions_is_broken_des = Rollback transaction must be in a try-catch, there should be no executable code between exception and rollback transaction, there is no begin transaction for rollback transaction, there is no commit transaction for begin transaction. +SelfAssignCheck_Title = Self assign + +SelfAssignCheck_Description = Check that variable self assign + +SelfAssignCheck_SelfAssignIssue = This variable self assign + SelfReferenceCheck_Description = Excessive usage of self reference (when referencing method, property or attribute) SelfReferenceCheck_Issue = Excessive usage of self reference (when referencing method, property or attribute) diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages_ru.properties b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages_ru.properties index 9eadbaf33..3f2307d63 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages_ru.properties +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages_ru.properties @@ -452,6 +452,24 @@ RollbackTransactionCheck_Transactions_is_broken = Нарушена схема р RollbackTransactionCheck_Transactions_is_broken_des = Вызов "ОтменитьТранзакцию()" находится вне конструкции "Попытка... Исключение". Отсутствует вызов "НачатьТранзакцию()", хотя вызываются "ОтменитьТранзакцию()". Для вызова "НачатьТранзакцию()" отсутствует парный вызов "ЗафиксироватьТранзакцию()". Между "Исключение" и "ОтменитьТранзакцию()" есть исполняемый код, который может вызвать исключение. +MethodSemicolonExtraCheck_Description = Лишняя точка с запятой + +MethodSemicolonExtraCheck_Title = Лишняя точка с запятой + +MethodSemicolonExtraCheck_Issue = Объявление метода содержит лишнюю точку с запятой + +SemicolonMissingCheck_Description = Пропущена точка с запятой + +SemicolonMissingCheck_Title = Пропущена точка с запятой + +SemicolonMissingCheck_Issue = Пропущена точка с запятой + +SelfAssignCheck_Title = Присвоение переменной самой себе + +SelfAssignCheck_Description = Проверяет что переменная присвоена сама себе + +SelfAssignCheck_SelfAssignIssue = Эта переменная присвоена сама себе + SelfReferenceCheck_Description = Избыточное обращение внутри модуля через псевдоним "ЭтотОбъект" (к методу, свойству или реквизиту) SelfReferenceCheck_Issue = Избыточное обращение внутри модуля через псевдоним "ЭтотОбъект" (к методу, свойству или реквизиту) diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/extra-semicolon-method-after.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/extra-semicolon-method-after.bsl new file mode 100644 index 000000000..541492620 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/extra-semicolon-method-after.bsl @@ -0,0 +1,13 @@ + +#Region Aaaa + +Procedure Test(); + +EndProcedure + +Procedure NonContain() + +EndProcedure + +#EndRegion + diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/extra-semicolon-method-before.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/extra-semicolon-method-before.bsl new file mode 100644 index 000000000..4687313c8 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/extra-semicolon-method-before.bsl @@ -0,0 +1,13 @@ + +#Region Aaaa + +Procedure NonContain() + +EndProcedure + +Procedure Test(); + +EndProcedure + +#EndRegion + diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/method-declaration-contain-semicolon.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/method-declaration-contain-semicolon.bsl new file mode 100644 index 000000000..4ccd43c36 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/method-declaration-contain-semicolon.bsl @@ -0,0 +1,8 @@ + +#Region Aaaa + +Procedure Test (); + +EndProcedure + +#EndRegion diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-after.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-after.bsl new file mode 100644 index 000000000..2ce06997f --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-after.bsl @@ -0,0 +1,18 @@ + +#Region Abcd + +Procedure Aaaa() + + Test = 2 + + NoTest = 2; + +EndProcedure + +Procedure Bbbb() + + NoTest = 2; + +EndProcedure + +#EndRegion diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-before.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-before.bsl new file mode 100644 index 000000000..0c13e5579 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-before.bsl @@ -0,0 +1,12 @@ + +#Region Abcd + +Procedure Aaaa() + + A = 1; + Test = 1 + +EndProcedure + +#EndRegion + diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-sub-statement.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-sub-statement.bsl new file mode 100644 index 000000000..0b5c9fc97 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-sub-statement.bsl @@ -0,0 +1,14 @@ + +#Region Abcd + +Procedure Aaaa() + +If True Then + +Test = 1 + +EndIf; + +EndProcedure + +#EndRegion diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement.bsl new file mode 100644 index 000000000..e022efd46 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement.bsl @@ -0,0 +1,10 @@ + +#Region Abcd + +Procedure Aaaa() + + Test = 2 + +EndProcedure + +#EndRegion diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/non-contain-extra-semicolon-method.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/non-contain-extra-semicolon-method.bsl new file mode 100644 index 000000000..445693946 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/non-contain-extra-semicolon-method.bsl @@ -0,0 +1,8 @@ + +#Region NotEmpty + +Procedure Test() + +EndProcedure + +#EndRegion diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/non-missing-semicolon-statement.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/non-missing-semicolon-statement.bsl new file mode 100644 index 000000000..b63b13565 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/non-missing-semicolon-statement.bsl @@ -0,0 +1,10 @@ + +#Region Abcd + +Procedure Aaaa() + + Test = 1; + +EndProcedure + +#EndRegion diff --git a/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/MethodSemicolonExtraCheckTest.java b/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/MethodSemicolonExtraCheckTest.java new file mode 100644 index 000000000..5153ff878 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/MethodSemicolonExtraCheckTest.java @@ -0,0 +1,102 @@ +/******************************************************************************* + * Copyright (C) 2025, 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.itests; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.junit.Test; + +import com._1c.g5.v8.dt.validation.marker.Marker; +import com._1c.g5.v8.dt.validation.marker.StandardExtraInfo; +import com.e1c.v8codestyle.bsl.check.MethodSemicolonExtraCheck; + +/** + * Tests for {@link MerhodSemicolonExtraCheck} check. + * + * @author Ivan Sergeev + */ +public class MethodSemicolonExtraCheckTest + extends AbstractSingleModuleTestBase +{ + + public MethodSemicolonExtraCheckTest() + { + super(MethodSemicolonExtraCheck.class); + } + + /** + * Test method declaration contain extra semicolon. + * + * @throws Exception the exception + */ + @Test + public void testMethodDeclarationExtraSemicolon() throws Exception + { + updateModule(FOLDER_RESOURCE + "method-declaration-contain-semicolon.bsl"); + + List markers = getModuleMarkers(); + assertEquals(1, markers.size()); + Marker marker = markers.get(0); + assertEquals(Integer.valueOf(4), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + } + + /** + * Test method after another method. + * + * @throws Exception the exception + */ + @Test + public void testMethodAfter() throws Exception + { + updateModule(FOLDER_RESOURCE + "extra-semicolon-method-after.bsl"); + + List markers = getModuleMarkers(); + assertEquals(1, markers.size()); + Marker marker = markers.get(0); + assertEquals(Integer.valueOf(4), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + } + + /** + * Test method before another method. + * + * @throws Exception the exception + */ + @Test + public void testMethodBefore() throws Exception + { + updateModule(FOLDER_RESOURCE + "extra-semicolon-method-before.bsl"); + + List markers = getModuleMarkers(); + assertEquals(1, markers.size()); + Marker marker = markers.get(0); + assertEquals(Integer.valueOf(8), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + } + + /** + * Test method declaration not contain extra semicolon. + * + * @throws Exception the exception + */ + @Test + public void testMethodDeclarationNoExtraSemicolon() throws Exception + { + updateModule(FOLDER_RESOURCE + "non-contain-extra-semicolon-method.bsl"); + + List markers = getModuleMarkers(); + assertTrue(markers.isEmpty()); + + } +} \ No newline at end of file diff --git a/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/SemicolonMissingCheckTest.java b/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/SemicolonMissingCheckTest.java new file mode 100644 index 000000000..c9a856ee2 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/SemicolonMissingCheckTest.java @@ -0,0 +1,119 @@ +/******************************************************************************* + * Copyright (C) 2025, 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.itests; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +import java.util.List; + +import org.junit.Test; + +import com._1c.g5.v8.dt.validation.marker.Marker; +import com._1c.g5.v8.dt.validation.marker.StandardExtraInfo; +import com.e1c.v8codestyle.bsl.check.SemicolonMissingCheck; + +/** + * Tests for {@link SemicolonMissingCheck} check. + * + * @author Ivan Sergeev + */ +public class SemicolonMissingCheckTest + extends AbstractSingleModuleTestBase +{ + + public SemicolonMissingCheckTest() + { + super(SemicolonMissingCheck.class); + } + + /** + * Test statement missing semicolon. + * + * @throws Exception the exception + */ + @Test + public void testStatementMissingSemicolon() throws Exception + { + updateModule(FOLDER_RESOURCE + "missing-semicolon-statement.bsl"); + + List markers = getModuleMarkers(); + assertEquals(1, markers.size()); + Marker marker = markers.get(0); + assertEquals(Integer.valueOf(6), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + } + + /** + * Test statement after another statement. + * + * @throws Exception the exception + */ + @Test + public void testStatementAfter() throws Exception + { + updateModule(FOLDER_RESOURCE + "missing-semicolon-statement-after.bsl"); + + List markers = getModuleMarkers(); + assertEquals(1, markers.size()); + Marker marker = markers.get(0); + assertEquals(Integer.valueOf(6), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + } + + /** + * Test statement before another statement. + * + * @throws Exception the exception + */ + @Test + public void testStatementBefore() throws Exception + { + updateModule(FOLDER_RESOURCE + "missing-semicolon-statement-before.bsl"); + + List markers = getModuleMarkers(); + assertEquals(1, markers.size()); + Marker marker = markers.get(0); + assertEquals(Integer.valueOf(7), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + } + + /** + * Test statement sub statement. + * + * @throws Exception the exception + */ + @Test + public void testStatementSubStatement() throws Exception + { + updateModule(FOLDER_RESOURCE + "missing-semicolon-statement-sub-statement.bsl"); + + List markers = getModuleMarkers(); + assertEquals(1, markers.size()); + Marker marker = markers.get(0); + assertEquals(Integer.valueOf(6), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + + } + + /** + * Test statement no missing semicolon. + * + * @throws Exception the exception + */ + @Test + public void testStatementNoMissingSemicolon() throws Exception + { + updateModule(FOLDER_RESOURCE + "non-missing-semicolon-statement.bsl"); + + List markers = getModuleMarkers(); + assertTrue(markers.isEmpty()); + + } +} From 18040f79a50c880858bcb2076492e2b30d550e61 Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Mon, 20 Oct 2025 11:10:12 +0400 Subject: [PATCH 02/23] Add checks missing and extra semicolon, qfix. --- .../src/com/e1c/v8codestyle/bsl/ui/qfix/Messages.java | 3 --- 1 file changed, 3 deletions(-) diff --git a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/Messages.java b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/Messages.java index eec0f337f..d4796850b 100644 --- a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/Messages.java +++ b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/Messages.java @@ -65,9 +65,6 @@ final class Messages public static String UndefinedVariableFix_title; public static String UndefinedVariableFix_desc; - public static String SelfAssignFix_Description; - public static String SelfAssignFix_Details; - static { // initialize resource bundle From c8d888d64c07aa3489f4a96721ffc65b3639f4de Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Mon, 20 Oct 2025 11:11:00 +0400 Subject: [PATCH 03/23] Add checks missing and extra semicolon, qfix. --- .../src/com/e1c/v8codestyle/bsl/ui/qfix/messages.properties | 2 -- 1 file changed, 2 deletions(-) diff --git a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/messages.properties b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/messages.properties index a755f05b1..301a341bb 100644 --- a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/messages.properties +++ b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/messages.properties @@ -29,8 +29,6 @@ SemicolonMissingFix_Details = Add missing semicolon SemicolonMissingFix_Description = Add missing semicolon SelfReferenceFix_description=Remove excessive self reference SelfReferenceFix_details=Remove excessive self reference -SelfAssignFix_Description = Remove self assign variable -SelfAssignFix_Details = Remove self assign variable ServerExecutionSafeModeFix_description = Enable safe mode ServerExecutionSafeModeFix_details = Insert safe mode enable statement before "Execute" or "Eval" method call UndefinedMethodFix_func_title=Create function From 1538aa252b14619305826b77a37983c77a9ae1d4 Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Mon, 20 Oct 2025 11:11:37 +0400 Subject: [PATCH 04/23] Add checks missing and extra semicolon, qfix. --- .../com/e1c/v8codestyle/bsl/ui/qfix/messages_ru.properties | 4 ---- 1 file changed, 4 deletions(-) diff --git a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/messages_ru.properties b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/messages_ru.properties index 2b5ea8ca2..75bd33af3 100644 --- a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/messages_ru.properties +++ b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/messages_ru.properties @@ -33,10 +33,6 @@ SelfReferenceFix_description=Удалить избыточное обращен SelfReferenceFix_details=Удалить избыточное обращение внутри модуля через псевдоним "ЭтотОбъект" -SelfAssignFix_Description = Удалить переменную присвоенную саму себе - -SelfAssignFix_Details = Удалить переменную присвоенную саму себе - ServerExecutionSafeModeFix_description = Включить безопасный режим ServerExecutionSafeModeFix_details = Добавить включение безопасного режима перед вызовом метода "Выполнить" или "Вычислить" From 604dd88cf9ac2ed6543ebdf23c0a110edd93ea8c Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Mon, 20 Oct 2025 11:13:09 +0400 Subject: [PATCH 05/23] Add checks missing and extra semicolon, qfix. --- .../src/com/e1c/v8codestyle/bsl/check/Messages.java | 4 ---- 1 file changed, 4 deletions(-) diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java index 91f5d6bff..df81029e6 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java @@ -289,10 +289,6 @@ final class Messages public static String QueryInLoop_Loop_has_query; public static String QueryInLoop_title; - public static String SelfAssignCheck_Title; - public static String SelfAssignCheck_Description; - public static String SelfAssignCheck_Self_assign_issue; - public static String SemicolonMissingCheck_Description; public static String SemicolonMissingCheck_Title; public static String SemicolonMissingCheck_Issue; From 719d92ae7345cdc03339de54f73fc5ee3b34ce48 Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Mon, 20 Oct 2025 11:13:54 +0400 Subject: [PATCH 06/23] Add checks missing and extra semicolon, qfix. --- .../src/com/e1c/v8codestyle/bsl/check/messages.properties | 6 ------ 1 file changed, 6 deletions(-) diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages.properties b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages.properties index d73c5697d..a3e086a9b 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages.properties +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages.properties @@ -464,12 +464,6 @@ RollbackTransactionCheck_Transactions_is_broken = Rollback transaction is incorr RollbackTransactionCheck_Transactions_is_broken_des = Rollback transaction must be in a try-catch, there should be no executable code between exception and rollback transaction, there is no begin transaction for rollback transaction, there is no commit transaction for begin transaction. -SelfAssignCheck_Title = Self assign - -SelfAssignCheck_Description = Check that variable self assign - -SelfAssignCheck_SelfAssignIssue = This variable self assign - SelfReferenceCheck_Description = Excessive usage of self reference (when referencing method, property or attribute) SelfReferenceCheck_Issue = Excessive usage of self reference (when referencing method, property or attribute) From 4b1ee9da2b489dc2cea36c2cf96d08bcd2b2b140 Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Mon, 20 Oct 2025 11:14:46 +0400 Subject: [PATCH 07/23] Add checks missing and extra semicolon, qfix. --- .../com/e1c/v8codestyle/bsl/check/messages_ru.properties | 6 ------ 1 file changed, 6 deletions(-) diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages_ru.properties b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages_ru.properties index 3f2307d63..0e9a4996c 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages_ru.properties +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages_ru.properties @@ -464,12 +464,6 @@ SemicolonMissingCheck_Title = Пропущена точка с запятой SemicolonMissingCheck_Issue = Пропущена точка с запятой -SelfAssignCheck_Title = Присвоение переменной самой себе - -SelfAssignCheck_Description = Проверяет что переменная присвоена сама себе - -SelfAssignCheck_SelfAssignIssue = Эта переменная присвоена сама себе - SelfReferenceCheck_Description = Избыточное обращение внутри модуля через псевдоним "ЭтотОбъект" (к методу, свойству или реквизиту) SelfReferenceCheck_Issue = Избыточное обращение внутри модуля через псевдоним "ЭтотОбъект" (к методу, свойству или реквизиту) From a9514832f43274d2ce507910ecf72443e59c0c87 Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Mon, 20 Oct 2025 11:20:00 +0400 Subject: [PATCH 08/23] Add checks missing and extra semicolon, qfix. --- .../src/com/e1c/v8codestyle/bsl/check/Messages.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java index df81029e6..dca4e4f51 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java @@ -461,7 +461,7 @@ final class Messages public static String IsInRoleMethodRoleExistCheck_Role_named_not_exists_in_configuration; public static String IsInRoleMethodRoleExistCheck_title; - + public static String ModuleUndefinedVariableCheck_Title; public static String ModuleUndefinedVariableCheck_Description; public static String ModuleUndefinedVariable_msg; From 71378da67457c1898f38b94c08e4c14533a808b1 Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Mon, 20 Oct 2025 11:47:21 +0400 Subject: [PATCH 09/23] Add checks missing and extra semicolon, qfix. --- bundles/com.e1c.v8codestyle.bsl/plugin.xml | 8 ++++++++ 1 file changed, 8 insertions(+) diff --git a/bundles/com.e1c.v8codestyle.bsl/plugin.xml b/bundles/com.e1c.v8codestyle.bsl/plugin.xml index 84f46c157..56c0a70c9 100644 --- a/bundles/com.e1c.v8codestyle.bsl/plugin.xml +++ b/bundles/com.e1c.v8codestyle.bsl/plugin.xml @@ -387,6 +387,14 @@ category="com.e1c.v8codestyle.bsl" class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.comment.check.ExportProcedureCommentDescriptionCheck"> + + + + From 7712e6cef78ee9920c55c8d22d1b517b5dd692c0 Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Mon, 20 Oct 2025 11:48:23 +0400 Subject: [PATCH 10/23] Add checks missing and extra semicolon, qfix. --- bundles/com.e1c.v8codestyle.bsl.ui/plugin.xml | 2 ++ 1 file changed, 2 insertions(+) diff --git a/bundles/com.e1c.v8codestyle.bsl.ui/plugin.xml b/bundles/com.e1c.v8codestyle.bsl.ui/plugin.xml index 6b1280ba5..b9787f0ab 100644 --- a/bundles/com.e1c.v8codestyle.bsl.ui/plugin.xml +++ b/bundles/com.e1c.v8codestyle.bsl.ui/plugin.xml @@ -373,6 +373,8 @@ + + From 1494474071785ef009ef76f1c1f651cc1cb19fc9 Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Thu, 23 Oct 2025 11:17:00 +0400 Subject: [PATCH 11/23] Update MethodSemicolonExtraCheck.java add empty check --- .../e1c/v8codestyle/bsl/check/MethodSemicolonExtraCheck.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/MethodSemicolonExtraCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/MethodSemicolonExtraCheck.java index 923f167cf..97c3853d5 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/MethodSemicolonExtraCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/MethodSemicolonExtraCheck.java @@ -69,6 +69,10 @@ protected void check(Object object, ResultAcceptor resultAceptor, ICheckParamete { Method method = (Method)object; List allItems = BslUtil.allStatements(method); + if (allItems.isEmpty()) + { + return; + } INode node = NodeModelUtils.findActualNodeFor(allItems.get(0)); if (allItems.get(0) instanceof EmptyStatement) From eeaf544d845b80dbd5700ac8aa293a9cc54cf6a6 Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Mon, 27 Oct 2025 10:18:02 +0400 Subject: [PATCH 12/23] Update MethodSemicolonExtraFix.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Проверка на нахождение statement --- .../e1c/v8codestyle/bsl/ui/qfix/MethodSemicolonExtraFix.java | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/MethodSemicolonExtraFix.java b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/MethodSemicolonExtraFix.java index fb83b0b8f..407a48335 100644 --- a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/MethodSemicolonExtraFix.java +++ b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/MethodSemicolonExtraFix.java @@ -58,7 +58,10 @@ protected TextEdit fixIssue(XtextResource state, IXtextBslModuleFixModel model) } List allItems = BslUtil.allStatements(eobject); - + if (allItems.isEmpty()) + { + return null; + } INode node = NodeModelUtils.findActualNodeFor(allItems.get(0)); int size = allItems.size(); From c0f14b4269833ed33bd4ea8d7619334f649e0af3 Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Mon, 27 Oct 2025 10:36:02 +0400 Subject: [PATCH 13/23] Update messages.properties contain -> contains --- .../src/com/e1c/v8codestyle/bsl/check/messages.properties | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages.properties b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages.properties index a3e086a9b..47ab2a9f2 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages.properties +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/messages.properties @@ -412,7 +412,7 @@ MethodSemicolonExtraCheck_Description = Extra Semicolon MethodSemicolonExtraCheck_Title = Extra Semicolon -MethodSemicolonExtraCheck_Issue = Method declaration contain extra semicolon +MethodSemicolonExtraCheck_Issue = Method declaration contains extra semicolon SemicolonMissingCheck_Description = Missing semicolon From a0b426d2ca3a8f80590436a6b5d814651d954089 Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Mon, 27 Oct 2025 10:49:10 +0400 Subject: [PATCH 14/23] Update SemicolonMissingFix.java ReplaceEdit -> InsertEdit --- .../com/e1c/v8codestyle/bsl/ui/qfix/SemicolonMissingFix.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/SemicolonMissingFix.java b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/SemicolonMissingFix.java index 06635482e..4a8597e34 100644 --- a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/SemicolonMissingFix.java +++ b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/SemicolonMissingFix.java @@ -58,6 +58,6 @@ protected TextEdit fixIssue(XtextResource state, IXtextBslModuleFixModel model) { return null; } - return new ReplaceEdit(node.getTotalOffset(), node.getTotalLength(), node.getText() + ";"); //$NON-NLS-1$ + return new InsertEdit(node.getEndOffset(), ";"); //$NON-NLS-1$ } } From 1d592bddfe0a41bba35c20e9435cb0c6e50b8c6d Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Wed, 29 Oct 2025 13:58:22 +0400 Subject: [PATCH 15/23] Update Messages.java MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Добавление пустых строк --- .../src/com/e1c/v8codestyle/bsl/check/Messages.java | 4 ++++ 1 file changed, 4 insertions(+) diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java index dca4e4f51..c8affe719 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/Messages.java @@ -290,7 +290,9 @@ final class Messages public static String QueryInLoop_title; public static String SemicolonMissingCheck_Description; + public static String SemicolonMissingCheck_Title; + public static String SemicolonMissingCheck_Issue; public static String SelfReferenceCheck_check_object_module; @@ -399,7 +401,9 @@ final class Messages public static String MethodTooManyPramsCheck_title; public static String MethodSemicolonExtraCheck_Description; + public static String MethodSemicolonExtraCheck_Title; + public static String MethodSemicolonExtraCheck_Issue; public static String MissingTemporaryFileDeletionCheck_Delete_File_Methods; From 576a4ce65fa9906f813cd900314fe25951bba57c Mon Sep 17 00:00:00 2001 From: IvanSergeev Date: Sat, 1 Nov 2025 13:11:21 +0400 Subject: [PATCH 16/23] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=BE=20=D0=BF=D0=BE=D0=B4=D1=87=D0=B5=D1=80=D0=BA=D0=B8?= =?UTF-8?q?=D0=B2=D0=B0=D0=BD=D0=B8=D0=B5=20=D0=BB=D0=B8=D1=88=D0=BD=D0=B5?= =?UTF-8?q?=D0=B9=20=D1=82=D0=BE=D1=87=D0=BA=D0=B8=20=D1=81=20=D0=B7=D0=B0?= =?UTF-8?q?=D0=BF=D1=8F=D1=82=D0=BE=D0=B9=20=D0=BF=D0=BE=D0=B4=D1=87=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D0=B8=D0=B2=D0=B0=D0=B5=D1=82=D1=81=D1=8F=20=D1=82?= =?UTF-8?q?=D0=BE=D0=BB=D1=8C=D0=BA=D0=BE=20=D0=BE=D0=BD=D0=B0=20=D0=98?= =?UTF-8?q?=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE?= =?UTF-8?q?=D0=B2=D0=B5=D1=80=D0=BA=D0=B0=20=D0=B2=D1=81=D0=B5=D1=85=20?= =?UTF-8?q?=D1=81=D1=82=D0=B5=D0=B9=D1=82=D0=BC=D0=B5=D0=BD=D0=BE=D1=82?= =?UTF-8?q?=D0=BE=D0=B2=20=D0=BD=D0=B0=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5?= =?UTF-8?q?=D1=80=D0=BA=D1=83=20=D0=B2=20=D0=BC=D0=B5=D1=82=D0=BE=D0=B4?= =?UTF-8?q?=D0=B0=D1=85?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bsl/check/MethodSemicolonExtraCheck.java | 32 +-- .../bsl/check/SemicolonMissingCheck.java | 197 +++++++++++------- 2 files changed, 141 insertions(+), 88 deletions(-) diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/MethodSemicolonExtraCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/MethodSemicolonExtraCheck.java index 97c3853d5..d18ec7c28 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/MethodSemicolonExtraCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/MethodSemicolonExtraCheck.java @@ -13,7 +13,6 @@ package com.e1c.v8codestyle.bsl.check; import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.METHOD; -import static com._1c.g5.v8.dt.mcore.McorePackage.Literals.NAMED_ELEMENT__NAME; import java.util.List; @@ -25,8 +24,11 @@ import com._1c.g5.v8.dt.bsl.model.Method; import com._1c.g5.v8.dt.bsl.model.Statement; import com._1c.g5.v8.dt.bsl.model.util.BslUtil; +import com.e1c.g5.v8.dt.check.BslDirectLocationIssue; import com.e1c.g5.v8.dt.check.CheckComplexity; +import com.e1c.g5.v8.dt.check.DirectLocation; import com.e1c.g5.v8.dt.check.ICheckParameters; +import com.e1c.g5.v8.dt.check.Issue; import com.e1c.g5.v8.dt.check.components.ModuleTopObjectNameFilterExtension; import com.e1c.g5.v8.dt.check.settings.IssueSeverity; import com.e1c.g5.v8.dt.check.settings.IssueType; @@ -73,11 +75,10 @@ protected void check(Object object, ResultAcceptor resultAceptor, ICheckParamete { return; } - INode node = NodeModelUtils.findActualNodeFor(allItems.get(0)); if (allItems.get(0) instanceof EmptyStatement) { - node = NodeModelUtils.findActualNodeFor(allItems.get(0)); + INode node = NodeModelUtils.findActualNodeFor(allItems.get(0)); if (node == null) { @@ -89,23 +90,26 @@ protected void check(Object object, ResultAcceptor resultAceptor, ICheckParamete { return; } - String checkText = checkNode.getText(); - + INode checkNodeNext = checkNode.getNextSibling(); if (checkText.contains(";")) //$NON-NLS-1$ { - resultAceptor.addIssue(Messages.MethodSemicolonExtraCheck_Issue, NAMED_ELEMENT__NAME); - } - INode checkNodeNext = checkNode.getNextSibling(); - if (checkNodeNext == null) - { - return; + DirectLocation directLocation = new DirectLocation(checkNode.getOffset(), checkNode.getLength(), + checkNode.getStartLine(), allItems.get(0)); + + Issue issue = new BslDirectLocationIssue(Messages.MethodSemicolonExtraCheck_Issue, directLocation); + + resultAceptor.addIssue(issue); } - String checkNextText = checkNodeNext.getText(); - if (checkNextText.contains(";")) //$NON-NLS-1$ + else if (checkNodeNext.getText().contains(";") && !(checkNodeNext == null)) //$NON-NLS-1$ { - resultAceptor.addIssue(Messages.MethodSemicolonExtraCheck_Issue, NAMED_ELEMENT__NAME); + DirectLocation directLocation = new DirectLocation(checkNodeNext.getOffset(), checkNodeNext.getLength(), + checkNodeNext.getStartLine(), allItems.get(0)); + + Issue issue = new BslDirectLocationIssue(Messages.MethodSemicolonExtraCheck_Issue, directLocation); + + resultAceptor.addIssue(issue); } } } diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java index 6ad2ecbe1..fb23679e6 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java @@ -12,7 +12,7 @@ *******************************************************************************/ package com.e1c.v8codestyle.bsl.check; -import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.STATEMENT; +import static com._1c.g5.v8.dt.bsl.model.BslPackage.Literals.METHOD; import java.util.LinkedList; import java.util.List; @@ -24,10 +24,19 @@ import org.eclipse.xtext.nodemodel.util.NodeModelUtils; import com._1c.g5.v8.dt.bsl.model.Conditional; -import com._1c.g5.v8.dt.bsl.model.RegionPreprocessorStatement; +import com._1c.g5.v8.dt.bsl.model.EmptyStatement; +import com._1c.g5.v8.dt.bsl.model.ForStatement; +import com._1c.g5.v8.dt.bsl.model.IfStatement; +import com._1c.g5.v8.dt.bsl.model.Method; +import com._1c.g5.v8.dt.bsl.model.ReturnStatement; +import com._1c.g5.v8.dt.bsl.model.SimpleStatement; import com._1c.g5.v8.dt.bsl.model.Statement; +import com._1c.g5.v8.dt.bsl.model.util.BslUtil; +import com.e1c.g5.v8.dt.check.BslDirectLocationIssue; import com.e1c.g5.v8.dt.check.CheckComplexity; +import com.e1c.g5.v8.dt.check.DirectLocation; import com.e1c.g5.v8.dt.check.ICheckParameters; +import com.e1c.g5.v8.dt.check.Issue; import com.e1c.g5.v8.dt.check.components.ModuleTopObjectNameFilterExtension; import com.e1c.g5.v8.dt.check.settings.IssueSeverity; import com.e1c.g5.v8.dt.check.settings.IssueType; @@ -39,7 +48,7 @@ * * @author Ivan Sergeev */ -public class SemicolonMissingCheck +public class SemicolonMissingCheck2 extends AbstractModuleStructureCheck { private static final String CHECK_ID = "semicolon-missing"; //$NON-NLS-1$ @@ -61,7 +70,7 @@ protected void configureCheck(CheckConfigurer builder) .extension(new ModuleTopObjectNameFilterExtension()) .extension(new CommonSenseCheckExtension(getCheckId(), BslPlugin.PLUGIN_ID)) .module() - .checkedObjectType(STATEMENT); + .checkedObjectType(METHOD); } @Override @@ -70,49 +79,39 @@ protected void check(Object object, ResultAcceptor resultAceptor, ICheckParamete { INode node = null; - Statement statement = (Statement)object; + Method method = (Method)object; - if (statement instanceof Statement | statement instanceof Conditional - && !(statement instanceof RegionPreprocessorStatement)) + List allItems = BslUtil.allStatements(method); + if (allItems.isEmpty()) + { + return; + } + for (Statement statement : allItems) { node = NodeModelUtils.findActualNodeFor(statement); - - if (node == null) - { - return; - } - - String nodeText = node.getText(); - INode checkNode = node.getNextSibling(); - - if (checkNode == null) + if (!(statement instanceof EmptyStatement)) { - return; - } - - String checkText = checkNode.getText(); - - if (checkText.equals(" ")) //$NON-NLS-1$ - { - INode checkNextNode = checkNode.getNextSibling(); - - if (checkNextNode == null) + if (statement instanceof Statement) { - return; + if (node == null) + { + return; + } + INode checkNode = node.getNextSibling(); + if (checkNode == null) + { + return; + } + if (!checkNode.getText().contains(";")) //$NON-NLS-1$ + { + resolveAddIssue(node, statement, resultAceptor); + } } - String checkText2 = checkNextNode.getText(); - if (checkText2.contains(";")) //$NON-NLS-1$ + if (!statement.eContents().isEmpty()) { - return; + checkSemicolon(statement.eContents(), resultAceptor); } } - if (!checkText.contains(";") && !nodeText.isEmpty()) //$NON-NLS-1$ - { - resultAceptor.addIssue(Messages.SemicolonMissingCheck_Issue); - } - - List eObJects = statement.eContents(); - checkSemicolon(eObJects, resultAceptor); } } @@ -125,22 +124,18 @@ private void checkSemicolon(List eObjects, ResultAcceptor resultAceptor for (EObject eObject : eObjects) { - List ListObjectsInside = eObject.eContents(); - - if (eObject instanceof Statement | eObject instanceof Conditional) + INode node = NodeModelUtils.findActualNodeFor(eObject); + if (node == null) + { + return; + } + String nodeText = node.getText(); + if (!(eObject instanceof Statement)) { - INode statementNode = NodeModelUtils.findActualNodeFor(eObject); - if (statementNode == null) - { - return; - } - - String nodeText = statementNode.getText(); - if (eObject instanceof Conditional) { LinkedList allLeafNodes = new LinkedList<>(); - statementNode.getLeafNodes().forEach(allLeafNodes::add); + node.getLeafNodes().forEach(allLeafNodes::add); ILeafNode lastNode = allLeafNodes.pollLast(); if (lastNode == null) @@ -152,43 +147,97 @@ private void checkSemicolon(List eObjects, ResultAcceptor resultAceptor if (!checkText.contains(";") && !nodeText.isEmpty()) //$NON-NLS-1$ { - if (checkText.contains("#EndRegion") | checkText.contains("#КонецОбласти")) //$NON-NLS-1$//$NON-NLS-2$ + if (checkText.toLowerCase().contains("#EndRegion".toLowerCase()) //$NON-NLS-1$ + | checkText.toLowerCase().contains("#КонецОбласти".toLowerCase())) //$NON-NLS-1$ { - checkSemicolon(ListObjectsInside, resultAceptor); + checkSemicolon(eObject.eContents(), resultAceptor); } - else + else if (checkText.toLowerCase().contains("#EndIf".toLowerCase()) //$NON-NLS-1$ + | checkText.toLowerCase().contains("#КонецЕсли".toLowerCase())) //$NON-NLS-1$ { - resultAceptor.addIssue(Messages.SemicolonMissingCheck_Issue, eObject); + checkSemicolon(eObject.eContents(), resultAceptor); + } + else if (eObject.eContents().isEmpty()) + { + resolveAddIssue(node, eObject, resultAceptor); } - } - checkSemicolon(ListObjectsInside, resultAceptor); } - else if (eObject instanceof RegionPreprocessorStatement) + checkSemicolon(eObject.eContents(), resultAceptor); + } + else if (eObject instanceof SimpleStatement) + { + INode checkNode = node.getNextSibling(); + if (checkNode == null) { - checkSemicolon(ListObjectsInside, resultAceptor); + if (!nodeText.contains(";") && !nodeText.isEmpty()) //$NON-NLS-1$ + { + resolveAddIssue(node, eObject, resultAceptor); + } + return; } - else + if (!checkNode.getText().contains(";")) //$NON-NLS-1$ { - INode checkNode = statementNode.getNextSibling(); - if (checkNode == null) + resolveAddIssue(node, eObject, resultAceptor); + } + } + else if (eObject instanceof IfStatement | eObject instanceof ForStatement) + { + INode checkNode = node.getNextSibling(); + if (checkNode == null) + { + resolveAddIssue(node, eObject, resultAceptor); + return; + } + if (!checkNode.getText().contains(";")) //$NON-NLS-1$ + { + resolveAddIssue(node, eObject, resultAceptor); + } + checkSemicolon(eObject.eContents(), resultAceptor); + } + else if (eObject instanceof Statement & !(eObject instanceof EmptyStatement)) + { + INode checkNode = node.getNextSibling(); + if (checkNode == null) + { + if (eObject instanceof ReturnStatement) { - if (!nodeText.contains(";") && !nodeText.isEmpty()) //$NON-NLS-1$ - { - resultAceptor.addIssue(Messages.SemicolonMissingCheck_Issue, eObject); - } - return; + resolveAddIssue(node, eObject, resultAceptor); } + return; + } + if (!checkNode.getText().contains(";")) //$NON-NLS-1$ + { + resolveAddIssue(node, eObject, resultAceptor); + } + if (!eObject.eContents().isEmpty()) + { + checkSemicolon(eObject.eContents(), resultAceptor); + } + } + } + } - String checkText = checkNode.getText(); + private void resolveAddIssue(INode node, EObject eObject, ResultAcceptor resultAceptor) + { + LinkedList allLeafNodes = new LinkedList<>(); + node.getLeafNodes().forEach(allLeafNodes::add); + ILeafNode lastNode = allLeafNodes.pollLast(); - if (!checkText.contains(";") && !nodeText.isEmpty()) //$NON-NLS-1$ - { - resultAceptor.addIssue(Messages.SemicolonMissingCheck_Issue, eObject); - } - } - } - checkSemicolon(ListObjectsInside, resultAceptor); + if (eObject instanceof SimpleStatement | eObject instanceof ReturnStatement) + { + resultAceptor.addIssue(Messages.SemicolonMissingCheck_Issue, eObject); + } + + if (lastNode == null) + { + return; } + DirectLocation directLocation = + new DirectLocation(lastNode.getOffset(), lastNode.getLength(), lastNode.getStartLine(), eObject); + + Issue issue = new BslDirectLocationIssue(Messages.SemicolonMissingCheck_Issue, directLocation); + + resultAceptor.addIssue(issue); } } From 93ae72b619506b0fbf3500e087cc3df200f1c7f4 Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Sat, 1 Nov 2025 13:19:02 +0400 Subject: [PATCH 17/23] Update SemicolonMissingFix.java --- .../com/e1c/v8codestyle/bsl/ui/qfix/SemicolonMissingFix.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/SemicolonMissingFix.java b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/SemicolonMissingFix.java index 4a8597e34..700f94513 100644 --- a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/SemicolonMissingFix.java +++ b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/SemicolonMissingFix.java @@ -14,7 +14,7 @@ import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.text.BadLocationException; -import org.eclipse.text.edits.ReplaceEdit; +import org.eclipse.text.edits.InsertEdit; import org.eclipse.text.edits.TextEdit; import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.nodemodel.util.NodeModelUtils; From f09963ae670d307e3906c0db60a62f1caaa4211f Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Sat, 1 Nov 2025 13:23:45 +0400 Subject: [PATCH 18/23] Update MethodSemicolonExtraFix.java --- .../bsl/ui/qfix/MethodSemicolonExtraFix.java | 51 +++++++------------ 1 file changed, 18 insertions(+), 33 deletions(-) diff --git a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/MethodSemicolonExtraFix.java b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/MethodSemicolonExtraFix.java index 407a48335..f2fef6d7f 100644 --- a/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/MethodSemicolonExtraFix.java +++ b/bundles/com.e1c.v8codestyle.bsl.ui/src/com/e1c/v8codestyle/bsl/ui/qfix/MethodSemicolonExtraFix.java @@ -12,8 +12,6 @@ *******************************************************************************/ package com.e1c.v8codestyle.bsl.ui.qfix; -import java.util.List; - import org.eclipse.emf.ecore.EObject; import org.eclipse.jface.text.BadLocationException; import org.eclipse.text.edits.DeleteEdit; @@ -23,9 +21,6 @@ import org.eclipse.xtext.resource.XtextResource; import com._1c.g5.v8.dt.bsl.model.EmptyStatement; -import com._1c.g5.v8.dt.bsl.model.Method; -import com._1c.g5.v8.dt.bsl.model.Statement; -import com._1c.g5.v8.dt.bsl.model.util.BslUtil; import com.e1c.g5.v8.dt.bsl.check.qfix.IXtextBslModuleFixModel; import com.e1c.g5.v8.dt.bsl.check.qfix.SingleVariantXtextBslModuleFix; import com.e1c.g5.v8.dt.check.qfix.components.QuickFix; @@ -52,42 +47,32 @@ protected void configureFix(FixConfigurer configurer) protected TextEdit fixIssue(XtextResource state, IXtextBslModuleFixModel model) throws BadLocationException { EObject eobject = model.getElement(); - if (!(eobject instanceof Method)) + + if (!(eobject instanceof EmptyStatement)) { return null; } - List allItems = BslUtil.allStatements(eobject); - if (allItems.isEmpty()) + INode node = NodeModelUtils.findActualNodeFor(eobject); + + if (node == null) { return null; } - INode node = NodeModelUtils.findActualNodeFor(allItems.get(0)); - - int size = allItems.size(); - - for (int i = 0; i < size; i++) + INode checkNode = node.getNextSibling(); + if (checkNode == null) { - if (allItems.get(i) instanceof EmptyStatement) - { - node = NodeModelUtils.findActualNodeFor(allItems.get(i)); - - if (node == null) - { - return null; - } - INode checkNode = node.getNextSibling(); - String checkText = checkNode.getText(); - INode checkNextNode = checkNode.getNextSibling(); - if (checkText.contains(";")) //$NON-NLS-1$ - { - return new DeleteEdit(checkNode.getTotalOffset(), checkNode.getTotalLength()); - } - else if (checkNextNode.getText().contains(";")) //$NON-NLS-1$ - { - return new DeleteEdit(checkNextNode.getTotalOffset(), checkNextNode.getTotalLength()); - } - } + return null; + } + String checkText = checkNode.getText(); + INode checkNextNode = checkNode.getNextSibling(); + if (checkText.contains(";")) //$NON-NLS-1$ + { + return new DeleteEdit(checkNode.getTotalOffset(), checkNode.getTotalLength()); + } + else if (checkNextNode.getText().contains(";") && !(checkNextNode == null)) //$NON-NLS-1$ + { + return new DeleteEdit(checkNextNode.getTotalOffset(), checkNextNode.getTotalLength()); } return null; } From 1fc52f5dd24c159cd1fc494993ef1ef982d006fe Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Thu, 13 Nov 2025 16:01:37 +0400 Subject: [PATCH 19/23] Update SemicolonMissingCheck.java --- .../bsl/check/SemicolonMissingCheck.java | 29 +++++++++---------- 1 file changed, 13 insertions(+), 16 deletions(-) diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java index fb23679e6..c7fffcc4a 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java @@ -91,21 +91,18 @@ protected void check(Object object, ResultAcceptor resultAceptor, ICheckParamete node = NodeModelUtils.findActualNodeFor(statement); if (!(statement instanceof EmptyStatement)) { - if (statement instanceof Statement) + if (node == null) { - if (node == null) - { - return; - } - INode checkNode = node.getNextSibling(); - if (checkNode == null) - { - return; - } - if (!checkNode.getText().contains(";")) //$NON-NLS-1$ - { - resolveAddIssue(node, statement, resultAceptor); - } + continue; + } + INode checkNode = node.getNextSibling(); + if (checkNode == null) + { + continue; + } + if (!checkNode.getText().contains(";")) //$NON-NLS-1$ + { + resolveAddIssue(node, statement, resultAceptor); } if (!statement.eContents().isEmpty()) { @@ -127,7 +124,7 @@ private void checkSemicolon(List eObjects, ResultAcceptor resultAceptor INode node = NodeModelUtils.findActualNodeFor(eObject); if (node == null) { - return; + continue; } String nodeText = node.getText(); if (!(eObject instanceof Statement)) @@ -140,7 +137,7 @@ private void checkSemicolon(List eObjects, ResultAcceptor resultAceptor if (lastNode == null) { - return; + continue; } String checkText = lastNode.getText(); From 22487cb80a7d59f3fc06364efc4bce2178e87a1a Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Thu, 13 Nov 2025 16:19:07 +0400 Subject: [PATCH 20/23] Update SemicolonMissingCheck.java --- .../com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java index c7fffcc4a..b3839eb85 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java @@ -48,7 +48,7 @@ * * @author Ivan Sergeev */ -public class SemicolonMissingCheck2 +public class SemicolonMissingCheck extends AbstractModuleStructureCheck { private static final String CHECK_ID = "semicolon-missing"; //$NON-NLS-1$ From 2be3c82d4d9a12da5bebb792a47373e7a9e47fd0 Mon Sep 17 00:00:00 2001 From: Ivan Sergeev <55486074+alonthedark@users.noreply.github.com> Date: Fri, 14 Nov 2025 17:57:29 +0400 Subject: [PATCH 21/23] Update SemicolonMissingCheck.java --- .../bsl/check/SemicolonMissingCheck.java | 109 ++++++++++++------ 1 file changed, 74 insertions(+), 35 deletions(-) diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java index b3839eb85..9a5a3d972 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java @@ -19,6 +19,7 @@ import org.eclipse.core.runtime.IProgressMonitor; import org.eclipse.emf.ecore.EObject; +import org.eclipse.xtext.nodemodel.BidiTreeIterator; import org.eclipse.xtext.nodemodel.ILeafNode; import org.eclipse.xtext.nodemodel.INode; import org.eclipse.xtext.nodemodel.util.NodeModelUtils; @@ -88,25 +89,42 @@ protected void check(Object object, ResultAcceptor resultAceptor, ICheckParamete } for (Statement statement : allItems) { - node = NodeModelUtils.findActualNodeFor(statement); - if (!(statement instanceof EmptyStatement)) + if (statement.eContainingFeature().isMany() && statement.eContainer() != null + && statement.eContainer().eGet(statement.eContainingFeature()) instanceof List statementCollection) { - if (node == null) + if (!statementCollection.isEmpty() + && statementCollection.get(statementCollection.size() - 1) == statement) { - continue; - } - INode checkNode = node.getNextSibling(); - if (checkNode == null) - { - continue; - } - if (!checkNode.getText().contains(";")) //$NON-NLS-1$ - { - resolveAddIssue(node, statement, resultAceptor); - } - if (!statement.eContents().isEmpty()) - { - checkSemicolon(statement.eContents(), resultAceptor); + if (!(statement instanceof EmptyStatement)) + { + node = NodeModelUtils.findActualNodeFor(statement); + if (node == null) + { + continue; + } + INode checkNode = node.getNextSibling(); + if (checkNode == null) + { + continue; + } + if (!checkNode.getText().contains(";")) //$NON-NLS-1$ + { + INode checkNextNode = checkNode.getNextSibling(); + if (checkNextNode == null) + { + resolveAddIssue(node, statement, resultAceptor); + continue; + } + if (!checkNextNode.getText().contains(";")) //$NON-NLS-1$ + { + resolveAddIssue(node, statement, resultAceptor); + } + } + if (!statement.eContents().isEmpty()) + { + checkSemicolon(statement.eContents(), resultAceptor); + } + } } } } @@ -118,10 +136,13 @@ private void checkSemicolon(List eObjects, ResultAcceptor resultAceptor { return; } + INode node = null; + INode checkNode = null; + INode checkNextNode = null; for (EObject eObject : eObjects) { - INode node = NodeModelUtils.findActualNodeFor(eObject); + node = NodeModelUtils.findActualNodeFor(eObject); if (node == null) { continue; @@ -131,9 +152,9 @@ private void checkSemicolon(List eObjects, ResultAcceptor resultAceptor { if (eObject instanceof Conditional) { - LinkedList allLeafNodes = new LinkedList<>(); - node.getLeafNodes().forEach(allLeafNodes::add); - ILeafNode lastNode = allLeafNodes.pollLast(); + BidiTreeIterator treeIterator = null; + treeIterator = node.getAsTreeIterable().reverse().iterator(); + INode lastNode = treeIterator.next(); if (lastNode == null) { @@ -164,27 +185,36 @@ else if (eObject.eContents().isEmpty()) } else if (eObject instanceof SimpleStatement) { - INode checkNode = node.getNextSibling(); + checkNode = node.getNextSibling(); if (checkNode == null) { if (!nodeText.contains(";") && !nodeText.isEmpty()) //$NON-NLS-1$ { resolveAddIssue(node, eObject, resultAceptor); } - return; + continue; } if (!checkNode.getText().contains(";")) //$NON-NLS-1$ { - resolveAddIssue(node, eObject, resultAceptor); + checkNextNode = checkNode.getNextSibling(); + if (checkNextNode == null) + { + resolveAddIssue(node, eObject, resultAceptor); + continue; + } + if (!checkNextNode.getText().contains(";")) //$NON-NLS-1$ + { + resolveAddIssue(node, eObject, resultAceptor); + } } } - else if (eObject instanceof IfStatement | eObject instanceof ForStatement) + else if (eObject instanceof IfStatement || eObject instanceof ForStatement) { - INode checkNode = node.getNextSibling(); + checkNode = node.getNextSibling(); if (checkNode == null) { resolveAddIssue(node, eObject, resultAceptor); - return; + continue; } if (!checkNode.getText().contains(";")) //$NON-NLS-1$ { @@ -194,18 +224,27 @@ else if (eObject instanceof IfStatement | eObject instanceof ForStatement) } else if (eObject instanceof Statement & !(eObject instanceof EmptyStatement)) { - INode checkNode = node.getNextSibling(); + checkNode = node.getNextSibling(); if (checkNode == null) { if (eObject instanceof ReturnStatement) { resolveAddIssue(node, eObject, resultAceptor); } - return; + continue; } if (!checkNode.getText().contains(";")) //$NON-NLS-1$ { - resolveAddIssue(node, eObject, resultAceptor); + checkNextNode = checkNode.getNextSibling(); + if (checkNextNode == null) + { + resolveAddIssue(node, eObject, resultAceptor); + continue; + } + if (!checkNextNode.getText().contains(";")) //$NON-NLS-1$ + { + resolveAddIssue(node, eObject, resultAceptor); + } } if (!eObject.eContents().isEmpty()) { @@ -217,14 +256,14 @@ else if (eObject instanceof Statement & !(eObject instanceof EmptyStatement)) private void resolveAddIssue(INode node, EObject eObject, ResultAcceptor resultAceptor) { - LinkedList allLeafNodes = new LinkedList<>(); - node.getLeafNodes().forEach(allLeafNodes::add); - ILeafNode lastNode = allLeafNodes.pollLast(); - - if (eObject instanceof SimpleStatement | eObject instanceof ReturnStatement) + if (eObject instanceof SimpleStatement || eObject instanceof ReturnStatement) { resultAceptor.addIssue(Messages.SemicolonMissingCheck_Issue, eObject); + return; } + LinkedList allLeafNodes = new LinkedList<>(); + node.getLeafNodes().forEach(allLeafNodes::add); + ILeafNode lastNode = allLeafNodes.pollLast(); if (lastNode == null) { From 3b42a9a96e89d79f5d72b75cd22eb11c519968c6 Mon Sep 17 00:00:00 2001 From: IvanSergeev Date: Wed, 19 Nov 2025 18:07:26 +0400 Subject: [PATCH 22/23] =?UTF-8?q?=D0=98=D0=B7=D0=BC=D0=B5=D0=BD=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BF=D1=80=D0=BE=D0=B2=D0=B5=D1=80=D0=BA?= =?UTF-8?q?=D0=B8=20=D0=B8=20=D0=B4=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB=D0=B5?= =?UTF-8?q?=D0=BD=D0=B8=D0=B5=20=D0=BD=D0=BE=D0=B2=D1=8B=D1=85=20=D1=82?= =?UTF-8?q?=D0=B5=D1=81=D1=82=D0=BE=D0=B2?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../bsl/check/MethodSemicolonExtraCheck.java | 2 +- .../bsl/check/SemicolonMissingCheck.java | 215 ++++++++++-------- .../missing-semicolon-return-statement.bsl | 11 + ...emicolon-statemen-sub-statement-after.bsl} | 11 +- ...icolon-statement-else-ifelse-statement.bsl | 17 ++ ...emicolon-statement-if-ifelse-statement.bsl | 17 ++ ...ng-semicolon-statement-if-preprocessor.bsl | 13 ++ ...micolon-statement-sub-statement-before.bsl | 15 ++ ...issing-semicolon-statement-next-string.bsl | 10 + .../non-missing-semicolon-statement-space.bsl | 9 + .../itests/SemicolonMissingCheckTest.java | 117 +++++++++- 11 files changed, 326 insertions(+), 111 deletions(-) create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-return-statement.bsl rename tests/com.e1c.v8codestyle.bsl.itests/resources/{missing-semicolon-statement-after.bsl => missing-semicolon-statemen-sub-statement-after.bsl} (56%) create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-else-ifelse-statement.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-if-ifelse-statement.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-if-preprocessor.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-sub-statement-before.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/non-missing-semicolon-statement-next-string.bsl create mode 100644 tests/com.e1c.v8codestyle.bsl.itests/resources/non-missing-semicolon-statement-space.bsl diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/MethodSemicolonExtraCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/MethodSemicolonExtraCheck.java index d18ec7c28..a09eb602c 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/MethodSemicolonExtraCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/MethodSemicolonExtraCheck.java @@ -102,7 +102,7 @@ protected void check(Object object, ResultAcceptor resultAceptor, ICheckParamete resultAceptor.addIssue(issue); } - else if (checkNodeNext.getText().contains(";") && !(checkNodeNext == null)) //$NON-NLS-1$ + else if (checkNodeNext.getText().contains(";") && checkNodeNext != null) //$NON-NLS-1$ { DirectLocation directLocation = new DirectLocation(checkNodeNext.getOffset(), checkNodeNext.getLength(), checkNodeNext.getStartLine(), allItems.get(0)); diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java index 9a5a3d972..da2efdf0b 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java @@ -27,6 +27,7 @@ import com._1c.g5.v8.dt.bsl.model.Conditional; import com._1c.g5.v8.dt.bsl.model.EmptyStatement; import com._1c.g5.v8.dt.bsl.model.ForStatement; +import com._1c.g5.v8.dt.bsl.model.IfPreprocessorStatement; import com._1c.g5.v8.dt.bsl.model.IfStatement; import com._1c.g5.v8.dt.bsl.model.Method; import com._1c.g5.v8.dt.bsl.model.ReturnStatement; @@ -75,7 +76,7 @@ protected void configureCheck(CheckConfigurer builder) } @Override - protected void check(Object object, ResultAcceptor resultAceptor, ICheckParameters parameters, + protected void check(Object object, ResultAcceptor resultAcceptor, ICheckParameters parameters, IProgressMonitor monitor) { INode node = null; @@ -89,48 +90,41 @@ protected void check(Object object, ResultAcceptor resultAceptor, ICheckParamete } for (Statement statement : allItems) { - if (statement.eContainingFeature().isMany() && statement.eContainer() != null - && statement.eContainer().eGet(statement.eContainingFeature()) instanceof List statementCollection) + if (!(statement instanceof EmptyStatement)) { - if (!statementCollection.isEmpty() - && statementCollection.get(statementCollection.size() - 1) == statement) + node = NodeModelUtils.findActualNodeFor(statement); + if (node == null) + { + continue; + } + INode checkNode = node.getNextSibling(); + if (checkNode == null) { - if (!(statement instanceof EmptyStatement)) + resolveAddIssue(node, statement, resultAcceptor); + continue; + } + if (!checkNode.getText().contains(";")) //$NON-NLS-1$ + { + INode checkNextNode = checkNode.getNextSibling(); + if (checkNextNode == null) { - node = NodeModelUtils.findActualNodeFor(statement); - if (node == null) - { - continue; - } - INode checkNode = node.getNextSibling(); - if (checkNode == null) - { - continue; - } - if (!checkNode.getText().contains(";")) //$NON-NLS-1$ - { - INode checkNextNode = checkNode.getNextSibling(); - if (checkNextNode == null) - { - resolveAddIssue(node, statement, resultAceptor); - continue; - } - if (!checkNextNode.getText().contains(";")) //$NON-NLS-1$ - { - resolveAddIssue(node, statement, resultAceptor); - } - } - if (!statement.eContents().isEmpty()) - { - checkSemicolon(statement.eContents(), resultAceptor); - } + resolveAddIssue(node, statement, resultAcceptor); + continue; } + if (!checkNextNode.getText().contains(";")) //$NON-NLS-1$ + { + resolveAddIssue(node, statement, resultAcceptor); + } + } + if (!statement.eContents().isEmpty()) + { + checkSemicolon(statement.eContents(), resultAcceptor); } } } } - private void checkSemicolon(List eObjects, ResultAcceptor resultAceptor) + private void checkSemicolon(List eObjects, ResultAcceptor resultAcceptor) { if (eObjects.isEmpty()) { @@ -148,6 +142,7 @@ private void checkSemicolon(List eObjects, ResultAcceptor resultAceptor continue; } String nodeText = node.getText(); + if (!(eObject instanceof Statement)) { if (eObject instanceof Conditional) @@ -160,105 +155,129 @@ private void checkSemicolon(List eObjects, ResultAcceptor resultAceptor { continue; } - String checkText = lastNode.getText(); if (!checkText.contains(";") && !nodeText.isEmpty()) //$NON-NLS-1$ { if (checkText.toLowerCase().contains("#EndRegion".toLowerCase()) //$NON-NLS-1$ - | checkText.toLowerCase().contains("#КонецОбласти".toLowerCase())) //$NON-NLS-1$ + || checkText.toLowerCase().contains("#КонецОбласти".toLowerCase())) //$NON-NLS-1$ { - checkSemicolon(eObject.eContents(), resultAceptor); + checkSemicolon(eObject.eContents(), resultAcceptor); } else if (checkText.toLowerCase().contains("#EndIf".toLowerCase()) //$NON-NLS-1$ - | checkText.toLowerCase().contains("#КонецЕсли".toLowerCase())) //$NON-NLS-1$ + || checkText.toLowerCase().contains("#КонецЕсли".toLowerCase())) //$NON-NLS-1$ { - checkSemicolon(eObject.eContents(), resultAceptor); + checkSemicolon(eObject.eContents(), resultAcceptor); } else if (eObject.eContents().isEmpty()) { - resolveAddIssue(node, eObject, resultAceptor); + resolveAddIssue(node, eObject, resultAcceptor); } } } - checkSemicolon(eObject.eContents(), resultAceptor); + checkSemicolon(eObject.eContents(), resultAcceptor); } - else if (eObject instanceof SimpleStatement) + else if (eObject instanceof EmptyStatement) { - checkNode = node.getNextSibling(); - if (checkNode == null) - { - if (!nodeText.contains(";") && !nodeText.isEmpty()) //$NON-NLS-1$ - { - resolveAddIssue(node, eObject, resultAceptor); - } - continue; - } - if (!checkNode.getText().contains(";")) //$NON-NLS-1$ - { - checkNextNode = checkNode.getNextSibling(); - if (checkNextNode == null) - { - resolveAddIssue(node, eObject, resultAceptor); - continue; - } - if (!checkNextNode.getText().contains(";")) //$NON-NLS-1$ - { - resolveAddIssue(node, eObject, resultAceptor); - } - } + continue; } - else if (eObject instanceof IfStatement || eObject instanceof ForStatement) + else if (eObject instanceof IfPreprocessorStatement) { - checkNode = node.getNextSibling(); - if (checkNode == null) - { - resolveAddIssue(node, eObject, resultAceptor); - continue; - } - if (!checkNode.getText().contains(";")) //$NON-NLS-1$ - { - resolveAddIssue(node, eObject, resultAceptor); - } - checkSemicolon(eObject.eContents(), resultAceptor); + checkSemicolon(eObject.eContents(), resultAcceptor); } - else if (eObject instanceof Statement & !(eObject instanceof EmptyStatement)) + else if (eObject.eContainingFeature().isMany() && eObject.eContainer() != null + && eObject.eContainer().eGet(eObject.eContainingFeature()) instanceof List statementCollection) { - checkNode = node.getNextSibling(); - if (checkNode == null) + if (!statementCollection.isEmpty() + && statementCollection.get(statementCollection.size() - 1) == eObject) { - if (eObject instanceof ReturnStatement) + if (eObject instanceof SimpleStatement) { - resolveAddIssue(node, eObject, resultAceptor); + checkNode = node.getNextSibling(); + if (checkNode == null) + { + if (!nodeText.contains(";") && !nodeText.isEmpty()) //$NON-NLS-1$ + { + resolveAddIssue(node, eObject, resultAcceptor); + } + continue; + } + if (!checkNode.getText().contains(";")) //$NON-NLS-1$ + { + checkNextNode = checkNode.getNextSibling(); + if (checkNextNode == null) + { + resolveAddIssue(node, eObject, resultAcceptor); + continue; + } + if (!checkNextNode.getText().contains(";")) //$NON-NLS-1$ + { + resolveAddIssue(node, eObject, resultAcceptor); + } + } } - continue; - } - if (!checkNode.getText().contains(";")) //$NON-NLS-1$ - { - checkNextNode = checkNode.getNextSibling(); - if (checkNextNode == null) + else if (eObject instanceof IfStatement || eObject instanceof ForStatement) { - resolveAddIssue(node, eObject, resultAceptor); - continue; + checkNode = node.getNextSibling(); + if (checkNode == null) + { + resolveAddIssue(node, eObject, resultAcceptor); + continue; + } + if (!checkNode.getText().contains(";")) //$NON-NLS-1$ + { + checkNextNode = checkNode.getNextSibling(); + if (checkNextNode == null) + { + resolveAddIssue(node, eObject, resultAcceptor); + continue; + } + if (!checkNextNode.getText().contains(";")) //$NON-NLS-1$ + { + resolveAddIssue(node, eObject, resultAcceptor); + } + } + checkSemicolon(eObject.eContents(), resultAcceptor); } - if (!checkNextNode.getText().contains(";")) //$NON-NLS-1$ + else if (eObject instanceof Statement) { - resolveAddIssue(node, eObject, resultAceptor); + checkNode = node.getNextSibling(); + if (checkNode == null) + { + if (eObject instanceof ReturnStatement) + { + resolveAddIssue(node, eObject, resultAcceptor); + } + continue; + } + if (!checkNode.getText().contains(";")) //$NON-NLS-1$ + { + checkNextNode = checkNode.getNextSibling(); + if (checkNextNode == null) + { + resolveAddIssue(node, eObject, resultAcceptor); + continue; + } + if (!checkNextNode.getText().contains(";")) //$NON-NLS-1$ + { + resolveAddIssue(node, eObject, resultAcceptor); + } + } + if (!eObject.eContents().isEmpty()) + { + checkSemicolon(eObject.eContents(), resultAcceptor); + } } } - if (!eObject.eContents().isEmpty()) - { - checkSemicolon(eObject.eContents(), resultAceptor); - } } } } - private void resolveAddIssue(INode node, EObject eObject, ResultAcceptor resultAceptor) + private static void resolveAddIssue(INode node, EObject eObject, ResultAcceptor resultAcceptor) { if (eObject instanceof SimpleStatement || eObject instanceof ReturnStatement) { - resultAceptor.addIssue(Messages.SemicolonMissingCheck_Issue, eObject); + resultAcceptor.addIssue(Messages.SemicolonMissingCheck_Issue, eObject); return; } LinkedList allLeafNodes = new LinkedList<>(); @@ -274,6 +293,6 @@ private void resolveAddIssue(INode node, EObject eObject, ResultAcceptor resultA Issue issue = new BslDirectLocationIssue(Messages.SemicolonMissingCheck_Issue, directLocation); - resultAceptor.addIssue(issue); + resultAcceptor.addIssue(issue); } } diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-return-statement.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-return-statement.bsl new file mode 100644 index 000000000..80b7b384f --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-return-statement.bsl @@ -0,0 +1,11 @@ +#Region Abcd + +Function Aaaa() + + test = 1; + + return test + +EndFunction + +#EndRegion diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-after.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statemen-sub-statement-after.bsl similarity index 56% rename from tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-after.bsl rename to tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statemen-sub-statement-after.bsl index 2ce06997f..a188ee009 100644 --- a/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-after.bsl +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statemen-sub-statement-after.bsl @@ -1,16 +1,13 @@ - #Region Abcd Procedure Aaaa() - - Test = 2 - NoTest = 2; + If True Then -EndProcedure + Test= Test + 1 + + EndIf; -Procedure Bbbb() - NoTest = 2; EndProcedure diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-else-ifelse-statement.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-else-ifelse-statement.bsl new file mode 100644 index 000000000..e3615107e --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-else-ifelse-statement.bsl @@ -0,0 +1,17 @@ +#Region Abcd + +Function Aaaa() + + If True Then + + NoTest = 1; + + Else + + Test = 2 + + EndIf; + +EndFunction + +#EndRegion \ No newline at end of file diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-if-ifelse-statement.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-if-ifelse-statement.bsl new file mode 100644 index 000000000..a5801d985 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-if-ifelse-statement.bsl @@ -0,0 +1,17 @@ +#Region Abcd + +Function Aaaa() + + If True Then + + Test = 1 + + Else + + NoTest = 2; + + EndIf; + +EndFunction + +#EndRegion \ No newline at end of file diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-if-preprocessor.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-if-preprocessor.bsl new file mode 100644 index 000000000..3c679295c --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-if-preprocessor.bsl @@ -0,0 +1,13 @@ +#Region Abcd + +Procedure Aaaa() + +#If Server Then + + Test = Test + 1 + +#EndIf + +EndProcedure + +#EndRegion diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-sub-statement-before.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-sub-statement-before.bsl new file mode 100644 index 000000000..1c53f89fe --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/missing-semicolon-statement-sub-statement-before.bsl @@ -0,0 +1,15 @@ +#Region Abcd + +Procedure Aaaa() + + NoTest = 2; + + If True Then + + Test= Test + 1 + + EndIf; + +EndProcedure + +#EndRegion diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/non-missing-semicolon-statement-next-string.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/non-missing-semicolon-statement-next-string.bsl new file mode 100644 index 000000000..1456a5deb --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/non-missing-semicolon-statement-next-string.bsl @@ -0,0 +1,10 @@ +#Region Abcd + +Function Aaaa() + + test = 1 + ; + +EndFunction + +#EndRegion diff --git a/tests/com.e1c.v8codestyle.bsl.itests/resources/non-missing-semicolon-statement-space.bsl b/tests/com.e1c.v8codestyle.bsl.itests/resources/non-missing-semicolon-statement-space.bsl new file mode 100644 index 000000000..f5d399e53 --- /dev/null +++ b/tests/com.e1c.v8codestyle.bsl.itests/resources/non-missing-semicolon-statement-space.bsl @@ -0,0 +1,9 @@ +#Region Abcd + +Function Aaaa() + + test = 1 ; + +EndFunction + +#EndRegion diff --git a/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/SemicolonMissingCheckTest.java b/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/SemicolonMissingCheckTest.java index c9a856ee2..7a6223d3b 100644 --- a/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/SemicolonMissingCheckTest.java +++ b/tests/com.e1c.v8codestyle.bsl.itests/src/com/e1c/v8codestyle/bsl/check/itests/SemicolonMissingCheckTest.java @@ -54,21 +54,54 @@ public void testStatementMissingSemicolon() throws Exception } /** - * Test statement after another statement. + * Test statement missing semicolon. * * @throws Exception the exception */ @Test - public void testStatementAfter() throws Exception + public void testReturnStatementMissingSemicolon() throws Exception { - updateModule(FOLDER_RESOURCE + "missing-semicolon-statement-after.bsl"); + updateModule(FOLDER_RESOURCE + "missing-semicolon-return-statement.bsl"); List markers = getModuleMarkers(); assertEquals(1, markers.size()); Marker marker = markers.get(0); - assertEquals(Integer.valueOf(6), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + assertEquals(Integer.valueOf(7), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + } + + /** + * Test statement in sub statement after another statement. + * + * @throws Exception the exception + */ + @Test + public void testStatementSubStatementAfter() throws Exception + { + updateModule(FOLDER_RESOURCE + "missing-semicolon-statemen-sub-statement-after.bsl"); + + List markers = getModuleMarkers(); + assertEquals(1, markers.size()); + Marker marker = markers.get(0); + assertEquals(Integer.valueOf(7), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + } + + /** + * Test statement in sub statement before another statement. + * + * @throws Exception the exception + */ + @Test + public void testStatementSubStatementBefore() throws Exception + { + updateModule(FOLDER_RESOURCE + "missing-semicolon-statement-sub-statement-before.bsl"); + + List markers = getModuleMarkers(); + assertEquals(1, markers.size()); + Marker marker = markers.get(0); + assertEquals(Integer.valueOf(9), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); } + /** * Test statement before another statement. * @@ -85,6 +118,22 @@ public void testStatementBefore() throws Exception assertEquals(Integer.valueOf(7), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); } + /** + * Test statement in if preprocessor. + * + * @throws Exception the exception + */ + @Test + public void testStatementInIfPrepocessor() throws Exception + { + updateModule(FOLDER_RESOURCE + "missing-semicolon-statement-if-preprocessor.bsl"); + + List markers = getModuleMarkers(); + assertEquals(1, markers.size()); + Marker marker = markers.get(0); + assertEquals(Integer.valueOf(7), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + } + /** * Test statement sub statement. * @@ -98,8 +147,39 @@ public void testStatementSubStatement() throws Exception List markers = getModuleMarkers(); assertEquals(1, markers.size()); Marker marker = markers.get(0); - assertEquals(Integer.valueOf(6), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + assertEquals(Integer.valueOf(8), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + } + + /** + * Test statement sub statement. + * + * @throws Exception the exception + */ + @Test + public void testStatementInIfStatement() throws Exception + { + updateModule(FOLDER_RESOURCE + "missing-semicolon-statement-if-ifelse-statement.bsl"); + + List markers = getModuleMarkers(); + assertEquals(1, markers.size()); + Marker marker = markers.get(0); + assertEquals(Integer.valueOf(7), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); + } + /** + * Test statement sub statement. + * + * @throws Exception the exception + */ + @Test + public void testStatementInElse() throws Exception + { + updateModule(FOLDER_RESOURCE + "missing-semicolon-statement-else-ifelse-statement.bsl"); + + List markers = getModuleMarkers(); + assertEquals(1, markers.size()); + Marker marker = markers.get(0); + assertEquals(Integer.valueOf(11), marker.getExtraInfo().get(StandardExtraInfo.TEXT_LINE)); } /** @@ -114,6 +194,33 @@ public void testStatementNoMissingSemicolon() throws Exception List markers = getModuleMarkers(); assertTrue(markers.isEmpty()); + } + + /** + * Test statement no missing semicolon. + * + * @throws Exception the exception + */ + @Test + public void testStatemetSemicolonSpace() throws Exception + { + updateModule(FOLDER_RESOURCE + "non-missing-semicolon-statement-space.bsl"); + List markers = getModuleMarkers(); + assertTrue(markers.isEmpty()); + } + + /** + * Test statement no missing semicolon. + * + * @throws Exception the exception + */ + @Test + public void testStatementSemicolonNextString() throws Exception + { + updateModule(FOLDER_RESOURCE + "non-missing-semicolon-statement-next-string.bsl"); + + List markers = getModuleMarkers(); + assertTrue(markers.isEmpty()); } } From 023b24020f240ee23053fcd97ec7355b545076d1 Mon Sep 17 00:00:00 2001 From: IvanSergeev Date: Fri, 21 Nov 2025 11:20:58 +0400 Subject: [PATCH 23/23] =?UTF-8?q?=D0=94=D0=BE=D0=B1=D0=B0=D0=B2=D0=BB?= =?UTF-8?q?=D0=B5=D0=BD=D0=BE=20=D0=BE=D0=BF=D0=B8=D1=81=D0=B0=D0=BD=D0=B8?= =?UTF-8?q?=D0=B5?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../markdown/method-semicolon-extra.md | 19 +++++++++++ .../markdown/ru/method-semicolon-extra.md | 23 +++++++++++++ .../markdown/ru/semicolon-missing.md | 23 +++++++++++++ .../markdown/semicolon-missing.md | 19 +++++++++++ .../bsl/check/SemicolonMissingCheck.java | 34 ++++++++++--------- 5 files changed, 102 insertions(+), 16 deletions(-) create mode 100644 bundles/com.e1c.v8codestyle.bsl/markdown/method-semicolon-extra.md create mode 100644 bundles/com.e1c.v8codestyle.bsl/markdown/ru/method-semicolon-extra.md create mode 100644 bundles/com.e1c.v8codestyle.bsl/markdown/ru/semicolon-missing.md create mode 100644 bundles/com.e1c.v8codestyle.bsl/markdown/semicolon-missing.md diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/method-semicolon-extra.md b/bundles/com.e1c.v8codestyle.bsl/markdown/method-semicolon-extra.md new file mode 100644 index 000000000..0b97fce30 --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/method-semicolon-extra.md @@ -0,0 +1,19 @@ +# Exta semicolon at the end of method declaration + +A semicolon at the end of a method declaration is not an error, but its absence is preferable. + +## Noncompliant Code Example + +Procedure procedureName(Parameters); + + A = 1; + +EndProcedure + +## Compliant Solution + +Procedure procedureName(Parameters) + + A = 1; + +EndProcedure \ No newline at end of file diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/ru/method-semicolon-extra.md b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/method-semicolon-extra.md new file mode 100644 index 000000000..1b0d7b93a --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/method-semicolon-extra.md @@ -0,0 +1,23 @@ +# Лишняя точка с запятой в конце объявления метода + +Точка с запятой в конце объявления метода не является ошибкой но предпочтительно отсутствие. + +## Неправильно + +Например, неправильно: + +Процедура Ааааa(); + + А = 1; + +КонецПроцедуры + +## Правильно + +Например, правельно: + +Процедура Ааааa() + + А = 1; + +КонецПроцедуры \ No newline at end of file diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/ru/semicolon-missing.md b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/semicolon-missing.md new file mode 100644 index 000000000..55a1872f0 --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/ru/semicolon-missing.md @@ -0,0 +1,23 @@ +# Отсутствие точки с запятой в конце оператора + +Точка с запятой в конце последнего оператора блока не являеться обязательной, предпочтительно наличие. + +## Неправильно + +Например, неправильно: + +Процедура Ааааa() + + А = 1 + +КонецПроцедуры + +## Правильно + +Например, правельно: + +Процедура Ааааa() + + А = 1; + +КонецПроцедуры \ No newline at end of file diff --git a/bundles/com.e1c.v8codestyle.bsl/markdown/semicolon-missing.md b/bundles/com.e1c.v8codestyle.bsl/markdown/semicolon-missing.md new file mode 100644 index 000000000..7b56a96a1 --- /dev/null +++ b/bundles/com.e1c.v8codestyle.bsl/markdown/semicolon-missing.md @@ -0,0 +1,19 @@ +# Missing semicolon at the end of statement + +The semicolon at the end of the last statement is not required, but is preferred. + +## Noncompliant Code Example + +Procedure procedureName(Parameters) + + A = 1 + +EndProcedure + +## Compliant Solution + +Procedure procedureName(Parameters) + + A = 1; + +EndProcedure \ No newline at end of file diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java index da2efdf0b..5e41a592d 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/check/SemicolonMissingCheck.java @@ -130,23 +130,19 @@ private void checkSemicolon(List eObjects, ResultAcceptor resultAccepto { return; } - INode node = null; - INode checkNode = null; - INode checkNextNode = null; for (EObject eObject : eObjects) { - node = NodeModelUtils.findActualNodeFor(eObject); - if (node == null) - { - continue; - } - String nodeText = node.getText(); - if (!(eObject instanceof Statement)) { if (eObject instanceof Conditional) { + INode node = NodeModelUtils.findActualNodeFor(eObject); + if (node == null) + { + continue; + } + String nodeText = node.getText(); BidiTreeIterator treeIterator = null; treeIterator = node.getAsTreeIterable().reverse().iterator(); INode lastNode = treeIterator.next(); @@ -191,9 +187,15 @@ else if (eObject.eContainingFeature().isMany() && eObject.eContainer() != null if (!statementCollection.isEmpty() && statementCollection.get(statementCollection.size() - 1) == eObject) { + INode node = NodeModelUtils.findActualNodeFor(eObject); + if (node == null) + { + continue; + } + String nodeText = node.getText(); if (eObject instanceof SimpleStatement) { - checkNode = node.getNextSibling(); + INode checkNode = node.getNextSibling(); if (checkNode == null) { if (!nodeText.contains(";") && !nodeText.isEmpty()) //$NON-NLS-1$ @@ -204,7 +206,7 @@ else if (eObject.eContainingFeature().isMany() && eObject.eContainer() != null } if (!checkNode.getText().contains(";")) //$NON-NLS-1$ { - checkNextNode = checkNode.getNextSibling(); + INode checkNextNode = checkNode.getNextSibling(); if (checkNextNode == null) { resolveAddIssue(node, eObject, resultAcceptor); @@ -218,7 +220,7 @@ else if (eObject.eContainingFeature().isMany() && eObject.eContainer() != null } else if (eObject instanceof IfStatement || eObject instanceof ForStatement) { - checkNode = node.getNextSibling(); + INode checkNode = node.getNextSibling(); if (checkNode == null) { resolveAddIssue(node, eObject, resultAcceptor); @@ -226,7 +228,7 @@ else if (eObject instanceof IfStatement || eObject instanceof ForStatement) } if (!checkNode.getText().contains(";")) //$NON-NLS-1$ { - checkNextNode = checkNode.getNextSibling(); + INode checkNextNode = checkNode.getNextSibling(); if (checkNextNode == null) { resolveAddIssue(node, eObject, resultAcceptor); @@ -241,7 +243,7 @@ else if (eObject instanceof IfStatement || eObject instanceof ForStatement) } else if (eObject instanceof Statement) { - checkNode = node.getNextSibling(); + INode checkNode = node.getNextSibling(); if (checkNode == null) { if (eObject instanceof ReturnStatement) @@ -252,7 +254,7 @@ else if (eObject instanceof Statement) } if (!checkNode.getText().contains(";")) //$NON-NLS-1$ { - checkNextNode = checkNode.getNextSibling(); + INode checkNextNode = checkNode.getNextSibling(); if (checkNextNode == null) { resolveAddIssue(node, eObject, resultAcceptor);