public IEnumerable <CodeAction> GetActions(RefactoringContext context) { var type = context.GetNode <AstType>(); if (type == null || type.Role != Roles.BaseType) { yield break; } var state = context.GetResolverStateBefore(type); if (state.CurrentTypeDefinition == null) { yield break; } var resolveResult = context.Resolve(type); if (resolveResult.Type.Kind != TypeKind.Class || resolveResult.Type.GetDefinition() == null || !resolveResult.Type.GetDefinition().IsAbstract) { yield break; } var toImplement = CollectMembersToImplement(state.CurrentTypeDefinition, resolveResult.Type); if (toImplement.Count == 0) { yield break; } yield return(new CodeAction(context.TranslateString("Implement abstract members"), script => { script.InsertWithCursor( context.TranslateString("Implement abstract members"), state.CurrentTypeDefinition, ImplementInterfaceAction.GenerateImplementation(context, toImplement.Select(m => Tuple.Create(m, false))).Select(entity => { var decl = entity as EntityDeclaration; if (decl != null) { decl.Modifiers |= Modifiers.Override; } return entity; }) ); }, type)); }
public IEnumerable <CodeAction> GetActions(RefactoringContext context) { var type = context.GetNode <AstType>(); if (type == null || type.Role != Roles.BaseType) { yield break; } var state = context.GetResolverStateBefore(type); if (state.CurrentTypeDefinition == null) { yield break; } var resolveResult = context.Resolve(type); if (resolveResult.Type.Kind != TypeKind.Interface) { yield break; } var toImplement = ImplementInterfaceAction.CollectMembersToImplement( state.CurrentTypeDefinition, resolveResult.Type, false ); if (toImplement.Count == 0) { yield break; } yield return(new CodeAction(context.TranslateString("Implement interface explicit"), script => { script.InsertWithCursor( context.TranslateString("Implement Interface"), state.CurrentTypeDefinition, ImplementInterfaceAction.GenerateImplementation(context, toImplement.Select(t => Tuple.Create(t.Item1, true))) ); })); }
public static List <IMember> CollectMembersToImplement(ITypeDefinition implementingType, IType abstractType) { // var def = abstractType.GetDefinition(); var toImplement = new List <IMember>(); bool alreadyImplemented; // Stub out non-implemented events defined by @iface foreach (var ev in abstractType.GetEvents(e => !e.IsSynthetic && e.IsAbstract)) { alreadyImplemented = implementingType.GetAllBaseTypeDefinitions().Any( x => x.Kind != TypeKind.Interface && x.Events.Any(y => y.Name == ev.Name) ); if (!alreadyImplemented) { toImplement.Add(ev); } } // Stub out non-implemented methods defined by @iface foreach (var method in abstractType.GetMethods(d => !d.IsSynthetic && d.IsAbstract)) { alreadyImplemented = false; foreach (var cmet in implementingType.GetMethods()) { if (!cmet.IsAbstract && ImplementInterfaceAction.CompareMethods(method, cmet)) { alreadyImplemented = true; } } if (!alreadyImplemented) { toImplement.Add(method); } } // Stub out non-implemented properties defined by @iface foreach (var prop in abstractType.GetProperties(p => !p.IsSynthetic && p.IsAbstract)) { alreadyImplemented = false; foreach (var t in implementingType.GetAllBaseTypeDefinitions()) { if (t.Kind == TypeKind.Interface) { continue; } foreach (IProperty cprop in t.Properties) { if (!cprop.IsAbstract && cprop.Name == prop.Name) { alreadyImplemented = true; } } } if (!alreadyImplemented) { toImplement.Add(prop); } } return(toImplement); }