Skip to content

Commit

Permalink
fix: nested namespace apply template error (#8738)
Browse files Browse the repository at this point in the history
  • Loading branch information
yufeih authored May 6, 2023
1 parent 0777483 commit c86f85e
Show file tree
Hide file tree
Showing 21 changed files with 2,002 additions and 45 deletions.
9 changes: 9 additions & 0 deletions samples/seed/dotnet/project/Project/Namespace.cs
Original file line number Diff line number Diff line change
@@ -0,0 +1,9 @@
namespace BuildFromProject.Issue8540.A
{
public class A {}
}

namespace BuildFromProject.Issue8540.B
{
public class B {}
}
26 changes: 9 additions & 17 deletions src/Microsoft.DocAsCode.Dotnet/Resolvers/YamlMetadataResolver.cs
Original file line number Diff line number Diff line change
Expand Up @@ -31,7 +31,7 @@ public static MetadataModel ResolveMetadata(
NamespaceLayout namespaceLayout)
{
MetadataModel viewModel = new();
viewModel.TocYamlViewModel = GenerateToc(allMembers, namespaceLayout);
viewModel.TocYamlViewModel = GenerateToc(allMembers, allReferences, namespaceLayout);
viewModel.Members = new List<MetadataItem>();
ResolverContext context = new()
{
Expand All @@ -44,14 +44,14 @@ public static MetadataModel ResolveMetadata(
return viewModel;
}

private static MetadataItem GenerateToc(Dictionary<string, MetadataItem> allMembers, NamespaceLayout namespaceLayout)
private static MetadataItem GenerateToc(Dictionary<string, MetadataItem> allMembers, Dictionary<string, ReferenceItem> allReferences, NamespaceLayout namespaceLayout)
{
var namespaces = allMembers.Where(s => s.Value.Type == MemberType.Namespace);

return namespaceLayout switch
{
NamespaceLayout.Flattened => GenerateFlatToc(namespaces),
NamespaceLayout.Nested => GenerateNestedToc(namespaces),
NamespaceLayout.Nested => GenerateNestedToc(namespaces, allReferences),
_ => GenerateFlatToc(namespaces),
};
}
Expand All @@ -67,7 +67,7 @@ private static MetadataItem GenerateFlatToc(IEnumerable<KeyValuePair<string, Met
};
}

private static MetadataItem GenerateNestedTocStructure(IEnumerable<KeyValuePair<string, MetadataItem>> namespaces)
private static MetadataItem GenerateNestedTocStructure(IEnumerable<KeyValuePair<string, MetadataItem>> namespaces, Dictionary<string, ReferenceItem> allReferences)
{
var root = new MetadataItem()
{
Expand Down Expand Up @@ -98,7 +98,9 @@ private static MetadataItem GenerateNestedTocStructure(IEnumerable<KeyValuePair<
DisplayNamesWithType = new(),
DisplayQualifiedNames = new()
};
missingNamespace.DisplayNames.Add(SyntaxLanguage.Default, partialParentNamespace);
namespacedItems[partialParentNamespace] = missingNamespace;
allReferences.Add(partialParentNamespace, new());

if (!partialParentNamespace.Contains('.'))
{
Expand All @@ -109,7 +111,7 @@ private static MetadataItem GenerateNestedTocStructure(IEnumerable<KeyValuePair<
{
var parentNamespace = namespacedItems[partialParentNamespace.Substring(0, partialParentNamespace.LastIndexOf('.'))];
missingNamespace.Parent = parentNamespace;
parentNamespace.Items.Add(missingNamespace);
parentNamespace.Items.Add(missingNamespace);
}
}
}
Expand Down Expand Up @@ -153,9 +155,9 @@ private static IEnumerable<string> GetParentNamespaces(string originalNamespace)
}
}

private static MetadataItem GenerateNestedToc(IEnumerable<KeyValuePair<string, MetadataItem>> namespaces)
private static MetadataItem GenerateNestedToc(IEnumerable<KeyValuePair<string, MetadataItem>> namespaces, Dictionary<string, ReferenceItem> allReferences)
{
var root = GenerateNestedTocStructure(namespaces);
var root = GenerateNestedTocStructure(namespaces, allReferences);

Queue<MetadataItem> metadataItemQueue = new();
metadataItemQueue.Enqueue(root);
Expand All @@ -170,16 +172,6 @@ private static MetadataItem GenerateNestedToc(IEnumerable<KeyValuePair<string, M
metadataItem.Parent.Parent.Items.Remove(metadataItem.Parent);
metadataItem.Parent = metadataItem.Parent.Parent;
}

var lastIndex = metadataItem.Name?.LastIndexOf('.');
if (metadataItem.Parent != root)
{
if (metadataItem.Parent?.Name != null && metadataItem.Name.StartsWith(metadataItem.Parent.Name))
metadataItem.DisplayNames.Add(SyntaxLanguage.Default, metadataItem.Name.Substring(metadataItem.Parent.Name.Length + 1));
else if (lastIndex >= 0 && metadataItem.Parent != root)
metadataItem.DisplayNames.Add(SyntaxLanguage.Default, metadataItem.Name.Substring(lastIndex.Value + 1));
} else if (!metadataItem.DisplayNames.ContainsKey(SyntaxLanguage.Default))
metadataItem.DisplayNames.Add(SyntaxLanguage.Default, metadataItem.Name);
}

if (metadataItem.Items != null)
Expand Down
22 changes: 10 additions & 12 deletions src/Microsoft.DocAsCode.Dotnet/YamlViewModelExtensions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -103,7 +103,7 @@ public static MetadataItem ShrinkToSimpleTocWithNamespaceNotEmpty(this MetadataI
return shrinkedItem;
}

public static TocViewModel ToTocViewModel(this MetadataItem item)
public static TocViewModel ToTocViewModel(this MetadataItem item, string parentNamespace = "")
{
if (item == null)
{
Expand All @@ -120,34 +120,32 @@ public static TocViewModel ToTocViewModel(this MetadataItem item)
.ThenBy(x => x.Name)
)
{
result.Add(child.ToTocItemViewModel());
result.Add(child.ToTocItemViewModel(parentNamespace));
}
return new TocViewModel(result);
default:
return null;
}
}

public static TocItemViewModel ToTocItemViewModel(this MetadataItem item)
public static TocItemViewModel ToTocItemViewModel(this MetadataItem item, string parentNamespace)
{
var result = new TocItemViewModel
{
Uid = item.Name,
Name = item.DisplayNames.GetLanguageProperty(SyntaxLanguage.Default),
};
var nameForCSharp = item.DisplayNames.GetLanguageProperty(SyntaxLanguage.CSharp);
if (nameForCSharp != result.Name)
{
result.NameForCSharp = nameForCSharp;
}
var nameForVB = item.DisplayNames.GetLanguageProperty(SyntaxLanguage.VB);
if (nameForVB != result.Name)

if (item.Type is MemberType.Namespace)
{
result.NameForVB = nameForVB;
if (result.Name.StartsWith(parentNamespace))
result.Name = result.Name.Substring(parentNamespace.Length);
parentNamespace = $"{item.Name}.";
}

if (item.Items != null)
{
result.Items = item.ToTocViewModel();
result.Items = item.ToTocViewModel(parentNamespace);
}
return result;
}
Expand Down
Loading

0 comments on commit c86f85e

Please sign in to comment.