Skip to content

toString() writes * instead of boolean value #58

@kshchepanovskyi

Description

@kshchepanovskyi

Sample:

message X {
    optional bool y = 1 [default = false];
}

X#toString prints y as "*".

Problem in org.stringtemplate.v4.misc.MapModelAdaptor used by code generator.

public class MapModelAdaptor implements ModelAdaptor {
	@Override
	public Object getProperty(Interpreter interp, ST self, Object o, Object property, String propertyName)
		throws STNoSuchPropertyException
	{
		Object value;
		Map<?, ?> map = (Map<?, ?>)o;
		if ( property==null ) value = map.get(STGroup.DEFAULT_KEY);
		else if ( property.equals("keys") ) value = map.keySet();
		else if ( property.equals("values") ) value = map.values();
		else if ( map.containsKey(property) ) value = map.get(property);
		else if ( map.containsKey(propertyName) ) { // if can't find the key, try toString version
			value = map.get(propertyName);
		}
		else value = map.get(STGroup.DEFAULT_KEY); // not found, use default
		if ( value == STGroup.DICT_KEY ) {
			value = property;
		}
		return value;
	}
}

When it does property lookup in a map, it also checks "default" (STGroup.DEFAULT_KEY) key. Unfortunately it is also used in protobuf as an option key.

As a result, all fields with "default" value will be masked as "*".

Metadata

Metadata

Assignees

No one assigned

    Labels

    No labels
    No labels

    Type

    No type
    No fields configured for issues without a type.

    Projects

    No projects

    Milestone

    No milestone

    Relationships

    None yet

    Development

    No branches or pull requests

    Issue actions