Skip to content

Commit

Permalink
Handle private properties in the compiled model
Browse files Browse the repository at this point in the history
Add full support for service properties
Use a consistent pattern for unsafe accessors
Store the unsafe accessor names in an annotation
Refactor the different mechanisms for tracking variables in the generated code into a single bidirectional dictionary

Fixes #29761
Fixes #24904
Fixes #24900
  • Loading branch information
AndriySvyryd committed Apr 4, 2024
1 parent bd331aa commit ab39dec
Show file tree
Hide file tree
Showing 120 changed files with 15,985 additions and 20,344 deletions.
123 changes: 53 additions & 70 deletions src/EFCore.Design/Design/Internal/CSharpHelper.cs
Original file line number Diff line number Diff line change
Expand Up @@ -234,6 +234,50 @@ protected virtual bool ShouldUseFullName(string shortTypeName)
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary>
public virtual string Identifier(string name, ICollection<string>? scope = null, bool? capitalize = null)
{
var identifier = Identifier(name, capitalize);
if (scope == null)
{
return Keywords.Contains(identifier) ? "@" + identifier : identifier;
}

var uniqueIdentifier = Keywords.Contains(identifier) ? "@" + identifier : identifier;
var qualifier = 0;
while (scope.Contains(uniqueIdentifier))
{
uniqueIdentifier = identifier + qualifier++;
}

scope.Add(uniqueIdentifier);
identifier = uniqueIdentifier;

return identifier;
}

/// <summary>
/// This is an internal API that supports the Entity Framework Core infrastructure and not subject to
/// the same compatibility standards as public APIs. It may be changed or removed without notice in
/// any release. You should only use it directly in your code with extreme caution and knowing that
/// doing so can result in application failures when updating to a new Entity Framework Core release.
/// </summary>
public string Identifier<T>(string name, T value, IDictionary<string, T> scope, bool? capitalize = null)
{
var identifier = Identifier(name, capitalize);

var uniqueIdentifier = Keywords.Contains(identifier) ? "@" + identifier : identifier;
var qualifier = 0;
while (scope.ContainsKey(uniqueIdentifier))
{
uniqueIdentifier = identifier + qualifier++;
}

scope.Add(uniqueIdentifier, value);
identifier = uniqueIdentifier;

return identifier;
}

private static string Identifier(string name, bool? capitalize)
{
var builder = new StringBuilder();
var partStart = 0;
Expand Down Expand Up @@ -268,20 +312,7 @@ public virtual string Identifier(string name, ICollection<string>? scope = null,
}

var identifier = builder.ToString();
if (scope != null)
{
var uniqueIdentifier = identifier;
var qualifier = 0;
while (scope.Contains(uniqueIdentifier))
{
uniqueIdentifier = identifier + qualifier++;
}

scope.Add(uniqueIdentifier);
identifier = uniqueIdentifier;
}

return Keywords.Contains(identifier) ? "@" + identifier : identifier;
return identifier;
}

private static void ChangeFirstLetterCase(StringBuilder builder, bool capitalize)
Expand Down Expand Up @@ -1557,36 +1588,12 @@ public virtual string Statement(
Expression node,
ISet<string> collectedNamespaces,
IReadOnlyDictionary<object, string>? constantReplacements,
IReadOnlyDictionary<MemberAccess, string>? memberAccessReplacements)
{
Dictionary<object, ExpressionSyntax>? constantReplacementExpressions = null;
if (constantReplacements != null)
{
constantReplacementExpressions = [];

foreach (var instancePair in constantReplacements)
{
constantReplacementExpressions[instancePair.Key] = SyntaxFactory.IdentifierName(instancePair.Value);
}
}

Dictionary<MemberAccess, ExpressionSyntax>? memberAccessReplacementExpressions = null;
if (memberAccessReplacements != null)
{
memberAccessReplacementExpressions = [];

foreach (var methodPair in memberAccessReplacements)
{
memberAccessReplacementExpressions[methodPair.Key] = SyntaxFactory.IdentifierName(methodPair.Value);
}
}

return ToSourceCode(_translator.TranslateStatement(
IReadOnlyDictionary<MemberInfo, QualifiedName>? memberAccessReplacements)
=> ToSourceCode(_translator.TranslateStatement(
node,
constantReplacementExpressions,
memberAccessReplacementExpressions,
constantReplacements,
memberAccessReplacements,
collectedNamespaces));
}

/// <summary>
/// This is an internal API that supports the Entity Framework Core infrastructure and not subject to
Expand All @@ -1598,36 +1605,12 @@ public virtual string Expression(
Expression node,
ISet<string> collectedNamespaces,
IReadOnlyDictionary<object, string>? constantReplacements,
IReadOnlyDictionary<MemberAccess, string>? memberAccessReplacements)
{
Dictionary<object, ExpressionSyntax>? constantReplacementExpressions = null;
if (constantReplacements != null)
{
constantReplacementExpressions = [];

foreach (var instancePair in constantReplacements)
{
constantReplacementExpressions[instancePair.Key] = SyntaxFactory.IdentifierName(instancePair.Value);
}
}

Dictionary<MemberAccess, ExpressionSyntax>? memberAccessReplacementExpressions = null;
if (memberAccessReplacements != null)
{
memberAccessReplacementExpressions = [];

foreach (var methodPair in memberAccessReplacements)
{
memberAccessReplacementExpressions[methodPair.Key] = SyntaxFactory.IdentifierName(methodPair.Value);
}
}

return ToSourceCode(_translator.TranslateExpression(
IReadOnlyDictionary<MemberInfo, QualifiedName>? memberAccessReplacements)
=> ToSourceCode(_translator.TranslateExpression(
node,
constantReplacementExpressions,
memberAccessReplacementExpressions,
constantReplacements,
memberAccessReplacements,
collectedNamespaces));
}

private static bool IsIdentifierStartCharacter(char ch)
{
Expand Down
Loading

0 comments on commit ab39dec

Please sign in to comment.