示例#1
0
        /// <summary>
        /// Creates a method signature from a method's name,
        /// the number of generic parameters the method
        /// takes, its return type and its parameter types.
        /// </summary>
        /// <param name="name">
        /// The name of the method signature.
        /// </param>
        /// <param name="genericParameterCount">
        /// The number of generic parameters in the method
        /// signature.
        /// </param>
        /// <param name="returnType">
        /// The return type of the method signature.
        /// </param>
        /// <param name="parameterTypes">
        /// The types of the method signature's parameters.
        /// </param>
        /// <returns>A method signature.</returns>
        public static ClrMethodSignature Create(
            UnqualifiedName name,
            int genericParameterCount,
            IType returnType,
            IReadOnlyList <IType> parameterTypes)
        {
            var result = new ClrMethodSignature();

            result.Name = name;
            result.GenericParameterCount = genericParameterCount;

            // Replace generic parameters with standins.
            var visitor = new GenericParameterToStandinVisitor();

            result.ReturnType     = visitor.Visit(returnType);
            result.ParameterTypes = visitor
                                    .VisitAll(parameterTypes)
                                    .ToImmutableArray();
            return(result);
        }
示例#2
0
 /// <summary>
 /// Encodes an unqualified name as a simple name.
 /// </summary>
 /// <param name="name">
 /// An unqualified name to encode. Simple names are encoded
 /// as such. Other names are encoded as simple names by taking
 /// their string representation.
 /// </param>
 /// <returns>An encoded node.</returns>
 public LNode Encode(UnqualifiedName name)
 {
     if (name is SimpleName)
     {
         var simple         = (SimpleName)name;
         var simpleNameNode = Factory.Id(simple.Name);
         if (simple.TypeParameterCount == 0)
         {
             return(simpleNameNode);
         }
         else
         {
             return(Factory.Call(
                        simpleNameNode,
                        Factory.Literal(simple.TypeParameterCount)));
         }
     }
     else
     {
         return(Factory.Id(name.ToString()));
     }
 }
示例#3
0
 /// <summary>
 /// Creates a type from a name and a parent type.
 /// </summary>
 /// <param name="name">The type's unqualified name.</param>
 /// <param name="parentType">
 /// The type's parent type, i.e., the type that defines it.
 /// </param>
 public DescribedType(UnqualifiedName name, IType parentType)
     : base(name.Qualify(parentType.FullName))
 {
     this.Parent = new TypeParent(parentType);
     Initialize();
 }
示例#4
0
 public override int GetHashCode() => UnqualifiedName.GetHashCode();
示例#5
0
 /// <summary>
 /// Finds all nested types defined by a particular type that have
 /// a specific unqualified name.
 /// </summary>
 /// <param name="parentType">The type that defines the nested types.</param>
 /// <param name="name">The unqualified name to look for.</param>
 /// <returns>
 /// A list of types that are defined by <paramref name="parentType"/>
 /// and have name <paramref name="name"/>.
 /// </returns>
 public IReadOnlyList <IType> ResolveNestedTypes(IType parentType, UnqualifiedName name)
 {
     return(resolver.ResolveNestedTypes(parentType, name));
 }
示例#6
0
 /// <summary>
 /// Finds all generic parameters defined by a particular member that have
 /// a specific unqualified name.
 /// </summary>
 /// <param name="parentMember">
 /// The generic member that defines the generic parameters.
 /// </param>
 /// <param name="name">The unqualified name to look for.</param>
 /// <returns>
 /// A list of generic parameters that are defined by <paramref name="parentMember"/>
 /// and have name <paramref name="name"/>.
 /// </returns>
 public IReadOnlyList <IType> ResolveGenericParameters(
     IGenericMember parentMember,
     UnqualifiedName name)
 {
     return(resolver.ResolveGenericParameters(parentMember, name));
 }
示例#7
0
 private static IReadOnlyList <IType> ResolvePrecise(
     TypeResolverNamespace ns,
     UnqualifiedName name)
 {
     return(ns.ResolveTypes(name));
 }
示例#8
0
 /// <summary>
 /// Finds all nested types defined by a particular type that have
 /// a specific unqualified name.
 /// </summary>
 /// <param name="parentType">The type that defines the nested types.</param>
 /// <param name="name">The unqualified name to look for.</param>
 /// <returns>
 /// A list of types that are defined by <paramref name="parentType"/>
 /// and have name <paramref name="name"/>.
 /// </returns>
 public IReadOnlyList <IType> ResolveNestedTypes(IType parentType, UnqualifiedName name)
 {
     return(ResolveNestedTypesImpl <UnqualifiedName>(parentType, name, ResolvePrecise));
 }
示例#9
0
        Name ParseUnqualifiedName(ref int p)
        {
            var t  = Symbol.Text;
            var ch = t[p];

            var op = OperatorName.TryGet(t, ref p);

            if (op != null)
            {
                return(op);
            }

            if (ch == 'C' || ch == 'D')
            {
                var k     = t.Substring(p, 2);
                var ident = k;
                switch (k)
                {
                case "C1":
                    ident = "ctor";
                    break;

                case "C2":
                    ident = "ctor_base";
                    break;

                case "C3":
                    ident = "ctor_alloc";
                    break;

                case "D0":
                    ident = "dtor_free";
                    break;

                case "D1":
                    ident = "dtor";
                    break;

                case "D2":
                    ident = "dtor_base";
                    break;
                }
                var n = new CtorName {
                    Kind = k, Ident = ident
                };
                p += 2;
                return(n);
            }

            Name prefix = null;

            if (ch == 'S' && p + 1 < t.Length && t[p + 1] == 't')
            {
                p     += 2;
                prefix = Name.Std;
            }

            var e = p;

            while (char.IsDigit(t[e]) && e + 1 < t.Length)
            {
                e++;
            }
            if (e == p)
            {
                SyntaxError("Bad Source Name", p);
                return(null);
            }
            var length = int.Parse(t.Substring(p, e - p));
            var text   = t.Substring(e, length);

            p = e + length;

            var un = new UnqualifiedName {
                Text = text
            };

            if (prefix == null)
            {
                return(un);
            }

            return(new NestedName {
                Names = { prefix, un }
            });
        }
示例#10
0
 /// <inheritdoc/>
 public override bool Equals(UnqualifiedName Other)
 {
     return(Other is PreMangledName && ((PreMangledName)Other).MangledName.Equals(MangledName));
 }
示例#11
0
 /// <summary>
 /// Creates a pre-mangled name from the given names.
 /// </summary>
 /// <param name="MangledName">The mangled name.</param>
 /// <param name="UnmangledName">The unmangled name.</param>
 public PreMangledName(string MangledName, UnqualifiedName UnmangledName)
 {
     this.MangledName   = MangledName;
     this.UnmangledName = UnmangledName;
 }