Skip to content

Commit 2afc9d4

Browse files
Fixed issue when processing code file for metapackage (#8892)
* Fixed issue when processing code file for metapackage
1 parent 7b333b1 commit 2afc9d4

6 files changed

Lines changed: 48 additions & 13 deletions

File tree

src/dotnet/APIView/APIViewWeb/Helpers/CodeFileHelpers.cs

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -333,6 +333,9 @@ private static void InsertCodePanelRowData(CodePanelData codePanelData, CodePane
333333

334334
private static void AddDiagnosticRow(CodePanelData codePanelData, CodeFile codeFile, string nodeId, string nodeIdHashed)
335335
{
336+
if (codeFile.Diagnostics == null || codeFile.Diagnostics.Length == 0)
337+
return;
338+
336339
var diagnostics = codeFile.Diagnostics.Where(d => d.TargetId == nodeId);
337340
foreach (var diagnostic in diagnostics)
338341
{

src/dotnet/APIView/APIViewWeb/Managers/APIRevisionsManager.cs

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -725,12 +725,12 @@ public async Task UpdateAPIRevisionAsync(APIRevisionListItemModel revision, Lang
725725
try
726726
{
727727
var fileOriginal = await _originalsRepository.GetOriginalAsync(file.FileId);
728-
// file.Name property has been repurposed to store package name and version string
729-
// This is causing issue when updating review using latest parser since it expects Name field as file name
730-
// We have added a new property FileName which is only set for new reviews
731-
// All older reviews needs to be handled by checking review name field
732-
var fileName = file.FileName ?? file.FileId;
733-
var codeFile = await languageService.GetCodeFileAsync(fileName, fileOriginal, false);
728+
if (string.IsNullOrEmpty(file.FileName))
729+
{
730+
_telemetryClient.TrackTrace($"Revision does not have original file name to update API revision. Revision Id: {revision.Id}");
731+
continue;
732+
}
733+
var codeFile = await languageService.GetCodeFileAsync(file.FileName, fileOriginal, false);
734734
if (!verifyUpgradabilityOnly)
735735
{
736736
await _codeFileRepository.UpsertCodeFileAsync(revision.Id, file.FileId, codeFile);

src/dotnet/APIView/apiview.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4,7 +4,7 @@ parameters:
44
default: 'https://pkgs.dev.azure.com/azure-sdk/public/_packaging/azure-sdk-for-net/nuget/v3/index.json'
55
- name: CSharpAPIParserVersion
66
type: string
7-
default: '1.0.0-dev.20240723.1'
7+
default: '1.0.0-dev.20240826.7'
88

99
trigger:
1010
branches:

tools/apiview/parsers/csharp-api-parser/CSharpAPIParser/TreeToken/CodeFileBuilder.cs

Lines changed: 5 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -119,13 +119,14 @@ public static void BuildInternalsVisibleToAttributes(List<ReviewLine> reviewLine
119119
!a.ConstructorArguments[0].Value?.ToString()?.Contains("DynamicProxyGenAssembly2") == true);
120120
if (assemblyAttributes != null && assemblyAttributes.Any())
121121
{
122-
reviewLines.Add(new ReviewLine()
122+
var internalVisibleLine = new ReviewLine()
123123
{
124124
LineId = "InternalsVisibleTo",
125125
Tokens = [
126126
ReviewToken.CreateStringLiteralToken("Exposes internals to:")
127127
]
128-
});
128+
};
129+
reviewLines.Add(internalVisibleLine);
129130

130131
foreach (AttributeData attribute in assemblyAttributes)
131132
{
@@ -146,6 +147,8 @@ public static void BuildInternalsVisibleToAttributes(List<ReviewLine> reviewLine
146147
}
147148
}
148149
}
150+
// Add an empty line after internals visible to section
151+
reviewLines.Add(new ReviewLine() { RelatedToLine = internalVisibleLine.LineId });
149152
}
150153
}
151154

tools/apiview/parsers/csharp-api-parser/CSharpAPIParserTests/CSharpAPIParserTests.csproj

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111

1212
<ItemGroup>
1313
<PackageReference Include="Azure.Core" Version="1.42.0" />
14+
<PackageReference Include="Azure.Security.Attestation" Version="1.0.0" />
1415
<PackageReference Include="Azure.Storage.Blobs" Version="12.21.2" />
1516
<PackageReference Include="Azure.Template" Version="1.0.3-beta.4055065" />
1617
<PackageReference Include="coverlet.collector" Version="6.0.0" />

tools/apiview/parsers/csharp-api-parser/CSharpAPIParserTests/CodeFileTests.cs

Lines changed: 32 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,9 +43,9 @@ static CodeFileTests()
4343

4444
public static IEnumerable<object[]> CodeFiles => new List<object[]>
4545
{
46-
new object[] { templateCodeFile, "Azure.Template" , "1.0.3.0", 8},
47-
new object[] { storageCodeFile , "Azure.Storage.Blobs", "12.21.2.0", 14},
48-
new object[] { coreCodeFile, "Azure.Core", "1.42.0.0", 26},
46+
new object[] { templateCodeFile, "Azure.Template" , "1.0.3.0", 9},
47+
new object[] { storageCodeFile , "Azure.Storage.Blobs", "12.21.2.0", 15},
48+
new object[] { coreCodeFile, "Azure.Core", "1.42.0.0", 27},
4949
};
5050

5151
[Theory]
@@ -103,6 +103,7 @@ public void TestApiReviewLine()
103103
var classLine = namespaceLine.Children.Where(lines => lines.LineId == "Azure.Storage.Blobs.BlobServiceClient").FirstOrDefault();
104104
Assert.NotNull(classLine);
105105
var methodLine = classLine.Children.Where(lines => lines.LineId == "Azure.Storage.Blobs.BlobServiceClient.BlobServiceClient(System.String)").FirstOrDefault();
106+
Assert.NotNull(methodLine);
106107
Assert.Equal(7, methodLine.Tokens.Count());
107108
Assert.Equal("public BlobServiceClient(string connectionString);", methodLine.ToString().Trim());
108109
}
@@ -224,7 +225,7 @@ public static class TemplateClientBuilderExtensions {
224225
public void TestCodeFileJsonSchema(CodeFile codeFile)
225226
{
226227
//Verify JSON file generated for Azure.Template
227-
var isValid = validateSchema(templateCodeFile);
228+
var isValid = validateSchema(codeFile);
228229
Assert.True(isValid);
229230
}
230231

@@ -261,6 +262,7 @@ public void TestNavigationNodeHasRenderingClass()
261262
{
262263
var jsonString = JsonSerializer.Serialize(templateCodeFile);
263264
var parsedCodeFile = JsonSerializer.Deserialize<CodeFile>(jsonString);
265+
Assert.NotNull(parsedCodeFile);
264266
Assert.Equal(8, CountNavigationNodes(parsedCodeFile.ReviewLines));
265267
}
266268

@@ -317,5 +319,31 @@ private int CountHiddenApiInBlobDownloadInfo(List<ReviewLine> lines)
317319
}
318320
return count;
319321
}
322+
323+
[Fact]
324+
public void VerifyObsoleteMemberIsHidden()
325+
{
326+
var attestationAssembly = Assembly.Load("Azure.Security.Attestation");
327+
var dllStream = attestationAssembly.GetFile("Azure.Security.Attestation.dll");
328+
var assemblySymbol = CompilationFactory.GetCompilation(dllStream, null);
329+
var codeFile = new CSharpAPIParser.TreeToken.CodeFileBuilder().Build(assemblySymbol, true, null);
330+
331+
var lines = codeFile.ReviewLines;
332+
var namespaceLine = lines.Where(lines => lines.LineId == "Azure.Security.Attestation").FirstOrDefault();
333+
Assert.NotNull(namespaceLine);
334+
var classLine = namespaceLine.Children.Where(lines => lines.LineId == "Azure.Security.Attestation.AttestationResult").FirstOrDefault();
335+
Assert.NotNull(classLine);
336+
337+
var obsoleteMethods = classLine.Children.Where(line => line.ToString().StartsWith("[Obsolete("));
338+
Assert.NotEmpty(obsoleteMethods);
339+
//Make sure member lines are marked as hidden if it has obsolete attribute
340+
foreach (var method in obsoleteMethods)
341+
{
342+
Assert.True(method.IsHidden);
343+
Assert.NotNull(method.RelatedToLine);
344+
var relatedLine = classLine.Children.Where(line => line.LineId == method.RelatedToLine).FirstOrDefault();
345+
Assert.True(relatedLine?.IsHidden);
346+
}
347+
}
320348
}
321349
}

0 commit comments

Comments
 (0)