Browse Source

Fix #574: Wrong error highlighting with interface implementation

pull/573/merge
Andreas Weizel 12 years ago
parent
commit
872a8bf762
  1. 54
      src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp.Refactoring/CodeActions/ImplementInterfaceAction.cs

54
src/Libraries/NRefactory/ICSharpCode.NRefactory.CSharp.Refactoring/CodeActions/ImplementInterfaceAction.cs

@ -117,7 +117,7 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
{ {
return m.UnresolvedMember == method.UnresolvedMember; return m.UnresolvedMember == method.UnresolvedMember;
} }
public static List<Tuple<IMember, bool>> CollectMembersToImplement(ITypeDefinition implementingType, IType interfaceType, bool explicitly, out bool interfaceMissing) public static List<Tuple<IMember, bool>> CollectMembersToImplement(ITypeDefinition implementingType, IType interfaceType, bool explicitly, out bool interfaceMissing)
{ {
//var def = interfaceType.GetDefinition(); //var def = interfaceType.GetDefinition();
@ -131,8 +131,8 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
continue; continue;
bool needsExplicitly = explicitly; bool needsExplicitly = explicitly;
alreadyImplemented = implementingType.GetMembers().Any(m => m.ImplementedInterfaceMembers.Any(im => IsImplementation (im, ev))); var implementingMember = implementingType.GetInterfaceImplementation(ev);
alreadyImplemented = (implementingMember != null);
if (!alreadyImplemented) { if (!alreadyImplemented) {
toImplement.Add(new Tuple<IMember, bool>(ev, needsExplicitly)); toImplement.Add(new Tuple<IMember, bool>(ev, needsExplicitly));
} else { } else {
@ -147,17 +147,18 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
continue; continue;
bool needsExplicitly = explicitly; bool needsExplicitly = explicitly;
alreadyImplemented = false; alreadyImplemented = false;
foreach (var cmet in implementingType.GetMethods ()) { var implementingMethod = implementingType.GetInterfaceImplementation(method);
alreadyImplemented |= cmet.ImplementedInterfaceMembers.Any(m => IsImplementation (m, method)); alreadyImplemented = (implementingMethod != null);
if (alreadyImplemented) {
if (CompareMembers(method, cmet)) { if (!needsExplicitly && !implementingMethod.ReturnType.Equals(method.ReturnType)) {
if (!needsExplicitly && !cmet.ReturnType.Equals(method.ReturnType)) needsExplicitly = true;
needsExplicitly = true; alreadyImplemented = false;
else } else {
alreadyImplemented |= !needsExplicitly /*|| cmet.InterfaceImplementations.Any (impl => impl.InterfaceType.Equals (interfaceType))*/; alreadyImplemented = !needsExplicitly;
} }
} }
if (toImplement.Where(t => t.Item1 is IMethod).Any(t => CompareMembers(method, (IMethod)t.Item1))) if (toImplement.Where(t => t.Item1 is IMethod).Any(t => CompareMembers(method, (IMethod)t.Item1)))
needsExplicitly = true; needsExplicitly = true;
if (!alreadyImplemented) { if (!alreadyImplemented) {
@ -174,27 +175,18 @@ namespace ICSharpCode.NRefactory.CSharp.Refactoring
continue; continue;
bool needsExplicitly = explicitly; bool needsExplicitly = explicitly;
alreadyImplemented = implementingType.GetMembers().Any(m => m.ImplementedInterfaceMembers.Any(im => IsImplementation (im, prop)));
var implementingProp = implementingType.GetInterfaceImplementation(prop);
foreach (var t in implementingType.GetAllBaseTypeDefinitions ()) { alreadyImplemented = (implementingProp != null);
if (t.Kind == TypeKind.Interface) { if (alreadyImplemented) {
foreach (var cprop in t.Properties) { if (!needsExplicitly && !implementingProp.ReturnType.Equals(prop.ReturnType)) {
if (cprop.Name == prop.Name && cprop.IsShadowing) { needsExplicitly = true;
if (!needsExplicitly && !cprop.ReturnType.Equals(prop.ReturnType)) alreadyImplemented = false;
needsExplicitly = true; } else {
} alreadyImplemented = !needsExplicitly;
}
continue;
}
foreach (var cprop in t.Properties) {
if (cprop.Name == prop.Name) {
if (!needsExplicitly && !cprop.ReturnType.Equals(prop.ReturnType))
needsExplicitly = true;
else
alreadyImplemented |= !needsExplicitly/* || cprop.InterfaceImplementations.Any (impl => impl.InterfaceType.Resolve (ctx).Equals (interfaceType))*/;
}
} }
} }
if (!alreadyImplemented) { if (!alreadyImplemented) {
toImplement.Add(new Tuple<IMember, bool>(prop, needsExplicitly)); toImplement.Add(new Tuple<IMember, bool>(prop, needsExplicitly));
} else { } else {

Loading…
Cancel
Save