Skip to content

Commit

Permalink
#954 Добавление типизированного значения в не типизированную коллекцию (
Browse files Browse the repository at this point in the history
  • Loading branch information
muhtimur committed Sep 16, 2022
1 parent c852454 commit 0bc1f9d
Show file tree
Hide file tree
Showing 13 changed files with 447 additions and 34 deletions.
2 changes: 1 addition & 1 deletion CHANGELOG.md
Original file line number Diff line number Diff line change
Expand Up @@ -17,6 +17,7 @@

#### Код модулей

- Добавление типизированного значения в не типизированную коллекцию

#### Запросы

Expand Down Expand Up @@ -82,7 +83,6 @@
- Структура модуля. Область объявления переменных.
- Из проверка doc-comment-parameter-section выделена проверка doc-comment-redundant-parameter-section


#### Запросы

- В качестве правого операнда операции сравнения "ПОДОБНО" указано поле таблицы
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,30 @@
# Добавление типизированного значения в не типизированную коллекцию

Проверяет, что вызов метода ```Добавить()``` происходит для типизированной коллекции.

## Неправильно

Тип элементов коллекции не указан.

```bsl
// @strict-types
Результат = Новый Массив();
Результат.Добавить(42);
```

## Правильно

Необходимо указать тип элементов коллекции.

```bsl
// @strict-types
Результат = Новый Массив(); // Массив из Число
Результат.Добавить(42);
```

## См.

Original file line number Diff line number Diff line change
@@ -0,0 +1,26 @@
# Typed value is added to untyped collection

Checks that collection method ```Add()``` is calling for untyped collection

## Noncompliant Code Example

```bsl
// @strict-types
Result = New Array();
Result.Add(42);
```

## Compliant Solution

```bsl
// @strict-types
Result = New Array(); // Array of Number
Result.Add(42);
```

## See

4 changes: 4 additions & 0 deletions bundles/com.e1c.v8codestyle.bsl/plugin.xml
Original file line number Diff line number Diff line change
Expand Up @@ -128,6 +128,10 @@
category="com.e1c.v8codestyle.bsl.strict"
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.strict.check.StructureCtorValueTypeCheck">
</check>
<check
category="com.e1c.v8codestyle.bsl.strict"
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.strict.check.TypedValueAddingToUntypedCollectionCheck">
</check>
<check
category="com.e1c.v8codestyle.bsl"
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.EventHandlerBooleanParamCheck">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -40,7 +40,9 @@
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.FeatureEntry;
import com._1c.g5.v8.dt.bsl.model.Invocation;
import com._1c.g5.v8.dt.bsl.model.Method;
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;
Expand Down Expand Up @@ -265,6 +267,47 @@ protected boolean intersectTypeItem(Collection<TypeItem> expectedTypes, Collecti
}
}

/**
* Returns a method source for given feature access
* @param object {@link FeatureAccess}, cannot be <code>null</code>
* @return the source, can return {@code null}
*/
protected EObject getSourceMethod(FeatureAccess object)
{
Environments actualEnvs = getActualEnvironments(object);
if (actualEnvs.isEmpty())
{
return null;
}
List<FeatureEntry> objects = dynamicFeatureAccessComputer.resolveObject(object, actualEnvs);
for (FeatureEntry entry : objects)
{
EObject source = entry.getFeature();
if (source instanceof Method || (source instanceof com._1c.g5.v8.dt.mcore.Method))
{
return source;
}
}

return null;
}

/**
* Returns an actual environments for given object
* @param object {@link EObject}, cannot be <code>null</code>
* @return the environments, can return {@code Environments.EMPTY} value
*/
protected Environments getActualEnvironments(EObject object)
{
Environmental envs = EcoreUtil2.getContainerOfType(object, Environmental.class);
if (envs == null)
{
return Environments.EMPTY;
}

return bslPreferences.getLoadEnvs(object).intersect(envs.environments());
}

private static Collection<? extends String> getCastingType(Collection<String> expectedTypesNames)
{
List<String> castTypeNames = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -47,7 +47,6 @@
import com._1c.g5.v8.dt.bsl.model.EmptyExpression;
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.FormalParam;
import com._1c.g5.v8.dt.bsl.model.Invocation;
import com._1c.g5.v8.dt.bsl.model.Method;
Expand All @@ -59,7 +58,6 @@
import com._1c.g5.v8.dt.core.platform.IV8Project;
import com._1c.g5.v8.dt.core.platform.IV8ProjectManager;
import com._1c.g5.v8.dt.mcore.DuallyNamedElement;
import com._1c.g5.v8.dt.mcore.Environmental;
import com._1c.g5.v8.dt.mcore.McorePackage;
import com._1c.g5.v8.dt.mcore.NamedElement;
import com._1c.g5.v8.dt.mcore.ParamSet;
Expand Down Expand Up @@ -497,37 +495,6 @@ private void markInvalidSourceTypeNoIntercection(Expression param, int index, Na
resultAceptor.addIssue(message, param, BslPackage.Literals.EXPRESSION__TYPES);
}

private EObject getSourceMethod(FeatureAccess object)
{
Environments actualEnvs = getActualEnvironments(object);
if (actualEnvs.isEmpty())
{
return null;
}
List<FeatureEntry> objects = dynamicFeatureAccessComputer.resolveObject(object, actualEnvs);
for (FeatureEntry entry : objects)
{
EObject source = entry.getFeature();
if (source instanceof Method || (source instanceof com._1c.g5.v8.dt.mcore.Method))
{
return source;
}
}

return null;
}

private Environments getActualEnvironments(EObject object)
{
Environmental envs = EcoreUtil2.getContainerOfType(object, Environmental.class);
if (envs == null)
{
return Environments.EMPTY;
}

return bslPreferences.getLoadEnvs(object).intersect(envs.environments());
}

private List<ParamSet> actualParamSet(com._1c.g5.v8.dt.mcore.Method method, int numParam)
{
List<ParamSet> result = new ArrayList<>();
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -58,6 +58,8 @@ final class Messages
public static String StructureCtorValueTypeCheck_Structure_key__N__K__has_no_default_value_initializer;
public static String StructureCtorValueTypeCheck_Structure_key__N__K__value_initialized_with_empty_types;
public static String StructureCtorValueTypeCheck_title;
public static String TypedValueAddingToUntypedCollectionCheck_description;
public static String TypedValueAddingToUntypedCollectionCheck_title;
public static String VariableTypeCheck_description;
public static String VariableTypeCheck_title;
public static String VariableTypeCheck_Variable_M_has_no_value_type;
Expand Down
Loading

0 comments on commit 0bc1f9d

Please sign in to comment.