예제 #1
0
        /// <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);
        }
예제 #2
0
        /// <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);
        }
예제 #3
0
        /// <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));
        }