public override void VisitInvocationExpression(IInvocationExpression element, IHighlightingConsumer consumer) { base.VisitInvocationExpression(element, consumer); IMethod method; if (ReflectedTypeHelper.IsReflectionTypeMethod(element, out method)) { var reflectedType = ResolveReflectedType(element); var validator = ReflectionValidatorsRegistry.GetValidator(method); if (validator != null && validator.CanValidate(reflectedType)) { var error = validator.Validate(reflectedType, element); if (error != null) { consumer.AddHighlighting(error); } } } }
protected override bool AddLookupItems(CSharpCodeCompletionContext context, GroupedItemsCollector collector) { var node = context.NodeInFile; if (node.GetTokenType() == CSharpTokenType.LPARENTH && node.Parent is IInvocationExpression) { var invocationExpression = (IInvocationExpression)node.Parent; IMethod method; if (ReflectedTypeHelper.IsReflectionTypeMethod(invocationExpression, false, out method)) { MethodSpecificCompletion methodSpecificCompletion; if (IsCompletionRegisteredForMethod(method, out methodSpecificCompletion)) { var reflectedType = ReflectedTypeHelper.ResolveReflectedType(invocationExpression); if (reflectedType.ResolvedAs != ReflectedTypeResolution.NotResolved) { var symbols = reflectedType.Type.GetSymbolTable(context.PsiModule) .Filter(new ExtensionMethodsFilter(reflectedType.TypeElement)); if (reflectedType.ResolvedAs == ReflectedTypeResolution.Exact || reflectedType.ResolvedAs == ReflectedTypeResolution.ExactMakeGeneric) { //merge substituted constructors var constructorsSymbols = (ISymbolTable)Activator.CreateInstance(TypeMembersSymbolsTableType, new object[] { reflectedType.TypeElement, ((IDeclaredType)reflectedType.Type).GetSubstitution(), reflectedType.TypeElement.Constructors.Where(c => !c.IsStatic), 0, null }); symbols = symbols.Merge(constructorsSymbols); } methodSpecificCompletion.ProcessMembers(context, collector, symbols); collector.AddFilter(new ReflectionMembersPreference()); } } } } return(base.AddLookupItems(context, collector)); }
private ReflectedTypeResolveResult ResolveReflectedType(IInvocationExpression invocationExpression) { return(ReflectedTypeHelper.ResolveReflectedType(invocationExpression)); }