Skip to content

Commit a3aa3ba

Browse files
Disable experimental warning for MrwContext types. (#51374)
* Disable experimental warning for MrwContext types. * pr fb * pr fb * add ifdef * fix ifdef * fix ifdef * WIP * Upgrade compiler library * 4.12 * collections and more tests * using * using * PR fb * Add version override * Add version override * pr fb
1 parent c57c6c5 commit a3aa3ba

File tree

9 files changed

+604
-22
lines changed

9 files changed

+604
-22
lines changed

sdk/core/System.ClientModel/gen/Model/TypeRef.cs

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -13,7 +13,8 @@ public TypeRef(
1313
TypeRef? containingContext,
1414
TypeRef? itemType = default,
1515
int arrayRank = 0,
16-
ObsoleteLevel obsoleteLevel = ObsoleteLevel.None)
16+
ObsoleteLevel obsoleteLevel = ObsoleteLevel.None,
17+
string? experimentalDiagnosticId = null)
1718
{
1819
Name = name;
1920
Namespace = nameSpace;
@@ -22,6 +23,7 @@ public TypeRef(
2223
ArrayRank = arrayRank;
2324
FullyQualifiedName = fullyQualifiedName;
2425
ObsoleteLevel = obsoleteLevel;
26+
ExperimentalDiagnosticId = experimentalDiagnosticId;
2527
ContainingContext = containingContext;
2628
}
2729

@@ -32,6 +34,7 @@ public TypeRef(
3234
public int ArrayRank { get; }
3335
public string FullyQualifiedName { get; }
3436
public ObsoleteLevel ObsoleteLevel { get; init; }
37+
public string? ExperimentalDiagnosticId { get; }
3538
public TypeRef? ContainingContext { get; }
3639

3740
private string? _typeCaseName;

sdk/core/System.ClientModel/gen/ModelReaderWriterContextGenerator.Emitter.cs

Lines changed: 27 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ private void EmitContextClass(ModelReaderWriterContextGenerationSpec contextGene
102102
indent++;
103103
foreach (var modelInfo in contextGenerationSpec.TypeBuilders)
104104
{
105-
WrapInSuppress(modelInfo.Type.ObsoleteLevel, builder, () =>
105+
WrapInSuppress(modelInfo.Type, builder, () =>
106106
{
107107
builder.Append(indent, $"_typeBuilderFactories.Add(typeof({modelInfo.Type.FullyQualifiedName}), () => ");
108108
if (ShouldGenerateAsLocal(contextGenerationSpec, modelInfo))
@@ -315,7 +315,7 @@ private static void EmitReadOnlyMemoryBuilder(
315315
{
316316
var elementType = modelInfo.Type.ItemType!;
317317

318-
WrapInSuppress(elementType.ObsoleteLevel, builder, () =>
318+
WrapInSuppress(elementType, builder, () =>
319319
{
320320
builder.Append(indent, "protected override ");
321321
builder.AppendType(typeof(Type));
@@ -377,7 +377,7 @@ private static void EmitMultiDimensionalArrayBuilder(
377377
{
378378
var elementType = modelInfo.Type.ItemType!;
379379

380-
WrapInSuppress(elementType.ObsoleteLevel, builder, () =>
380+
WrapInSuppress(elementType, builder, () =>
381381
{
382382
builder.Append(indent, "protected override ");
383383
builder.AppendType(typeof(Type));
@@ -441,7 +441,7 @@ private static void EmitArrayBuilder(
441441
TypeBuilderSpec modelInfo)
442442
{
443443
var elementType = modelInfo.Type.ItemType!;
444-
WrapInSuppress(elementType.ObsoleteLevel, builder, () =>
444+
WrapInSuppress(elementType, builder, () =>
445445
{
446446
builder.Append(indent, "protected override ");
447447
builder.AppendType(typeof(Type));
@@ -484,7 +484,7 @@ private static void EmitDictionaryBuilder(
484484
{
485485
var elementType = modelInfo.Type.ItemType!;
486486

487-
WrapInSuppress(elementType.ObsoleteLevel, builder, () =>
487+
WrapInSuppress(elementType, builder, () =>
488488
{
489489
builder.Append(indent, "protected override ");
490490
builder.AppendType(typeof(Type));
@@ -513,7 +513,7 @@ private static void EmitListBuilder(
513513
{
514514
var elementType = modelInfo.Type.ItemType!;
515515

516-
WrapInSuppress(elementType.ObsoleteLevel, builder, () =>
516+
WrapInSuppress(elementType, builder, () =>
517517
{
518518
builder.Append(indent, "protected override ");
519519
builder.AppendType(typeof(Type));
@@ -541,7 +541,7 @@ private static void EmitPersistableModelBuilder(
541541
TypeBuilderSpec modelInfo,
542542
TypeRef context)
543543
{
544-
WrapInSuppress(modelInfo.Type.ObsoleteLevel, builder, () => {
544+
WrapInSuppress(modelInfo.Type, builder, () => {
545545
builder.Append(indent, "protected override ");
546546
builder.AppendType(typeof(Type));
547547
builder.AppendLine($" BuilderType => typeof({modelInfo.Type.FullyQualifiedName});");
@@ -550,31 +550,42 @@ private static void EmitPersistableModelBuilder(
550550

551551
if (modelInfo.PersistableModelProxy is not null)
552552
{
553-
WrapInSuppress(modelInfo.PersistableModelProxy.ObsoleteLevel, builder, () =>
553+
WrapInSuppress(modelInfo.PersistableModelProxy, builder, () =>
554554
builder.AppendLine(indent, $"protected override object CreateInstance() => new {modelInfo.PersistableModelProxy.FullyQualifiedName}();"));
555555
}
556556
else
557557
{
558-
WrapInSuppress(modelInfo.Type.ObsoleteLevel, builder, () =>
558+
WrapInSuppress(modelInfo.Type, builder, () =>
559559
builder.AppendLine(indent, $"protected override object CreateInstance() => new {modelInfo.Type.FullyQualifiedName}();"));
560560
}
561561
}
562562

563563
/// <summary>
564564
/// Helper method to wrap the action in #pragma warning disable CS0618 and #pragma warning restore CS0618.
565-
/// This is needed if MRW is used with a type that is marked as Obsolete, but not marked as an error.
565+
/// This is needed if MRW is used with a type that is marked as Obsolete, but not marked as an error. It is also
566+
/// used for types that have an experimental diagnostic ID.
566567
/// </summary>
567-
private static void WrapInSuppress(ObsoleteLevel level, StringBuilder builder, Action action)
568+
private static void WrapInSuppress(TypeRef typeRef, StringBuilder builder, Action action)
568569
{
569-
if (level == ObsoleteLevel.None)
570+
if (typeRef.ObsoleteLevel != ObsoleteLevel.None)
570571
{
571-
action();
572-
return;
572+
builder.AppendLine("#pragma warning disable CS0618");
573+
}
574+
if (typeRef.ExperimentalDiagnosticId != null)
575+
{
576+
builder.AppendLine($"#pragma warning disable {typeRef.ExperimentalDiagnosticId}");
573577
}
574578

575-
builder.AppendLine("#pragma warning disable CS0618");
576579
action();
577-
builder.AppendLine("#pragma warning restore CS0618");
580+
581+
if (typeRef.ExperimentalDiagnosticId != null)
582+
{
583+
builder.AppendLine($"#pragma warning restore {typeRef.ExperimentalDiagnosticId}");
584+
}
585+
if (typeRef.ObsoleteLevel != ObsoleteLevel.None)
586+
{
587+
builder.AppendLine("#pragma warning restore CS0618");
588+
}
578589
}
579590

580591
private HashSet<string> GetNameSpaces(ModelReaderWriterContextGenerationSpec contextGenerationSpec)

sdk/core/System.ClientModel/gen/TypeSymbolTypeRefCache.cs

Lines changed: 37 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,8 @@ private TypeRef FromTypeSymbol(ITypeSymbol symbol, TypeSymbolKindCache symbolToK
3838
symbol.ToDisplayString(SymbolDisplayFormat.FullyQualifiedFormat),
3939
isContext ? null : GetContextType(symbol.ContainingAssembly, symbolToKindCache),
4040
itemType,
41-
obsoleteLevel: itemType is not null ? itemType.ObsoleteLevel : GetObsoleteLevel(symbol));
41+
obsoleteLevel: itemType is not null ? itemType.ObsoleteLevel : GetObsoleteLevel(symbol),
42+
experimentalDiagnosticId: itemType is not null ? itemType.ExperimentalDiagnosticId : GetExperimentalDiagnosticId(symbol));
4243
}
4344
else if (symbol is IArrayTypeSymbol arrayTypeSymbol)
4445
{
@@ -54,14 +55,48 @@ private TypeRef FromTypeSymbol(ITypeSymbol symbol, TypeSymbolKindCache symbolToK
5455
isContext ? null : GetContextType(assembly, symbolToKindCache),
5556
elementType,
5657
arrayTypeSymbol.Rank,
57-
obsoleteLevel: elementType.ObsoleteLevel);
58+
obsoleteLevel: elementType.ObsoleteLevel,
59+
experimentalDiagnosticId: elementType.ExperimentalDiagnosticId);
5860
}
5961
else
6062
{
6163
throw new NotSupportedException($"Unexpected type {symbol.GetType()}");
6264
}
6365
}
6466

67+
private static string? GetExperimentalDiagnosticId(ITypeSymbol symbol)
68+
{
69+
foreach (var attribute in symbol.GetAttributes())
70+
{
71+
if (attribute.AttributeClass is
72+
{
73+
Name: "ExperimentalAttribute",
74+
ContainingType: null,
75+
ContainingNamespace:
76+
{
77+
Name: "CodeAnalysis",
78+
ContainingNamespace:
79+
{
80+
Name: "Diagnostics",
81+
ContainingNamespace:
82+
{
83+
Name: "System",
84+
ContainingNamespace.IsGlobalNamespace: true
85+
}
86+
}
87+
}
88+
})
89+
{
90+
if (attribute.ConstructorArguments.Length > 0 &&
91+
attribute.ConstructorArguments[0].Value is string diagnosticId)
92+
{
93+
return diagnosticId;
94+
}
95+
}
96+
}
97+
return null;
98+
}
99+
65100
private IAssemblySymbol GetArrayAssembly(IArrayTypeSymbol arrayTypeSymbol)
66101
{
67102
while (arrayTypeSymbol.ElementType is IArrayTypeSymbol innerArray)
Lines changed: 40 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,40 @@
1+
// Copyright (c) Microsoft Corporation. All rights reserved.
2+
// Licensed under the MIT License.
3+
4+
using System.ClientModel.Primitives;
5+
using System.Diagnostics.CodeAnalysis;
6+
using System.Text.Json;
7+
8+
namespace System.ClientModel.Tests.Client.ModelReaderWriterTests.Models
9+
{
10+
#if NET8_0_OR_GREATER
11+
[Experimental("TEST001")]
12+
#endif
13+
public class ExperimentalModel : IJsonModel<ExperimentalModel>
14+
{
15+
public BinaryData Write(ModelReaderWriterOptions options)
16+
{
17+
throw new NotImplementedException();
18+
}
19+
20+
public ExperimentalModel? Create(BinaryData data, ModelReaderWriterOptions options)
21+
{
22+
throw new NotImplementedException();
23+
}
24+
25+
public string GetFormatFromOptions(ModelReaderWriterOptions options)
26+
{
27+
throw new NotImplementedException();
28+
}
29+
30+
public void Write(Utf8JsonWriter writer, ModelReaderWriterOptions options)
31+
{
32+
throw new NotImplementedException();
33+
}
34+
35+
public ExperimentalModel? Create(ref Utf8JsonReader reader, ModelReaderWriterOptions options)
36+
{
37+
throw new NotImplementedException();
38+
}
39+
}
40+
}

sdk/core/System.ClientModel/tests/client/ModelReaderWriter/TestClientModelReaderWriterContext.cs

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -24,6 +24,7 @@ public class TestClientModelReaderWriterContext : ModelReaderWriterContext
2424
private ResourceProviderData_Builder? _resourceProviderData_Builder;
2525
private UnknownBaseModel_Builder? _unknownBaseModel_Builder;
2626
private ModelY_Builder? _modelY_Builder;
27+
private ExperimentalModel_Builder? _experimentalModel_Builder;
2728

2829
protected override bool TryGetTypeBuilderCore(Type type, out ModelReaderWriterTypeBuilder? builder)
2930
{
@@ -37,6 +38,9 @@ protected override bool TryGetTypeBuilderCore(Type type, out ModelReaderWriterTy
3738
Type t when t == typeof(ResourceProviderData) => _resourceProviderData_Builder ??= new(),
3839
Type t when t == typeof(UnknownBaseModel) => _unknownBaseModel_Builder ??= new(),
3940
Type t when t == typeof(ModelY) => _modelY_Builder ??= new(),
41+
#pragma warning disable TEST001
42+
Type t when t == typeof(ExperimentalModel) => _experimentalModel_Builder ??= new ExperimentalModel_Builder(),
43+
#pragma warning restore TEST001
4044
_ => null
4145
};
4246
return builder is not null;
@@ -97,5 +101,14 @@ private class AvailabilitySetData_Builder : ModelReaderWriterTypeBuilder
97101

98102
protected override object CreateInstance() => new AvailabilitySetData();
99103
}
104+
105+
#pragma warning disable TEST001
106+
private class ExperimentalModel_Builder : ModelReaderWriterTypeBuilder
107+
{
108+
protected override Type BuilderType => typeof(ExperimentalModel);
109+
110+
protected override object CreateInstance() => new ExperimentalModel();
111+
}
112+
#pragma warning restore TEST001
100113
}
101114
}

sdk/core/System.ClientModel/tests/gen.unit/CompilationHelper.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -70,7 +70,6 @@ public static Compilation CreateCompilation(
7070
}
7171
}
7272

73-
parseOptions ??= s_defaultParseOptions;
7473
SyntaxTree[] syntaxTrees =
7574
[
7675
CSharpSyntaxTree.ParseText(source, parseOptions),

0 commit comments

Comments
 (0)