/// <summary> /// Called to check if ContextAction is available. /// ReadLock is taken /// Will not be called if <c>PsiManager</c>, ProjectFile of Solution == null /// </summary> /// <param name="element"> /// The element. /// </param> /// <returns> /// The is available. /// </returns> protected override bool IsAvailable(IElement element) { this.name = null; var localVariableDeclaration = this.Provider.GetSelectedElement<ILocalVariableDeclaration>(true, true); var assignmentExpression = this.Provider.GetSelectedElement<IAssignmentExpression>(true, true); if (assignmentExpression == null && localVariableDeclaration == null) { return false; } global::JetBrains.Util.TextRange range; IType declaredType; if (assignmentExpression != null) { var destination = assignmentExpression.Dest; if (destination == null) { return false; } if (!destination.IsClassifiedAsVariable) { return false; } declaredType = destination.GetExpressionType() as IDeclaredType; var referenceExpression = destination as IReferenceExpression; if (referenceExpression == null) { return false; } var reference = referenceExpression.Reference; var source = assignmentExpression.Source; if (source == null) { return false; } this.name = reference.GetName(); range = new global::JetBrains.Util.TextRange(destination.GetTreeStartOffset().Offset, source.GetTreeStartOffset().Offset); } else { var localVariable = localVariableDeclaration.DeclaredElement as ILocalVariable; if (localVariable == null) { return false; } declaredType = localVariable.Type; var declNode = localVariableDeclaration.ToTreeNode(); if (declNode.AssignmentSign == null) { return false; } this.name = localVariable.ShortName; IIdentifierNode identifier = declNode.NameIdentifier; if (identifier == null) { return false; } var initial = localVariableDeclaration.Initial; if (initial == null) { return false; } range = new global::JetBrains.Util.TextRange(identifier.GetTreeStartOffset().Offset, initial.GetTreeStartOffset().Offset); } if (declaredType == null) { return false; } if (!declaredType.IsReferenceType()) { return false; } return range.IsValid() && range.Contains(this.Provider.CaretOffset.Offset); }
/// <summary> /// Gets the name of the template. /// </summary> /// <param name="parameters"> /// The parameters. /// </param> /// <returns> /// The items. /// </returns> IEnumerable<LiveTemplateItem> ILiveTemplate.GetItems(SmartGenerateParameters parameters) { var element = parameters.Element; var result = new List<LiveTemplateItem>(); var hasString = false; var hasInt = false; var hasBool = false; var expression = element.GetContainingElement(typeof(IExpression), false) as IExpression; while (expression != null) { var type = expression.Type(); var typeName = type.GetPresentableName(element.Language); var treeTextRange = expression.GetTreeTextRange(); var textRange = new global::JetBrains.Util.TextRange(treeTextRange.StartOffset.Offset, treeTextRange.EndOffset.Offset); if (typeName == "string" && !hasString) { result.Add(new LiveTemplateItem { MenuText = "Surround string expression", Description = "Surround string expression", Shortcut = "Surround string expression", Range = textRange }); hasString = true; } if (typeName == "int" && !hasInt) { result.Add(new LiveTemplateItem { MenuText = "Surround integer expression", Description = "Surround integer expression", Shortcut = "Surround integer expression", Range = textRange }); hasInt = true; } if (typeName == "bool" && !hasBool) { result.Add(new LiveTemplateItem { MenuText = "Surround boolean expression", Description = "Surround boolean expression", Shortcut = "Surround boolean expression", Range = textRange }); hasBool = true; } expression = expression.GetContainingElement(typeof(IExpression), false) as IExpression; } return result; }