public IEnumerable <IntentionAction> CreateBulbItems()
        {
            var fieldDeclaration         = myDataProvider.GetSelectedElement <IFieldDeclaration>();
            var multipleFieldDeclaration = MultipleFieldDeclarationNavigator.GetByDeclarator(fieldDeclaration);

            if (multipleFieldDeclaration == null)
            {
                return(EmptyList <IntentionAction> .Enumerable);
            }

            var unityApi     = myDataProvider.Solution.GetComponent <UnityApi>();
            var isSerialized = unityApi.IsSerialisedField(fieldDeclaration.DeclaredElement);

            if (multipleFieldDeclaration.Declarators.Count == 1)
            {
                return(new ToggleSerializedFieldAll(multipleFieldDeclaration, myDataProvider.PsiModule,
                                                    myDataProvider.ElementFactory, isSerialized).ToContextActionIntentions());
            }

            return(new[]
            {
                new ToggleSerializedFieldOne(fieldDeclaration, myDataProvider.PsiModule, myDataProvider.ElementFactory,
                                             isSerialized).ToContextActionIntention(ourSubmenuAnchor),
                new ToggleSerializedFieldAll(multipleFieldDeclaration, myDataProvider.PsiModule,
                                             myDataProvider.ElementFactory, isSerialized).ToContextActionIntention(ourSubmenuAnchor)
            });
        }
Example #2
0
        public IEnumerable <IntentionAction> CreateBulbItems()
        {
            var fieldDeclaration         = myDataProvider.GetSelectedElement <IFieldDeclaration>();
            var multipleFieldDeclaration = MultipleFieldDeclarationNavigator.GetByDeclarator(fieldDeclaration);
            var unityApi = myDataProvider.Solution.GetComponent <UnityApi>();

            if (!unityApi.IsSerialisedField(fieldDeclaration?.DeclaredElement) || multipleFieldDeclaration == null)
            {
                return(EmptyList <IntentionAction> .Enumerable);
            }

            var existingAttribute = AttributeUtil.GetAttribute(fieldDeclaration, KnownTypes.HideInInspector);

            if (multipleFieldDeclaration.Declarators.Count == 1)
            {
                return(new ToggleHideInInspectorAll(multipleFieldDeclaration, myDataProvider.PsiModule,
                                                    myDataProvider.ElementFactory, existingAttribute).ToContextActionIntentions());
            }

            return(new[]
            {
                new ToggleHideInInspectorOne(fieldDeclaration, myDataProvider.PsiModule, myDataProvider.ElementFactory,
                                             existingAttribute).ToContextActionIntention(ourSubmenuAnchor),
                new ToggleHideInInspectorAll(multipleFieldDeclaration, myDataProvider.PsiModule,
                                             myDataProvider.ElementFactory, existingAttribute).ToContextActionIntention(ourSubmenuAnchor)
            });
        }
Example #3
0
        public RemoveReadonlyFromSerializedFieldQuickFix(RedundantSerializeFieldAttributeWarning highlighting)
        {
            myAttribute = highlighting.Attribute;
            var attributeSectionList = AttributeSectionListNavigator.GetByAttribute(myAttribute);

            myMultipleFieldDeclaration = MultipleFieldDeclarationNavigator.GetByAttributes(attributeSectionList);
            myFieldDeclarations        = FieldDeclarationNavigator.GetByAttribute(myAttribute);
        }
Example #4
0
        protected override Action <ITextControl> ExecutePsiTransaction(ISolution solution, IProgressIndicator progress)
        {
            var attributeSectionList     = AttributeSectionListNavigator.GetByAttribute(myAttribute);
            var multipleFieldDeclaration = MultipleFieldDeclarationNavigator.GetByAttributes(attributeSectionList);

            if (multipleFieldDeclaration != null)
            {
                SplitDeclarationsListAction.Execute(multipleFieldDeclaration);
            }
            return(null);
        }
        public IEnumerable <IntentionAction> CreateBulbItems()
        {
            var selectedFieldDeclaration = myDataProvider.GetSelectedElement <IFieldDeclaration>();
            var multipleFieldDeclaration = MultipleFieldDeclarationNavigator.GetByDeclarator(selectedFieldDeclaration);
            var unityApi = myDataProvider.Solution.GetComponent <UnityApi>();

            if (!unityApi.IsSerialisedField(selectedFieldDeclaration?.DeclaredElement) || multipleFieldDeclaration == null)
            {
                return(EmptyList <IntentionAction> .Enumerable);
            }

            var existingAttribute = selectedFieldDeclaration.GetAttribute(AttributeTypeName);

            var actionToApplyToEntireDeclaration = GetActionToApplyToEntireFieldDeclaration(multipleFieldDeclaration,
                                                                                            selectedFieldDeclaration, myDataProvider.PsiModule, myDataProvider.ElementFactory,
                                                                                            existingAttribute)
                                                   .ToContextActionIntention(myAnchor);

            // If we only have a single field in the declaration, then use the default action ("Add 'Attr'")
            // This is the most likely case
            if (multipleFieldDeclaration.Declarators.Count == 1)
            {
                return new[] { actionToApplyToEntireDeclaration }
            }
            ;

            var actionToExtractAndApply = GetActionToExtractAndApplyToSingleField(multipleFieldDeclaration,
                                                                                  selectedFieldDeclaration, myDataProvider.PsiModule, myDataProvider.ElementFactory,
                                                                                  existingAttribute)
                                          .ToContextActionIntention(myAnchor);

            // Only makes sense to apply to a single attribute, not all. E.g. you can't apply Range to all the fields
            // in a multiple
            if (SupportsSingleDeclarationOnly)
            {
                return new[] { actionToExtractAndApply }
            }
            ;

            // Change the order of main menu and submenu. If it's a layout attribute (e.g. 'Space'):
            // "Add 'Attr' before all fields" -> "Add 'Attr' before 'field'"
            // If it's an annotation attribute (e.g. 'Tooltip'):
            // "Add 'Attr' to 'field'" -> "Add 'Attr' to all fields"
            return(IsLayoutAttribute
                ? new[] { actionToApplyToEntireDeclaration, actionToExtractAndApply }
                : new[] { actionToExtractAndApply, actionToApplyToEntireDeclaration });
        }
        public static void CreateInefficientMultidimensionalArrayAccessWarning([CanBeNull] IDeclaredElement declaredElement,
                                                                               [NotNull] IVariableDeclaration variableDeclaration, [NotNull]  IDaemonProcess daemonProcess, [NotNull]  DaemonProcessKind kind,
                                                                               [NotNull] IHighlightingConsumer consumer, [NotNull] DocumentRange highlightingRange)
        {
            if (declaredElement == null)
            {
                return;
            }

            var type = variableDeclaration.Type as IArrayType;

            if (type == null)
            {
                return;
            }

            if (type.Rank == 1)
            {
                return;
            }

            IArrayCreationExpression arrayCreationExpression = null;
            IMultipleDeclaration     multipleDeclaration     = null;

            switch (variableDeclaration)
            {
            case IFieldDeclaration fieldDeclaration:
                // perfomance optimization
                if (fieldDeclaration.GetAccessRights() != AccessRights.PRIVATE)
                {
                    return;
                }

                arrayCreationExpression = (fieldDeclaration.Initial as IExpressionInitializer)?.Value as IArrayCreationExpression;
                multipleDeclaration     = MultipleFieldDeclarationNavigator.GetByDeclarator(fieldDeclaration);

                break;

            case ILocalVariableDeclaration localVariableDeclaration:
                var initial = localVariableDeclaration.Initial;
                arrayCreationExpression = (initial as IExpressionInitializer)?.Value as IArrayCreationExpression;

                if (initial != null && arrayCreationExpression == null)
                {
                    return;
                }

                multipleDeclaration =
                    MultipleLocalVariableDeclarationNavigator.GetByDeclarator(localVariableDeclaration);
                break;

            default:
                return;
            }

            var classDeclaration = variableDeclaration.GetContainingNode <IClassLikeDeclaration>();

            if (classDeclaration == null)
            {
                return;
            }

            var usages = FindArrayUsages(declaredElement, classDeclaration, daemonProcess, kind);

            foreach (var usage in usages)
            {
                if (ElementAccessExpressionNavigator.GetByOperand(usage as ICSharpExpression) == null)
                {
                    return;
                }
            }

            if (arrayCreationExpression.ContainsErrorElement())
            {
                return;
            }

            consumer.AddHighlighting(new InefficientMultidimensionalArrayUsageWarning(usages.Select(t => t.CreateTreeElementPointer()).ToList(),
                                                                                      arrayCreationExpression, variableDeclaration, multipleDeclaration, highlightingRange));
        }