/// <summary> /// Adds global edit that will create instance of current type definition. /// </summary> /// <param name="editName">Name of the edit.</param> /// <param name="variableNameProvider">Provider of name of created instance.</param> /// <param name="argumentsProvider">Provider of arguments used in constructor.</param> /// <returns>Edit.</returns> protected Edit AddCreationEdit(string editName, NameProvider variableNameProvider, ArgumentsProvider argumentsProvider = null) { var creationTransformation = new AddCallTransformation((v) => { var entryContext = v.EntryBlock.Call; var name = variableNameProvider(this, entryContext); if (name == null) { v.Abort("Name hasn't been selected"); return(null); } var args = argumentsProvider == null ? null : argumentsProvider(v); if (args == null) { args = new object[0]; } if (v.IsAborted) { return(null); } var call = new CallEditInfo(TypeInfo, Naming.CtorName, args); call.ReturnName = name; return(call); }); var edit = new Edit(null, null, null, editName, creationTransformation); _globalEdits.Add(edit); return(edit); }
/// <summary> /// Creates edits for creating components. /// </summary> /// <returns>Edits for creating components.</returns> private IEnumerable <EditDefinition> componentCreationEdits() { var result = new List <EditDefinition>(); if (_currentResult == null || _currentResult.EntryContext == null) { return(null); } var call = _currentResult.EntryContext.EntryBlock.Call; var assembly = _loader.AppDomain.GetDefiningAssembly(call.Name); if (assembly == null) { return(result); } var components = assembly.GetReferencedComponents(); foreach (var component in components) { if (component.ImportingConstructor == null) { continue; } if (!Naming.IsParamLessCtor(component.ImportingConstructor)) { continue; } var edit = new EditDefinition("Create " + component.ComponentType.TypeName, (v) => { return(_vs.SafeRun(() => { var transformation = new AddCallTransformation((exV) => addComponent(component, exV)); var view = (v as EditView).CopyView(); view.Apply(transformation); return EditView.Wrap(view); }, "Creation edit failed")); }, (v) => true); result.Add(edit); } return(result); }
/// <summary> /// Creates edit that creates specified call. /// </summary> /// <param name="editProvider">The edit provider.</param> /// <param name="editName">Name of the edit.</param> /// <param name="callProvider">The call provider.</param> /// <returns>Created edit.</returns> public Edit AddCall(Instance editProvider, string editName, CallProvider callProvider) { var transformation = new AddCallTransformation(callProvider); return(AddEdit(editProvider, editName, transformation)); }