private void generateComponentProperties(final LwComponent lwComponent,
                                             final InstrumentationClassFinder.PseudoClass componentClass,
                                             final GeneratorAdapter generator,
                                             final int componentLocal) throws CodeGenerationException {
      // introspected properties
      final LwIntrospectedProperty[] introspectedProperties = lwComponent.getAssignedIntrospectedProperties();
      for (final LwIntrospectedProperty property : introspectedProperties) {
        if (property instanceof LwIntroComponentProperty) {
          continue;
        }
        final String propertyClass = property.getCodeGenPropertyClassName();
        if (myIgnoreCustomCreation) {
          try {
            final String descriptor;
            // convert wrapper classes to primitive
            if (propertyClass.equals(Integer.class.getName())) {
              descriptor = "(I)V";
            }
            else if (propertyClass.equals(Boolean.class.getName())) {
              descriptor = "(Z)V";
            }
            else if (propertyClass.equals(Double.class.getName())) {
              descriptor = "(D)V";
            }
            else if (propertyClass.equals(Float.class.getName())) {
              descriptor = "(F)V";
            }
            else if (propertyClass.equals(Long.class.getName())) {
              descriptor = "(L)V";
            }
            else if (propertyClass.equals(Byte.class.getName())) {
              descriptor = "(B)V";
            }
            else if (propertyClass.equals(Short.class.getName())) {
              descriptor = "(S)V";
            }
            else if (propertyClass.equals(Character.class.getName())) {
              descriptor = "(C)V";
            }
            else {
              descriptor = "(L" + Class.forName(propertyClass).getName().replace('.', '/') + ";)V";
            }
            final InstrumentationClassFinder.PseudoMethod setter = componentClass.findMethodInHierarchy(property.getWriteMethodName(),
                                                                                                        descriptor);
            if (setter == null) {
              continue;
            }
          }
          catch (Exception e) {
            continue;
          }
        }
        final PropertyCodeGenerator propGen = myPropertyCodeGenerators.get(propertyClass);

        try {
          if (propGen != null &&
              propGen.generateCustomSetValue(lwComponent, componentClass, property, generator, this, componentLocal, myClassName)) {
            continue;
          }
        }
        catch (IOException | ClassNotFoundException e) {
          throw new CodeGenerationException(lwComponent.getId(), e.getMessage(), e);
        }

        generator.loadLocal(componentLocal);

        Object value = lwComponent.getPropertyValue(property);
        Type setterArgType;
        if (propertyClass.equals(Integer.class.getName())) {
          generator.push(((Integer)value).intValue());
          setterArgType = Type.INT_TYPE;
        }
        else if (propertyClass.equals(Boolean.class.getName())) {
          generator.push(((Boolean)value).booleanValue());
          setterArgType = Type.BOOLEAN_TYPE;
        }
        else if (propertyClass.equals(Double.class.getName())) {
          generator.push(((Double)value).doubleValue());
          setterArgType = Type.DOUBLE_TYPE;
        }
        else if (propertyClass.equals(Float.class.getName())) {
          generator.push(((Float)value).floatValue());
          setterArgType = Type.FLOAT_TYPE;
        }
        else if (propertyClass.equals(Long.class.getName())) {
          generator.push(((Long)value).longValue());
          setterArgType = Type.LONG_TYPE;
        }
        else if (propertyClass.equals(Short.class.getName())) {
          generator.push(((Short)value).intValue());
          setterArgType = Type.SHORT_TYPE;
        }
        else if (propertyClass.equals(Byte.class.getName())) {
          generator.push(((Byte)value).intValue());
          setterArgType = Type.BYTE_TYPE;
        }
        else if (propertyClass.equals(Character.class.getName())) {
          generator.push(((Character)value).charValue());
          setterArgType = Type.CHAR_TYPE;
        }
        else {
          if (propGen == null) {
            continue;
          }
          propGen.generatePushValue(generator, value);
          setterArgType = typeFromClassName(property.getPropertyClassName());
        }

        Type declaringType = (property.getDeclaringClassName() != null)
                             ? typeFromClassName(property.getDeclaringClassName())
                             : Type.getType(componentClass.getDescriptor());
        generator.invokeVirtual(declaringType, new Method(property.getWriteMethodName(),
                                                          Type.VOID_TYPE, new Type[]{setterArgType}));
      }

      generateClientProperties(lwComponent, componentClass, generator, componentLocal);
    }
private void generateComponentProperties(final LwComponent lwComponent,
                                             final InstrumentationClassFinder.PseudoClass componentClass,
                                             final GeneratorAdapter generator,
                                             final int componentLocal)