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) }); }
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) }); }
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)); }