提交 a2acb57f 编写于 作者: J JieCarolHu

PR comments

上级 1274d4e5
...@@ -181,20 +181,23 @@ private static bool IsRenameValid(ConflictResolution conflictResolution, ISymbol ...@@ -181,20 +181,23 @@ private static bool IsRenameValid(ConflictResolution conflictResolution, ISymbol
{ {
try try
{ {
var project = conflictResolution.NewSolution.GetProject(renamedSymbol.ContainingAssembly, cancellationToken);
if (renamedSymbol.ContainingSymbol.IsKind(SymbolKind.NamedType)) if (renamedSymbol.ContainingSymbol.IsKind(SymbolKind.NamedType))
{ {
var otherThingsNamedTheSame = renamedSymbol.ContainingType.GetMembers(renamedSymbol.Name) var otherThingsNamedTheSame = renamedSymbol.ContainingType.GetMembers(renamedSymbol.Name)
.Where(s => !s.Equals(renamedSymbol) && .Where(s => !s.Equals(renamedSymbol) &&
string.Equals(s.MetadataName, renamedSymbol.MetadataName, StringComparison.Ordinal)); string.Equals(s.MetadataName, renamedSymbol.MetadataName, StringComparison.Ordinal));
// excluded Method or Property(only for VB) here, as they may have the same name but different parameters
IEnumerable<ISymbol> otherThingsNamedTheSameExcludeMethodAndParameterizedProperty; IEnumerable<ISymbol> otherThingsNamedTheSameExcludeMethodAndParameterizedProperty;
if (renamedSymbol.Language == LanguageNames.VisualBasic)
// Possibly overloaded symbols are excluded here and handled elsewhere
var semanticFactsService = project.LanguageServices.GetService<ISemanticFactsService>();
if (semanticFactsService.SupportsParameterizedProperties)
{ {
// Only VB allows Parameterized Properties
otherThingsNamedTheSameExcludeMethodAndParameterizedProperty = otherThingsNamedTheSame otherThingsNamedTheSameExcludeMethodAndParameterizedProperty = otherThingsNamedTheSame
.Where(s=> (s.Kind != SymbolKind.Method && s.Kind != SymbolKind.Property) || .Where(s=> !s.MatchesKind(SymbolKind.Method, SymbolKind.Property) ||
(renamedSymbol.Kind != SymbolKind.Method && renamedSymbol.Kind != SymbolKind.Property)); !renamedSymbol.MatchesKind(SymbolKind.Method, SymbolKind.Property));
} }
else else
{ {
...@@ -234,8 +237,6 @@ private static bool IsRenameValid(ConflictResolution conflictResolution, ISymbol ...@@ -234,8 +237,6 @@ private static bool IsRenameValid(ConflictResolution conflictResolution, ISymbol
// Some types of symbols (namespaces, cref stuff, etc) might not have ContainingAssemblies // Some types of symbols (namespaces, cref stuff, etc) might not have ContainingAssemblies
if (renamedSymbol.ContainingAssembly != null) if (renamedSymbol.ContainingAssembly != null)
{ {
var project = conflictResolution.NewSolution.GetProject(renamedSymbol.ContainingAssembly, cancellationToken);
// There also might be language specific rules we need to include // There also might be language specific rules we need to include
var languageRenameService = project.LanguageServices.GetService<IRenameRewriterLanguageService>(); var languageRenameService = project.LanguageServices.GetService<IRenameRewriterLanguageService>();
var languageConflicts = await languageRenameService.ComputeDeclarationConflictsAsync( var languageConflicts = await languageRenameService.ComputeDeclarationConflictsAsync(
......
// Copyright (c) Microsoft. All Rights Reserved. Licensed under the Apache License, Version 2.0. See License.txt in the project root for license information. // Copyright (c) Microsoft. 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.Collections.Generic;
using System.Collections.Immutable; using System.Collections.Immutable;
using System.Linq; using System.Linq;
...@@ -17,31 +18,8 @@ public static ImmutableArray<Location> GetMembersWithConflictingSignatures(IMeth ...@@ -17,31 +18,8 @@ public static ImmutableArray<Location> GetMembersWithConflictingSignatures(IMeth
.OfType<IMethodSymbol>() .OfType<IMethodSymbol>()
.Where(m => !m.Equals(renamedMethod) && m.Arity == renamedMethod.Arity); .Where(m => !m.Equals(renamedMethod) && m.Arity == renamedMethod.Arity);
var signatureToConflictingMember = new Dictionary<ImmutableArray<ITypeSymbol>, IMethodSymbol>(ConflictingSignatureComparer.Instance); return GetConflictLocations(renamedMethod, potentiallyConfictingMethods,
(method) => GetAllSignatures((method as IMethodSymbol).Parameters, trimOptionalParameters));
foreach (var method in potentiallyConfictingMethods)
{
foreach (var signature in GetAllSignatures(method, trimOptionalParameters))
{
signatureToConflictingMember[signature] = method;
}
}
var builder = ArrayBuilder<Location>.GetInstance();
foreach (var signature in GetAllSignatures(renamedMethod, trimOptionalParameters))
{
if (signatureToConflictingMember.TryGetValue(signature, out var conflictingSymbol))
{
if (!(conflictingSymbol.PartialDefinitionPart != null && conflictingSymbol.PartialDefinitionPart == renamedMethod) &&
!(conflictingSymbol.PartialImplementationPart != null && conflictingSymbol.PartialImplementationPart == renamedMethod))
{
builder.AddRange(conflictingSymbol.Locations);
}
}
}
return builder.ToImmutableAndFree();
} }
public static ImmutableArray<Location> GetMembersWithConflictingSignatures(IPropertySymbol renamedProperty, bool trimOptionalParameters) public static ImmutableArray<Location> GetMembersWithConflictingSignatures(IPropertySymbol renamedProperty, bool trimOptionalParameters)
...@@ -51,19 +29,27 @@ public static ImmutableArray<Location> GetMembersWithConflictingSignatures(IProp ...@@ -51,19 +29,27 @@ public static ImmutableArray<Location> GetMembersWithConflictingSignatures(IProp
.OfType<IPropertySymbol>() .OfType<IPropertySymbol>()
.Where(m => !m.Equals(renamedProperty) && m.Parameters.Count() == renamedProperty.Parameters.Count()); .Where(m => !m.Equals(renamedProperty) && m.Parameters.Count() == renamedProperty.Parameters.Count());
var signatureToConflictingMember = new Dictionary<ImmutableArray<ITypeSymbol>, IPropertySymbol>(ConflictingSignatureComparer.Instance); return GetConflictLocations(renamedProperty, potentiallyConfictingProperties,
(property)=>GetAllSignatures((property as IPropertySymbol).Parameters, trimOptionalParameters));
}
private static ImmutableArray<Location> GetConflictLocations(ISymbol renamedMember,
IEnumerable<ISymbol> potentiallyConfictingMembers,
Func<ISymbol, ImmutableArray<ImmutableArray<ITypeSymbol>>> getAllSignatures)
{
var signatureToConflictingMember = new Dictionary<ImmutableArray<ITypeSymbol>, ISymbol>(ConflictingSignatureComparer.Instance);
foreach (var property in potentiallyConfictingProperties) foreach (var member in potentiallyConfictingMembers)
{ {
foreach (var signature in GetAllSignatures(property, trimOptionalParameters)) foreach (var signature in getAllSignatures(member))
{ {
signatureToConflictingMember[signature] = property; signatureToConflictingMember[signature] = member;
} }
} }
var builder = ArrayBuilder<Location>.GetInstance(); var builder = ArrayBuilder<Location>.GetInstance();
foreach (var signature in GetAllSignatures(renamedProperty, trimOptionalParameters)) foreach (var signature in getAllSignatures(renamedMember))
{ {
if (signatureToConflictingMember.TryGetValue(signature, out var conflictingSymbol)) if (signatureToConflictingMember.TryGetValue(signature, out var conflictingSymbol))
{ {
...@@ -94,41 +80,13 @@ public int GetHashCode(ImmutableArray<ITypeSymbol> obj) ...@@ -94,41 +80,13 @@ public int GetHashCode(ImmutableArray<ITypeSymbol> obj)
} }
} }
private static ImmutableArray<ImmutableArray<ITypeSymbol>> GetAllSignatures(IMethodSymbol method, bool trimOptionalParameters) private static ImmutableArray<ImmutableArray<ITypeSymbol>> GetAllSignatures(ImmutableArray<IParameterSymbol> parameters, bool trimOptionalParameters)
{
var resultBuilder = ArrayBuilder<ImmutableArray<ITypeSymbol>>.GetInstance();
var signatureBuilder = ArrayBuilder<ITypeSymbol>.GetInstance();
if (method.MethodKind == MethodKind.Conversion)
{
signatureBuilder.Add(method.ReturnType);
}
foreach (var parameter in method.Parameters)
{
// In VB, a method effectively creates multiple signatures which are produced by
// chopping off each of the optional parameters on the end, last to first, per 4.1.1 of
// the spec.
if (trimOptionalParameters && parameter.IsOptional)
{
resultBuilder.Add(signatureBuilder.ToImmutable());
}
signatureBuilder.Add(parameter.Type);
}
resultBuilder.Add(signatureBuilder.ToImmutableAndFree());
return resultBuilder.ToImmutableAndFree();
}
private static ImmutableArray<ImmutableArray<ITypeSymbol>> GetAllSignatures(IPropertySymbol property, bool trimOptionalParameters)
{ {
var resultBuilder = ArrayBuilder<ImmutableArray<ITypeSymbol>>.GetInstance(); var resultBuilder = ArrayBuilder<ImmutableArray<ITypeSymbol>>.GetInstance();
var signatureBuilder = ArrayBuilder<ITypeSymbol>.GetInstance(); var signatureBuilder = ArrayBuilder<ITypeSymbol>.GetInstance();
foreach (var parameter in property.Parameters) foreach (var parameter in parameters)
{ {
// In VB, a method effectively creates multiple signatures which are produced by // In VB, a method effectively creates multiple signatures which are produced by
// chopping off each of the optional parameters on the end, last to first, per 4.1.1 of // chopping off each of the optional parameters on the end, last to first, per 4.1.1 of
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册