示例#1
0
 public override void WriteId(EscapingTextWriter trapFile)
 {
     trapFile.WriteSubId(DeclaringType);
     trapFile.Write('.');
     trapFile.Write(Name);
     trapFile.Write(";cil-field");
 }
示例#2
0
 public override void WriteId(EscapingTextWriter trapFile)
 {
     trapFile.WriteSubId(method);
     trapFile.Write('_');
     trapFile.Write(index);
     trapFile.Write(";cil-local");
 }
示例#3
0
 public override void WriteId(EscapingTextWriter trapFile)
 {
     trapFile.Write(FullName);
     trapFile.Write("#file:///");
     trapFile.Write(Context.AssemblyPath.Replace("\\", "/"));
     trapFile.Write(";assembly");
 }
示例#4
0
 public override void WriteId(EscapingTextWriter trapFile)
 {
     parent.WriteId(trapFile);
     trapFile.Write('.');
     trapFile.Write(Context.ShortName(ed.Name));
     trapFile.Write(";cil-event");
 }
示例#5
0
        public override void WriteId(EscapingTextWriter trapFile)
        {
            string  kind;
            IEntity containingEntity;

            switch (Symbol.TypeParameterKind)
            {
            case TypeParameterKind.Method:
                kind             = "methodtypeparameter";
                containingEntity = Method.Create(Context, (IMethodSymbol)Symbol.ContainingSymbol);
                break;

            case TypeParameterKind.Type:
                kind             = "typeparameter";
                containingEntity = Create(Context, Symbol.ContainingType);
                break;

            default:
                throw new InternalError(Symbol, $"Unhandled type parameter kind {Symbol.TypeParameterKind}");
            }
            trapFile.WriteSubId(containingEntity);
            trapFile.Write('_');
            trapFile.Write(Symbol.Ordinal);
            trapFile.Write(';');
            trapFile.Write(kind);
        }
示例#6
0
 public void WriteId(EscapingTextWriter trapFile, IGenericContext gc)
 {
     unmodifiedType.WriteId(trapFile, gc);
     trapFile.Write(isRequired ? " modreq(" : " modopt(");
     modifier.WriteId(trapFile, gc);
     trapFile.Write(")");
 }
示例#7
0
 public override void WriteId(EscapingTextWriter trapFile)
 {
     trapFile.WriteSubId(parameterizable);
     trapFile.Write('_');
     trapFile.Write(index);
     trapFile.Write(";cil-parameter");
 }
示例#8
0
 public override void WriteId(EscapingTextWriter trapFile, bool inContext)
 {
     Unmodified.WriteId(trapFile, inContext);
     trapFile.Write(IsRequired ? " modreq" : " modopt");
     trapFile.Write("(");
     Modifier.WriteId(trapFile, inContext);
     trapFile.Write(")");
 }
示例#9
0
 public override void WriteId(EscapingTextWriter trapFile)
 {
     trapFile.WriteSubId(Context.CreateLocation(ReportingLocation));
     trapFile.Write(Symbol.IsActive);
     trapFile.Write(',');
     trapFile.Write(Symbol.BranchTaken);
     trapFile.Write(";trivia");
 }
示例#10
0
 public override void WriteId(EscapingTextWriter trapFile)
 {
     trapFile.WriteSubId(ContainingType !);
     trapFile.Write('.');
     Method.AddExplicitInterfaceQualifierToId(Context, trapFile, Symbol.ExplicitInterfaceImplementations);
     trapFile.Write(Symbol.Name);
     trapFile.Write(";event");
 }
示例#11
0
 public override void WriteId(EscapingTextWriter trapFile, bool inContext)
 {
     if (!(inContext && method == gc))
     {
         trapFile.WriteSubId(method);
     }
     trapFile.Write("!");
     trapFile.Write(index);
 }
示例#12
0
 public override void WriteId(EscapingTextWriter trapFile)
 {
     trapFile.WriteSubId(Type);
     trapFile.Write(" ");
     trapFile.WriteSubId(ContainingType !);
     trapFile.Write('.');
     trapFile.Write(Symbol.Name);
     trapFile.Write(";field");
 }
示例#13
0
 public override void WriteId(EscapingTextWriter trapFile)
 {
     trapFile.WriteSubId(ContainingType !);
     trapFile.Write('.');
     trapFile.Write(Symbol.MetadataName);
     trapFile.Write('(');
     trapFile.BuildList(",", Symbol.Parameters, p => trapFile.WriteSubId(Type.Create(Context, p.Type)));
     trapFile.Write(");indexer");
 }
示例#14
0
 public void WriteId(EscapingTextWriter trapFile, IGenericContext outerGc)
 {
     if (!ReferenceEquals(innerGc, outerGc) && innerGc is Method method)
     {
         trapFile.WriteSubId(method);
     }
     trapFile.Write("M!");
     trapFile.Write(index);
 }
示例#15
0
 public override void WriteId(EscapingTextWriter trapFile)
 {
     if (!Symbol.IsGlobalNamespace)
     {
         trapFile.WriteSubId(Create(Context, Symbol.ContainingNamespace));
         trapFile.Write('.');
         trapFile.Write(Symbol.Name);
     }
     trapFile.Write(";namespace");
 }
示例#16
0
 public override void WriteId(EscapingTextWriter trapFile)
 {
     if (ParentNamespace is not null && !ParentNamespace.IsGlobalNamespace)
     {
         ParentNamespace.WriteId(trapFile);
         trapFile.Write('.');
     }
     trapFile.Write(Name);
     trapFile.Write(";namespace");
 }
示例#17
0
 public void WriteId(EscapingTextWriter trapFile, IGenericContext gc)
 {
     elementType.WriteId(trapFile, gc);
     trapFile.Write('[');
     for (var i = 1; i < shape.Rank; ++i)
     {
         trapFile.Write(',');
     }
     trapFile.Write(']');
 }
示例#18
0
 public override void WriteId(EscapingTextWriter trapFile)
 {
     trapFile.Write(assembly.ToString());
     if (!(assemblyPath is null))
     {
         trapFile.Write("#file:///");
         trapFile.Write(assemblyPath.Replace("\\", "/"));
     }
     trapFile.Write(";assembly");
 }
示例#19
0
 public override void WriteId(EscapingTextWriter trapFile, bool inContext)
 {
     elementType.WriteId(trapFile, inContext);
     trapFile.Write('[');
     for (var i = 1; i < rank; ++i)
     {
         trapFile.Write(',');
     }
     trapFile.Write(']');
 }
示例#20
0
 public void WriteId(EscapingTextWriter trapFile)
 {
     trapFile.Write(Annotation);
     trapFile.Write('(');
     foreach (var s in NullableParameters)
     {
         s.WriteId(trapFile);
     }
     trapFile.Write(')');
 }
示例#21
0
 public override void WriteId(EscapingTextWriter trapFile)
 {
     if (ReportingLocation?.IsInSource == true)
     {
         trapFile.WriteSubId(Location);
         trapFile.Write(";attribute");
     }
     else
     {
         trapFile.Write('*');
     }
 }
示例#22
0
            public void WriteId(EscapingTextWriter trapFile, IGenericContext gc)
            {
                genericType.WriteId(trapFile, gc);
                trapFile.Write('<');
                var index = 0;

                foreach (var arg in typeArguments)
                {
                    trapFile.WriteSeparator(",", ref index);
                    arg.WriteId(trapFile, gc);
                }
                trapFile.Write('>');
            }
示例#23
0
        public override void WriteId(EscapingTextWriter trapFile)
        {
            unboundMethod.WriteId(trapFile);
            trapFile.Write('<');
            var index = 0;

            foreach (var param in typeParams)
            {
                trapFile.WriteSeparator(",", ref index);
                trapFile.WriteSubId(param);
            }
            trapFile.Write('>');
        }
示例#24
0
        /// <summary>
        /// Constructs a unique string for this type symbol.
        ///
        /// The supplied action <paramref name="subTermAction"/> is applied to the
        /// syntactic sub terms of this type (if any).
        /// </summary>
        /// <param name="cx">The extraction context.</param>
        /// <param name="trapFile">The trap builder used to store the result.</param>
        /// <param name="symbolBeingDefined">The outer symbol being defined (to avoid recursive ids).</param>
        /// <param name="constructUnderlyingTupleType">Whether to build a type ID for the underlying `System.ValueTuple` struct in the case of tuple types.</param>
        public static void BuildTypeId(this ITypeSymbol type, Context cx, EscapingTextWriter trapFile, ISymbol symbolBeingDefined, bool constructUnderlyingTupleType)
        {
            using (cx.StackGuard)
            {
                switch (type.TypeKind)
                {
                case TypeKind.Array:
                    var array = (IArrayTypeSymbol)type;
                    array.ElementType.BuildOrWriteId(cx, trapFile, symbolBeingDefined, constructUnderlyingTupleType: false);
                    array.BuildArraySuffix(trapFile);
                    return;

                case TypeKind.Class:
                case TypeKind.Interface:
                case TypeKind.Struct:
                case TypeKind.Enum:
                case TypeKind.Delegate:
                case TypeKind.Error:
                    var named = (INamedTypeSymbol)type;
                    named.BuildNamedTypeId(cx, trapFile, symbolBeingDefined, constructUnderlyingTupleType);
                    return;

                case TypeKind.Pointer:
                    var ptr = (IPointerTypeSymbol)type;
                    ptr.PointedAtType.BuildOrWriteId(cx, trapFile, symbolBeingDefined, constructUnderlyingTupleType: false);
                    trapFile.Write('*');
                    return;

                case TypeKind.TypeParameter:
                    var tp = (ITypeParameterSymbol)type;
                    tp.ContainingSymbol.BuildOrWriteId(cx, trapFile, symbolBeingDefined, constructUnderlyingTupleType: false);
                    trapFile.Write('_');
                    trapFile.Write(tp.Name);
                    return;

                case TypeKind.Dynamic:
                    trapFile.Write("dynamic");
                    return;

                case TypeKind.FunctionPointer:
                    var funptr = (IFunctionPointerTypeSymbol)type;
                    funptr.BuildFunctionPointerTypeId(cx, trapFile, symbolBeingDefined);
                    return;

                default:
                    throw new InternalError(type, $"Unhandled type kind '{type.TypeKind}'");
                }
            }
        }
示例#25
0
        private static void BuildOrWriteId(this ISymbol?symbol, Context cx, EscapingTextWriter trapFile, ISymbol symbolBeingDefined, bool constructUnderlyingTupleType)
        {
            if (symbol is null)
            {
                cx.ModelError(symbolBeingDefined, "Missing symbol. Couldn't build some part of the ID.");
                return;
            }

            // We need to keep track of the symbol being defined in order to avoid cyclic labels.
            // For example, in
            //
            // ```csharp
            // class C<T> : IEnumerable<T> { }
            // ```
            //
            // when we generate the label for ``C`1``, the base class `IEnumerable<T>` has `T` as a type
            // argument, which will be qualified with `__self__` instead of the label we are defining.
            // In effect, the label will (simplified) look like
            //
            // ```
            // #123 = @"C`1 : IEnumerable<__self___T>"
            // ```
            if (SymbolEqualityComparer.Default.Equals(symbol, symbolBeingDefined))
            {
                trapFile.Write("__self__");
            }
            else if (symbol is ITypeSymbol type && type.IdDependsOn(cx, symbolBeingDefined))
            {
                type.BuildTypeId(cx, trapFile, symbolBeingDefined, constructUnderlyingTupleType);
            }
示例#26
0
 public override void WriteId(EscapingTextWriter trapFile)
 {
     file.WriteId(trapFile);
     trapFile.Write(',');
     trapFile.Write(location.StartLine);
     trapFile.Write(',');
     trapFile.Write(location.StartColumn);
     trapFile.Write(',');
     trapFile.Write(location.EndLine);
     trapFile.Write(',');
     trapFile.Write(location.EndColumn);
     trapFile.Write(";sourcelocation");
 }
示例#27
0
        public override void WriteId(EscapingTextWriter trapFile)
        {
            if (Parent is null)
            {
                Parent = Method.Create(Context, Symbol.ContainingSymbol as IMethodSymbol);
            }

            if (Parent is null)
            {
                throw new InternalError(Symbol, "Couldn't get parent of symbol.");
            }

            trapFile.WriteSubId(Parent);
            trapFile.Write('_');
            trapFile.Write(Ordinal);
            trapFile.Write(";parameter");
        }
示例#28
0
        public override void WriteId(EscapingTextWriter trapFile)
        {
            trapFile.WriteSubId(type);
            trapFile.Write('.');
            trapFile.Write(Context.GetString(pd.Name));
            trapFile.Write("(");
            var index     = 0;
            var signature = pd.DecodeSignature(new SignatureDecoder(), gc);

            foreach (var param in signature.ParameterTypes)
            {
                trapFile.WriteSeparator(",", ref index);
                param.WriteId(trapFile, gc);
            }
            trapFile.Write(")");
            trapFile.Write(";cil-property");
        }
示例#29
0
        protected static void AddParametersToId(Context cx, EscapingTextWriter trapFile, IMethodSymbol method)
        {
            trapFile.Write('(');
            var index = 0;

            var @params = method.Parameters;

            foreach (var param in @params)
            {
                trapFile.WriteSeparator(",", ref index);
                param.Type.BuildOrWriteId(cx, trapFile, method);
                trapFile.Write(" ");
                trapFile.Write(param.Name);
                switch (param.RefKind)
                {
                case RefKind.Out:
                    trapFile.Write(" out");
                    break;

                case RefKind.Ref:
                    trapFile.Write(" ref");
                    break;
                }
            }

            if (method.IsVararg)
            {
                trapFile.WriteSeparator(",", ref index);
                trapFile.Write("__arglist");
            }

            trapFile.Write(')');
        }
示例#30
0
        public void WriteId(EscapingTextWriter trapFile, bool inContext)
        {
            if (type.IsPrimitiveType)
            {
                Type.WritePrimitiveTypeId(trapFile, type.Name);
                return;
            }

            var ct = type.ContainingType;

            if (ct is not null)
            {
                ct.WriteId(trapFile, inContext);
                trapFile.Write('.');
            }
            else
            {
                type.WriteAssemblyPrefix(trapFile);

                var ns = type.ContainingNamespace !;
                if (!ns.IsGlobalNamespace)
                {
                    ns.WriteId(trapFile);
                    trapFile.Write('.');
                }
            }

            trapFile.Write(type.Name);

            var thisTypeArguments = type.ThisTypeArguments;

            if (thisTypeArguments is not null && thisTypeArguments.Any())
            {
                trapFile.Write('<');
                var index = 0;
                foreach (var t in thisTypeArguments)
                {
                    trapFile.WriteSeparator(",", ref index);
                    t.WriteId(trapFile);
                }
                trapFile.Write('>');
            }