예제 #1
0
            [NotNull] public static HashSet <IDeclaredType> Accept([NotNull] IType type)
            {
                var collector = new DeclaredTypesCollector();

                type.Accept(collector);
                return(collector.myTypes);
            }
예제 #2
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);
        }