internal static bool CheckAttributeUsage(this AttributeKind kind, FunctionAttributeIndex index, Value value) { FunctionIndexKinds allowedindices = kind.GetAllowedIndexes(); switch (index) { case FunctionAttributeIndex.Function: if (!allowedindices.HasFlag(FunctionIndexKinds.Function)) { return(false); } break; case FunctionAttributeIndex.ReturnType: if (!allowedindices.HasFlag(FunctionIndexKinds.Return)) { return(false); } break; // case FunctionAttributeIndex.Parameter0: default: { if (value == default) { throw new ArgumentNullException(nameof(value)); } if (!allowedindices.HasFlag(FunctionIndexKinds.Parameter)) { return(false); } IrFunction?function = value switch { IrFunction f => f, CallInstruction call => call.TargetFunction, Argument arg => arg.ContainingFunction, _ => default, }; int paramIndex = index - FunctionAttributeIndex.Parameter0; if (paramIndex >= (function?.Parameters.Count ?? 0)) { return(false); } }
internal BasicBlockCollection(IrFunction function) { ContainingFunction = function; }
internal FunctionParameterList(IrFunction owningFunction) { OwningFunction = owningFunction; }