private void tryToParseTypeInfoComment(TaskMonitor monitor, Function func,
			String typeInfoComment) {
		try {
			FunctionDefinitionDataType funcDef = CParserUtils
					.parseSignature((DataTypeManagerService) null, program, typeInfoComment, false);
			if (funcDef == null) {
				log.appendMsg("Unable to parse function definition: " + typeInfoComment);
				return;
			}

			ApplyFunctionSignatureCmd afsCmd = new ApplyFunctionSignatureCmd(func.getEntryPoint(),
				funcDef, SourceType.IMPORTED, false, false, DataTypeConflictHandler.DEFAULT_HANDLER,
				FunctionRenameOption.RENAME_IF_DEFAULT);
			if (!afsCmd.applyTo(program, monitor)) {
				// TODO: continue trying to add local vars after failing to update the function signature?
				log.appendMsg("Failed to update function " + funcDesc(func) + " with signature \"" +
					typeInfoComment + "\"");
			}
		}
		// catch all errors so that import will continue
		catch (Throwable pe) {
			log.appendMsg("Unable to parse function definition: " + typeInfoComment);
		}
	}
Parses a list of {@link Function function} definitions from xml and creates then, adding them to the current
{@link Program program}.
<p>
Information from a TYPEINFO_COMMENT is used in preference to information from RETURN_TYPE and STACK_FRAME/STACK_VARs that
are tagged as parameters.
<p>
DTD for the FUNCTION element:
<pre><code>
&lt;!ELEMENT FUNCTION (RETURN_TYPE?, ADDRESS_RANGE*, REGULAR_CMT?, REPEATABLE_CMT?, TYPEINFO_CMT?, STACK_FRAME?, REGISTER_VAR*)&gt;
</code></pre>

@param parser the parser
@param overwriteConflicts true to overwrite any conflicts
@param ignoreStackFrames true to ignore stack frames
@param monitor the task monitor
@throws AddressFormatException if any address is not parsable 
@throws CancelledException if the operation is cancelled through the monitor
Ghidra/Features/Base/src/main/java/ghidra/app/util/xml/FunctionsXmlMgr.java