diff options
Diffstat (limited to 'mdoc/Mono.Documentation')
5 files changed, 56 insertions, 209 deletions
diff --git a/mdoc/Mono.Documentation/MDocUpdater.cs b/mdoc/Mono.Documentation/MDocUpdater.cs index 1345b859..f2ef9cfd 100644 --- a/mdoc/Mono.Documentation/MDocUpdater.cs +++ b/mdoc/Mono.Documentation/MDocUpdater.cs @@ -320,8 +320,7 @@ namespace Mono.Documentation Console.Write ("."); foreach (var assembly in assemblySet.Assemblies) { - var a = cacheIndex.StartProcessingAssembly (assemblySet, assembly, assemblySet.Importers, assemblySet.Id, assemblySet.Version); - + var a = cacheIndex.StartProcessingAssembly (assembly, assemblySet.Importers, assemblySet.Id, assemblySet.Version); foreach (var type in assembly.GetTypes ()) { var t = a.ProcessType (type); @@ -673,14 +672,13 @@ namespace Mono.Documentation var namespacesSet = new HashSet<string>(); memberSet = new HashSet<string>(); - var frameworkEntry = frameworks.StartProcessingAssembly(assemblySet, assembly, assemblySet.Importers, assemblySet.Id, assemblySet.Version); - assemblySet.Framework = frameworkEntry; + var frameworkEntry = frameworks.StartProcessingAssembly(assembly, assemblySet.Importers, assemblySet.Id, assemblySet.Version); foreach (TypeDefinition type in docEnum.GetDocumentationTypes(assembly, typenames)) { var typeEntry = frameworkEntry.ProcessType(type); - string relpath = DoUpdateType(assemblySet, type, typeEntry, basepath, dest); + string relpath = DoUpdateType(type, typeEntry, basepath, dest); if (relpath == null) continue; @@ -689,7 +687,7 @@ namespace Mono.Documentation if (index == null) continue; - index.Add(assemblySet, assembly); + index.Add(assembly); index.Add(type); namespacesSet.Add(type.Namespace); @@ -736,12 +734,12 @@ namespace Mono.Documentation index_assemblies = WriteElement (index.DocumentElement, "Assemblies"); } - public void Add (AssemblySet set, AssemblyDefinition assembly) + public void Add (AssemblyDefinition assembly) { if (index_assemblies.SelectSingleNode ("Assembly[@Name='" + assembly.Name.Name + "']") != null) return; - app.AddIndexAssembly (assembly, index_assemblies, set.Framework); + app.AddIndexAssembly (assembly, index_assemblies); } public void Add (TypeDefinition type) @@ -779,12 +777,12 @@ namespace Mono.Documentation return file.Exists; } - public string DoUpdateType (AssemblySet set, TypeDefinition type, FrameworkTypeEntry typeEntry, string basepath, string dest) + public string DoUpdateType (TypeDefinition type, FrameworkTypeEntry typeEntry, string basepath, string dest) { if (type.Namespace == null) Warning ("warning: The type `{0}' is in the root namespace. This may cause problems with display within monodoc.", type.FullName); - if (!DocUtils.IsPublic (type)) + if (!IsPublic (type)) return null; if (type.HasCustomAttributes && CustomAttributeNamesToSkip.All(x => type.CustomAttributes.Any(y => y.AttributeType.FullName == x))) @@ -876,7 +874,7 @@ namespace Mono.Documentation else { // Stub - XmlElement td = StubType (set, type, output, typeEntry.Framework.Importers, typeEntry.Framework.Id, typeEntry.Framework.Version); + XmlElement td = StubType (type, output, typeEntry.Framework.Importers, typeEntry.Framework.Id, typeEntry.Framework.Version); if (td == null) return null; } @@ -925,7 +923,7 @@ namespace Mono.Documentation return filename.ToString (); } - private void AddIndexAssembly (AssemblyDefinition assembly, XmlElement parent, FrameworkEntry fx) + private void AddIndexAssembly (AssemblyDefinition assembly, XmlElement parent) { XmlElement index_assembly = null; if (IsMultiAssembly) @@ -957,7 +955,7 @@ namespace Mono.Documentation index_assembly.AppendChild (culture); } - MakeAttributes (index_assembly, GetCustomAttributes (assembly.CustomAttributes, ""), fx, assemblyFilename:assembly.MainModule.FileName); + MakeAttributes (index_assembly, GetCustomAttributes (assembly.CustomAttributes, "")); parent.AppendChild (index_assembly); } @@ -1025,9 +1023,8 @@ namespace Mono.Documentation { using (assm) { + AddIndexAssembly(assm, index_assemblies); DoUpdateAssembly(assemblySet, assm, index_types, source, dest, goodfiles); - AddIndexAssembly (assm, index_assemblies, assemblySet.Framework); - processedAssemblyCount++; } } @@ -1063,7 +1060,7 @@ namespace Mono.Documentation var typeSet = new HashSet<string> (); memberSet = new HashSet<string> (); - var frameworkEntry = frameworks.StartProcessingAssembly (assemblySet, assembly, assemblySet.Importers, assemblySet.Id, assemblySet.Version); + var frameworkEntry = frameworks.StartProcessingAssembly (assembly, assemblySet.Importers, assemblySet.Id, assemblySet.Version); foreach (TypeDefinition type in docEnum.GetDocumentationTypes (assembly, null)) { string typename = GetTypeFileName (type); @@ -1072,7 +1069,7 @@ namespace Mono.Documentation var typeEntry = frameworkEntry.ProcessType (type); - string reltypepath = DoUpdateType (assemblySet, type, typeEntry, source, dest); + string reltypepath = DoUpdateType (type, typeEntry, source, dest); if (reltypepath == null) continue; @@ -1892,7 +1889,7 @@ namespace Mono.Documentation // CREATE A STUB DOCUMENTATION FILE - public XmlElement StubType (AssemblySet set, TypeDefinition type, string output, IEnumerable<DocumentationImporter> importers, string Id, string Version) + public XmlElement StubType (TypeDefinition type, string output, IEnumerable<DocumentationImporter> importers, string Id, string Version) { string typesig = typeFormatters[0].GetDeclaration (type); if (typesig == null) return null; // not publicly visible @@ -1901,7 +1898,7 @@ namespace Mono.Documentation XmlElement root = doc.CreateElement ("Type"); doc.AppendChild (root); - var frameworkEntry = frameworks.StartProcessingAssembly (set, type.Module.Assembly, importers, Id, Version); + var frameworkEntry = frameworks.StartProcessingAssembly (type.Module.Assembly, importers, Id, Version); var typeEntry = frameworkEntry.ProcessType (type); DoUpdateType2 ("New Type", doc, type, typeEntry, output, true); statisticsCollector.AddMetric (typeEntry.Framework.Name, StatisticsItem.Types, StatisticsMetrics.Added); @@ -1964,7 +1961,7 @@ namespace Mono.Documentation if (type.IsGenericType ()) { - MakeTypeParameters (typeEntry, root, type.GenericParameters, type, MDocUpdater.HasDroppedNamespace (type)); + MakeTypeParameters (root, type.GenericParameters, type, MDocUpdater.HasDroppedNamespace (type)); } else { @@ -2053,16 +2050,16 @@ namespace Mono.Documentation ClearElement (root, "Interfaces"); } - MakeAttributes (root, GetCustomAttributes (type), typeEntry.Framework, type, typeEntry: typeEntry); + MakeAttributes (root, GetCustomAttributes (type), type); if (DocUtils.IsDelegate (type)) { - MakeTypeParameters (typeEntry, root, type.GenericParameters, type, MDocUpdater.HasDroppedNamespace (type)); + MakeTypeParameters (root, type.GenericParameters, type, MDocUpdater.HasDroppedNamespace (type)); var member = type.GetMethod ("Invoke"); bool fxAlternateTriggered = false; MakeParameters (root, member, member.Parameters, typeEntry, ref fxAlternateTriggered); - MakeReturnValue (typeEntry, root, member); + MakeReturnValue (root, member); } DocsNodeInfo typeInfo = new DocsNodeInfo (WriteElement (root, "Docs"), type); @@ -2169,14 +2166,14 @@ namespace Mono.Documentation ClearElement (me, "AssemblyInfo"); } - MakeAttributes (me, GetCustomAttributes (mi), typeEntry.Framework, mi.DeclaringType, typeEntry: typeEntry); + MakeAttributes (me, GetCustomAttributes (mi), mi.DeclaringType); - MakeReturnValue (typeEntry, me, mi, MDocUpdater.HasDroppedNamespace (mi)); + MakeReturnValue (me, mi, MDocUpdater.HasDroppedNamespace (mi)); if (mi is MethodReference) { MethodReference mb = (MethodReference)mi; if (mb.IsGenericMethod ()) - MakeTypeParameters (typeEntry, me, mb.GenericParameters, mi, MDocUpdater.HasDroppedNamespace (mi)); + MakeTypeParameters (me, mb.GenericParameters, mi, MDocUpdater.HasDroppedNamespace (mi)); } bool fxAlternateTriggered = false; MakeParameters (me, mi, typeEntry, ref fxAlternateTriggered, MDocUpdater.HasDroppedNamespace (mi)); @@ -3092,9 +3089,6 @@ namespace Mono.Documentation private static void NormalizeWhitespace (XmlElement e) { - if (e == null) - return; - // Remove all text and whitespace nodes from the element so it // is outputted with nice indentation and no blank lines. ArrayList deleteNodes = new ArrayList (); @@ -3262,119 +3256,33 @@ namespace Mono.Documentation } } - public static void MakeAttributes (XmlElement root, IEnumerable<string> attributes, FrameworkEntry fx, TypeReference t = null, FrameworkTypeEntry typeEntry = null, string assemblyFilename = null)//FrameworkEntry fx, TypeReference t = null) + private void MakeAttributes (XmlElement root, IEnumerable<string> attributes, TypeReference t = null) { - XmlElement e = (XmlElement)root.SelectSingleNode ("Attributes"); - bool isLastFx = fx != null && fx.IsLastFramework; - bool noAttributes = attributes.Any (); - bool currentlyHasAttributes = e != null && e.ChildNodes.Count > 0; - - - if (e == null) - e = root.OwnerDocument.CreateElement ("Attributes"); - - var attributesCurrent = attributes - .Select (FilterSpecialChars) - .Distinct () // make sure there aren't any dupes - .ToDictionary (a => a, a => false); // key is the attribute, value is whether it was found - - var attributesState = e.ChildNodes.Cast<XmlElement> () - .Select (elem => new - { - ExistingValue = elem.FirstChild.InnerText, - XElement = elem, - }).ToArray(); - - - // iterate this framework's attributes and compare against the state - foreach(var currentAttribute in attributesCurrent) + if (!attributes.Any ()) { - var alreadyExists = attributesState.FirstOrDefault (state => state.ExistingValue == currentAttribute.Key); - if (alreadyExists != null) - { - // if FXA, add fx.name - if (fx.Frameworks.Count() > 1 && alreadyExists.XElement.HasAttribute(Consts.FrameworkAlternate)) - { - var newfxlist = FXUtils.AddFXToList (alreadyExists.XElement.GetAttribute (Consts.FrameworkAlternate), fx.Name); - alreadyExists.XElement.SetAttribute (Consts.FrameworkAlternate, newfxlist); - } - continue; - } - else // let's create it - { - XmlElement ae = root.OwnerDocument.CreateElement ("Attribute"); - e.AppendChild (ae); - WriteElementText (ae, "AttributeName", currentAttribute.Key); - + ClearElement (root, "Attributes"); + return; + } - // add FXA if this isn't the first framework, and - bool typeNotExisted = (typeEntry != null && !typeEntry.PreviouslyProcessedFrameworkTypes.Any ()); - bool assemblyNotExisted = (assemblyFilename != null && !fx.PreviousFXContainsAssembly (assemblyFilename)); + XmlElement e = (XmlElement)root.SelectSingleNode ("Attributes"); + if (e != null) + e.RemoveAll (); + else if (e == null) + e = root.OwnerDocument.CreateElement ("Attributes"); - if (fx.Frameworks.Count() > 1 && !fx.IsFirstFramework && (!typeNotExisted && !assemblyNotExisted)) - { - ae.SetAttribute (Consts.FrameworkAlternate, fx.Name); - } - } - } - // iterate the state's attributes to find attributes that aren't - // a part of this framework's attributes. - foreach(var stateAttribute in attributesState) + foreach (string attribute in attributes) { - if (attributesCurrent.ContainsKey(stateAttribute.ExistingValue)) - { - continue; - } - else // let's remove it - { - - if (fx.Frameworks.Count() > 1) { - - if (stateAttribute.XElement.HasAttribute (Consts.FrameworkAlternate)) - { - // if has FXA, remove from list - var newfxlist = FXUtils.RemoveFXFromList (stateAttribute.XElement.GetAttribute (Consts.FrameworkAlternate), fx.Name); - stateAttribute.XElement.SetAttribute (Consts.FrameworkAlternate, newfxlist); - } - else if (!fx.IsFirstFramework) // doesn't have FXA, and isn't the first framework - { - // if not, we need to make sure - var priorfxList = fx.PreviousFrameworks.Select (f => f.Name).ToArray (); - stateAttribute.XElement.SetAttribute (Consts.FrameworkAlternate, string.Join (";", priorfxList)); - } - else if (fx.IsFirstFramework) - { - stateAttribute.XElement.ParentNode.RemoveChild (stateAttribute.XElement); - } - } - else - stateAttribute.XElement.ParentNode.RemoveChild (stateAttribute.XElement); - } - } - - // clean up - if (fx.IsLastFramework) { - foreach(var attr in e.ChildNodes.Cast<XmlElement> ().ToArray()) { - if (attr.HasAttribute (Consts.FrameworkAlternate) && string.IsNullOrWhiteSpace (attr.GetAttribute (Consts.FrameworkAlternate))) - attr.ParentNode.RemoveChild (attr); - } + XmlElement ae = root.OwnerDocument.CreateElement ("Attribute"); + e.AppendChild (ae); + var value = new String (FilterSpecialChars (attribute).ToArray ()); + WriteElementText (ae, "AttributeName", value); } - if (e != null && e.ParentNode == null) + if (e.ParentNode == null) root.AppendChild (e); - if (e.ChildNodes.Count == 0 && e.ParentNode != null) { - var parent = e.ParentNode as XmlElement; - parent.RemoveChild (e); - if (parent.ChildNodes.Count == 0) - parent.IsEmpty = true; - return; - } - NormalizeWhitespace (e); - - return; } public static string MakeAttributesValueString (object v, TypeReference valueType) @@ -3450,7 +3358,7 @@ namespace Mono.Documentation if (addfx) pe.SetAttribute (Consts.FrameworkAlternate, fx); - MakeAttributes (pe, GetCustomAttributes (param.CustomAttributes, ""), typeEntry.Framework, typeEntry: typeEntry); + MakeAttributes (pe, GetCustomAttributes (param.CustomAttributes, "")); }; /// addFXAttributes, adds the index attribute to all existing elements. /// Used when we first detect the scenario which requires this. @@ -3583,7 +3491,7 @@ namespace Mono.Documentation } } - private void MakeTypeParameters (FrameworkTypeEntry entry, XmlElement root, IList<GenericParameter> typeParams, MemberReference member, bool shouldDuplicateWithNew) + private void MakeTypeParameters (XmlElement root, IList<GenericParameter> typeParams, MemberReference member, bool shouldDuplicateWithNew) { if (typeParams == null || typeParams.Count == 0) { @@ -3618,7 +3526,7 @@ namespace Mono.Documentation XmlElement pe = root.OwnerDocument.CreateElement ("TypeParameter"); e.AppendChild (pe); pe.SetAttribute ("Name", t.Name); - MakeAttributes (pe, GetCustomAttributes (t.CustomAttributes, ""), entry.Framework, t.DeclaringType, typeEntry: entry); + MakeAttributes (pe, GetCustomAttributes (t.CustomAttributes, ""), t.DeclaringType); XmlElement ce = (XmlElement)e.SelectSingleNode ("Constraints"); if (attrs == GenericParameterAttributes.NonVariant && constraints.Count == 0) { @@ -3692,7 +3600,7 @@ namespace Mono.Documentation return GetDocTypeFullName (type).Replace ("@", "&"); } - private void MakeReturnValue (FrameworkTypeEntry typeEntry, XmlElement root, TypeReference type, IList<CustomAttribute> attributes, bool shouldDuplicateWithNew = false) + private void MakeReturnValue (XmlElement root, TypeReference type, IList<CustomAttribute> attributes, bool shouldDuplicateWithNew = false) { XmlElement e = WriteElement (root, "ReturnValue"); var valueToUse = GetDocTypeFullName (type); @@ -3704,25 +3612,25 @@ namespace Mono.Documentation { var newNode = WriteElementText (e, "ReturnType", valueToUse, forceNewElement: true); if (attributes != null) - MakeAttributes (e, GetCustomAttributes (attributes, ""), typeEntry.Framework, type, typeEntry: typeEntry); + MakeAttributes (e, GetCustomAttributes (attributes, ""), type); return newNode; }, type); } - private void MakeReturnValue (FrameworkTypeEntry typeEntry, XmlElement root, MemberReference mi, bool shouldDuplicateWithNew = false) + private void MakeReturnValue (XmlElement root, MemberReference mi, bool shouldDuplicateWithNew = false) { if (mi is MethodDefinition && ((MethodDefinition)mi).IsConstructor) return; else if (mi is MethodDefinition) - MakeReturnValue (typeEntry, root, ((MethodDefinition)mi).ReturnType, ((MethodDefinition)mi).MethodReturnType.CustomAttributes, shouldDuplicateWithNew); + MakeReturnValue (root, ((MethodDefinition)mi).ReturnType, ((MethodDefinition)mi).MethodReturnType.CustomAttributes, shouldDuplicateWithNew); else if (mi is PropertyDefinition) - MakeReturnValue (typeEntry, root, ((PropertyDefinition)mi).PropertyType, null, shouldDuplicateWithNew); + MakeReturnValue (root, ((PropertyDefinition)mi).PropertyType, null, shouldDuplicateWithNew); else if (mi is FieldDefinition) - MakeReturnValue (typeEntry, root, ((FieldDefinition)mi).FieldType, null, shouldDuplicateWithNew); + MakeReturnValue (root, ((FieldDefinition)mi).FieldType, null, shouldDuplicateWithNew); else if (mi is EventDefinition) - MakeReturnValue (typeEntry, root, ((EventDefinition)mi).EventType, null, shouldDuplicateWithNew); + MakeReturnValue (root, ((EventDefinition)mi).EventType, null, shouldDuplicateWithNew); else if (mi is AttachedEventReference) return; else if (mi is AttachedPropertyReference) diff --git a/mdoc/Mono.Documentation/Updater/Frameworks/AssemblySet.cs b/mdoc/Mono.Documentation/Updater/Frameworks/AssemblySet.cs index 496d5624..6affe4cd 100644 --- a/mdoc/Mono.Documentation/Updater/Frameworks/AssemblySet.cs +++ b/mdoc/Mono.Documentation/Updater/Frameworks/AssemblySet.cs @@ -10,7 +10,7 @@ namespace Mono.Documentation.Updater.Frameworks /// <summary> /// Represents a set of assemblies that we want to document /// </summary> - public class AssemblySet : IDisposable + class AssemblySet : IDisposable { static readonly BaseAssemblyResolver resolver = new Frameworks.MDocResolver (); static IAssemblyResolver cachedResolver; @@ -23,23 +23,6 @@ namespace Mono.Documentation.Updater.Frameworks IEnumerable<string> importPaths; public IEnumerable<DocumentationImporter> Importers { get; private set; } - FrameworkEntry fx; - public FrameworkEntry Framework - { - get => fx; - set - { - fx = value; - fx.AddAssemblySet (this); - } - } - - /// <summary>This is meant only for unit test access</summary> - public IDictionary<string, bool> AssemblyMapsPath - { - get => assemblyPathsMap; - } - public AssemblySet (IEnumerable<string> paths) : this ("Default", paths, new string[0]) { } public AssemblySet (string name, IEnumerable<string> paths, IEnumerable<string> resolverSearchPaths, IEnumerable<string> imports = null, string version = null, string id = null) diff --git a/mdoc/Mono.Documentation/Updater/Frameworks/FrameworkEntry.cs b/mdoc/Mono.Documentation/Updater/Frameworks/FrameworkEntry.cs index 304fc22e..5c98db27 100644 --- a/mdoc/Mono.Documentation/Updater/Frameworks/FrameworkEntry.cs +++ b/mdoc/Mono.Documentation/Updater/Frameworks/FrameworkEntry.cs @@ -11,9 +11,7 @@ namespace Mono.Documentation.Updater.Frameworks SortedSet<FrameworkTypeEntry> types = new SortedSet<FrameworkTypeEntry> (); IList<FrameworkEntry> allframeworks; - ISet<AssemblySet> allAssemblies = new SortedSet<AssemblySet> (); - - public int Index = 0; + public int index = 0; public FrameworkEntry (IList<FrameworkEntry> frameworks) { @@ -21,50 +19,13 @@ namespace Mono.Documentation.Updater.Frameworks if (allframeworks == null) allframeworks = new List<FrameworkEntry> (0); - Index = allframeworks.Count; + index = allframeworks.Count; } public string Name { get; set; } public string Version { get; set; } public string Id { get; set; } - /// <summary>Gets a value indicating whether this <see cref="T:Mono.Documentation.Updater.Frameworks.FrameworkEntry"/> is last framework being processed.</summary> - public bool IsLastFramework { - get => Index == allframeworks.Count - 1; - } - - public IEnumerable<FrameworkEntry> PreviousFrameworks { - get => allframeworks.Where (f => f.Index < this.Index); - } - - public ISet<AssemblySet> AllProcessedAssemblies { get => allAssemblies; } - - public void AddAssemblySet (AssemblySet assemblySet) - { - allAssemblies.Add (assemblySet); - } - - /// <summary>Checks to see if this assembly is contained in previously processed frameworks</summary> - public bool PreviousFXContainsAssembly(string name) - { - if (name.Contains (System.IO.Path.DirectorySeparatorChar)) - name = System.IO.Path.GetFileName (name); - - return PreviousFrameworks.Any (pf => pf.ContainsAssembly (name)); - } - - public bool ContainsAssembly(string name) { - if (name.Contains (System.IO.Path.DirectorySeparatorChar)) - name = System.IO.Path.GetFileName (name); - - return allAssemblies.Any (a => a.Contains (name)); - } - - /// <summary>Gets a value indicating whether this <see cref="T:Mono.Documentation.Updater.Frameworks.FrameworkEntry"/> is first framework being processed.</summary> - public bool IsFirstFramework { - get => this.Index == 0; - } - /// <summary>Only Use in Unit Tests</summary> public string Replace=""; diff --git a/mdoc/Mono.Documentation/Updater/Frameworks/FrameworkIndex.cs b/mdoc/Mono.Documentation/Updater/Frameworks/FrameworkIndex.cs index e9e19600..25ae158b 100644 --- a/mdoc/Mono.Documentation/Updater/Frameworks/FrameworkIndex.cs +++ b/mdoc/Mono.Documentation/Updater/Frameworks/FrameworkIndex.cs @@ -26,13 +26,10 @@ namespace Mono.Documentation.Updater.Frameworks } } - public FrameworkEntry StartProcessingAssembly (AssemblySet set, AssemblyDefinition assembly, IEnumerable<DocumentationImporter> importers, string Id, string Version) + public FrameworkEntry StartProcessingAssembly (AssemblyDefinition assembly, IEnumerable<DocumentationImporter> importers, string Id, string Version) { - if (string.IsNullOrWhiteSpace (this.path)) - { - set.Framework = FrameworkEntry.Empty; - return FrameworkEntry.Empty; - } + if (string.IsNullOrWhiteSpace (this.path)) + return FrameworkEntry.Empty; string assemblyPath = assembly.MainModule.FileName; var frameworksDirectory = this.path.EndsWith ("frameworks.xml", StringComparison.OrdinalIgnoreCase) @@ -48,8 +45,6 @@ namespace Mono.Documentation.Updater.Frameworks entry = new FrameworkEntry (frameworks) { Name = shortPath, Importers = importers, Id = Id, Version = Version}; frameworks.Add (entry); } - - set.Framework = entry; return entry; } diff --git a/mdoc/Mono.Documentation/Updater/Frameworks/FrameworkTypeEntry.cs b/mdoc/Mono.Documentation/Updater/Frameworks/FrameworkTypeEntry.cs index f95dda87..a6886c8c 100644 --- a/mdoc/Mono.Documentation/Updater/Frameworks/FrameworkTypeEntry.cs +++ b/mdoc/Mono.Documentation/Updater/Frameworks/FrameworkTypeEntry.cs @@ -36,7 +36,7 @@ namespace Mono.Documentation.Updater.Frameworks { previouslyProcessedFXTypes = new Lazy<FrameworkTypeEntry[]> ( () => this.Framework.Frameworks - .Where (f => f.Index < this.Framework.Index) + .Where (f => f.index < this.Framework.index) .Select (f => f.FindTypeEntry (this)) .ToArray () ); |