private String[] getPreceedingComponentAutoComment(Data data) {

		// NOTE: A zero-length composite has a length of 1 which may cause it to improperly consume
		// the address location which actually corresponds to a trailing zero-length 
		// component.

		int levelsToIgnore = 0;
		String label = null;
		Address prevDataAddr = data.getMinAddress().previous();
		if (prevDataAddr == null) {
			return null;
		}

		int[] cpath = data.getComponentPath();
		if (cpath != null && cpath.length > 0) {
			// check previous sibling data within composite
			if (cpath[cpath.length - 1] <= 0) {
				return null; // case not handled
			}
			data = data.getParent().getComponent(cpath[cpath.length - 1] - 1);
			if (data == null || !data.isStructure()) {
				return null;
			}
			levelsToIgnore = cpath.length - 1;
		}
		else {
			Program p = data.getProgram();
			data = p.getListing().getDefinedDataContaining(prevDataAddr);
			if (data == null || !(data.isStructure() || data.isDynamic())) {  // FIXME!! refer to DynamicDataType which has components - Union?
				return null;
			}
			Symbol s = p.getSymbolTable().getPrimarySymbol(data.getAddress());
			label = s != null ? s.getName(true) : data.getDataType().getName();
		}

		DataTypeComponent lastDtc = null;
		while (true) {
			DataType dt = data.getDataType();

			if (dt instanceof Structure) {
				Structure struct = (Structure) dt;
				List<DataTypeComponent> components =
					struct.getComponentsContaining(struct.getLength());
				lastDtc = components.isEmpty() ? null : components.get(components.size() - 1);
			}
			else if (dt instanceof DynamicDataType) {
				DynamicDataType ddt = (DynamicDataType) dt;
				lastDtc = ddt.getComponentAt(data.getLength(), data);
				int lastDtcOrdinal = ddt.getNumComponents(data) - 1;
				if (lastDtc != null && lastDtc.getOrdinal() < lastDtcOrdinal) {
					lastDtc = ddt.getComponent(lastDtcOrdinal, data);
				}
			}

			if (lastDtc == null || lastDtc.getLength() == 0) {
				break;
			}

			Data component = data.getComponent(lastDtc.getOrdinal());
			if (component == null) {
				return null;
			}
			data = component;
		}

		if (lastDtc == null || lastDtc.isBitFieldComponent()) {
			return null;
		}

		return buildZeroLengthComponentAutoComment(lastDtc, data, levelsToIgnore, label);
	}
A composite which immediately precedes the current address may contain trailing zero-length 
components which implicitly refer to this address and are not rendered by the opened composite.
This comment is intended to convey the existence of such hidden components which correspond
to addr.
<br>
NOTE: Implementation only provides comment for one trailing zero-length component.  This could
be improved to return a comment for all applicable trailing zero-length components. 
@param data data location whose pre-comment is currently be generated
@return auto-comment or null
Ghidra/Features/Base/src/main/java/ghidra/app/util/viewer/field/PreCommentFieldFactory.java