protected override bool AddLookupItems(CSharpCodeCompletionContext context, GroupedItemsCollector collector) { var referenceExpression = context.UnterminatedContext.ToReferenceExpression() ?? context.TerminatedContext.ToReferenceExpression(); if (referenceExpression == null) { return(false); } var qualifier = referenceExpression.QualifierExpression; if (qualifier == null) { return(false); } var settingsStore = qualifier.GetSettingsStore(); if (!settingsStore.GetValue(PostfixSettingsAccessor.ShowStaticMethods)) { return(false); } IType filterType; var qualifierType = GetQualifierType(qualifier, out filterType); if (qualifierType == null) { return(false); } var symbolTable = EmptySymbolTable.INSTANCE; foreach (var type in DeclaredTypesCollector.Accept(qualifierType)) { symbolTable = symbolTable.Merge(type.GetSymbolTable(context.PsiModule)); } var argumentsCount = GetExistingArgumentsCount(referenceExpression); // prepare symbol table of suitable static methods var accessFilter = new AccessRightsFilter(new ElementAccessContext(qualifier)); var staticMethodsFilter = new SuitableStaticMethodsFilter(filterType, qualifier, argumentsCount); var filteredSymbolTable = symbolTable.Filter(staticMethodsFilter, OverriddenFilter.INSTANCE, accessFilter); FillCollectorWithStaticItems(context, collector, filteredSymbolTable, argumentsCount); return(true); }
[NotNull] private static ISymbolTable GetStaticMethodsSymbolTable( [NotNull] IReferenceExpression referenceExpression, [NotNull] IType qualifierType, [NotNull] IType firstArgumentType) { var symbolTable = EmptySymbolTable.INSTANCE; var typesToTraverse = DeclaredTypesCollector.Accept(qualifierType); var psiModule = referenceExpression.GetPsiModule(); foreach (var type in typesToTraverse) { symbolTable = symbolTable.Merge(type.GetSymbolTable(psiModule)); } var existingArgumentsCount = GetExistingArgumentsCount(referenceExpression); // prepare symbol table of suitable static methods var accessFilter = new AccessRightsFilter(referenceExpression.Reference.GetAccessContext()); var qualifierExpression = referenceExpression.QualifierExpression.NotNull("qualifierExpression != null"); var staticMethodsFilter = new StaticMethodsByFirstArgumentTypeFilter(firstArgumentType, qualifierExpression, existingArgumentsCount); var filteredSymbolTable = symbolTable.Filter(staticMethodsFilter, OverriddenFilter.INSTANCE, accessFilter); return(filteredSymbolTable); }
protected bool CanBeLoopedOver([NotNull] CSharpPostfixTemplateContext context, [CanBeNull] out string lengthName) { lengthName = null; var expressionContext = context.InnerExpression; if (expressionContext == null || !expressionContext.CanBeStatement) { return(false); } var expression = expressionContext.Expression; if (context.IsPreciseMode && !expression.IsPure()) { return(false); } if (expressionContext.Type is IArrayType) { // todo: test with array of unresolved types lengthName = "Length"; return(true); } if (!expressionContext.Type.IsResolved) { return(false); // even in force mode } if (expressionContext.Type.IsPredefinedIntegralNumeric()) { if (expressionContext.PostfixContext.IsPreciseMode) { return(false); } return(true); } var psiModule = expressionContext.PostfixContext.PsiModule; var symbolTable = expressionContext.Type.GetSymbolTable(psiModule); var accessFilter = new AccessRightsFilter(new ElementAccessContext(expression)); var publicProperties = symbolTable.Filter(myPropertyFilter, OverriddenFilter.INSTANCE, accessFilter); const string countPropertyName = "Count"; var resolveResult = publicProperties.GetResolveResult(countPropertyName); var property = resolveResult.DeclaredElement as IProperty; if (property != null) { if (property.IsStatic) { return(false); } if (!property.Type.IsInt()) { return(false); } lengthName = countPropertyName; return(true); } return(false); }