Skip to content

Commit 93f46f0

Browse files
committed
feat: enables null reference types for the library
Signed-off-by: Vincent Biret <vibiret@microsoft.com>
1 parent 9029a2f commit 93f46f0

22 files changed

+575
-510
lines changed

.editorconfig

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -3,3 +3,6 @@
33
# IDE0009: Member access should be qualified.
44
dotnet_diagnostic.IDE0009.severity = none
55
dotnet_diagnostic.CA2016.severity = warning
6+
7+
[*.cs]
8+
dotnet_public_api_analyzer.require_api_files = true

src/Microsoft.OpenApi.OData.Reader/Edm/EdmAnnotationExtensions.cs

Lines changed: 46 additions & 49 deletions
Large diffs are not rendered by default.

src/Microsoft.OpenApi.OData.Reader/Edm/EdmModelExtensions.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -73,16 +73,16 @@ private static bool IsUrlEscapeFunction(this IEdmModel model, IEdmFunction funct
7373
/// </summary>
7474
/// <param name="model">The Edm model.</param>
7575
/// <returns>The dictionary.</returns>
76-
public static IDictionary<IEdmEntityType, IList<IEdmNavigationSource>> LoadAllNavigationSources(this IEdmModel model)
76+
public static Dictionary<IEdmEntityType, IList<IEdmNavigationSource>> LoadAllNavigationSources(this IEdmModel model)
7777
{
7878
var navigationSourceDic = new Dictionary<IEdmEntityType, IList<IEdmNavigationSource>>();
7979
if (model != null && model.EntityContainer != null)
8080
{
8181
Action<IEdmNavigationSource, IDictionary<IEdmEntityType, IList<IEdmNavigationSource>>> action = (ns, dic) =>
8282
{
83-
if (!dic.TryGetValue(ns.EntityType, out IList<IEdmNavigationSource> value))
83+
if (!dic.TryGetValue(ns.EntityType, out var value))
8484
{
85-
value = new List<IEdmNavigationSource>();
85+
value = [];
8686
dic[ns.EntityType] = value;
8787
}
8888

@@ -96,9 +96,9 @@ public static IDictionary<IEdmEntityType, IList<IEdmNavigationSource>> LoadAllNa
9696
}
9797

9898
// singleton
99-
foreach (var singelton in model.EntityContainer.Singletons())
99+
foreach (var singleton in model.EntityContainer.Singletons())
100100
{
101-
action(singelton, navigationSourceDic);
101+
action(singleton, navigationSourceDic);
102102
}
103103
}
104104

src/Microsoft.OpenApi.OData.Reader/Edm/ODataKeySegment.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -45,7 +45,7 @@ public ODataKeySegment(IEdmEntityType entityType, IDictionary<string, string> ke
4545
/// <summary>
4646
/// Gets the key/template mappings.
4747
/// </summary>
48-
public IDictionary<string, string> KeyMappings { get; }
48+
public IDictionary<string, string>? KeyMappings { get; }
4949

5050
/// <inheritdoc />
5151
public override IEdmEntityType EntityType { get; }

src/Microsoft.OpenApi.OData.Reader/Edm/ODataOperationSegment.cs

Lines changed: 8 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -77,12 +77,12 @@ public ODataOperationSegment(IEdmOperation operation, bool isEscapedFunction, IE
7777
/// <summary>
7878
/// Gets the parameter mappings.
7979
/// </summary>
80-
public IDictionary<string, string> ParameterMappings { get; }
80+
public IDictionary<string, string>? ParameterMappings { get; }
8181

8282
/// <summary>
8383
/// Gets the operation.
8484
/// </summary>
85-
public IEdmOperation Operation { get; }
85+
public IEdmOperation? Operation { get; }
8686

8787
/// <summary>
8888
/// Gets the is escaped function.
@@ -93,19 +93,19 @@ public ODataOperationSegment(IEdmOperation operation, bool isEscapedFunction, IE
9393
public override ODataSegmentKind Kind => ODataSegmentKind.Operation;
9494

9595
/// <inheritdoc />
96-
public override string Identifier { get => Operation.Name; }
96+
public override string? Identifier { get => Operation?.Name; }
9797

9898
/// <inheritdoc />
99-
public override IEdmEntityType EntityType => null;
99+
public override IEdmEntityType? EntityType => null;
100100

101101
/// <inheritdoc />
102102
public override string GetPathItemName(OpenApiConvertSettings settings, HashSet<string> parameters)
103103
{
104104
Utils.CheckArgumentNull(settings, nameof(settings));
105105

106-
if (Operation.IsFunction())
106+
if (Operation is IEdmFunction function)
107107
{
108-
return FunctionName(Operation as IEdmFunction, settings, parameters);
108+
return FunctionName(function, settings, parameters);
109109
}
110110

111111
return OperationName(Operation, settings);
@@ -115,9 +115,8 @@ internal IDictionary<string, string> GetNameMapping(OpenApiConvertSettings setti
115115
{
116116
IDictionary<string, string> parameterNamesMapping = new Dictionary<string, string>();
117117

118-
if (Operation.IsFunction())
118+
if (Operation is IEdmFunction function)
119119
{
120-
IEdmFunction function = Operation as IEdmFunction;
121120
if (settings.EnableUriEscapeFunctionCall && IsEscapedFunction)
122121
{
123122
string parameterName = function.Parameters.Last().Name;
@@ -192,7 +191,7 @@ private string FunctionName(IEdmFunction function, OpenApiConvertSettings settin
192191
/// <inheritdoc />
193192
public override IEnumerable<IEdmVocabularyAnnotatable> GetAnnotables()
194193
{
195-
return new IEdmVocabularyAnnotatable[] { Operation };
194+
return Operation is null ? [] : [Operation];
196195
}
197196
}
198197
}

src/Microsoft.OpenApi.OData.Reader/Edm/ODataPathProvider.cs

Lines changed: 19 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -19,17 +19,17 @@ namespace Microsoft.OpenApi.OData.Edm
1919
/// </summary>
2020
public class ODataPathProvider : IODataPathProvider
2121
{
22-
private IDictionary<IEdmEntityType, IList<IEdmNavigationSource>> _allNavigationSources;
22+
private Dictionary<IEdmEntityType, IList<IEdmNavigationSource>>? _allNavigationSources;
2323

24-
private IDictionary<IEdmEntityType, IList<ODataPath>> _allNavigationSourcePaths =
24+
private readonly IDictionary<IEdmEntityType, IList<ODataPath>> _allNavigationSourcePaths =
2525
new Dictionary<IEdmEntityType, IList<ODataPath>>();
2626

27-
private IDictionary<IEdmEntityType, IList<ODataPath>> _allNavigationPropertyPaths =
27+
private readonly IDictionary<IEdmEntityType, IList<ODataPath>> _allNavigationPropertyPaths =
2828
new Dictionary<IEdmEntityType, IList<ODataPath>>();
2929

30-
private IList<ODataPath> _allOperationPaths = new List<ODataPath>();
30+
private readonly List<ODataPath> _allOperationPaths = [];
3131

32-
private IEdmModel _model;
32+
private IEdmModel? _model;
3333

3434
private readonly IDictionary<IEdmEntityType, IList<ODataPath>> _dollarCountPaths =
3535
new Dictionary<IEdmEntityType, IList<ODataPath>>();
@@ -52,7 +52,7 @@ public virtual IEnumerable<ODataPath> GetPaths(IEdmModel model, OpenApiConvertSe
5252
{
5353
if (model == null || model.EntityContainer == null)
5454
{
55-
return Enumerable.Empty<ODataPath>();
55+
return [];
5656
}
5757

5858
Initialize(model);
@@ -734,7 +734,7 @@ private void CreateTypeCastPaths(ODataPath currentPath, OpenApiConvertSettings c
734734
if(!convertSettings.EnableODataTypeCast)
735735
return;
736736

737-
var annotedTypeNames = GetDerivedTypeConstaintTypeNames(annotable);
737+
var annotedTypeNames = GetDerivedTypeConstraintTypeNames(annotable);
738738

739739
if(!annotedTypeNames.Any() && convertSettings.RequireDerivedTypesConstraintForODataTypeCastSegments)
740740
return; // we don't want to generate any downcast path item if there is no type cast annotation.
@@ -1099,11 +1099,11 @@ private bool HasUnsatisfiedDerivedTypeConstraint(
10991099
OpenApiConvertSettings convertSettings)
11001100
{
11011101
return convertSettings.RequireDerivedTypesConstraintForBoundOperations &&
1102-
!GetDerivedTypeConstaintTypeNames(annotatable)
1102+
!GetDerivedTypeConstraintTypeNames(annotatable)
11031103
.Any(c => c.Equals(baseType.FullName(), StringComparison.OrdinalIgnoreCase));
11041104
}
1105-
private IEnumerable<string> GetDerivedTypeConstaintTypeNames(IEdmVocabularyAnnotatable annotatable) =>
1106-
_model.GetCollection(annotatable, "Org.OData.Validation.V1.DerivedTypeConstraint") ?? Enumerable.Empty<string>();
1105+
private IEnumerable<string> GetDerivedTypeConstraintTypeNames(IEdmVocabularyAnnotatable annotatable) =>
1106+
_model?.GetCollection(annotatable, "Org.OData.Validation.V1.DerivedTypeConstraint") ?? [];
11071107

11081108
private void AppendBoundOperationOnDerivedNavigationPropertyPath(
11091109
IEdmOperation edmOperation,
@@ -1112,11 +1112,11 @@ private void AppendBoundOperationOnDerivedNavigationPropertyPath(
11121112
OpenApiConvertSettings convertSettings)
11131113
{
11141114
if (!convertSettings.AppendBoundOperationsOnDerivedTypeCastSegments) return;
1115-
bool isEscapedFunction = _model.IsUrlEscapeFunction(edmOperation);
1115+
bool isEscapedFunction = _model?.IsUrlEscapeFunction(edmOperation) ?? false;
11161116

11171117
foreach (var baseType in bindingEntityType.FindAllBaseTypes())
11181118
{
1119-
if (_allNavigationPropertyPaths.TryGetValue(baseType, out IList<ODataPath> paths))
1119+
if (_allNavigationPropertyPaths.TryGetValue(baseType, out var paths))
11201120
{
11211121
foreach (var path in paths.Where(x => !_pathKindToSkipForNavigationProperties.Contains(x.Kind)))
11221122
{
@@ -1126,7 +1126,7 @@ private void AppendBoundOperationOnDerivedNavigationPropertyPath(
11261126
continue;
11271127
}
11281128

1129-
if (!EdmModelHelper.IsOperationAllowed(_model, edmOperation, npSegment.NavigationProperty, npSegment.NavigationProperty.ContainsTarget))
1129+
if (_model is not null && !EdmModelHelper.IsOperationAllowed(_model, edmOperation, npSegment.NavigationProperty, npSegment.NavigationProperty.ContainsTarget))
11301130
{
11311131
continue;
11321132
}
@@ -1173,7 +1173,7 @@ private void AppendBoundOperationOnDerivedNavigationPropertyPath(
11731173

11741174
private void AppendBoundOperationOnOperationPath(IEdmOperation edmOperation, bool isCollection, IEdmEntityType bindingEntityType)
11751175
{
1176-
bool isEscapedFunction = _model.IsUrlEscapeFunction(edmOperation);
1176+
bool isEscapedFunction = _model?.IsUrlEscapeFunction(edmOperation) ?? false;
11771177

11781178
// only composable functions
11791179
var paths = _allOperationPaths.Where(x => x.LastSegment is ODataOperationSegment operationSegment
@@ -1187,7 +1187,7 @@ private void AppendBoundOperationOnOperationPath(IEdmOperation edmOperation, boo
11871187
|| operationSegment.Operation is not IEdmFunction edmFunction || !edmFunction.IsComposable
11881188
|| edmFunction.ReturnType == null || !edmFunction.ReturnType.Definition.Equals(bindingEntityType)
11891189
|| isCollection
1190-
|| !EdmModelHelper.IsOperationAllowed(_model, edmOperation, operationSegment.Operation, true))
1190+
|| _model is not null && !EdmModelHelper.IsOperationAllowed(_model, edmOperation, operationSegment.Operation, true))
11911191
{
11921192
continue;
11931193
}
@@ -1199,7 +1199,10 @@ private void AppendBoundOperationOnOperationPath(IEdmOperation edmOperation, boo
11991199
}
12001200

12011201
ODataPath newOperationPath = path.Clone();
1202-
newOperationPath.Push(new ODataOperationSegment(edmOperation, isEscapedFunction, _model));
1202+
if (_model is not null)
1203+
{
1204+
newOperationPath.Push(new ODataOperationSegment(edmOperation, isEscapedFunction, _model));
1205+
}
12031206
AppendPath(newOperationPath);
12041207
}
12051208
}

src/Microsoft.OpenApi.OData.Reader/Edm/ODataSegment.cs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -105,15 +105,15 @@ public abstract class ODataSegment
105105
/// <returns>The path item name.</returns>
106106
public string GetPathItemName(OpenApiConvertSettings settings)
107107
{
108-
return GetPathItemName(settings, new HashSet<string>());
108+
return GetPathItemName(settings, []);
109109
}
110110
/// <summary>
111111
/// Provides a suffix for the operation id based on the operation path.
112112
/// </summary>
113113
/// <param name="path">Path to use to deduplicate.</param>
114114
/// <param name="settings">The settings.</param>
115115
///<returns>The suffix.</returns>
116-
public string GetPathHash(OpenApiConvertSettings settings, ODataPath path = default)
116+
public string GetPathHash(OpenApiConvertSettings settings, ODataPath? path = default)
117117
{
118118
var suffix = string.Join("/", path?.Segments.Select(x => x.Identifier).Distinct() ?? Enumerable.Empty<string>());
119119
return (GetPathItemName(settings) + suffix).GetHashSHA256().Substring(0, 4);

0 commit comments

Comments
 (0)