Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Refactor ConventionScope #19297

Merged
merged 2 commits into from
Dec 17, 2019
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
4 changes: 2 additions & 2 deletions src/EFCore/Metadata/Builders/OwnedNavigationBuilder.cs
Original file line number Diff line number Diff line change
Expand Up @@ -76,11 +76,11 @@ protected virtual InternalRelationshipBuilder Builder
[EntityFrameworkInternal]
protected virtual T UpdateBuilder<T>([NotNull] Func<T> configure)
{
var foreignKey = _builder.Metadata;
IConventionForeignKey foreignKey = _builder.Metadata;
var result = DependentEntityType.Model.ConventionDispatcher.Run(configure, ref foreignKey);
if (foreignKey != null)
{
_builder = foreignKey.Builder;
_builder = ((ForeignKey)foreignKey).Builder;
}

return result;
Expand Down
Original file line number Diff line number Diff line change
@@ -0,0 +1,13 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

namespace Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal
{
public partial class ConventionDispatcher
{
private abstract class ConventionNode
{
public abstract ConventionNode Accept(ConventionVisitor visitor);
}
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,84 @@
// Copyright (c) .NET Foundation. All rights reserved.
// Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information.

using System;
using System.Collections.Generic;
using System.Reflection;
using JetBrains.Annotations;
using Microsoft.EntityFrameworkCore.Metadata.Builders;

namespace Microsoft.EntityFrameworkCore.Metadata.Conventions.Internal
{
public partial class ConventionDispatcher
{
private abstract class ConventionScope : ConventionNode
{
public virtual ConventionScope Parent => null;
public virtual IReadOnlyList<ConventionNode> Children => null;

public int GetLeafCount()
{
if (Children == null)
{
return 0;
}

var scopesToVisit = new Queue<ConventionScope>();
scopesToVisit.Enqueue(this);
var leafCount = 0;
while (scopesToVisit.Count > 0)
{
var scope = scopesToVisit.Dequeue();
if (scope.Children == null)
{
continue;
}

foreach (var conventionNode in scope.Children)
{
if (conventionNode is ConventionScope nextScope)
{
scopesToVisit.Enqueue(nextScope);
}
else
{
leafCount++;
}
}
}

return leafCount;
}

public abstract IConventionEntityTypeBuilder OnEntityTypeAdded([NotNull] IConventionEntityTypeBuilder entityTypeBuilder);
public abstract IConventionAnnotation OnEntityTypeAnnotationChanged([NotNull] IConventionEntityTypeBuilder entityTypeBuilder, [NotNull] string name, [CanBeNull] IConventionAnnotation annotation, [CanBeNull] IConventionAnnotation oldAnnotation);
public abstract IConventionEntityType OnEntityTypeBaseTypeChanged([NotNull] IConventionEntityTypeBuilder entityTypeBuilder, [CanBeNull] IConventionEntityType newBaseType, [CanBeNull] IConventionEntityType previousBaseType);
public abstract string OnEntityTypeIgnored([NotNull] IConventionModelBuilder modelBuilder, [NotNull] string name, [CanBeNull] Type type);
public abstract string OnEntityTypeMemberIgnored([NotNull] IConventionEntityTypeBuilder entityTypeBuilder, [NotNull] string name);
public abstract IConventionKey OnEntityTypePrimaryKeyChanged([NotNull] IConventionEntityTypeBuilder entityTypeBuilder, [CanBeNull] IConventionKey newPrimaryKey, [CanBeNull] IConventionKey previousPrimaryKey);
public abstract IConventionEntityType OnEntityTypeRemoved([NotNull] IConventionModelBuilder modelBuilder, [NotNull] IConventionEntityType entityType);
public abstract IConventionRelationshipBuilder OnForeignKeyAdded([NotNull] IConventionRelationshipBuilder relationshipBuilder);
public abstract IConventionAnnotation OnForeignKeyAnnotationChanged(IConventionRelationshipBuilder relationshipBuilder, string name, IConventionAnnotation annotation, IConventionAnnotation oldAnnotation);
public abstract IConventionRelationshipBuilder OnForeignKeyOwnershipChanged([NotNull] IConventionRelationshipBuilder relationshipBuilder);
public abstract IConventionRelationshipBuilder OnForeignKeyPrincipalEndChanged([NotNull] IConventionRelationshipBuilder relationshipBuilder);
public abstract IConventionRelationshipBuilder OnForeignKeyPropertiesChanged([NotNull] IConventionRelationshipBuilder relationshipBuilder, [NotNull] IReadOnlyList<IConventionProperty> oldDependentProperties, [NotNull] IConventionKey oldPrincipalKey);
public abstract IConventionForeignKey OnForeignKeyRemoved([NotNull] IConventionEntityTypeBuilder entityTypeBuilder, [NotNull] IConventionForeignKey foreignKey);
public abstract IConventionRelationshipBuilder OnForeignKeyRequirednessChanged([NotNull] IConventionRelationshipBuilder relationshipBuilder);
public abstract IConventionRelationshipBuilder OnForeignKeyUniquenessChanged([NotNull] IConventionRelationshipBuilder relationshipBuilder);
public abstract IConventionIndexBuilder OnIndexAdded([NotNull] IConventionIndexBuilder indexBuilder);
public abstract IConventionAnnotation OnIndexAnnotationChanged([NotNull] IConventionIndexBuilder indexBuilder, [NotNull] string name, [CanBeNull] IConventionAnnotation annotation, [CanBeNull] IConventionAnnotation oldAnnotation);
public abstract IConventionIndex OnIndexRemoved([NotNull] IConventionEntityTypeBuilder entityTypeBuilder, [NotNull] IConventionIndex index);
public abstract IConventionIndexBuilder OnIndexUniquenessChanged([NotNull] IConventionIndexBuilder indexBuilder);
public abstract IConventionKeyBuilder OnKeyAdded([NotNull] IConventionKeyBuilder keyBuilder);
public abstract IConventionAnnotation OnKeyAnnotationChanged(IConventionKeyBuilder keyBuilder, string name, IConventionAnnotation annotation, IConventionAnnotation oldAnnotation);
public abstract IConventionKey OnKeyRemoved([NotNull] IConventionEntityTypeBuilder entityTypeBuilder, [NotNull] IConventionKey key);
public abstract IConventionAnnotation OnModelAnnotationChanged([NotNull] IConventionModelBuilder modelBuilder, [NotNull] string name, [CanBeNull] IConventionAnnotation annotation, [CanBeNull] IConventionAnnotation oldAnnotation);
public abstract IConventionNavigation OnNavigationAdded([NotNull] IConventionRelationshipBuilder relationshipBuilder, [NotNull] IConventionNavigation navigation);
public abstract string OnNavigationRemoved([NotNull] IConventionEntityTypeBuilder sourceEntityTypeBuilder, [NotNull] IConventionEntityTypeBuilder targetEntityTypeBuilder, [NotNull] string navigationName, [CanBeNull] MemberInfo memberInfo);
public abstract IConventionPropertyBuilder OnPropertyAdded([NotNull] IConventionPropertyBuilder propertyBuilder);
public abstract IConventionAnnotation OnPropertyAnnotationChanged([NotNull] IConventionPropertyBuilder propertyBuilder, [NotNull] string name, [CanBeNull] IConventionAnnotation annotation, [CanBeNull] IConventionAnnotation oldAnnotation);
public abstract FieldInfo OnPropertyFieldChanged([NotNull] IConventionPropertyBuilder propertyBuilder, FieldInfo newFieldInfo, [CanBeNull] FieldInfo oldFieldInfo);
public abstract IConventionPropertyBuilder OnPropertyNullableChanged([NotNull] IConventionPropertyBuilder propertyBuilder);
}
}
}
Original file line number Diff line number Diff line change
Expand Up @@ -35,96 +35,67 @@ public virtual ConventionScope VisitConventionScope(ConventionScope node)
visitedNodes.Add(visitedNode);
}

return (visitedNodes?.Count ?? 0) == 0 ? null : new ConventionScope(node.Parent, visitedNodes);
return (visitedNodes?.Count ?? 0) == 0 ? null : new DelayedConventionScope(node.Parent, visitedNodes);
}

public virtual OnModelAnnotationChangedNode VisitOnModelAnnotationChanged(OnModelAnnotationChangedNode node)
=> node;
public abstract OnModelAnnotationChangedNode VisitOnModelAnnotationChanged(OnModelAnnotationChangedNode node);

public virtual OnEntityTypeAddedNode VisitOnEntityTypeAdded(OnEntityTypeAddedNode node)
=> node;
public abstract OnEntityTypeAddedNode VisitOnEntityTypeAdded(OnEntityTypeAddedNode node);

public virtual OnEntityTypeIgnoredNode VisitOnEntityTypeIgnored(OnEntityTypeIgnoredNode node)
=> node;
public abstract OnEntityTypeIgnoredNode VisitOnEntityTypeIgnored(OnEntityTypeIgnoredNode node);

public virtual OnEntityTypeRemovedNode VisitOnEntityTypeRemoved(OnEntityTypeRemovedNode node)
=> node;
public abstract OnEntityTypeRemovedNode VisitOnEntityTypeRemoved(OnEntityTypeRemovedNode node);

public virtual OnEntityTypeMemberIgnoredNode VisitOnEntityTypeMemberIgnored(OnEntityTypeMemberIgnoredNode node)
=> node;
public abstract OnEntityTypeMemberIgnoredNode VisitOnEntityTypeMemberIgnored(OnEntityTypeMemberIgnoredNode node);

public virtual OnEntityTypeBaseTypeChangedNode VisitOnBaseEntityTypeChanged(OnEntityTypeBaseTypeChangedNode node)
=> node;
public abstract OnEntityTypeBaseTypeChangedNode VisitOnBaseEntityTypeChanged(OnEntityTypeBaseTypeChangedNode node);

public virtual OnEntityTypeAnnotationChangedNode VisitOnEntityTypeAnnotationChanged(OnEntityTypeAnnotationChangedNode node)
=> node;
public abstract OnEntityTypeAnnotationChangedNode VisitOnEntityTypeAnnotationChanged(OnEntityTypeAnnotationChangedNode node);

public virtual OnForeignKeyAddedNode VisitOnForeignKeyAdded(OnForeignKeyAddedNode node)
=> node;
public abstract OnForeignKeyAddedNode VisitOnForeignKeyAdded(OnForeignKeyAddedNode node);

public virtual OnForeignKeyRemovedNode VisitOnForeignKeyRemoved(OnForeignKeyRemovedNode node)
=> node;
public abstract OnForeignKeyRemovedNode VisitOnForeignKeyRemoved(OnForeignKeyRemovedNode node);

public virtual OnForeignKeyPropertiesChangedNode VisitOnForeignKeyPropertiesChanged(OnForeignKeyPropertiesChangedNode node)
=> node;
public abstract OnForeignKeyPropertiesChangedNode VisitOnForeignKeyPropertiesChanged(OnForeignKeyPropertiesChangedNode node);

public virtual OnForeignKeyUniquenessChangedNode VisitOnForeignKeyUniquenessChanged(OnForeignKeyUniquenessChangedNode node)
=> node;
public abstract OnForeignKeyUniquenessChangedNode VisitOnForeignKeyUniquenessChanged(OnForeignKeyUniquenessChangedNode node);

public virtual OnForeignKeyRequirednessChangedNode VisitOnForeignKeyRequirednessChanged(
OnForeignKeyRequirednessChangedNode node) => node;
public abstract OnForeignKeyRequirednessChangedNode VisitOnForeignKeyRequirednessChanged(OnForeignKeyRequirednessChangedNode node);

public virtual OnForeignKeyOwnershipChangedNode VisitOnForeignKeyOwnershipChanged(OnForeignKeyOwnershipChangedNode node)
=> node;
public abstract OnForeignKeyOwnershipChangedNode VisitOnForeignKeyOwnershipChanged(OnForeignKeyOwnershipChangedNode node);

public virtual OnForeignKeyPrincipalEndChangedNode VisitOnForeignKeyPrincipalEndChanged(
OnForeignKeyPrincipalEndChangedNode node)
=> node;
public abstract OnForeignKeyPrincipalEndChangedNode VisitOnForeignKeyPrincipalEndChanged(
OnForeignKeyPrincipalEndChangedNode node);

public virtual OnForeignKeyAnnotationChangedNode VisitOnForeignKeyAnnotationChanged(OnForeignKeyAnnotationChangedNode node)
=> node;
public abstract OnForeignKeyAnnotationChangedNode VisitOnForeignKeyAnnotationChanged(OnForeignKeyAnnotationChangedNode node);

public virtual OnNavigationAddedNode VisitOnNavigationAdded(OnNavigationAddedNode node)
=> node;
public abstract OnNavigationAddedNode VisitOnNavigationAdded(OnNavigationAddedNode node);

public virtual OnNavigationRemovedNode VisitOnNavigationRemoved(OnNavigationRemovedNode node)
=> node;
public abstract OnNavigationRemovedNode VisitOnNavigationRemoved(OnNavigationRemovedNode node);

public virtual OnKeyAddedNode VisitOnKeyAdded(OnKeyAddedNode node)
=> node;
public abstract OnKeyAddedNode VisitOnKeyAdded(OnKeyAddedNode node);

public virtual OnKeyRemovedNode VisitOnKeyRemoved(OnKeyRemovedNode node)
=> node;
public abstract OnKeyRemovedNode VisitOnKeyRemoved(OnKeyRemovedNode node);

public virtual OnKeyAnnotationChangedNode VisitOnKeyAnnotationChanged(OnKeyAnnotationChangedNode node)
=> node;
public abstract OnKeyAnnotationChangedNode VisitOnKeyAnnotationChanged(OnKeyAnnotationChangedNode node);

public virtual OnEntityTypePrimaryKeyChangedNode VisitOnPrimaryKeyChanged(OnEntityTypePrimaryKeyChangedNode node)
=> node;
public abstract OnEntityTypePrimaryKeyChangedNode VisitOnPrimaryKeyChanged(OnEntityTypePrimaryKeyChangedNode node);

public virtual OnIndexAddedNode VisitOnIndexAdded(OnIndexAddedNode node)
=> node;
public abstract OnIndexAddedNode VisitOnIndexAdded(OnIndexAddedNode node);

public virtual OnIndexRemovedNode VisitOnIndexRemoved(OnIndexRemovedNode node)
=> node;
public abstract OnIndexRemovedNode VisitOnIndexRemoved(OnIndexRemovedNode node);

public virtual OnIndexUniquenessChangedNode VisitOnIndexUniquenessChanged(OnIndexUniquenessChangedNode node)
=> node;
public abstract OnIndexUniquenessChangedNode VisitOnIndexUniquenessChanged(OnIndexUniquenessChangedNode node);

public virtual OnIndexAnnotationChangedNode VisitOnIndexAnnotationChanged(OnIndexAnnotationChangedNode node)
=> node;
public abstract OnIndexAnnotationChangedNode VisitOnIndexAnnotationChanged(OnIndexAnnotationChangedNode node);

public virtual OnPropertyAddedNode VisitOnPropertyAdded(OnPropertyAddedNode node)
=> node;
public abstract OnPropertyAddedNode VisitOnPropertyAdded(OnPropertyAddedNode node);

public virtual OnPropertyNullableChangedNode VisitOnPropertyNullableChanged(OnPropertyNullableChangedNode node)
=> node;
public abstract OnPropertyNullableChangedNode VisitOnPropertyNullableChanged(OnPropertyNullableChangedNode node);

public virtual OnPropertyFieldChangedNode VisitOnPropertyFieldChanged(OnPropertyFieldChangedNode node)
=> node;
public abstract OnPropertyFieldChangedNode VisitOnPropertyFieldChanged(OnPropertyFieldChangedNode node);

public virtual OnPropertyAnnotationChangedNode VisitOnPropertyAnnotationChanged(OnPropertyAnnotationChangedNode node)
=> node;
public abstract OnPropertyAnnotationChangedNode VisitOnPropertyAnnotationChanged(OnPropertyAnnotationChangedNode node);
}

private sealed class RunVisitor : ConventionVisitor
AndriySvyryd marked this conversation as resolved.
Show resolved Hide resolved
Expand Down
Loading