protected AssemblyResolutionResults applyRecursionPath(Deque<AssemblyConstructorSemantic> path,
			AssemblyParseBranch branch, AssemblyProduction rec, AssemblyResolution child) {
		/*
		 * A constructor may have multiple patterns, so I cannot assume I will get at most one
		 * output at each constructor in the path. Start (1) collecting all the results, then (2)
		 * filter out and report the errors, then (3) feed successful resolutions into the next
		 * constructor in the path (or finish).
		 */
		AssemblyResolutionResults results = factory.newAssemblyResolutionResults();
		results.add(child);
		while (!path.isEmpty()) {
			AssemblyConstructorSemantic sem = path.pollLast();

			int opIdx = sem.getOperandIndex(0);
			Constructor cons = sem.getConstructor();
			OperandSymbol opSym = cons.getOperand(opIdx);
			if (-1 != opSym.getOffsetBase()) {
				throw new AssertionError("TODO");
			}
			int offset = opSym.getRelativeOffset();
			results = parent("Resolving recursive constructor: " + cons.getSourceFile() + ":" +
				cons.getLineno(), results, 1);
			results = results.apply(factory, rp -> rp.shift(offset));
			results =
				resolvePatterns(sem, 0, results).apply(factory, rp -> rp.withConstructor(cons));
		}
		return results;
	}
Apply constructors as indicated by a path returned by the context resolution graph

<p>
<b>NOTE:</b> The given path will be emptied during processing.

@param path the path to apply
@param branch the branch corresponding to the production whose LHS has a purely-recursive
           definition.
@param rec the purely-recursive production
@param child the intermediate result to apply the constructors to
@return the results
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/assembler/sleigh/sem/AbstractAssemblyTreeResolver.java