예제 #1
0
        private string GetPresentationInner(ISolution solution, IDeclaredElement declaredElement, bool prefabImport, bool makeTextShorter)
        {
            solution.GetComponent <IShellLocks>().AssertReadAccessAllowed();
            var type = declaredElement.Type();

            if (type == null)
            {
                return("...");
            }
            if (type.IsBool())
            {
                if (SimpleValue.Equals("0"))
                {
                    return("\"false\"");
                }
                return("\"true\"");
            }

            if (type.IsEnumType())
            {
                if (!int.TryParse(SimpleValue, out var result))
                {
                    return("...");
                }
                var @enum          = type.GetTypeElement() as IEnum;
                var enumMemberType = @enum?.EnumMembers.FirstOrDefault()?.ConstantValue.Type;
                if (enumMemberType == null)
                {
                    return("...");
                }
                var enumMembers = CSharpEnumUtil.CalculateEnumMembers(new ConstantValue(result, enumMemberType), @enum);

                return(string.Join(" | ", enumMembers.Select(t => t.ShortName)));
            }

            var textPresentation = SimpleValue;

            if (makeTextShorter && textPresentation != null)
            {
                textPresentation = StringUtil.DropMiddleIfLong(textPresentation, 30);
            }
            return($"\"{textPresentation ?? "..." }\"");
        }
        protected override bool AddLookupItems(CSharpCodeCompletionContext context, GroupedItemsCollector collector)
        {
            bool         moqIsSeen = false;
            var          candidateExistingElements = new List <ISymbolInfo>();
            ISymbolTable table = GetSymbolTable(context);

            if (table != null)
            {
                table.ForAllSymbolInfos(info =>
                {
                    IDeclaredElement declaredElement = info.GetDeclaredElement();
                    if (declaredElement.ConvertToString() == "Class:Moq.Mock")
                    {
                        moqIsSeen = true;
                    }
                    IType type = declaredElement.Type();
                    if (type != null)
                    {
                        if (type.GetClassType().ConvertToString() == "Class:Moq.Mock`1")
                        {
                            IType typeParameter = TypesUtil.GetTypeArgumentValue(type, 0);
                            if (typeParameter != null && context.ExpectedTypesContext != null && context.ExpectedTypesContext.ExpectedITypes != null && context.ExpectedTypesContext.ExpectedITypes.Select(x => x.Type).Where(x => x != null).Any(x => typeParameter.IsExplicitlyConvertibleTo(x, ClrPredefinedTypeConversionRule.INSTANCE)))
                            {
                                candidateExistingElements.Add(info);
                            }
                        }
                    }
                });
            }
            foreach (ISymbolInfo candidateExistingElement in candidateExistingElements)
            {
#if RESHARPER8
                collector.AddToTop(context.LookupItemsFactory.CreateTextLookupItem(candidateExistingElement.ShortName + ".Object"));
#endif
#if RESHARPER9
                var lookupItem = new TextLookupItem(candidateExistingElement.ShortName + ".Object");
                lookupItem.InitializeRanges(context.CompletionRanges, context.BasicContext);
                lookupItem.PlaceTop();
                collector.Add(lookupItem);
#endif
            }
            if (moqIsSeen && !candidateExistingElements.Any() && context.ExpectedTypesContext != null)
            {
                foreach (ExpectedTypeCompletionContextBase.ExpectedIType expectedType in context.ExpectedTypesContext.ExpectedITypes)
                {
                    if (expectedType.Type == null)
                    {
                        continue;
                    }
                    if (expectedType.Type.IsInterfaceType())
                    {
                        string typeName = expectedType.Type.GetPresentableName(CSharpLanguage.Instance);
#if RESHARPER8
                        if (candidateExistingElements.Any())
                        {
                            collector.AddToBottom(context.LookupItemsFactory.CreateTextLookupItem("new Mock<" + typeName + ">().Object"));
                        }
                        else
                        {
                            collector.AddToTop(context.LookupItemsFactory.CreateTextLookupItem("new Mock<" + typeName + ">().Object"));
                        }
#endif
#if RESHARPER9
                        var lookupItem = new TextLookupItem("new Mock<" + typeName + ">().Object");
                        lookupItem.InitializeRanges(context.CompletionRanges, context.BasicContext);
                        if (candidateExistingElements.Any())
                        {
                            lookupItem.PlaceBottom();
                        }
                        else
                        {
                            lookupItem.PlaceTop();
                        }
                        collector.Add(lookupItem);
#endif
                    }
                }
            }
            return(true);
        }
예제 #3
0
        protected override Action <ITextControl> ExecutePsiTransaction(ISolution solution, IProgressIndicator progress)
        {
            var accessExpression = _error.Reference.GetTreeNode() as IExpression;
            var replacementNode  = accessExpression;

            if (replacementNode == null)
            {
                return(null);
            }

            var modifiers = _declaredElement as IModifiersOwner;

            if (modifiers == null)
            {
                return(null);
            }

            bool isAssign     = replacementNode.Parent is IAssignmentExpression;
            bool needsCasting = !isAssign && !(replacementNode.Parent is IExpressionStatement) &&
                                !_declaredElement.Type().IsVoid() && !_declaredElement.Type().IsObject();

            if (replacementNode.Parent is IInvocationExpression || replacementNode.Parent is IAssignmentExpression)
            {
                replacementNode = (IExpression)replacementNode.Parent;
            }

            CSharpElementFactory factory = CSharpElementFactory.GetInstance(replacementNode, applyCodeFormatter: true);

            AddSystemReflectionNamespace(factory);


            BindingFlags flags = BindingFlags.NonPublic;

            if (modifiers.IsStatic)
            {
                flags |= BindingFlags.Static;
            }
            else
            {
                flags |= BindingFlags.Instance;
            }

            flags |= GetInvokeMemberBindingFlag(_declaredElement, isAssign);

            IExpression instanceExpression = modifiers.IsStatic ? factory.CreateExpression("null") : ((IReferenceExpression)accessExpression).QualifierExpression;
            IExpression argsExpression     = factory.CreateExpression("null");

            if (isAssign)
            {
                argsExpression = factory.CreateExpression("new object[] { $0 }",
                                                          ((IAssignmentExpression)replacementNode).Source);
            }
            if (replacementNode is IInvocationExpression)
            {
                var invocationExpression = (IInvocationExpression)replacementNode;

                if (invocationExpression.Arguments.Count != 0)
                {
                    argsExpression = CreateArrayCreationExpression(
                        TypeFactory.CreateTypeByCLRName(
                            "System.Object",
                            accessExpression.GetPsiModule(),
                            accessExpression.GetResolveContext()), factory);
                    var arrayCreationExpression = argsExpression as IArrayCreationExpression;

                    foreach (var arg in invocationExpression.ArgumentsEnumerable)
                    {
                        var initiallizer = factory.CreateVariableInitializer((ICSharpExpression)arg.Expression);
                        arrayCreationExpression.ArrayInitializer.AddElementInitializerBefore(initiallizer, null);
                    }
                }
            }

            var reflectionExpression = factory.CreateExpression("typeof($0).InvokeMember(\"$1\", $2, null, $3, $4)",
                                                                ((IClrDeclaredElement)_declaredElement).GetContainingType(),
                                                                _declaredElement.ShortName,
                                                                flags.GetFullString(),
                                                                instanceExpression,
                                                                argsExpression);

            if (needsCasting)
            {
                reflectionExpression = factory.CreateExpression("($0)$1",
                                                                _declaredElement.Type(),
                                                                reflectionExpression);
            }

            replacementNode.ReplaceBy(reflectionExpression);
            return(null);
        }