Ejemplo n.º 1
0
        public override bool IsAvailable(IUserDataHolder cache)
        {
            // Quick fix should be available only for exceptions, declared in the same project.
            // I.e. fix would be unavailable for internal exeptions visible because of InternalVisibleTo
            var project =
                _highlighting.PreconditionContainer.DeclaredElement
                .With(x => x.GetContainingType())
                .With(x => x.GetSingleOrDefaultSourceFile())
                .With(x => x.GetProject());

            var exceptionProject =
                _highlighting.ExceptionClass
                .With(x => x.GetDeclarations().FirstOrDefault())
                .With(x => x.GetProject());

            // Fix is available only when exception declared in the same project!!
            if (project == null || exceptionProject == null || project.Guid != exceptionProject.Guid)
            {
                return(false);
            }

            var exceptionDeclaration =
                (IClassDeclaration)_highlighting.ExceptionClass.GetDeclarations().FirstOrDefault();

            if (exceptionDeclaration == null)
            {
                return(false);
            }

            // TODO: terrible approach, but can't find better!
            using (var workflow = GeneratorWorkflowFactory.CreateWorkflowWithoutTextControl(
                       GeneratorStandardKinds.Constructor,
                       exceptionDeclaration,
                       exceptionDeclaration))
            {
                Contract.Assert(workflow != null);

                var ctors = workflow.Context.ProvidedElements
                            .OfType <GeneratorDeclaredElement <IConstructor> >()
                            .Select(c => c.DeclaredElement)
                            .ToList();

                // TODO: refine me later!!
                if (ctors.Any(ContractUtils.HasTwoStringArgument))
                {
                    _missedConstructorPredicate = ContractUtils.HasTwoStringArgument;
                    _missedConstructor          = "ctor(string, string)";
                    return(true);
                }

                if (ctors.Any(ContractUtils.HasOneStringArgument))
                {
                    _missedConstructorPredicate = ContractUtils.HasOneStringArgument;
                    _missedConstructor          = "ctor(string)";
                    return(true);
                }

                return(false);
            }
        }
Ejemplo n.º 2
0
        protected override Action <ITextControl> ExecutePsiTransaction(ISolution solution, IProgressIndicator progress)
        {
            var exceptionDeclaration =
                (IClassDeclaration)_highlighting.ExceptionClass.GetDeclarations().FirstOrDefault();

            Contract.Assert(exceptionDeclaration != null);

            using (var workflow = GeneratorWorkflowFactory.CreateWorkflowWithoutTextControl(
                       GeneratorStandardKinds.Constructor,
                       exceptionDeclaration,
                       exceptionDeclaration))
            {
                Contract.Assert(workflow != null);

                var ctors = workflow.Context.ProvidedElements
                            .OfType <GeneratorDeclaredElement <IConstructor> >()
                            .Where(ge => _missedConstructorPredicate(ge.DeclaredElement))
                            .ToList();

                Contract.Assert(ctors.Count != 0);

                workflow.Context.InputElements.Clear();
                workflow.Context.InputElements.AddRange(ctors);
                workflow.BuildOptions();
                workflow.Generate("Generate missing constructor", NullProgressIndicator.Instance);
            }

            return(null);
        }
        private void AddNonDefaultConstructorIfNeeded(IClassDeclaration contractClass)
        {
            if (!_addContractForAvailability.IsAbstractClass)
            {
                return;
            }

            var abstractBaseClass = _addContractForAvailability.ClassDeclaration;

            using (var workflow = GeneratorWorkflowFactory.CreateWorkflowWithoutTextControl(
                       GeneratorStandardKinds.Constructor,
                       contractClass,
                       abstractBaseClass))
            {
                Contract.Assert(workflow != null);

                var ctor =
                    workflow.Context.ProvidedElements
                    .OfType <GeneratorDeclaredElement <IConstructor> >()
                    .FirstOrDefault(c => !c.DeclaredElement.IsDefault);

                if (ctor != null)
                {
                    workflow.Context.InputElements.Clear();
                    workflow.Context.InputElements.Add(ctor);
                    workflow.BuildOptions();
                    workflow.Generate("Generate missing constructor", NullProgressIndicator.Instance);
                }
            }
        }
        private void ImplementContractForInterface(IClassDeclaration contractClass,
                                                   IInterfaceDeclaration interfaceDeclaration)
        {
            Contract.Requires(contractClass != null);
            Contract.Requires(interfaceDeclaration != null);

            if (interfaceDeclaration.MemberDeclarations.Count == 0)
            {
                return;
            }

            using (var workflow = GeneratorWorkflowFactory.CreateWorkflowWithoutTextControl(
                       GeneratorStandardKinds.MissingMembers,
                       contractClass,
                       interfaceDeclaration))
            {
                Contract.Assert(workflow != null);

                workflow.Context.InputElements.Clear();
                workflow.Context.InputElements.AddRange(workflow.Context.ProvidedElements);

                workflow.Context.SetOption(
                    CSharpBuilderOptions.ImplementationKind,
                    CSharpBuilderOptions.ImplementationKindExplicit);

                workflow.Generate("Generate contract class", NullProgressIndicator.Instance);
            }
        }
Ejemplo n.º 5
0
        private void ImplementInterfaceOrBaseClass(IClassDeclaration contractClass, IProgressIndicator progress)
        {
            string generateKind = GeneratorStandardKinds.Implementations;

            if (_addContractForAvailability.IsAbstractClass)
            {
                generateKind = GeneratorStandardKinds.Overrides;
            }

            using (var workflow = GeneratorWorkflowFactory.CreateWorkflowWithoutTextControl(
                       generateKind,
                       contractClass,
                       contractClass))
            //_addContractForAvailability.TypeDeclaration))
            {
                Contract.Assert(workflow != null);



                workflow.Context.SetGlobalOptionValue(CSharpBuilderOptions.PropertyBody,
                                                      CSharpBuilderOptions.PropertyBodyDefault);

                workflow.Context.SetGlobalOptionValue(
                    CSharpBuilderOptions.ImplementationKind,
                    CSharpBuilderOptions.ImplementationKindExplicit);

                //var globalActions = workflow.Context.GlobalOptions;
                //var dd = globalActions
                //    .FirstOrDefault(g => g.ID == CSharpBuilderOptions.ImplementationKind);
                //if (dd != null)
                //{
                //    dd.OverridesGlobalOption = true;
                //    dd.Value = CSharpBuilderOptions.ImplementationKindPublicMember;
                //}

                workflow.Context.Anchor = contractClass;
                workflow.Context.InputElements.Clear();

                Contract.Assert(workflow.Context.ProvidedElements.Count != 0);
                workflow.Context.InputElements.AddRange(workflow.Context.ProvidedElements);
                //foreach (var e in workflow.Context.ProvidedElements)
                //{
                //    workflow.Context.InputElements.Add(e);
                //}


                //workflow.Context.GlobalOptions.Clear();



                workflow.GenerateAndFinish("Generate contract class", progress);
            }
        }
        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);
            }
        }