@Override
 public TypeUsageNode getFieldType(String fieldName, boolean staticContext) {
   for (Property property : getAllProperties(symbolResolver())) {
     if (property.getName().equals(fieldName)) {
       return property.getTypeUsage();
     }
   }
   throw new IllegalArgumentException(fieldName);
 }
 public List<Property> getDirectProperties(SymbolResolver resolver) {
   List<Property> properties = new ArrayList<>();
   for (Node member : members) {
     if (member instanceof PropertyDefinition) {
       properties.add(Property.fromDefinition((PropertyDefinition) member));
     } else if (member instanceof PropertyReference) {
       properties.add(Property.fromReference((PropertyReference) member, resolver));
     }
   }
   return properties;
 }
  @Override
  public Optional<Symbol> findSymbol(String name, SymbolResolver resolver) {
    // TODO support references to methods
    for (Property property : this.getAllProperties(resolver)) {
      if (property.getName().equals(name)) {
        return Optional.of(property);
      }
    }

    return super.findSymbol(name, resolver);
  }
 private void initializeMethodsByName(SymbolResolver resolver) {
   methodsByName = new HashMap<>();
   // TODO methods inherited by Object
   // TODO if we implement inheritance also other methods inherited from classes or interfaces
   for (Property property : getDirectProperties(resolver)) {
     {
       String descriptor = "()" + property.getTypeUsage().jvmType().getDescriptor();
       JvmMethodDefinition jvmMethodDefinition =
           new JvmMethodDefinition(
               getInternalName(), property.getterName(resolver), descriptor, false, false);
       InternalMethodDefinition getter =
           new InternalMethodDefinition(
               property.getterName(resolver),
               Collections.emptyList(),
               property.getTypeUsage(),
               jvmMethodDefinition);
       registerMethod(getter);
     }
     {
       String descriptor = "(" + property.getTypeUsage().jvmType().getDescriptor() + ")V";
       JvmMethodDefinition jvmMethodDefinition =
           new JvmMethodDefinition(
               getInternalName(), property.setterName(), descriptor, false, false);
       FormalParameterNode param =
           new FormalParameterNode(property.getTypeUsage().copy(), property.getName());
       param.setParent(this);
       InternalMethodDefinition setter =
           new InternalMethodDefinition(
               property.setterName(),
               ImmutableList.of(param),
               new VoidTypeUsageNode(),
               jvmMethodDefinition);
       registerMethod(setter);
     }
   }
 }