public InefficientMultidimensionalArrayUsageQuickFix(InefficientMultidimensionalArrayUsageWarning warning) { myWarning = warning; myVariableDeclaration = warning.VariableDeclaration; myTreeNodePointers = warning.Usages; myArrayCreationExpression = warning.ArrayCreationExpression; myType = (myVariableDeclaration.Type as IArrayType).NotNull("type != null"); myMultipleDeclaration = warning.MultiplyDeclaration; }
private static void ProcessCSharpMultipleDeclaration([NotNull] IMultipleDeclaration declaration, [NotNull] CodeStructureElement parentElement, CSharpCodeStructureProcessingState state) { foreach (IMultipleDeclarationMember declarationMember in declaration.Declarators) { if (!declarationMember.IsSynthetic()) { ProcessCSharpDeclaration(declarationMember, parentElement, state); } } }
/// <summary> /// The execute transaction inner. /// </summary> /// <param name="solution"> /// The solution. /// </param> /// <param name="textControl"> /// The text control. /// </param> public override void ExecuteTransactionInner(ISolution solution, ITextControl textControl) { IList <ITokenNode> tokensForLine = Utils.GetTokensForLineFromTextControl(solution, textControl); foreach (ITokenNode tokenNode in tokensForLine) { ITypeArgumentList typeArgumentListNode = tokenNode.GetContainingNode <ITypeArgumentList>(true); if (typeArgumentListNode != null) { ReadabilityRules.SwapToBuiltInTypeAlias(typeArgumentListNode); } IObjectCreationExpression objectCreationExpressionNode = tokenNode.GetContainingNode <IObjectCreationExpression>(true); if (objectCreationExpressionNode != null) { ReadabilityRules.SwapToBuiltInTypeAlias(objectCreationExpressionNode); } IArrayCreationExpression arrayCreationExpressionNode = tokenNode.GetContainingNode <IArrayCreationExpression>(true); if (arrayCreationExpressionNode != null) { ReadabilityRules.SwapToBuiltInTypeAlias(arrayCreationExpressionNode); } IMethodDeclaration methodDeclaration = tokenNode.GetContainingNode <IMethodDeclaration>(true); if (methodDeclaration != null) { ReadabilityRules.SwapToBuiltInTypeAlias(methodDeclaration); } IVariableDeclaration variableDeclaration = tokenNode.GetContainingNode <IVariableDeclaration>(true); if (variableDeclaration != null) { ReadabilityRules.SwapToBuiltInTypeAlias(variableDeclaration); } IMultipleDeclaration multipleDeclarationNode = tokenNode.GetContainingNode <IMultipleDeclaration>(true); if (multipleDeclarationNode != null) { ReadabilityRules.SwapToBuiltInTypeAlias(multipleDeclarationNode); } } }
private void CheckMember( IClassMemberDeclaration declaration, IHighlightingConsumer highlightingConsumer, CommentAnalyzer commentAnalyzer, IdentifierSpellCheckAnalyzer identifierAnalyzer) { if (declaration is IConstructorDeclaration && declaration.IsStatic) { // TODO: probably need to put this somewhere in settings. //Static constructors have no visibility so not clear how to check them. return; } // Documentation doesn't work properly on multiple declarations (as of R# 6.1) so see if we can get it from the parent XmlNode docNode = null; IDocCommentBlockNode commentBlock; var multipleDeclarationMember = declaration as IMultipleDeclarationMember; if (multipleDeclarationMember != null) { // get the parent IMultipleDeclaration multipleDeclaration = multipleDeclarationMember.MultipleDeclaration; // Now ask for the actual comment block commentBlock = SharedImplUtil.GetDocCommentBlockNode(multipleDeclaration); if (commentBlock != null) { docNode = commentBlock.GetXML(null); } } else { commentBlock = SharedImplUtil.GetDocCommentBlockNode(declaration); docNode = declaration.GetXMLDoc(false); } commentAnalyzer.CheckMemberHasComment(declaration, docNode, highlightingConsumer); commentAnalyzer.CheckCommentSpelling(declaration, commentBlock, highlightingConsumer, true); identifierAnalyzer.CheckMemberSpelling(declaration, highlightingConsumer, true); }
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)); }