Program: 80715
Project: 80715
Buggy source:
private void processMethod(ExecutableElement methodElt){
  String methodName=methodElt.getSimpleName().toString();
  if (methodName.length() > 3) {
    String prefix=methodName.substring(0,3);
    String name=Helper.normalizePropertyName(methodName.substring(3));
    List<? extends VariableElement> parameters=methodElt.getParameters();
switch (prefix) {
case "String_Node_Str":
case "String_Node_Str":
{
        if (parameters.size() != 1) {
          return;
        }
        VariableElement parameterElt=parameters.get(0);
        TypeInfo type=typeFactory.create(parameterElt.asType());
        boolean array;
        boolean adder;
        if ("String_Node_Str".equals(prefix)) {
          if (name.endsWith("String_Node_Str")) {
            throw new GenException(methodElt,"String_Node_Str");
          }
 else {
            name+="String_Node_Str";
          }
          array=true;
          adder=true;
        }
 else {
          adder=false;
          if (type.getKind() == ClassKind.LIST) {
            type=((TypeInfo.Parameterized)type).getArgs().get(0);
            array=true;
          }
 else {
            array=false;
          }
        }
switch (type.getKind()) {
case PRIMITIVE:
case BOXED_PRIMITIVE:
case STRING:
case DATA_OBJECT:
case API:
case JSON_OBJECT:
          break;
default :
        return;
    }
    Function<Boolean,Stream<ExecutableElement>> overridenMethods=(annotated) -> {
      LinkedList<TypeMirror> superTypes=new LinkedList<>(modelElt.getInterfaces());
      if (modelElt.getSuperclass() != null) {
        superTypes.addFirst(modelElt.getSuperclass());
      }
      return superTypes.stream().flatMap(Helper.instanceOf(DeclaredType.class)).map(DeclaredType::asElement).filter(superTypeElt -> !annotated || superTypeElt.getAnnotation(DataObject.class) != null).flatMap(Helper.cast(TypeElement.class)).flatMap(superTypeElt -> elementUtils.getAllMembers(superTypeElt).stream()).flatMap(Helper.instanceOf(ExecutableElement.class)).filter(executableElt -> executableElt.getKind() == ElementKind.METHOD && elementUtils.overrides(methodElt,executableElt,modelElt));
    }
;
    boolean declared;
    Element ownerElt=methodElt.getEnclosingElement();
    if (ownerElt.equals(modelElt)) {
      declared=overridenMethods.apply(true).count() == 0;
    }
 else {
      declared=ownerElt.getAnnotation(DataObject.class) == null;
    }
    Doc doc=docFactory.createDoc(methodElt);
    if (doc == null) {
      Optional<Doc> first=overridenMethods.apply(false).map(docFactory::createDoc).filter(d -> d != null).findFirst();
      doc=first.orElse(null);
    }
    PropertyInfo property=new PropertyInfo(declared,name,doc,type,methodName,array,adder);
    propertyMap.put(property.name,property);
  }
}
}
}

Fixed version (ground truth):
private void processMethod(ExecutableElement methodElt){
  String methodName=methodElt.getSimpleName().toString();
  if (methodName.length() > 3) {
    String prefix=methodName.substring(0,3);
    String name=Helper.normalizePropertyName(methodName.substring(3));
    List<? extends VariableElement> parameters=methodElt.getParameters();
switch (prefix) {
case "String_Node_Str":
case "String_Node_Str":
{
        if (parameters.size() != 1) {
          return;
        }
        VariableElement parameterElt=parameters.get(0);
        TypeInfo type=typeFactory.create(parameterElt.asType());
        boolean array;
        boolean adder;
        if ("String_Node_Str".equals(prefix)) {
          if (name.endsWith("String_Node_Str")) {
            throw new GenException(methodElt,"String_Node_Str");
          }
 else {
            name+="String_Node_Str";
          }
          array=true;
          adder=true;
        }
 else {
          adder=false;
          if (type.getKind() == ClassKind.LIST) {
            type=((TypeInfo.Parameterized)type).getArgs().get(0);
            array=true;
          }
 else {
            array=false;
          }
        }
switch (type.getKind()) {
case PRIMITIVE:
case BOXED_PRIMITIVE:
case STRING:
case DATA_OBJECT:
case API:
case JSON_OBJECT:
          break;
default :
        return;
    }
    Function<Boolean,Stream<ExecutableElement>> overridenMethods=(annotated) -> {
      Set<DeclaredType> ancestorTypes=Helper.resolveAncestorTypes(modelElt);
      return ancestorTypes.stream().map(DeclaredType::asElement).filter(superTypeElt -> !annotated || superTypeElt.getAnnotation(DataObject.class) != null).flatMap(Helper.cast(TypeElement.class)).flatMap(superTypeElt -> elementUtils.getAllMembers(superTypeElt).stream()).flatMap(Helper.instanceOf(ExecutableElement.class)).filter(executableElt -> executableElt.getKind() == ElementKind.METHOD && elementUtils.overrides(methodElt,executableElt,modelElt));
    }
;
    boolean declared;
    Element ownerElt=methodElt.getEnclosingElement();
    if (ownerElt.equals(modelElt)) {
      declared=overridenMethods.apply(true).count() == 0;
    }
 else {
      declared=ownerElt.getAnnotation(DataObject.class) == null;
    }
    Doc doc=docFactory.createDoc(methodElt);
    if (doc == null) {
      Optional<Doc> first=overridenMethods.apply(false).map(docFactory::createDoc).filter(d -> d != null).findFirst();
      doc=first.orElse(null);
    }
    PropertyInfo property=new PropertyInfo(declared,name,doc,type,methodName,array,adder);
    propertyMap.put(property.name,property);
  }
}
}
}