Ejemplo n.º 1
0
 // 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;
 }
Ejemplo n.º 2
0
        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();
            }
        }
Ejemplo n.º 4
0
        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();
            }
        }
Ejemplo n.º 6
0
		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;
			}
		}
Ejemplo n.º 7
0
		public static ILNode AttrNamed(this ILNode node, Symbol name)
		{
			return node.Attrs().NodeNamed(name);
		}
Ejemplo n.º 8
0
		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();
        }
Ejemplo n.º 10
0
        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();
        }
Ejemplo n.º 11
0
        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();
        }