// correctly formats attribute strings as they're written in code public static String ToComprehensiveString(this ICustomAttributeProvider cap) { var sj = (cap.Attrs<Attribute>(true) ?? new Attribute[0]).Select(a => a.GetType().Name.EndsWith("Attribute") ? a.GetType().Name.Substring(0, a.GetType().Name.Length - "Attribute".Length) : a.GetType().Name).StringJoin(); if (sj.Length > 0) sj = "[" + sj + "]"; return sj; }
internal static List<string> GetEnumShortcuts(this FieldInfo enumField) { if (enumField.DeclaringType.IsEnum == false) throw new ArgumentException("The given field '" + enumField.Name + "' is not an enum field."); var shortcutAttrs = enumField.Attrs<ArgShortcut>(); var noShortcutPolicy = shortcutAttrs.Where(s => s.Shortcut == null).SingleOrDefault(); var shortcutVals = shortcutAttrs.Where(s => s.Shortcut != null).Select(s => s.Shortcut).ToList(); if (noShortcutPolicy != null && shortcutVals.Count > 0) throw new InvalidArgDefinitionException("You can't have an ArgShortcut attribute with a null shortcut and then define a second ArgShortcut attribute with a non-null value."); return shortcutVals; }
public static String GetCSharpDecl(this Type t, ToCSharpOptions opt) { if (t == typeof(byte)) return "byte"; if (t == typeof(sbyte)) return "sbyte"; if (t == typeof(short)) return "short"; if (t == typeof(ushort)) return "ushort"; if (t == typeof(int)) return "int"; if (t == typeof(uint)) return "uint"; if (t == typeof(long)) return "long"; if (t == typeof(ulong)) return "ulong"; if (t == typeof(float)) return "float"; if (t == typeof(double)) return "double"; if (t == typeof(decimal)) return "decimal"; if (t == typeof(bool)) return "bool"; if (t == typeof(char)) return "char"; if (t == typeof(void)) return "void"; if (t.IsNullable()) { return t.UndecorateNullable().GetCSharpRef(opt) + "?"; } else { opt = opt ?? ToCSharpOptions.Terse; var buffer = new StringBuilder(); if (opt.EmitAttributes && t.Attrs().IsNotEmpty()) buffer.Append(t.GetCSharpAttributesClause(opt)).Append(" "); if (opt.EmitStaticQualifier && t.IsStatic()) buffer.Append("static "); buffer.Append(t.GetCSharpTypeNameQualifier(opt)); if (t.DeclaringType != null && !t.IsGenericParameter) { var dt = t.DeclaringType; buffer.Append(dt.Name.Slice(0, dt.Name.IndexOf("`") == -1 ? dt.Name.Length : dt.Name.IndexOf("`"))); if (opt.EmitTypeArgsCount && dt.XGetGenericArguments().IsNotEmpty()) buffer.Append("`").Append(dt.XGetGenericArguments().Count()); if (opt.EmitTypeArgs && dt.XGetGenericArguments().IsNotEmpty()) buffer.Append(dt.GetCSharpTypeArgsClause(opt)); buffer.Append("."); } buffer.Append(t.Name.Slice(0, t.Name.IndexOf("`") == -1 ? t.Name.Length : t.Name.IndexOf("`"))); if (opt.EmitTypeArgsCount && t.XGetGenericArguments().IsNotEmpty()) buffer.Append("`").Append(t.XGetGenericArguments().Count()); if (opt.EmitTypeArgs && t.XGetGenericArguments().IsNotEmpty()) buffer.Append(t.GetCSharpTypeArgsClause(opt)); if (opt.EmitSemicolon) buffer.Append(";"); return buffer.ToString(); } }
public static bool IsValid(this MethodInfo mi, params RelinqScriptType[] argTypes) { var methodValid = mi.Attrs<SignatureValidWhenAttribute>() .Select(retAttr => retAttr.ValidateSignature( new SignatureInspectionOptions(mi, argTypes){InspectingMethod = true})); var retvalValid = mi.ReturnTypeCustomAttributes.Attrs<SignatureValidWhenAttribute>() .Select(retAttr => retAttr.ValidateSignature( new SignatureInspectionOptions(mi, argTypes){InspectingRetVal = true})); var tparamsValid = mi.XGetGenericDefinition().GetGenericArguments().Select((garg, i) => garg.Attrs<SignatureValidWhenAttribute>().Select(retAttr => retAttr.ValidateSignature( new SignatureInspectionOptions(mi, argTypes){InspectingTypeParam = i}))).Flatten(); var fparamsValid = mi.GetParameters().Select((fparam, i) => fparam.Attrs<SignatureValidWhenAttribute>().Select(retAttr => retAttr.ValidateSignature( new SignatureInspectionOptions(mi, argTypes){InspectingParamOrArg = i}))).Flatten(); return methodValid.Concat(retvalValid).Concat(tparamsValid).Concat(fparamsValid).All(b => b); }
public static String GetCSharpAttributesClause(this ICustomAttributeProvider cap, ToCSharpOptions opt) { if (cap.Attrs().Count() == 0) { return String.Empty; } else { var buffer = new StringBuilder(); buffer.Append("["); var prefix = String.Empty; if (cap is ParameterInfo) { /*IsRetVal ain't work */ var mb = ((ParameterInfo)cap).Member; if (mb is MethodInfo && ((MethodInfo)(mb)).ReturnParameter == cap) { prefix = "return: "; } } // todo. implement this using CustomAttributeData // that will preserve info about ctor and setters var attrs = cap.GetCustomAttributes(false); attrs.ForEach((attr, i) => { buffer.Append(prefix); buffer.Append(attr.GetType().GetCSharpRef(opt)); if (i != attrs.Count() - 1) buffer.Append(", "); }); buffer.Append("]"); return buffer.ToString(); } }
public static IListSource<ILNode> GetTrailingTrivia(this ILNode node) { if (node is LNode) { VList<LNode> list = GetTrailingTrivia((LNode)node); if (list.IsEmpty) return EmptyList<ILNode>.Value; // avoid boxing in the common case return list.UpCast<LNode, ILNode>(); } else { VList<ILNode> list = VList<ILNode>.Empty; foreach (ILNode a in node.Attrs()) { if (a.Calls(S.TriviaTrailing)) list.AddRange(a.Args()); } if (list.IsEmpty) return EmptyList<ILNode>.Value; // avoid boxing in the common case return list; } }
public static ILNode AttrNamed(this ILNode node, Symbol name) { return node.Attrs().NodeNamed(name); }
public static bool IsParenthesizedExpr(this ILNode node) { return node.Attrs().NodeNamed(CodeSymbols.TriviaInParens) != null; }
public static String GetCSharpDecl(this PropertyInfo p, ToCSharpOptions opt) { opt = opt ?? ToCSharpOptions.Terse; var buffer = new StringBuilder(); if (opt.EmitAttributes && p.Attrs().IsNotEmpty()) buffer.Append(p.GetCSharpAttributesClause(opt)).Append(" "); if (opt.EmitVisibilityQualifier) buffer.Append(p.GetCSharpVisibilityQualifier()).Append(" "); if (opt.EmitStaticQualifier && p.IsStatic()) buffer.Append("static "); buffer.Append(p.PropertyType.GetCSharpRef(opt)).Append(" "); if (opt.EmitDeclaringType) buffer.Append(p.DeclaringType.GetCSharpRef(ToCSharpOptions.Terse) + "::"); buffer.Append(p.Name); buffer.Append(" { "); if (p.CanRead) { var getter = p.GetGetMethod(true); if (opt.EmitVisibilityQualifier) buffer.Append(getter.GetCSharpVisibilityQualifier()).Append(" "); buffer.Append("get; "); } if (p.CanWrite) { var setter = p.GetSetMethod(true); if (opt.EmitVisibilityQualifier) buffer.Append(setter.GetCSharpVisibilityQualifier()).Append(" "); buffer.Append("set; "); } buffer.Append("}"); return buffer.ToString(); }
public static String GetCSharpDecl(this MethodBase m, ToCSharpOptions opt) { opt = opt ?? ToCSharpOptions.Terse; var buffer = new StringBuilder(); if (opt.EmitAttributes && m.Attrs().IsNotEmpty()) buffer.Append(m.GetCSharpAttributesClause(opt)).Append(" "); if (opt.EmitAttributes && m is MethodInfo && (((MethodInfo)m).ReturnParameter).Attrs().IsNotEmpty()) buffer.Append(((MethodInfo)m).ReturnParameter.GetCSharpAttributesClause(opt)).Append(" "); if (opt.EmitVisibilityQualifier) buffer.Append(m.GetCSharpVisibilityQualifier()).Append(" "); if (opt.EmitStaticQualifier && m.IsStatic) buffer.Append("static "); if (!(m is ConstructorInfo)) buffer.Append(m.Ret().GetCSharpRef(opt)).Append(" "); if (opt.EmitDeclaringType) buffer.Append(m.DeclaringType.GetCSharpRef(ToCSharpOptions.Terse) + "::"); if (!(m is ConstructorInfo)) buffer.Append(m.Name.Slice(0, m.Name.IndexOf("`") == -1 ? m.Name.Length : m.Name.IndexOf("`"))); else if (opt.EmitCtorNameAsClassName) buffer.Append(m.DeclaringType.Name.Slice(0, m.DeclaringType.Name.IndexOf("`") == -1 ? m.DeclaringType.Name.Length : m.DeclaringType.Name.IndexOf("`"))); else buffer.Append(m.Name.Slice(0, m.Name.IndexOf("`") == -1 ? m.Name.Length : m.Name.IndexOf("`"))); if (opt.EmitTypeArgs) buffer.Append(m.GetCSharpTypeArgsClause(opt)); buffer.Append("("); m.GetParameters().ForEach((pi, i) => { if (opt.EmitAttributes && pi.Attrs().IsNotEmpty()) buffer.Append(pi.GetCSharpAttributesClause(opt)).Append(" "); var mod = ""; if (pi.ParameterType.IsByRef && pi.IsOut) mod = "out"; if (pi.ParameterType.IsByRef && !pi.IsOut) mod = "ref"; if (mod.IsNotEmpty()) buffer.Append(mod).Append(" "); var t_par = pi.ParameterType.IsByRef ? pi.ParameterType.GetElementType() : pi.ParameterType; buffer.Append(t_par.GetCSharpRef(opt)).Append(" "); buffer.Append(pi.Name); if (i != m.GetParameters().Count() - 1) buffer.Append(", "); }); buffer.Append(")"); if (opt.EmitTypeArgsConstraints) buffer.Append(m.GetCSharpTypeConstraintsClause(opt)); if (opt.EmitSemicolon) buffer.Append(";"); return buffer.ToString(); }
public static String GetCSharpDecl(this FieldInfo f, ToCSharpOptions opt) { opt = opt ?? ToCSharpOptions.Terse; var buffer = new StringBuilder(); if (opt.EmitAttributes && f.Attrs().IsNotEmpty()) buffer.Append(f.GetCSharpAttributesClause(opt)).Append(" "); if (opt.EmitVisibilityQualifier) buffer.Append(f.GetCSharpVisibilityQualifier()).Append(" "); if (opt.EmitStaticQualifier && f.IsStatic) buffer.Append("static "); buffer.Append(f.FieldType.GetCSharpRef(opt)).Append(" "); if (opt.EmitDeclaringType) buffer.Append(f.DeclaringType.GetCSharpRef(ToCSharpOptions.Terse) + "::"); buffer.Append(f.Name); if (opt.EmitSemicolon) buffer.Append(";"); return buffer.ToString(); }