protected DetectedPropertyInfo analyzeForNodeElementType(Node node, String propertyName) {
   if (isPmCommentNestedProperty(propertyName) || isPmCommentMethodCall(propertyName)) {
     return null;
   }
   final DfLanguageGrammar grammar = getLanguageGrammar();
   DetectedPropertyInfo detected = null;
   for (int i = 0; i < node.getChildSize(); i++) {
     final Node childNode = node.getChild(i);
     if (childNode instanceof BindVariableNode) {
       final BindVariableNode bindNode = (BindVariableNode) childNode;
       final String expression = bindNode.getExpression();
       if (!isPmCommentEqualsCurrent(expression)) {
         continue;
       }
       if (isPmCommentNestedProperty(expression) || isPmCommentMethodCall(expression)) {
         continue;
       }
       // /*#current*/ here
       final String testValue = bindNode.getTestValue();
       if (testValue == null) {
         continue;
       }
       final String propertyType = derivePropertyTypeFromTestValue(testValue);
       final String propertyOption = derivePropertyOptionFromTestValue(testValue);
       if (Srl.is_NotNull_and_NotTrimmedEmpty(propertyType)) {
         detected = new DetectedPropertyInfo();
         final String generic = grammar.buildGenericOneClassHint(propertyType);
         detected.setPropertyType("List" + generic);
         detected.setPropertyOption(propertyOption);
       }
     } else if (childNode instanceof ForNode) {
       final ForNode nestedNode = (ForNode) childNode;
       final String expression = nestedNode.getExpression();
       if (!isPmCommentStartsWithCurrent(expression)) {
         continue;
       }
       // /*FOR #current.xxx*/ here
       final String nestedForPropName = substringPmCommentCurrentRear(expression);
       detected = analyzeForNodeElementType(nestedNode, nestedForPropName); // recursive call
       if (detected != null) {
         final String generic = grammar.buildGenericOneClassHint(detected.getPropertyType());
         detected.setPropertyType("List" + generic);
       }
     } else if (childNode instanceof ScopeNode) { // IF, Begin, First, ...
       detected = analyzeForNodeElementType(childNode, propertyName); // recursive call
     }
     if (detected != null) {
       break;
     }
   }
   if (detected == null) {
     return null;
   }
   return detected;
 }
 // -----------------------------------------------------
 //                                           For Comment
 //                                           -----------
 protected void doProcessAutoDetectForNode(
     String sql,
     Map<String, String> propertyNameTypeMap,
     Map<String, String> propertyNameOptionMap,
     ForNode forNode) {
   final String expression = forNode.getExpression();
   if (!isPmCommentStartsWithPmb(expression)) {
     return;
   }
   final String propertyName = substringPmCommentPmbRear(expression);
   if (propertyNameTypeMap.containsKey(propertyName)) {
     // because of priority low (bind variable is given priority over for-comment)
     return;
   }
   if (isRevervedProperty(propertyName)) {
     return;
   }
   final DetectedPropertyInfo detected = analyzeForNodeElementType(forNode, propertyName);
   if (detected != null) {
     final String propertyType = switchPlainTypeName(detected.getPropertyType());
     propertyNameTypeMap.put(propertyName, propertyType);
     final String propertyOption = detected.getPropertyOption();
     if (Srl.is_NotNull_and_NotTrimmedEmpty(propertyOption)) {
       propertyNameOptionMap.put(propertyName, propertyOption);
     }
   }
 }