docs: @SneakyThrows
      public void parseCompilationUnit(final Set<ConfigurationMetadataProperty> collectedProps,
                                       final Set<ConfigurationMetadataProperty> collectedGroups,
                                       final ConfigurationMetadataProperty p,
                                       final String typePath,
                                       final String typeName,
                                       final boolean indexNameWithBrackets) {
  
          try (val is = Files.newInputStream(Paths.get(typePath))) {
              val cu = StaticJavaParser.parse(is);
              new ConfigurationMetadataFieldVisitor(collectedProps, collectedGroups, indexNameWithBrackets, typeName, sourcePath).visit(cu, p);
              if (!cu.getTypes().isEmpty()) {
                  val decl = ClassOrInterfaceDeclaration.class.cast(cu.getType(0));
                  for (var i = 0; i < decl.getExtendedTypes().size(); i++) {
                      val parentType = decl.getExtendedTypes().get(i);
                      val instance = ConfigurationMetadataClassSourceLocator.getInstance();
                      val parentClazz = instance.locatePropertiesClassForType(parentType);
                      val parentTypePath = ConfigurationMetadataClassSourceLocator.buildTypeSourcePath(this.sourcePath, parentClazz.getName());
  
                      parseCompilationUnit(collectedProps, collectedGroups, p,
                          parentTypePath, parentClazz.getName(), indexNameWithBrackets);
                  }
              }
          }
      }