Free cookie consent management tool by TermsFeed Policy Generator

Ignore:
Timestamp:
12/06/12 12:07:31 (12 years ago)
Author:
epitzer
Message:

#1990 Enable correct parsing of generics and nested classes.

File:
1 edited

Legend:

Unmodified
Added
Removed
  • trunk/sources/HeuristicLab.Persistence/3.3/Auxiliary/TypeName.cs

    r8698 r9005  
    5151
    5252    /// <summary>
     53    /// Gets or sets the number of generic args for
     54    /// each class in a series of nested classes.
     55    /// </summary>
     56    [Storable]
     57    public List<int> GenericArgCounts { get; private set; }
     58
     59      /// <summary>
    5360    /// Gets or sets the generic args.
    5461    /// </summary>
     
    103110    /// <param name="nameSpace">The namespace.</param>
    104111    /// <param name="className">Name of the class.</param>
    105     internal TypeName(string nameSpace, string className) {
     112    internal TypeName(string nameSpace, string className, List<int> genericArgCounts=null) {
    106113      Namespace = nameSpace;
    107114      ClassName = className;
     
    109116      MemoryMagic = "";
    110117      AssemblyAttribues = new Dictionary<string, string>();
     118      if (genericArgCounts != null)
     119        GenericArgCounts = genericArgCounts.ToList();
    111120    }
    112121
    113122    internal TypeName(TypeName typeName, string className = null, string nameSpace = null) {
    114       Namespace = typeName.Namespace;
    115       ClassName = typeName.ClassName;
     123      Namespace = nameSpace ?? typeName.Namespace;
     124      ClassName = className ?? typeName.ClassName;
    116125      GenericArgs = new List<TypeName>(typeName.GenericArgs);
    117126      AssemblyAttribues = new Dictionary<string, string>(typeName.AssemblyAttribues);
     
    119128      AssemblyName = typeName.AssemblyName;
    120129      IsReference = typeName.IsReference;
    121       if (nameSpace != null)
    122         Namespace = nameSpace;
    123       if (className != null)
    124         ClassName = className;
     130      if (typeName.GenericArgCounts != null)
     131        GenericArgCounts = typeName.GenericArgCounts.ToList();
    125132    }
    126133
     
    148155    /// </returns>
    149156    public string ToString(bool full, bool includeAssembly) {
    150       StringBuilder sb = new StringBuilder();
     157      var sb = new StringBuilder();
    151158      if (!string.IsNullOrEmpty(Namespace))
    152159        sb.Append(Namespace).Append('.');
    153       sb.Append(ClassName);
     160      if (GenericArgCounts != null) {
     161        sb.Append(string.Join("+",
     162          ClassName
     163          .Split('+')
     164          .Zip(GenericArgCounts, (n, c) =>
     165            c > 0 ? String.Format("{0}`{1}", n, c) : n)));
     166      } else {
     167        sb.Append(ClassName);
     168        if (IsGeneric)
     169          sb.Append('`').Append(GenericArgs.Count);
     170      }
    154171      if (IsGeneric) {
    155         sb.Append('`').Append(GenericArgs.Count).Append('[');
    156         bool first = true;
    157         foreach (TypeName t in GenericArgs) {
    158           if (first)
    159             first = false;
    160           else
    161             sb.Append(',');
    162           sb.Append('[').Append(t.ToString(full)).Append(']');
    163         }
     172        sb.Append('[');
     173        sb.Append(String.Join(",", GenericArgs.Select(a =>
     174          string.Format("[{0}]", a.ToString(full)))));
    164175        sb.Append(']');
    165176      }
     
    174185    }
    175186
    176     public string GetTypeNameInCode(HashSet<string> omitNamespaces) {
    177       StringBuilder sb = new StringBuilder();
    178       if (!string.IsNullOrEmpty(Namespace) && omitNamespaces == null || !omitNamespaces.Contains(Namespace))
    179         sb.Append(Namespace).Append('.');
    180       sb.Append(ClassName);
    181       if (IsGeneric) {
    182         sb.Append("<");
    183         sb.Append(
    184           string.Join(", ",
    185             GenericArgs
    186               .Select(a => a.GetTypeNameInCode(omitNamespaces))
    187               .ToArray()));
    188         sb.Append(">");
     187    private IEnumerable<string> GetNestedClassesInCode(HashSet<string> omitNamespaces, bool includeAllNamespaces) {
     188      var i = 0;
     189      foreach (var pair in ClassName.Split('+').Zip(GenericArgCounts, (n, c) => new {n, c})) {
     190        if (pair.c == 0) {
     191          yield return pair.n;
     192        }
     193        else {
     194          yield return string.Format("{0}<{1}>",
     195            pair.n,
     196            string.Join(",",
     197              GenericArgs
     198                .GetRange(i, pair.c)
     199                .Select(a => a.GetTypeNameInCode(omitNamespaces, includeAllNamespaces))));
     200          i += pair.c;
     201        }
     202      }
     203    }
     204
     205    private string GetTypeNameInCode(HashSet<string> omitNamespaces, bool includeNamespaces) {
     206      var sb = new StringBuilder();
     207      if (!string.IsNullOrEmpty(Namespace) &&
     208            (omitNamespaces == null && includeNamespaces) ||
     209             omitNamespaces != null && !omitNamespaces.Contains(Namespace))
     210          sb.Append(Namespace).Append('.');
     211      if (GenericArgCounts != null) {
     212        sb.Append(string.Join(".", GetNestedClassesInCode(omitNamespaces, includeNamespaces)));
     213      } else {
     214        sb.Append(ClassName);
     215        if (IsGeneric) {
     216          sb.Append("<");
     217          sb.Append(
     218            string.Join(", ",
     219                        GenericArgs
     220                          .Select(a => a.GetTypeNameInCode(omitNamespaces, includeNamespaces))
     221                          .ToArray()));
     222          sb.Append(">");
     223        }
    189224      }
    190225      sb.Append(MemoryMagic);
     
    192227    }
    193228
    194     public string GetTypeNameInCode(bool includeAllNamespaces) {
    195       StringBuilder sb = new StringBuilder();
    196       if (includeAllNamespaces)
    197         sb.Append(Namespace).Append('.');
    198       sb.Append(ClassName);
    199       if (IsGeneric) {
    200         sb.Append("<");
    201         sb.Append(
    202           string.Join(", ",
    203             GenericArgs
    204               .Select(a => a.GetTypeNameInCode(includeAllNamespaces))
    205               .ToArray()));
    206         sb.Append(">");
    207       }
    208       sb.Append(MemoryMagic);
    209       return sb.ToString();
     229    public string GetTypeNameInCode(HashSet<string> omitNamespaces) {
     230      return GetTypeNameInCode(omitNamespaces, false);
     231    }
     232
     233    public string GetTypeNameInCode(bool includeNamespaces) {
     234      return GetTypeNameInCode(null, includeNamespaces);
    210235    }
    211236
Note: See TracChangeset for help on using the changeset viewer.