docs: private SingularData getSingularData(EclipseNode node, ASTNode source) {
  		for (EclipseNode child : node.down()) {
  			if (!annotationTypeMatches(Singular.class, child)) continue;
  			
  			char[] pluralName = node.getKind() == Kind.FIELD ? removePrefixFromField(node) : ((AbstractVariableDeclaration) node.get()).name;
  			AnnotationValues<Singular> ann = createAnnotation(Singular.class, child);
  			String explicitSingular = ann.getInstance().value();
  			if (explicitSingular.isEmpty()) {
  				if (Boolean.FALSE.equals(node.getAst().readConfiguration(ConfigurationKeys.SINGULAR_AUTO))) {
  					node.addError("The singular must be specified explicitly (e.g. @Singular(\"task\")) because auto singularization is disabled.");
  					explicitSingular = new String(pluralName);
  				} else {
  					explicitSingular = autoSingularize(new String(pluralName));
  					if (explicitSingular == null) {
  						node.addError("Can't singularize this name; please specify the singular explicitly (i.e. @Singular(\"sheep\"))");
  						explicitSingular = new String(pluralName);
  					}
  				}
  			}
  			char[] singularName = explicitSingular.toCharArray();
  			
  			TypeReference type = ((AbstractVariableDeclaration) node.get()).type;
  			TypeReference[] typeArgs = null;
  			String typeName;
  			if (type instanceof ParameterizedSingleTypeReference) {
  				typeArgs = ((ParameterizedSingleTypeReference) type).typeArguments;
  				typeName = new String(((ParameterizedSingleTypeReference) type).token);
  			} else if (type instanceof ParameterizedQualifiedTypeReference) {
  				TypeReference[][] tr = ((ParameterizedQualifiedTypeReference) type).typeArguments;
  				if (tr != null) typeArgs = tr[tr.length - 1];
  				char[][] tokens = ((ParameterizedQualifiedTypeReference) type).tokens;
  				StringBuilder sb = new StringBuilder();
  				for (int i = 0; i < tokens.length; i++) {
  					if (i > 0) sb.append(".");
  					sb.append(tokens[i]);
  				}
  				typeName = sb.toString();
  			} else {
  				typeName = type.toString();
  			}
  			
  			String targetFqn = EclipseSingularsRecipes.get().toQualified(typeName);
  			EclipseSingularizer singularizer = EclipseSingularsRecipes.get().getSingularizer(targetFqn);
  			if (singularizer == null) {
  				node.addError("Lombok does not know how to create the singular-form builder methods for type '" + typeName + "'; they won't be generated.");
  				return null;
  			}
  			
  			return new SingularData(child, singularName, pluralName, typeArgs == null ? Collections.<TypeReference>emptyList() : Arrays.asList(typeArgs), targetFqn, singularizer, source);
  		}
  		
  		return null;
  	}