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); }
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); }