예제 #1
0
        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);
        }