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"); }
/// <summary> /// Factored out to share logic between `Method` and `UserOperator`. /// </summary> private static void BuildMethodId(Method m, EscapingTextWriter trapFile) { if (!SymbolEqualityComparer.Default.Equals(m.Symbol, m.Symbol.OriginalDefinition)) { if (!SymbolEqualityComparer.Default.Equals(m.Symbol, m.ConstructedFromSymbol)) { trapFile.WriteSubId(Create(m.Context, m.ConstructedFromSymbol)); trapFile.Write('<'); // Encode the nullability of the type arguments in the label. // Type arguments with different nullability can result in // a constructed method with different nullability of its parameters and return type, // so we need to create a distinct database entity for it. trapFile.BuildList(",", m.Symbol.GetAnnotatedTypeArguments(), ta => { ta.Symbol.BuildOrWriteId(m.Context, trapFile, m.Symbol); trapFile.Write((int)ta.Nullability); }); trapFile.Write('>'); } else { trapFile.WriteSubId(m.ContainingType !); trapFile.Write("."); trapFile.WriteSubId(m.OriginalDefinition); } WritePostfix(m, trapFile); return; } m.Symbol.ReturnType.BuildOrWriteId(m.Context, trapFile, m.Symbol); trapFile.Write(" "); trapFile.WriteSubId(m.ContainingType !); AddExplicitInterfaceQualifierToId(m.Context, trapFile, m.Symbol.ExplicitInterfaceImplementations); trapFile.Write("."); trapFile.Write(m.Symbol.Name); if (m.Symbol.IsGenericMethod) { trapFile.Write('`'); trapFile.Write(m.Symbol.TypeParameters.Length); } AddParametersToId(m.Context, trapFile, m.Symbol); WritePostfix(m, trapFile); }