private void ImplementContractForAbstractClass(IClassDeclaration contractClass, IClassDeclaration abstractClass) { Contract.Requires(contractClass != null); Contract.Requires(contractClass.DeclaredElement != null); Contract.Requires(abstractClass != null); Contract.Requires(abstractClass.DeclaredElement != null); using (var workflow = GeneratorWorkflowFactory.CreateWorkflowWithoutTextControl( GeneratorStandardKinds.Overrides, contractClass, abstractClass)) { Contract.Assert(workflow != null); // By default this input for this workflow contains too many members: // It contains member from the base class (required) and // members from the other base classes (i.e. from System.Object). // Using some hack to get only members defined in the "abstractClass" // So I'm trying to find required elements myself. var missingMembers = contractClass.GetMissingMembersOf(abstractClass); if (_requiredFunction != null) { var requiredDeclaration = _requiredFunction.DeclaredElement; missingMembers = missingMembers.Where(x => GetMembers(x).Any(m => m.Equals(requiredDeclaration))) .ToList(); Contract.Assert(missingMembers.Count != 0, "Should be at least one method to add!"); } var membersToOverride = missingMembers .Select(x => new GeneratorDeclaredElement <IOverridableMember>(x.Member, x.Substitution)) .ToList(); workflow.Context.InputElements.Clear(); workflow.Context.ProvidedElements.Clear(); workflow.Context.ProvidedElements.AddRange(membersToOverride); workflow.Context.InputElements.AddRange(workflow.Context.ProvidedElements); workflow.Generate("Generate contract class", NullProgressIndicator.Instance); } }
private void ImplementContractForAbstractClass(IClassDeclaration contractClass, IClassDeclaration abstractClass) { Contract.Requires(contractClass != null); Contract.Requires(contractClass.DeclaredElement != null); Contract.Requires(abstractClass != null); Contract.Requires(abstractClass.DeclaredElement != null); using (var workflow = GeneratorWorkflowFactory.CreateWorkflowWithoutTextControl( GeneratorStandardKinds.Overrides, contractClass, abstractClass)) { Contract.Assert(workflow != null); // By default this input for this workflow contains too many members: // It contains member from the base class (required) and // members from the other base classes (i.e. from System.Object). // Using some hack to get only members defined in the "abstractClass" // So I'm trying to find required elements myself. var missingMembers = contractClass.GetMissingMembersOf(abstractClass); if (_requiredFunction != null) { var requiredDeclaration = _requiredFunction.DeclaredElement; missingMembers = missingMembers.Where(x => GetMembers(x).Any(m => m.Equals(requiredDeclaration))) .ToList(); Contract.Assert(missingMembers.Count != 0, "Should be at least one method to add!"); } var membersToOverride = missingMembers .Select(x => new GeneratorDeclaredElement<IOverridableMember>(x.Member, x.Substitution)) .ToList(); workflow.Context.InputElements.Clear(); workflow.Context.ProvidedElements.Clear(); workflow.Context.ProvidedElements.AddRange(membersToOverride); workflow.Context.InputElements.AddRange(workflow.Context.ProvidedElements); workflow.Generate("Generate contract class", NullProgressIndicator.Instance); } }