@Override
	protected IsfObject getIsfObject(DataType dt, TaskMonitor monitor)
			throws IOException, CancelledException {
		if (dt == null) {
			throw new IOException("Null datatype passed to getIsfObject");
		}
		if (dt instanceof FactoryDataType) {
			Msg.error(this, "Factory root types may not be written - type: " + dt);
		}
		if (dt instanceof BitFieldDataType) {
			Msg.error(this, "BitField data types may not be written - type: " + dt);
		}
		if (dt instanceof Pointer || dt instanceof Array) {
			IsfObject type = getObjectDataType(IsfUtilities.getBaseDataType(dt));
			IsfObject obj = new ExtIsfTypedObject(dt, type);
			return obj;
		}

		dt = dt.clone(dtm); // force resize/repack for target root organization

		IsfObject res = resolve(dt);
		if (res != null) {
			return res;
		}

		if (dt instanceof Dynamic dynamic) {
			DataType rep = dynamic.getReplacementBaseType();
			return rep == null ? null : getIsfObject(rep, monitor);
		}
		else if (dt instanceof BuiltInDataType builtin) {
			return new IsfBuiltIn(builtin);
		}
		else if (dt instanceof TypeDef typedef) {
			return getObjectTypeDef(typedef, monitor);
		}
		else if (dt instanceof Composite composite) {
			return new ExtIsfComposite(composite, this, monitor);
		}
		else if (dt instanceof Enum enumm) {
			return new IsfEnum(enumm);
		}
		else if (dt instanceof FunctionDefinition funcDef) {  
			return new ExtIsfFunction(funcDef);
		}
		else {
			Msg.warn(this, "Unable to write datatype. Type unrecognized: " + dt.getClass());
		}

		return null;
	}
Writes the root type as ISF JSON using the underlying writer. For now, ignoring top-level
bit-fields and function defs as unsupported by ISF. Typedefs really deserve their own
category, but again unsupported.

@param dt the root type to write as ISF JSON
@param monitor the task monitor
@throws IOException if there is an exception writing the output
Ghidra/Features/Sarif/src/main/java/sarif/export/data/ExtIsfDataTypeWriter.java