diff --git a/CHANGELOG.md b/CHANGELOG.md index cd729047..60974f5d 100644 --- a/CHANGELOG.md +++ b/CHANGELOG.md @@ -60,6 +60,7 @@ - Клиентский глобальный модуль: ошибочное предупреждение о некорректном типе - Отключено создание модуля менеджера при создании перечисления - Для проверки md-standard-attribute-synonym-empty исправлена регистрация и улучшена точность позиции ошибки +- Исправлен расчета типов возвращаемых значений функций с вызовом сервера ## 0.1.0 diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/strict/check/AbstractTypeCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/strict/check/AbstractTypeCheck.java index 59f20b4b..480c8ff9 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/strict/check/AbstractTypeCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/strict/check/AbstractTypeCheck.java @@ -14,10 +14,10 @@ package com.e1c.v8codestyle.bsl.strict.check; import java.util.ArrayList; import java.util.Collection; -import java.util.HashSet; import java.util.Iterator; import java.util.List; import java.util.Set; +import java.util.TreeSet; import java.util.stream.Collectors; import org.eclipse.core.resources.IProject; @@ -35,6 +35,7 @@ import com._1c.g5.v8.dt.bsl.documentation.comment.BslMultiLineCommentDocumentati import com._1c.g5.v8.dt.bsl.model.DynamicFeatureAccess; import com._1c.g5.v8.dt.bsl.model.ExplicitVariable; import com._1c.g5.v8.dt.bsl.model.FeatureAccess; +import com._1c.g5.v8.dt.bsl.model.Invocation; import com._1c.g5.v8.dt.bsl.model.SimpleStatement; import com._1c.g5.v8.dt.bsl.resource.DynamicFeatureAccessComputer; import com._1c.g5.v8.dt.bsl.resource.TypesComputer; @@ -50,7 +51,6 @@ import com._1c.g5.v8.dt.mcore.util.McoreUtil; import com._1c.g5.v8.dt.platform.IEObjectDynamicTypeNames; import com._1c.g5.v8.dt.platform.IEObjectTypeNames; import com.e1c.g5.v8.dt.check.components.BasicCheck; -import com.google.common.collect.Sets; /** * Abstract check of types in module objects. Allows to compute types respecting system enums, @@ -124,6 +124,12 @@ public abstract class AbstractTypeCheck { return true; } + if (object instanceof Invocation && !actualEnvs.containsAny(Environments.SERVER) + && ((Invocation)object).isIsServerCall()) + { + actualEnvs = actualEnvs.add(Environments.SERVER); + } + List types = computeTypes(object, actualEnvs); if (types.isEmpty() && object instanceof ExplicitVariable) @@ -209,7 +215,6 @@ public abstract class AbstractTypeCheck parentTypes.addAll(expectedTypes); Collection expectedTypesNames = getTypeNames(parentTypes, context); expectedTypesNames.addAll(getCastingType(expectedTypesNames)); - expectedTypesNames = Sets.newLinkedHashSet(expectedTypesNames); if (expectedTypesNames.contains(IEObjectTypeNames.ARBITRARY) || expectedTypesNames.contains(IEObjectTypeNames.UNDEFINED) || expectedTypesNames.contains(IEObjectTypeNames.REFERENCE_TO_OBJECT_OF_INFORMATION_BASE) @@ -269,7 +274,7 @@ public abstract class AbstractTypeCheck private static Collection getTypeNames(List parentTypes, EObject context) { - Set typeNames = new HashSet<>(); + Set typeNames = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); for (TypeItem type : parentTypes) { String typeName = McoreUtil.getTypeName(type); diff --git a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/strict/check/SimpleStatementTypeCheck.java b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/strict/check/SimpleStatementTypeCheck.java index 93953f34..8bdd02f4 100644 --- a/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/strict/check/SimpleStatementTypeCheck.java +++ b/bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/strict/check/SimpleStatementTypeCheck.java @@ -30,6 +30,7 @@ import com._1c.g5.v8.dt.bsl.model.Expression; import com._1c.g5.v8.dt.bsl.model.FeatureAccess; import com._1c.g5.v8.dt.bsl.model.FeatureEntry; import com._1c.g5.v8.dt.bsl.model.ImplicitVariable; +import com._1c.g5.v8.dt.bsl.model.Invocation; import com._1c.g5.v8.dt.bsl.model.SimpleStatement; import com._1c.g5.v8.dt.bsl.model.StaticFeatureAccess; import com._1c.g5.v8.dt.bsl.model.Variable; @@ -144,6 +145,11 @@ public class SimpleStatementTypeCheck boolean canResetToUndefined = allowImplicitVarResetToUndefined && isImplicitVariableSource(left, actualEnvs); Expression right = statment.getRight(); + if (right instanceof Invocation && !actualEnvs.containsAny(Environments.SERVER) + && ((Invocation)right).isIsServerCall()) + { + actualEnvs = actualEnvs.add(Environments.SERVER); + } List newTypes = computeTypes(right, actualEnvs); if (monitor.isCanceled()) {