-
Notifications
You must be signed in to change notification settings - Fork 1
/
Copy pathWin32APIReferenceContentTopicsLexer.cs
172 lines (144 loc) · 8.55 KB
/
Win32APIReferenceContentTopicsLexer.cs
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
using Microsoft.VisualBasic;
using System;
using System.Collections.Generic;
using System.Diagnostics;
using System.IO;
using System.Linq;
using MDSDKBase;
using MDSDKDerived;
using System.Text.RegularExpressions;
namespace MDSDK
{
/// <summary>
/// A class that performs lexical analysis on the Win32 and COM API reference content repo.
/// </summary>
internal class Win32APIReferenceContentTopicsLexer
{
public static void DocumentTypesForParameters(ApiRefModelWin32 apiRefModelWin32)
{
using (new ChangeAndRestoreCurrentDirectory($"{ProgramBase.MyContentReposFolderDirectoryInfo.FullName}\\{ProgramBase.Win32ApiReferenceContentRepoName}\\sdk-api-src\\content"))
{
string platformDesc = "Win32 and COM";
List<DirectoryInfo> headerDirectoryInfos = Win32APIReferenceContentTopicsLexer.GetHeaderDirectoryInfos();
ProgramBase.ConsoleWrite($"{Environment.NewLine}Lexing {platformDesc} content topics.", ConsoleWriteStyle.Highlight);
string projectListIntro = $"These are the shipping headers that document {platformDesc} functions.";
ProgramBase.ConsoleWrite(projectListIntro, ConsoleWriteStyle.Highlight);
foreach (DirectoryInfo eachHeaderDirectoryInfo in headerDirectoryInfos)
{
ProgramBase.ConsoleWrite($"{eachHeaderDirectoryInfo.Name} ", ConsoleWriteStyle.Default, 0);
Win32APIReferenceContentTopicsLexer.GetApiRefModelWin32ProcessHeader(apiRefModelWin32, eachHeaderDirectoryInfo);
}
ProgramBase.ConsoleWrite(string.Empty, ConsoleWriteStyle.Default, 2);
}
}
public static void ReportAnyFirstAsteriskInYamlDescription()
{
using (new ChangeAndRestoreCurrentDirectory($"{ProgramBase.MyContentReposFolderDirectoryInfo.FullName}\\{ProgramBase.Win32ApiReferenceContentRepoName}\\sdk-api-src\\content"))
{
string platformDesc = "Win32 and COM";
List<DirectoryInfo> headerDirectoryInfos = Win32APIReferenceContentTopicsLexer.GetHeaderDirectoryInfos();
ProgramBase.ConsoleWrite($"{Environment.NewLine}Lexing {platformDesc} content topics.", ConsoleWriteStyle.Highlight);
string projectListIntro = $"These are the shipping headers that document {platformDesc} functions.";
ProgramBase.ConsoleWrite(projectListIntro, ConsoleWriteStyle.Highlight);
foreach (DirectoryInfo eachHeaderDirectoryInfo in headerDirectoryInfos)
{
ProgramBase.ConsoleWrite($"{eachHeaderDirectoryInfo.Name} ", ConsoleWriteStyle.Default, 0);
foreach (FileInfo fileInfo in eachHeaderDirectoryInfo.GetFiles("*.md").ToList())
{
Editor topicEditor = new Editor(fileInfo);
string firstAsteriskInYamlDescriptionLine = topicEditor.GetFirstAsteriskInYamlDescriptionLine();
if (firstAsteriskInYamlDescriptionLine != null)
{
ProgramBase.ConsoleWrite($"{Environment.NewLine}{fileInfo.Name} {firstAsteriskInYamlDescriptionLine}", ConsoleWriteStyle.Error, 2);
}
}
}
ProgramBase.ConsoleWrite(string.Empty, ConsoleWriteStyle.Default, 2);
}
}
private static List<DirectoryInfo> GetHeaderDirectoryInfos()
{
List<DirectoryInfo> headerDirectoryInfos = new List<DirectoryInfo>();
var win32ApiReferenceContentFolder = new DirectoryInfo(Directory.GetCurrentDirectory());
foreach (var headerDirectoryInfo in win32ApiReferenceContentFolder.GetDirectories())
{
string headerDirectoryName = headerDirectoryInfo.Name;
if (!headerDirectoryName.StartsWith("_"))
{
headerDirectoryInfos.Add(headerDirectoryInfo);
}
}
return headerDirectoryInfos;
}
private static void GetApiRefModelWin32ProcessHeader(ApiRefModelWin32 apiRefModelWin32, DirectoryInfo eachHeaderDirectoryInfo)
{
// Construct a WindowsSDKWin32HeaderFilesLexer to use for the duration of this method.
var windowsSDKWin32HeaderFileLexer = WindowsSDKWin32HeaderFileLexer.MakeWindowsSDKWin32HeaderFileLexer(eachHeaderDirectoryInfo);
// Free functions.
// Structures.
// TODO: in the built topic object model, for each header, have a dictionary that maps UID to correct name (the built topic's H1 should
// be the real name.
// Then for each content file (which shouldn't even have an H1), map its UID to that name. Then use that in the regex to find the right struct.
// In the Type field, put the SAL and also any "[size_is(cEntries)]" type stuff.
List<FileInfo> fileInfos = eachHeaderDirectoryInfo.GetFiles("ns-*.md").ToList();
foreach (FileInfo fileInfo in fileInfos)
{
Editor structureTopicEditor = new Editor(fileInfo);
int lineNumberOneBased = structureTopicEditor.GetFieldsSection1BasedLineNumber();
(string structure_members, string structure_names) = windowsSDKWin32HeaderFileLexer.FindStructureDefinition(structureTopicEditor.GetYamlApiName());
string[] structure_members_array = structure_members.Split(';');
for (int ix = 0; ix < structure_members_array.Length; ++ix)
{
structure_members_array[ix] = structure_members_array[ix].Trim();
string[] member_elements_array = structure_members_array[ix].Split(new char[] { }, StringSplitOptions.RemoveEmptyEntries);
for (int ix2 = 0; ix2 < member_elements_array.Length; ++ix2)
{
member_elements_array[ix2] = member_elements_array[ix2].Trim();
string[] member_element_elements_array = member_elements_array[ix2].Split(new char[] { '*' }, StringSplitOptions.RemoveEmptyEntries);
if (member_element_elements_array.Length > 0)
{
if (member_element_elements_array[0] != member_elements_array[ix2])
{
}
}
}
}
string[] structure_names_array = structure_names.Split(',');
for (int ix = 0; ix < structure_names_array.Length; ++ix)
{
structure_names_array[ix] = structure_names_array[ix].Trim();
}
}
}
public static void ReportAnyNoBreakSpaceInWin32ConceptualTopics()
{
using (new ChangeAndRestoreCurrentDirectory($"{ProgramBase.MyContentReposFolderDirectoryInfo.FullName}\\{ProgramBase.Win32ConceptualContentRepoName}\\desktop-src"))
{
var win32ConceptualContentFolder = new DirectoryInfo(Directory.GetCurrentDirectory());
foreach (var eachDirectoryInfo in win32ConceptualContentFolder.GetDirectories())
{
Win32APIReferenceContentTopicsLexer.ReportAnyNoBreakSpaceInFolderRecursive(string.Empty, eachDirectoryInfo);
}
ProgramBase.ConsoleWrite(string.Empty, ConsoleWriteStyle.Default, 2);
}
}
private static void ReportAnyNoBreakSpaceInFolderRecursive(string parentFolder, DirectoryInfo eachDirectoryInfo)
{
if (eachDirectoryInfo.Name.ToLower() == "images") return;
ProgramBase.ConsoleWrite($"{parentFolder}{eachDirectoryInfo.Name} ", ConsoleWriteStyle.Default, 0);
foreach (FileInfo fileInfo in eachDirectoryInfo.GetFiles("*.md").ToList())
{
Editor topicEditor = new Editor(fileInfo);
string firstNoBreakSpaceLine = topicEditor.GetFirstNoBreakSpaceLine();
if (firstNoBreakSpaceLine != null)
{
ProgramBase.ConsoleWrite($"{Environment.NewLine}{fileInfo.Name} {firstNoBreakSpaceLine}", ConsoleWriteStyle.Error, 2);
}
}
foreach (var eachSubdirectoryInfo in eachDirectoryInfo.GetDirectories())
{
Win32APIReferenceContentTopicsLexer.ReportAnyNoBreakSpaceInFolderRecursive($"{parentFolder}{eachDirectoryInfo.Name}\\", eachSubdirectoryInfo);
}
}
}
}