private @Nullable PsiJavaToken parseType(@NotNull PsiJavaToken child) {
      IElementType tokenType = child.getTokenType();
      boolean isPrimitiveType = ElementType.PRIMITIVE_TYPE_BIT_SET.contains(tokenType);
      if (!isPrimitiveType && tokenType != JavaTokenType.IDENTIFIER) return null;
      PsiElement element = nextChild();
      if (!isPrimitiveType) {
        element = parseQualifiedType(element);
      }
      else {
        // in case if we have array type e.g. int @Nullable []
        // now we accept invalid declarations like int @Nullable foo() {} but it's fine since we don't need precise parser 
        element = parseModifiers(element);
      }
      return parseArrayType(tryCast(element, PsiJavaToken.class));
    }
private @Nullable PsiJavaToken parseType(@NotNull PsiJavaToken child)