Skip to content

Commit 44d3035

Browse files
committed
Validate unused contract properties
1 parent 8bb70e7 commit 44d3035

108 files changed

Lines changed: 961 additions & 487 deletions

File tree

Some content is hidden

Large Commits have some content hidden by default. Use the searchbox below for content that may be hidden.

src/Dibix.Sdk/CodeGeneration/Model/ActionDefinitionResolver.cs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -6,13 +6,15 @@ namespace Dibix.Sdk.CodeGeneration
66
internal abstract class ActionDefinitionResolver
77
{
88
#region Properties
9+
protected ISchemaDefinitionResolver SchemaDefinitionResolver { get; }
910
protected ISchemaRegistry SchemaRegistry { get; }
1011
protected ILogger Logger { get; }
1112
#endregion
1213

1314
#region Constructor
14-
protected ActionDefinitionResolver(ISchemaRegistry schemaRegistry, ILogger logger)
15+
protected ActionDefinitionResolver(ISchemaDefinitionResolver schemaDefinitionResolver, ISchemaRegistry schemaRegistry, ILogger logger)
1516
{
17+
this.SchemaDefinitionResolver = schemaDefinitionResolver;
1618
this.SchemaRegistry = schemaRegistry;
1719
this.Logger = logger;
1820
}
@@ -57,7 +59,7 @@ protected bool IsParameterRequired(TypeReference type, ActionParameterLocation l
5759
switch (location)
5860
{
5961
case ActionParameterLocation.Query:
60-
return defaultValue == null && Equals(type?.IsUserDefinedType(this.SchemaRegistry), false);
62+
return defaultValue == null && Equals(type?.IsUserDefinedType(this.SchemaDefinitionResolver), false);
6163

6264
case ActionParameterLocation.Header:
6365
return defaultValue == null;

src/Dibix.Sdk/CodeGeneration/Model/ActionDefinitionResolverFacade.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,5 @@
11
using System.Collections.Generic;
22
using System.Collections.ObjectModel;
3-
using Dibix.Sdk.CodeGeneration.Model;
43

54
namespace Dibix.Sdk.CodeGeneration
65
{
@@ -18,14 +17,15 @@ string productName
1817
, IExternalSchemaResolver externalSchemaResolver
1918
, ReferencedAssemblyInspector referencedAssemblyInspector
2019
, LockEntryManager lockEntryManager
20+
, ISchemaDefinitionResolver schemaDefinitionResolver
2121
, ISchemaRegistry schemaRegistry
2222
, ILogger logger
2323
)
2424
{
2525
this._logger = logger;
2626
this._resolvers = new Collection<ActionDefinitionResolver>
2727
{
28-
new ExternalReflectionTargetActionDefinitionResolver(schemaRegistry, lockEntryManager, logger)
28+
new ExternalReflectionTargetActionDefinitionResolver(schemaDefinitionResolver, schemaRegistry, lockEntryManager, logger)
2929
, new SqlStatementDefinitionActionDefinitionResolver
3030
(
3131
productName
@@ -34,6 +34,7 @@ string productName
3434
, sqlStatementDefinitionProvider
3535
, externalSchemaResolver
3636
, referencedAssemblyInspector
37+
, schemaDefinitionResolver
3738
, schemaRegistry
3839
, logger
3940
)

src/Dibix.Sdk/CodeGeneration/Model/ActionParameterPropertySource.cs

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@ internal sealed class ActionParameterPropertySource : ActionParameterSource
1111
public int Line { get; }
1212
public int Column { get; }
1313
public string Converter { get; set; }
14+
public ICollection<ActionParameterPropertySourceNode> Nodes { get; }
1415
public ICollection<ActionParameterItemSource> ItemSources { get; }
1516

1617
internal ActionParameterPropertySource(ActionParameterSourceDefinition definition, string propertyName, string filePath, int line, int column)
@@ -20,6 +21,7 @@ internal ActionParameterPropertySource(ActionParameterSourceDefinition definitio
2021
this.FilePath = filePath;
2122
this.Line = line;
2223
this.Column = column;
24+
this.Nodes = new Collection<ActionParameterPropertySourceNode>();
2325
this.ItemSources = new Collection<ActionParameterItemSource>();
2426
}
2527
}
Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,14 @@
1+
namespace Dibix.Sdk.CodeGeneration
2+
{
3+
internal sealed class ActionParameterPropertySourceNode
4+
{
5+
public ObjectSchema Schema { get; }
6+
public ObjectSchemaProperty Property { get; }
7+
8+
public ActionParameterPropertySourceNode(ObjectSchema schema, ObjectSchemaProperty property)
9+
{
10+
this.Schema = schema;
11+
this.Property = property;
12+
}
13+
}
14+
}

src/Dibix.Sdk/CodeGeneration/Model/BuiltInSchemaProvider.cs

Lines changed: 6 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -1,9 +1,11 @@
11
using System.Collections.Generic;
22

3-
namespace Dibix.Sdk.CodeGeneration.Model
3+
namespace Dibix.Sdk.CodeGeneration
44
{
55
internal sealed class BuiltInSchemaProvider : ISchemaProvider
66
{
7+
private const string Source = "<internal>";
8+
79
public static SchemaDefinition FileEntitySchema { get; } = CollectFileEntitySchema();
810
public IEnumerable<SchemaDefinition> Schemas
911
{
@@ -19,9 +21,9 @@ private static SchemaDefinition CollectFileEntitySchema()
1921
{
2022
Properties =
2123
{
22-
new ObjectSchemaProperty("Type", new PrimitiveTypeReference(PrimitiveType.String, isNullable: false, isEnumerable: false, source: default, line: default, column: default))
23-
, new ObjectSchemaProperty("Data", new PrimitiveTypeReference(PrimitiveType.Binary, isNullable: false, isEnumerable: false, source: default, line: default, column: default))
24-
, new ObjectSchemaProperty("FileName", new PrimitiveTypeReference(PrimitiveType.String, isNullable: false, isEnumerable: false, source: default, line: default, column: default))
24+
new ObjectSchemaProperty(name: new Token<string>("Type", Source, line: default, column: default), new PrimitiveTypeReference(PrimitiveType.String, isNullable: false, isEnumerable: false, source: default, line: default, column: default))
25+
, new ObjectSchemaProperty(name: new Token<string>("Data", Source, line: default, column: default), new PrimitiveTypeReference(PrimitiveType.Binary, isNullable: false, isEnumerable: false, source: default, line: default, column: default))
26+
, new ObjectSchemaProperty(name: new Token<string>("FileName", Source, line: default, column: default), new PrimitiveTypeReference(PrimitiveType.String, isNullable: false, isEnumerable: false, source: default, line: default, column: default))
2527
}
2628
};
2729
return schema;

src/Dibix.Sdk/CodeGeneration/Model/CodeGenerationModelLoader.cs

Lines changed: 6 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4-
using Dibix.Sdk.CodeGeneration.Model;
54
using Dibix.Sdk.Sql;
65
using Microsoft.SqlServer.Dac.Model;
76

@@ -12,7 +11,6 @@ internal static class CodeGenerationModelLoader
1211
public static CodeGenerationModel Create
1312
(
1413
string projectName
15-
, string projectDirectory
1614
, string productName
1715
, string areaName
1816
, string title
@@ -22,18 +20,19 @@ string projectName
2220
, string outputDirectory
2321
, string defaultOutputName
2422
, string clientOutputName
25-
, string externalAssemblyReferenceDirectory
2623
, ICollection<TaskItem> source
2724
, IEnumerable<TaskItem> contracts
2825
, IEnumerable<TaskItem> endpoints
29-
, IEnumerable<TaskItem> references
3026
, IEnumerable<TaskItem> defaultSecuritySchemes
3127
, bool isEmbedded
3228
, bool enableExperimentalFeatures
3329
, string databaseSchemaProviderName
3430
, string modelCollation
3531
, ICollection<TaskItem> sqlReferencePath
3632
, ISchemaRegistry schemaRegistry
33+
, IExternalSchemaResolver externalSchemaResolver
34+
, ISchemaDefinitionResolver schemaDefinitionResolver
35+
, DefaultAssemblyResolver assemblyResolver
3736
, IActionParameterSourceRegistry actionParameterSourceRegistry
3837
, IActionParameterConverterRegistry actionParameterConverterRegistry
3938
, LockEntryManager lockEntryManager
@@ -48,7 +47,6 @@ string projectName
4847
ICollection<string> normalizedSources = source.Select(x => x.GetFullPath()).ToArray();
4948
IEnumerable<string> normalizedContracts = contracts.Select(x => x.GetFullPath());
5049
IEnumerable<string> normalizedEndpoints = endpoints.Select(x => x.GetFullPath());
51-
ICollection<string> normalizedReferences = references.Select(x => x.GetFullPath()).ToArray();
5250
ICollection<string> normalizedDefaultSecuritySchemes = defaultSecuritySchemes.Select(x => x.ItemSpec).ToArray();
5351

5452
CodeGenerationModel model = new CodeGenerationModel
@@ -67,7 +65,6 @@ string projectName
6765
EnableExperimentalFeatures = enableExperimentalFeatures
6866
};
6967

70-
DefaultAssemblyResolver assemblyResolver = new DefaultAssemblyResolver(projectDirectory, externalAssemblyReferenceDirectory, normalizedReferences);
7168
ITypeResolverFacade typeResolver = new TypeResolverFacade(assemblyResolver, schemaRegistry, logger);
7269

7370
// Currently only DML statements are included automatically
@@ -85,13 +82,12 @@ string projectName
8582
//ISchemaProvider externalSchemaProvider = new ExternalSchemaProvider(assemblyResolver);
8683
schemaRegistry.ImportSchemas(builtInSchemaProvider, contractDefinitionProvider, userDefinedTypeProvider/*, externalSchemaProvider*/);
8784

88-
IExternalSchemaResolver externalSchemaResolver = new ExternalSchemaResolver(assemblyResolver, schemaRegistry);
8985
typeResolver.Register(new ContractDefinitionSchemaTypeResolver(schemaRegistry, contractDefinitionProvider, externalSchemaResolver, assemblyResolver, assemblyResolver, logger, productName, areaName), 1);
9086
typeResolver.Register(new UserDefinedTypeSchemaTypeResolver(schemaRegistry, userDefinedTypeProvider, externalSchemaResolver, assemblyResolver, logger), 2);
9187

92-
ISqlStatementDefinitionProvider sqlStatementDefinitionProvider = new SqlStatementDefinitionProvider(projectName, isEmbedded, analyzeAlways: true, rootNamespace, productName, areaName, parser, formatter, typeResolver, schemaRegistry, logger, normalizedSources, modelAccessor);
93-
IActionDefinitionResolverFacade actionResolver = new ActionDefinitionResolverFacade(productName, areaName, className, sqlStatementDefinitionProvider, externalSchemaResolver, assemblyResolver, lockEntryManager, schemaRegistry, logger);
94-
IControllerDefinitionProvider controllerDefinitionProvider = new ControllerDefinitionProvider(normalizedEndpoints, normalizedDefaultSecuritySchemes, securitySchemeMap, actionResolver, typeResolver, schemaRegistry, actionParameterSourceRegistry, actionParameterConverterRegistry, lockEntryManager, fileSystemProvider, logger);
88+
ISqlStatementDefinitionProvider sqlStatementDefinitionProvider = new SqlStatementDefinitionProvider(projectName, isEmbedded, analyzeAlways: true, rootNamespace, productName, areaName, parser, formatter, typeResolver, schemaRegistry, schemaDefinitionResolver, logger, normalizedSources, modelAccessor);
89+
IActionDefinitionResolverFacade actionResolver = new ActionDefinitionResolverFacade(productName, areaName, className, sqlStatementDefinitionProvider, externalSchemaResolver, assemblyResolver, lockEntryManager, schemaDefinitionResolver, schemaRegistry, logger);
90+
IControllerDefinitionProvider controllerDefinitionProvider = new ControllerDefinitionProvider(normalizedEndpoints, normalizedDefaultSecuritySchemes, securitySchemeMap, actionResolver, typeResolver, schemaDefinitionResolver, actionParameterSourceRegistry, actionParameterConverterRegistry, lockEntryManager, fileSystemProvider, logger);
9591

9692
schemaRegistry.ImportSchemas(sqlStatementDefinitionProvider);
9793

src/Dibix.Sdk/CodeGeneration/Model/ContractDefinitionProvider.cs

Lines changed: 3 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -158,7 +158,9 @@ private void ReadObjectContract(NamespacePath rootNamespace, NamespacePath curre
158158
defaultValue = JsonValueReferenceParser.Parse(type, defaultValueJson, filePath, defaultValueLocation, Logger);
159159
}
160160

161-
ObjectSchemaProperty objectSchemaProperty = new ObjectSchemaProperty(property.Name, type, defaultValue, serializationBehavior, dateTimeKind, isPartOfKey, isOptional, isDiscriminator, isObfuscated, isRelativeHttpsUrl);
161+
IJsonLineInfo propertyLineInfo = property.GetLineInfo();
162+
Token<string> propertyName = new Token<string>(property.Name, filePath, propertyLineInfo.LineNumber, propertyLineInfo.LinePosition);
163+
ObjectSchemaProperty objectSchemaProperty = new ObjectSchemaProperty(propertyName, type, defaultValue, serializationBehavior, dateTimeKind, isPartOfKey, isOptional, isDiscriminator, isObfuscated, isRelativeHttpsUrl);
162164
contract.Properties.Add(objectSchemaProperty);
163165
}
164166
}

src/Dibix.Sdk/CodeGeneration/Model/ContractDefinitionSchemaTypeResolver.cs

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,7 +1,6 @@
11
using System;
22
using System.Collections.Generic;
33
using System.Linq;
4-
using Dibix.Sdk.CodeGeneration.Model;
54

65
namespace Dibix.Sdk.CodeGeneration
76
{

0 commit comments

Comments
 (0)