@Override
	public int getOpType(int opIndex, InstructionContext context) {
		if (opIndex < 0 || opIndex >= opresolve.length) {
			return OperandType.DYNAMIC;
		}

		SleighParserContext protoContext;
		try {
			protoContext = (SleighParserContext) context.getParserContext();
		}
		catch (MemoryAccessException e) {
			return OperandType.DYNAMIC;
		}
		ConstructState opState = mnemonicState.getSubState(opresolve[opIndex]);
		FixedHandle hand = protoContext.getFixedHandle(opState);
		if (hand.isInvalid()) {
			return OperandType.DYNAMIC;
		}
		int indirect = isIndirect(opresolve[opIndex]) ? OperandType.INDIRECT : 0;
		if (hand.offset_space == null) { // Static handle
			int type = hand.space.getType();
			if (type == AddressSpace.TYPE_REGISTER) {
				return OperandType.REGISTER | indirect;
			}
			if (type == AddressSpace.TYPE_CONSTANT) {
				return OperandType.SCALAR | indirect;
			}
			OperandSymbol sym = mnemonicState.getConstructor().getOperand(opresolve[opIndex]);
			if (sym.isCodeAddress()) {
				return (OperandType.ADDRESS | OperandType.CODE | indirect);
			}
			if (type == AddressSpace.TYPE_RAM) {
				return (OperandType.ADDRESS | OperandType.DATA | indirect);
			}
		}
		return OperandType.DYNAMIC | indirect;
	}
Walk the Constructor tree gathering ConstructStates which are flow destinations
(flowStateList) flowFlags and delayslot directives
Ghidra/Framework/SoftwareModeling/src/main/java/ghidra/app/plugin/processors/sleigh/SleighInstructionPrototype.java