@Nullable
    private PyType resolveQualifierType(@NotNull List<Token<PyElementType>> tokens,
                                        @NotNull PyFile file,
                                        @NotNull TypeEvalContext context,
                                        @NotNull Map<TextRange, PyType> types,
                                        @NotNull Map<PyType, TextRange> fullRanges,
                                        @NotNull Map<PyType, PyImportElement> imports) {
      if (tokens.isEmpty()) {
        return null;
      }
      final Token<PyElementType> firstToken = tokens.get(0);
      final String firstText = firstToken.getText().toString();
      final TextRange firstRange = firstToken.getRange();
      final List<RatedResolveResult> resolveResults = file.multiResolveName(firstText);
      if (resolveResults.isEmpty()) {
        return getImplicitlyResolvedType(tokens, context, types, fullRanges, firstRange);
      }
      final List<PyType> members = new ArrayList<>();
      for (RatedResolveResult result : resolveResults) {
        final PsiElement resolved = result.getElement();
        PyType type = null;
        if (resolved instanceof PyTypedElement) {
          type = context.getType((PyTypedElement)resolved);
        }
        if (type != null) {
          if (!allowResolveToType(type)) {
            continue;
          }
          if (type instanceof PyClassLikeType) {
            type = ((PyClassLikeType)type).toInstance();
          }
          types.put(firstRange, type);
          fullRanges.put(type, firstRange);
          for (PyFromImportStatement fromImportStatement : file.getFromImports()) {
            for (PyImportElement importElement : fromImportStatement.getImportElements()) {
              if (firstText.equals(importElement.getVisibleName())) {
                imports.put(type, importElement);
              }
            }
          }
          for (PyImportElement importElement : file.getImportTargets()) {
            if (firstText.equals(importElement.getVisibleName())) {
              imports.put(type, importElement);
            }
          }
        }
        members.add(type);
      }
      if (!members.isEmpty()) {
        tokens.remove(0);
      }
      return PyUnionType.union(members);
    }
@Nullable
    private PyType resolveQualifierType(@NotNull List<Token<PyElementType>> tokens,
                                        @NotNull PyFile file,
                                        @NotNull TypeEvalContext context,
                                        @NotNull Map<TextRange, PyType> types,
                                        @NotNull Map<PyType, TextRange> fullRanges,
                                        @NotNull Map<PyType, PyImportElement> imports)