Skip to content

Commit 26bc157

Browse files
committed
Use C#9 Covariant return types feature for Clone() implementation for more type safety
1 parent 84e4ba4 commit 26bc157

65 files changed

Lines changed: 215 additions & 243 deletions

Some content is hidden

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

Orm/Xtensive.Orm.Tests.Sql/CloneTests.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -36,7 +36,7 @@ public void SetUp()
3636
public void SqlExpressionCloneTest()
3737
{
3838
SqlExpression e = SqlDml.Literal(1);
39-
SqlExpression eClone = (SqlExpression) e.Clone();
39+
SqlExpression eClone = e.Clone();
4040
Assert.AreNotEqual(e, eClone);
4141
Assert.AreEqual(e.NodeType, eClone.NodeType);
4242
}

Orm/Xtensive.Orm/Orm/Upgrade/Internals/CatalogCloner.cs

Lines changed: 9 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ private void CloneSchemas(Catalog newCatalog, Catalog source, Dictionary<string,
8484
private void CloneAssertions(Schema newSchema, Schema sourceSchema)
8585
{
8686
foreach (var assertion in sourceSchema.Assertions) {
87-
var newAssertion = newSchema.CreateAssertion(assertion.Name, (SqlExpression)assertion.Condition.Clone(), assertion.IsDeferrable, assertion.IsInitiallyDeferred);
87+
var newAssertion = newSchema.CreateAssertion(assertion.Name, assertion.Condition.Clone(), assertion.IsDeferrable, assertion.IsInitiallyDeferred);
8888
CopyDbName(newAssertion, assertion);
8989
}
9090
}
@@ -113,9 +113,9 @@ private void CloneDomains(Schema newSchema, Schema sourceSchema, Dictionary<Coll
113113
if (sourceDomain.Collation!=null)
114114
newDomain.Collation = collationsMap[sourceDomain.Collation];
115115
if (sourceDomain.DefaultValue!=null)
116-
newDomain.DefaultValue = (SqlExpression)sourceDomain.DefaultValue.Clone();
116+
newDomain.DefaultValue = sourceDomain.DefaultValue.Clone();
117117
foreach (var domainConstraint in sourceDomain.DomainConstraints) {
118-
var newConstraint = newDomain.CreateConstraint(domainConstraint.Name, (SqlExpression) domainConstraint.Condition.Clone());
118+
var newConstraint = newDomain.CreateConstraint(domainConstraint.Name, domainConstraint.Condition.Clone());
119119
CopyDbName(newConstraint, domainConstraint);
120120
}
121121
}
@@ -181,7 +181,7 @@ private void CloneTableColumns(Table newTable, Table sourceTable, Dictionary<Col
181181
CopyDbName(newColumn, sourceTableColumn);
182182

183183
if (sourceTableColumn.DefaultValue!=null)
184-
newColumn.DefaultValue = (SqlExpression) sourceTableColumn.DefaultValue.Clone();
184+
newColumn.DefaultValue = sourceTableColumn.DefaultValue.Clone();
185185

186186
var schema = newTable.Schema;
187187
if (sourceTableColumn.Collation!=null) {
@@ -196,7 +196,7 @@ private void CloneTableColumns(Table newTable, Table sourceTable, Dictionary<Col
196196
if (sourceTableColumn.Domain!=null)
197197
newColumn.Domain = schema.Domains[sourceTableColumn.Domain.Name];
198198
if (sourceTableColumn.Expression!=null)
199-
newColumn.Expression = (SqlExpression) sourceTableColumn.Expression.Clone();
199+
newColumn.Expression = sourceTableColumn.Expression.Clone();
200200
newColumn.IsNullable = sourceTableColumn.IsNullable;
201201
newColumn.IsPersisted = sourceTableColumn.IsPersisted;
202202
if (sourceTableColumn.SequenceDescriptor!=null)
@@ -251,7 +251,7 @@ private void CloneIndex(DataTable newTable, Index sourceIndex)
251251
ft.IsUnique = ftIndex.IsUnique;
252252
ft.UnderlyingUniqueIndex = ftIndex.UnderlyingUniqueIndex;
253253
if (ftIndex.Where!=null)
254-
ft.Where = (SqlExpression) ftIndex.Where.Clone();
254+
ft.Where = ftIndex.Where.Clone();
255255
ClonePartitionDescriptor(ft, sourceIndex);
256256
return;
257257
}
@@ -269,7 +269,7 @@ private void CloneIndex(DataTable newTable, Index sourceIndex)
269269
spatial.IsClustered = spatialIndex.IsClustered;
270270
spatial.IsUnique = spatialIndex.IsUnique;
271271
if (spatialIndex.Where!=null)
272-
spatial.Where = (SqlExpression) spatialIndex.Where.Clone();
272+
spatial.Where = spatialIndex.Where.Clone();
273273
ClonePartitionDescriptor(spatialIndex, sourceIndex);
274274
return;
275275
}
@@ -283,7 +283,7 @@ private void CloneIndex(DataTable newTable, Index sourceIndex)
283283
index.IsUnique = sourceIndex.IsUnique;
284284
index.IsClustered = sourceIndex.IsClustered;
285285
if (sourceIndex.Where!=null)
286-
index.Where = (SqlExpression) sourceIndex.Where.Clone();
286+
index.Where = sourceIndex.Where.Clone();
287287
index.NonkeyColumns.AddRange(GetNonKeyColumns(newTable, sourceIndex));
288288
index.IsBitmap = sourceIndex.IsBitmap;
289289
ClonePartitionDescriptor(index, sourceIndex);
@@ -319,7 +319,7 @@ private void CloneTableConstraint(Table newTable, TableConstraint sourceConstrai
319319
{
320320
var checkConstraint = sourceConstraint as CheckConstraint;
321321
if (checkConstraint!=null) {
322-
var c = newTable.CreateCheckConstraint(checkConstraint.Name, (SqlExpression) checkConstraint.Condition.Clone());
322+
var c = newTable.CreateCheckConstraint(checkConstraint.Name, checkConstraint.Condition.Clone());
323323
CopyDbName(c, checkConstraint);
324324
return;
325325
}

Orm/Xtensive.Orm/Sql/Ddl/Actions/SqlSetDefault.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -17,7 +17,7 @@ public class SqlSetDefault : SqlAction
1717
internal override object Clone(SqlNodeCloneContext context) =>
1818
context.NodeMapping.TryGetValue(this, out var clone)
1919
? clone
20-
: context.NodeMapping[this] = new SqlSetDefault((SqlExpression) DefaultValue.Clone(context), Column);
20+
: context.NodeMapping[this] = new SqlSetDefault(DefaultValue.Clone(context), Column);
2121

2222
internal SqlSetDefault(SqlExpression defaultValue, TableColumn column)
2323
{

Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlAggregate.cs

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -41,11 +41,10 @@ public override void ReplaceWith(SqlExpression expression)
4141
this.expression = replacingExpression.Expression;
4242
}
4343

44-
internal override object Clone(SqlNodeCloneContext context) =>
45-
context.NodeMapping.TryGetValue(this, out var clone)
46-
? clone
47-
: context.NodeMapping[this] = new SqlAggregate(NodeType,
48-
expression.IsNullReference() ? null : (SqlExpression) expression.Clone(context), distinct);
44+
internal override SqlAggregate Clone(SqlNodeCloneContext context) =>
45+
context.TryGet(this) ?? context.Add(this,
46+
new SqlAggregate(NodeType,
47+
expression?.Clone(context), distinct));
4948

5049
internal SqlAggregate(SqlNodeType nodeType, SqlExpression expression, bool distinct) : base(nodeType)
5150
{

Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlArray{T}.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,9 @@ public override void ReplaceWith(SqlExpression expression)
4343
Values = replacingExpression.Values;
4444
}
4545

46-
internal override object Clone(SqlNodeCloneContext context) =>
47-
context.NodeMapping.TryGetValue(this, out var clone)
48-
? clone
49-
: context.NodeMapping[this] = new SqlArray<T>((T[]) Values.Clone());
46+
internal override SqlArray Clone(SqlNodeCloneContext context) =>
47+
context.TryGet(this) ?? context.Add(this,
48+
new SqlArray<T>((T[]) Values.Clone()));
5049

5150

5251
// Constructors

Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlBetween.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,10 +55,9 @@ public override void ReplaceWith(SqlExpression expression)
5555
expression = replacingExpression.Expression;
5656
}
5757

58-
internal override object Clone(SqlNodeCloneContext context) =>
59-
context.NodeMapping.TryGetValue(this, out var clone)
60-
? clone
61-
: context.NodeMapping[this] = new SqlBetween(NodeType, (SqlExpression)expression.Clone(context), (SqlExpression)left.Clone(context), (SqlExpression)right.Clone(context));
58+
internal override SqlBetween Clone(SqlNodeCloneContext context) =>
59+
context.TryGet(this) ?? context.Add(this,
60+
new SqlBetween(NodeType, expression.Clone(context), left.Clone(context), right.Clone(context)));
6261

6362
internal SqlBetween(SqlNodeType nodeType, SqlExpression expression, SqlExpression left, SqlExpression right)
6463
: base(nodeType)

Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlBinary.cs

Lines changed: 5 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -91,12 +91,11 @@ public override void ReplaceWith(SqlExpression expression)
9191
Right = replacingExpression.Right;
9292
}
9393

94-
internal override object Clone(SqlNodeCloneContext context) =>
95-
context.NodeMapping.TryGetValue(this, out var clone)
96-
? clone
97-
: context.NodeMapping[this] = new SqlBinary(NodeType,
98-
(SqlExpression) Left.Clone(context),
99-
(SqlExpression) Right.Clone(context));
94+
internal override SqlBinary Clone(SqlNodeCloneContext context) =>
95+
context.TryGet(this) ?? context.Add(this,
96+
new SqlBinary(NodeType,
97+
Left.Clone(context),
98+
Right.Clone(context)));
10099

101100
public override void AcceptVisitor(ISqlVisitor visitor)
102101
{

Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCase.cs

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,19 +105,19 @@ public override void ReplaceWith(SqlExpression expression)
105105
cases.Add(pair);
106106
}
107107

108-
internal override object Clone(SqlNodeCloneContext context)
108+
internal override SqlCase Clone(SqlNodeCloneContext context)
109109
{
110110
if (context.NodeMapping.TryGetValue(this, out var v)) {
111-
return v;
111+
return (SqlCase)v;
112112
}
113113

114-
var clone = new SqlCase(value.IsNullReference() ? null : (SqlExpression) value.Clone(context));
114+
var clone = new SqlCase(value.IsNullReference() ? null : value.Clone(context));
115115

116116
if (!@else.IsNullReference())
117-
clone.Else = (SqlExpression) @else.Clone(context);
117+
clone.Else = @else.Clone(context);
118118

119119
foreach (KeyValuePair<SqlExpression, SqlExpression> pair in cases)
120-
clone[(SqlExpression) pair.Key.Clone(context)] = (SqlExpression) pair.Value.Clone(context);
120+
clone[pair.Key.Clone(context)] = pair.Value.Clone(context);
121121

122122
context.NodeMapping[this] = clone;
123123
return clone;

Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCast.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -22,10 +22,9 @@ public override void ReplaceWith(SqlExpression expression)
2222
Type = replacingExpression.Type;
2323
}
2424

25-
internal override object Clone(SqlNodeCloneContext context) =>
26-
context.NodeMapping.TryGetValue(this, out var clone)
27-
? clone
28-
: context.NodeMapping[this] = new SqlCast((SqlExpression) Operand.Clone(context), Type);
25+
internal override SqlCast Clone(SqlNodeCloneContext context) =>
26+
context.TryGet(this) ?? context.Add(this,
27+
new SqlCast(Operand.Clone(context), Type));
2928

3029
public override void AcceptVisitor(ISqlVisitor visitor)
3130
{

Orm/Xtensive.Orm/Sql/Dml/Expressions/SqlCollate.cs

Lines changed: 3 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -43,10 +43,9 @@ public override void ReplaceWith(SqlExpression expression)
4343
collation = replacingExpression.Collation;
4444
}
4545

46-
internal override object Clone(SqlNodeCloneContext context) =>
47-
context.NodeMapping.TryGetValue(this, out var clone)
48-
? clone
49-
: context.NodeMapping[this] = new SqlCollate((SqlExpression)operand.Clone(context), collation);
46+
internal override SqlCollate Clone(SqlNodeCloneContext context) =>
47+
context.TryGet(this) ?? context.Add(this,
48+
new SqlCollate(operand.Clone(context), collation));
5049

5150
public override void AcceptVisitor(ISqlVisitor visitor)
5251
{

0 commit comments

Comments
 (0)