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 3cbbd78a..8edf7905 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 @@ -12,9 +12,10 @@ *******************************************************************************/ package com.e1c.v8codestyle.bsl.strict.check; +import java.util.ArrayDeque; import java.util.ArrayList; import java.util.Collection; -import java.util.Iterator; +import java.util.Deque; import java.util.List; import java.util.Set; import java.util.TreeSet; @@ -238,9 +239,7 @@ public abstract class AbstractTypeCheck { return true; } - Collection parentTypes = getParentTypes(expectedTypes); - parentTypes.addAll(expectedTypes); - Collection expectedTypesNames = getTypeNames(parentTypes, context); + Collection expectedTypesNames = getTypeNames(expectedTypes, context); expectedTypesNames.addAll(getCastingType(expectedTypesNames)); if (expectedTypesNames.contains(IEObjectTypeNames.ARBITRARY) || expectedTypesNames.contains(IEObjectTypeNames.UNDEFINED) @@ -254,9 +253,8 @@ public abstract class AbstractTypeCheck { return false; } - parentTypes = getParentTypes(realTypes); - parentTypes.addAll(realTypes); - Collection realTypesNames = getTypeNames(parentTypes, context); + Collection withParentTypes = getParentTypes(realTypes, context); + Collection realTypesNames = getTypeNames(withParentTypes, context); if (!expectedTypesNames.isEmpty() && !realTypesNames.isEmpty()) { @@ -282,18 +280,22 @@ public abstract class AbstractTypeCheck return castTypeNames; } - private static Collection getParentTypes(Collection theFirstCollectionTypes) + private static Collection getParentTypes(Collection theFirstCollectionTypes, EObject context) { - List types = new ArrayList<>(theFirstCollectionTypes); + Deque types = new ArrayDeque<>(theFirstCollectionTypes); List parentTypes = new ArrayList<>(); - Iterator iterator = types.iterator(); - while (iterator.hasNext()) + while (!types.isEmpty()) { - TypeItem type = iterator.next(); - while (type instanceof Type && ((Type)type).getParentType() != null) + TypeItem type = types.pollFirst(); + type = (TypeItem)EcoreUtil.resolve(type, context); + parentTypes.add(type); + if (type instanceof TypeSet) { - parentTypes.add(((Type)type).getParentType()); - type = ((Type)type).getParentType(); + ((TypeSet)type).getTypes().forEach(types::add); + } + if (type instanceof Type && ((Type)type).getParentType() != null) + { + types.add(((Type)type).getParentType()); } } return parentTypes; @@ -304,28 +306,15 @@ public abstract class AbstractTypeCheck Set typeNames = new TreeSet<>(String.CASE_INSENSITIVE_ORDER); for (TypeItem type : parentTypes) { + type = (TypeItem)EcoreUtil.resolve(type, context); String typeName = McoreUtil.getTypeName(type); - String[] parts = typeName.split("\\."); //$NON-NLS-1$ - if (parts.length == 2) - { - typeNames.add(parts[0]); - if (type.eIsProxy() && (IEObjectTypeNames.DEFINED_TYPE.equals(parts[0]) - || IEObjectTypeNames.CHARACTERISTIC.equals(parts[0]))) - { - type = (TypeItem)EcoreUtil.resolve(type, context); - } - } typeNames.add(typeName); if (type instanceof TypeSet) { - if (parts.length == 2) - { - typeNames.addAll(((TypeSet)type).getTypes() - .stream() - .map(typeItem -> McoreUtil.getTypeName(typeItem)) - .collect(Collectors.toList())); - } - else if (IEObjectTypeNames.ANY_REF.equals(typeName)) + typeNames.addAll( + ((TypeSet)type).getTypes().stream().map(McoreUtil::getTypeName).collect(Collectors.toList())); + + if (IEObjectTypeNames.ANY_REF.equals(typeName)) { typeNames.addAll(ALL_REF_TYPE_SET_PARENT_TYPE_NAMES); }