Skip to content

Commit 0bc1f9d

Browse files
authored
#954 Добавление типизированного значения в не типизированную коллекцию (#1084)
1 parent c852454 commit 0bc1f9d

File tree

13 files changed

+447
-34
lines changed

13 files changed

+447
-34
lines changed

CHANGELOG.md

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,6 +17,7 @@
1717

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

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

2122
#### Запросы
2223

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

85-
8686
#### Запросы
8787

8888
- В качестве правого операнда операции сравнения "ПОДОБНО" указано поле таблицы
Lines changed: 30 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,30 @@
1+
# Добавление типизированного значения в не типизированную коллекцию
2+
3+
Проверяет, что вызов метода ```Добавить()``` происходит для типизированной коллекции.
4+
5+
## Неправильно
6+
7+
Тип элементов коллекции не указан.
8+
9+
```bsl
10+
// @strict-types
11+
12+
Результат = Новый Массив();
13+
14+
Результат.Добавить(42);
15+
```
16+
17+
## Правильно
18+
19+
Необходимо указать тип элементов коллекции.
20+
21+
```bsl
22+
// @strict-types
23+
24+
Результат = Новый Массив(); // Массив из Число
25+
26+
Результат.Добавить(42);
27+
```
28+
29+
## См.
30+
Lines changed: 26 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,26 @@
1+
# Typed value is added to untyped collection
2+
3+
Checks that collection method ```Add()``` is calling for untyped collection
4+
5+
## Noncompliant Code Example
6+
7+
```bsl
8+
// @strict-types
9+
10+
Result = New Array();
11+
12+
Result.Add(42);
13+
```
14+
15+
## Compliant Solution
16+
17+
```bsl
18+
// @strict-types
19+
20+
Result = New Array(); // Array of Number
21+
22+
Result.Add(42);
23+
```
24+
25+
## See
26+

bundles/com.e1c.v8codestyle.bsl/plugin.xml

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -128,6 +128,10 @@
128128
category="com.e1c.v8codestyle.bsl.strict"
129129
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.strict.check.StructureCtorValueTypeCheck">
130130
</check>
131+
<check
132+
category="com.e1c.v8codestyle.bsl.strict"
133+
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.strict.check.TypedValueAddingToUntypedCollectionCheck">
134+
</check>
131135
<check
132136
category="com.e1c.v8codestyle.bsl"
133137
class="com.e1c.v8codestyle.internal.bsl.ExecutableExtensionFactory:com.e1c.v8codestyle.bsl.check.EventHandlerBooleanParamCheck">

bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/strict/check/AbstractTypeCheck.java

Lines changed: 43 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,7 +40,9 @@
4040
import com._1c.g5.v8.dt.bsl.model.DynamicFeatureAccess;
4141
import com._1c.g5.v8.dt.bsl.model.ExplicitVariable;
4242
import com._1c.g5.v8.dt.bsl.model.FeatureAccess;
43+
import com._1c.g5.v8.dt.bsl.model.FeatureEntry;
4344
import com._1c.g5.v8.dt.bsl.model.Invocation;
45+
import com._1c.g5.v8.dt.bsl.model.Method;
4446
import com._1c.g5.v8.dt.bsl.model.SimpleStatement;
4547
import com._1c.g5.v8.dt.bsl.model.StaticFeatureAccess;
4648
import com._1c.g5.v8.dt.bsl.model.Variable;
@@ -265,6 +267,47 @@ protected boolean intersectTypeItem(Collection<TypeItem> expectedTypes, Collecti
265267
}
266268
}
267269

270+
/**
271+
* Returns a method source for given feature access
272+
* @param object {@link FeatureAccess}, cannot be <code>null</code>
273+
* @return the source, can return {@code null}
274+
*/
275+
protected EObject getSourceMethod(FeatureAccess object)
276+
{
277+
Environments actualEnvs = getActualEnvironments(object);
278+
if (actualEnvs.isEmpty())
279+
{
280+
return null;
281+
}
282+
List<FeatureEntry> objects = dynamicFeatureAccessComputer.resolveObject(object, actualEnvs);
283+
for (FeatureEntry entry : objects)
284+
{
285+
EObject source = entry.getFeature();
286+
if (source instanceof Method || (source instanceof com._1c.g5.v8.dt.mcore.Method))
287+
{
288+
return source;
289+
}
290+
}
291+
292+
return null;
293+
}
294+
295+
/**
296+
* Returns an actual environments for given object
297+
* @param object {@link EObject}, cannot be <code>null</code>
298+
* @return the environments, can return {@code Environments.EMPTY} value
299+
*/
300+
protected Environments getActualEnvironments(EObject object)
301+
{
302+
Environmental envs = EcoreUtil2.getContainerOfType(object, Environmental.class);
303+
if (envs == null)
304+
{
305+
return Environments.EMPTY;
306+
}
307+
308+
return bslPreferences.getLoadEnvs(object).intersect(envs.environments());
309+
}
310+
268311
private static Collection<? extends String> getCastingType(Collection<String> expectedTypesNames)
269312
{
270313
List<String> castTypeNames = new ArrayList<>();

bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/strict/check/InvocationParamIntersectionCheck.java

Lines changed: 0 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -47,7 +47,6 @@
4747
import com._1c.g5.v8.dt.bsl.model.EmptyExpression;
4848
import com._1c.g5.v8.dt.bsl.model.Expression;
4949
import com._1c.g5.v8.dt.bsl.model.FeatureAccess;
50-
import com._1c.g5.v8.dt.bsl.model.FeatureEntry;
5150
import com._1c.g5.v8.dt.bsl.model.FormalParam;
5251
import com._1c.g5.v8.dt.bsl.model.Invocation;
5352
import com._1c.g5.v8.dt.bsl.model.Method;
@@ -59,7 +58,6 @@
5958
import com._1c.g5.v8.dt.core.platform.IV8Project;
6059
import com._1c.g5.v8.dt.core.platform.IV8ProjectManager;
6160
import com._1c.g5.v8.dt.mcore.DuallyNamedElement;
62-
import com._1c.g5.v8.dt.mcore.Environmental;
6361
import com._1c.g5.v8.dt.mcore.McorePackage;
6462
import com._1c.g5.v8.dt.mcore.NamedElement;
6563
import com._1c.g5.v8.dt.mcore.ParamSet;
@@ -497,37 +495,6 @@ private void markInvalidSourceTypeNoIntercection(Expression param, int index, Na
497495
resultAceptor.addIssue(message, param, BslPackage.Literals.EXPRESSION__TYPES);
498496
}
499497

500-
private EObject getSourceMethod(FeatureAccess object)
501-
{
502-
Environments actualEnvs = getActualEnvironments(object);
503-
if (actualEnvs.isEmpty())
504-
{
505-
return null;
506-
}
507-
List<FeatureEntry> objects = dynamicFeatureAccessComputer.resolveObject(object, actualEnvs);
508-
for (FeatureEntry entry : objects)
509-
{
510-
EObject source = entry.getFeature();
511-
if (source instanceof Method || (source instanceof com._1c.g5.v8.dt.mcore.Method))
512-
{
513-
return source;
514-
}
515-
}
516-
517-
return null;
518-
}
519-
520-
private Environments getActualEnvironments(EObject object)
521-
{
522-
Environmental envs = EcoreUtil2.getContainerOfType(object, Environmental.class);
523-
if (envs == null)
524-
{
525-
return Environments.EMPTY;
526-
}
527-
528-
return bslPreferences.getLoadEnvs(object).intersect(envs.environments());
529-
}
530-
531498
private List<ParamSet> actualParamSet(com._1c.g5.v8.dt.mcore.Method method, int numParam)
532499
{
533500
List<ParamSet> result = new ArrayList<>();

bundles/com.e1c.v8codestyle.bsl/src/com/e1c/v8codestyle/bsl/strict/check/Messages.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -58,6 +58,8 @@ final class Messages
5858
public static String StructureCtorValueTypeCheck_Structure_key__N__K__has_no_default_value_initializer;
5959
public static String StructureCtorValueTypeCheck_Structure_key__N__K__value_initialized_with_empty_types;
6060
public static String StructureCtorValueTypeCheck_title;
61+
public static String TypedValueAddingToUntypedCollectionCheck_description;
62+
public static String TypedValueAddingToUntypedCollectionCheck_title;
6163
public static String VariableTypeCheck_description;
6264
public static String VariableTypeCheck_title;
6365
public static String VariableTypeCheck_Variable_M_has_no_value_type;

0 commit comments

Comments
 (0)