Пример #1
0
 internal GenerateName(IContext context, INsMember nameScope, IMemberDef source, NameGenerator options)
     : base(context)
 {
     NameScope = nameScope;
     Source    = source;
     Options   = options;
 }
Пример #2
0
 public override string Generate(IMetadataMangler mangler, INsMember scope, IMemberDef member, string old,
                                 int iteration)
 {
     if (iteration > 0)
     {
         old += iteration;
     }
     return(Encode(Hasher.ComputeHash(Encoding.UTF8.GetBytes(old))));
 }
Пример #3
0
        string NameGenerator(INsMember scope, IMemberDef member, string old, Func <string, bool> isBadName)
        {
            var options = _options.Generator.Clone();

            if (member != null && options is NameGenerator.Encoded enc && member.IsTypeDef &&
                ((TypeDef)member).Interfaces.Any(i =>
                                                 i.Interface.FullName == typeof(System.Runtime.InteropServices.ICustomMarshaler).FullName))
            {
                enc.Dictionary = ManglerCharsets.Latin;
            }
            var ev = Context.Fire(new NameManglerEvent.GenerateName(Context, scope, member, options));

            options = ev.Options;

            string postfix = null;

            if (options.PreserveGenericCount && member != null && (member.IsType || member.IsMethod))
            {
                var i = old.IndexOf('`');
                if (i != -1)
                {
                    postfix = old.Substring(i + 1);
                    old     = old.Substring(0, i);
                }
            }

            var    iteration = 0;
            string name;

            while (true)
            {
                if (iteration > options.MaxIterations)
                {
                    throw Context.Error($"too many attempts to generate unique name for {member?.FullName ?? old}");
                }

                name = options.Generate(this, scope, member, old, iteration++);
                if (isBadName != null && isBadName(name))
                {
                    continue;
                }
                if (ev.AvoidNames != null && ev.AvoidNames.Contains(name))
                {
                    continue;
                }
                break;
            }

            if (postfix != null)
            {
                name += '`' + postfix;
            }
            return(name);
        }
Пример #4
0
            public override string Generate(IMetadataMangler mangler, INsMember scope, IMemberDef member, string old,
                                            int iteration)
            {
                var name = old.Replace('.', '_') + "_";

                if (iteration > 0)
                {
                    name += iteration;
                }
                return(name);
            }
Пример #5
0
 /// <summary>
 /// Generate new name for a given metadata member
 /// </summary>
 /// <param name="mangler">instance of the mangler plugin</param>
 /// <param name="scope">naming scope</param>
 /// <param name="member">the member to rename</param>
 /// <param name="old">old name</param>
 /// <param name="iteration">number of current iteration (increments with each unsuccessful attemt to generate new name)</param>
 /// <returns>new name</returns>
 public abstract string Generate(IMetadataMangler mangler, INsMember scope, IMemberDef member, string old,
                                 int iteration);
Пример #6
0
 public override string Generate(IMetadataMangler mangler, INsMember scope, IMemberDef member, string old,
                                 int iteration)
 {
     return(Encode(mangler.Rng.NextBytes((MaxSignificantBits + 7) >> 3)));
 }
Пример #7
0
 public override string Generate(IMetadataMangler mangler, INsMember scope, IMemberDef member, string old,
                                 int iteration)
 {
     return(Encode(ToBytes(NextSequence(scope), MaxSignificantBits)));
 }
Пример #8
0
 private long NextSequence(INsMember scope) => _sequences.GetOrAdd(scope, s => new Seq()).Next();