/// <summary> /// Process local variable declaration. /// </summary> /// <param name="localVariableDeclaration"> /// The local variable declaration. /// </param> private static void ProcessLocalVariableDeclaration(ILocalVariableDeclaration localVariableDeclaration) { IMultipleLocalVariableDeclaration multipleDeclaration = MultipleLocalVariableDeclarationNavigator.GetByDeclarator(localVariableDeclaration); if (multipleDeclaration.Declarators.Count > 1) { IType newType = CSharpTypeFactory.CreateType(multipleDeclaration.TypeUsage); using (WriteLockCookie.Create(true)) { multipleDeclaration.SetTypeUsage(CSharpElementFactory.GetInstance(localVariableDeclaration.GetPsiModule()).CreateTypeUsageNode(newType)); } } else { ILocalVariable variable = localVariableDeclaration.DeclaredElement; if (variable != null) { if (!multipleDeclaration.IsVar) { using (WriteLockCookie.Create(true)) { localVariableDeclaration.SetType(variable.Type); } } } } }
private static ITreeNode GetCaptureHighlightingRange( [NotNull] ITreeNode topDeclaration, [CanBeNull] IParametersOwner thisElement, [NotNull] IDeclaredElement capture, out DocumentRange range) { var declarations = capture.GetDeclarations(); if (declarations.Count == 0) // accessors 'value' parameter { if (thisElement is IAccessor accessor && Equals(accessor.ValueVariable, capture)) { var identifier = ((IAccessorDeclaration)topDeclaration).NameIdentifier; range = identifier.GetDocumentRange(); return(identifier); } range = DocumentRange.InvalidRange; return(null); } var declaration = declarations[0]; range = declaration.GetNameDocumentRange(); #if RESHARPER2016_3 var nameEndOffset = range.EndOffset; #else var nameEndOffset = range.TextRange.EndOffset; #endif if (declaration is ILocalVariableDeclaration variableDeclaration) { var multiple = MultipleLocalVariableDeclarationNavigator.GetByDeclarator(variableDeclaration); if (multiple != null && multiple.Declarators[0] == variableDeclaration) { var documentRange = multiple.GetTypeRange(); range = documentRange.SetEndTo(nameEndOffset); return(variableDeclaration); } return(null); } if (declaration is IRegularParameterDeclaration parameterDeclaration) { if (range.TextRange.Length < 3) { range = parameterDeclaration.TypeUsage.GetDocumentRange().SetEndTo(nameEndOffset); } return(parameterDeclaration); } if (declaration is IAnonymousMethodParameterDeclaration anonymousParameter) { range = anonymousParameter.TypeUsage.GetDocumentRange().SetEndTo(nameEndOffset); return(anonymousParameter); } return(declaration); }
// Check that invocation immediately under declaration statement as initializer (Parenthesized Expression is allowed) private bool IsInvocationInitializer() { var expression = myInvocationExpression.GetContainingParenthesizedExpression(); var currentInitializer = ExpressionInitializerNavigator.GetByValue(expression); var selectedDeclarator = LocalVariableDeclarationNavigator.GetByInitial(currentInitializer); var multiplyVariableDeclaration = MultipleLocalVariableDeclarationNavigator.GetByDeclarator(selectedDeclarator); return(DeclarationStatementNavigator.GetByDeclaration(multiplyVariableDeclaration) != null); }
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)); }