コード例 #1
0
        public void ContextInTagDescriptionTest2()
        {
            string xaml = @"<Window x:Class='Vokabeltrainer.Window1'
	xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
	xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
	Title=''>
	<Grid>
		<StackPanel>
			<RadioButton
		</StackPanel>
	</Grid>
</Window>";

            int offset = @"<Window x:Class='Vokabeltrainer.Window1'
	xmlns='http://schemas.microsoft.com/winfx/2006/xaml/presentation'
	xmlns:x='http://schemas.microsoft.com/winfx/2006/xaml'
	Title=''>
	<Grid>
		<StackPanel>
			<RadioButton "            .Length;

            XamlContext context = CompletionDataHelper.ResolveContext(xaml, "", offset);

            Assert.AreEqual(XamlContextDescription.InTag, context.Description);
        }
コード例 #2
0
        public void ContextAtTagDescriptionTest4()
        {
            string      xaml    = "<Grid>\n\t<\n</Grid>";
            int         offset  = "<Grid>\n\t<".Length;
            XamlContext context = CompletionDataHelper.ResolveContext(xaml, "", offset);

            Assert.AreEqual(XamlContextDescription.AtTag, context.Description);
        }
コード例 #3
0
        public void ContextAtTagDescriptionTest3()
        {
            string      xaml    = File.ReadAllText("Test4.xaml");
            int         offset  = 413;
            XamlContext context = CompletionDataHelper.ResolveContext(xaml, "", offset);

            Assert.AreEqual(XamlContextDescription.AtTag, context.Description);
        }
コード例 #4
0
        public void ElementNameWithDotTest1()
        {
            string      xaml    = "<Grid>\n\t<Grid.ColumnDefinitions />\n</Grid>";
            int         offset  = "<Grid>\n".Length + 12;
            XamlContext context = CompletionDataHelper.ResolveContext(xaml, "", offset);

            Assert.AreEqual("Grid.ColumnDefinitions", context.ActiveElement.Name);
        }
コード例 #5
0
        public void ContextInTagDescriptionTest()
        {
            string      xaml    = "<Grid>\n\t<CheckBox x:Name=\"asdf\" Background=\"Aqua\" Content=\"{x:Static Cursors.Arrow}\" />\n</Grid>";
            int         offset  = "<Grid>\n".Length + 26;
            XamlContext context = CompletionDataHelper.ResolveContext(xaml, "", offset);

            Assert.AreEqual(XamlContextDescription.InTag, context.Description);
        }
コード例 #6
0
        public void RootElementTest()
        {
            string      xaml    = File.ReadAllText("Test1.xaml");
            int         offset  = 31;
            XamlContext context = CompletionDataHelper.ResolveContext(xaml, "", offset);

            Assert.AreEqual("Window", context.ActiveElement.Name);
            Assert.AreEqual(null, context.ParentElement);
        }
コード例 #7
0
        public void ParentElementTestSimple2()
        {
            string      xaml    = File.ReadAllText("Test4.xaml");
            int         offset  = 413;
            XamlContext context = CompletionDataHelper.ResolveContext(xaml, "", offset);

            Assert.AreEqual("Grid", context.ActiveElement.Name);
            Assert.AreEqual("Grid", context.ParentElement.Name);
        }
コード例 #8
0
        public void ContextInAttributeValueTest3()
        {
            string xaml   = "<Test attr=\"Test />";
            int    offset = "<Test attr=\"".Length;

            XamlContext context = CompletionDataHelper.ResolveContext(xaml, "", offset);

            Assert.AreEqual(XamlContextDescription.InAttributeValue, context.Description);
        }
コード例 #9
0
        public void ContextInMarkupExtensionTest2()
        {
            string xaml   = "<Test attr=\"{}{Test}\" />";
            int    offset = "<Test attr=\"{}{Te".Length;

            XamlContext context = CompletionDataHelper.ResolveContext(xaml, "", offset);

            Assert.AreEqual(XamlContextDescription.InAttributeValue, context.Description);
        }
コード例 #10
0
        public void IgnoredXmlnsTest1()
        {
            string      xaml    = File.ReadAllText("Test2.xaml");
            int         offset  = 447;
            XamlContext context = CompletionDataHelper.ResolveContext(xaml, "", offset);

            Assert.AreEqual(1, context.IgnoredXmlns.Count);
            Assert.AreEqual("d", context.IgnoredXmlns[0]);
        }
コード例 #11
0
        static void DoTriggerCompletion(XamlCompletionContext context, XamlCompletionItemList completionList)
        {
            bool           isExplicit;
            AttributeValue value = MarkupExtensionParser.ParseValue(CompletionDataHelper.LookForTargetTypeValue(context, out isExplicit, "Trigger") ?? string.Empty);

            IReturnType typeName       = null;
            string      typeNameString = null;

            if (!value.IsString)
            {
                typeNameString = CompletionDataHelper.GetTypeNameFromTypeExtension(value.ExtensionValue, context);
                typeName       = CompletionDataHelper.ResolveType(typeNameString, context);
            }
            else
            {
                typeNameString = value.StringValue;
                typeName       = CompletionDataHelper.ResolveType(value.StringValue, context);
            }

            if (typeName != null)
            {
                switch (context.Attribute.Name)
                {
                case "Value":
                    AttributeValue propType = MarkupExtensionParser.ParseValue(context.ActiveElement.GetAttributeValue("Property") ?? "");
                    if (!propType.IsString)
                    {
                        break;
                    }

                    string name = propType.StringValue;

                    if (!name.Contains("."))
                    {
                        name = typeNameString + "." + name;
                    }

                    context.Description = XamlContextDescription.AtTag;

                    var member = XamlResolver.Resolve(name, context) as MemberResolveResult;

                    if (member == null || member.ResolvedMember == null)
                    {
                        break;
                    }

                    completionList.Items.AddRange(
                        CompletionDataHelper.MemberCompletion(context, member.ResolvedMember.ReturnType, string.Empty)
                        );
                    break;
                }
            }
        }
コード例 #12
0
        static IMember Resolve(XAttribute attribute, ITextEditor editor)
        {
            XamlContext context = CompletionDataHelper.ResolveCompletionContext(editor, default(char), editor.Document.PositionToOffset(attribute.GetLineNumber(), attribute.GetLinePosition()));
            string      prefix  = context.XmlnsDefinitions.GetKeyByValue(attribute.Name.NamespaceName);

            if (!string.IsNullOrEmpty(prefix))
            {
                prefix += ":";
            }
            var mrr = XamlResolver.Resolve(prefix + attribute.Name.LocalName, context) as MemberResolveResult;

            if (mrr != null)
            {
                return(mrr.ResolvedMember);
            }

            return(null);
        }
コード例 #13
0
        public void AncestorDetectionTest1()
        {
            string      xaml    = File.ReadAllText("Test5.xaml");
            int         offset  = 881;
            XamlContext context = CompletionDataHelper.ResolveContext(xaml, "", offset);

            string[] ancestors = new string[] {
                "DoubleAnimation", "Storyboard",
                "BeginStoryboard", "EventTrigger",
                "Button.Triggers", "Button",
                "Grid", "Window"
            };

            Assert.AreEqual("DoubleAnimation", context.ActiveElement.Name);
            Assert.AreEqual("Storyboard", context.ParentElement.Name);
            Assert.AreEqual(8, context.Ancestors.Count);
            Assert.AreEqual(ancestors, context.Ancestors.Select(item => item.Name).ToArray());
        }
コード例 #14
0
        static bool DoMarkupExtensionCompletion(XamlCompletionContext context)
        {
            if (context.Description == XamlContextDescription.InMarkupExtension && context.AttributeValue != null && !context.AttributeValue.IsString)
            {
                if (!XamlBindingOptions.UseExtensionCompletion)
                {
                    return(false);
                }
                XamlCompletionItemList completionList = CompletionDataHelper.CreateMarkupExtensionCompletion(context) as XamlCompletionItemList;
                string word = context.Editor.GetWordBeforeCaretExtended();
                if (context.PressedKey != '.' && context.PressedKey != '=' && !word.EndsWith(".") && completionList.PreselectionLength == 0)
                {
                    completionList.PreselectionLength = word.Length;
                }
                var insightList = CompletionDataHelper.CreateMarkupExtensionInsight(context);
                context.Editor.ShowInsightWindow(insightList);
                context.Editor.ShowCompletionWindow(completionList);
                return(completionList.Items.Any() || insightList.Any());
            }

            return(false);
        }
コード例 #15
0
        public ResolveResult Resolve(ExpressionResult expressionResult, ParseInformation parseInfo, string fileContent)
        {
            if (parseInfo == null || (string.IsNullOrEmpty(fileContent) && !(expressionResult.Context is XamlContext)))
            {
                return(null);
            }

            this.resolveExpression = expressionResult.Expression;
            this.caretLine         = expressionResult.Region.BeginLine;
            this.caretColumn       = expressionResult.Region.BeginColumn;
            this.callingClass      = parseInfo.CompilationUnit.GetInnermostClass(caretLine, caretColumn);
            this.context           = expressionResult.Context as XamlContext ?? CompletionDataHelper.ResolveContext(fileContent, parseInfo.CompilationUnit.FileName, Utils.GetOffsetFromFilePos(fileContent, caretLine, caretColumn));

            switch (this.context.Description)
            {
            case XamlContextDescription.AtTag:
            case XamlContextDescription.None:
                return(ResolveElementName(resolveExpression));

            case XamlContextDescription.InTag:
                return(ResolveAttribute(resolveExpression) ?? ResolveElementName(resolveExpression));

            case XamlContextDescription.InAttributeValue:
                MemberResolveResult mrr = ResolveAttribute(context.Attribute.Name);
                if (mrr != null)
                {
                    var rr = ResolveAttributeValue(mrr.ResolvedMember, resolveExpression) ?? mrr;
                    return(rr);
                }
                break;

            case XamlContextDescription.InMarkupExtension:
                return(ResolveMarkupExtension(resolveExpression));
            }

            return(null);
        }
コード例 #16
0
        static void DoSetterAndEventSetterCompletion(XamlCompletionContext context, XamlCompletionItemList completionList)
        {
            bool           isExplicit;
            string         element = context.ParentElement.Name.EndsWith("Trigger") ? "Trigger" : context.ParentElement.Name;
            AttributeValue value   = MarkupExtensionParser.ParseValue(CompletionDataHelper.LookForTargetTypeValue(context, out isExplicit, element) ?? string.Empty);

            IReturnType typeName       = null;
            string      typeNameString = null;

            if (!value.IsString)
            {
                typeNameString = CompletionDataHelper.GetTypeNameFromTypeExtension(value.ExtensionValue, context);
                typeName       = CompletionDataHelper.ResolveType(typeNameString, context);
            }
            else
            {
                typeNameString = value.StringValue;
                typeName       = CompletionDataHelper.ResolveType(value.StringValue, context);
            }

            if (typeName != null)
            {
                switch (context.Attribute.Name)
                {
                case "Value":
                    AttributeValue propType = MarkupExtensionParser.ParseValue(context.ActiveElement.GetAttributeValue("Property") ?? "");

                    if (!propType.IsString)
                    {
                        break;
                    }

                    context.Description = XamlContextDescription.AtTag;

                    string name = propType.StringValue;

                    if (!name.Contains("."))
                    {
                        name = typeNameString + "." + name;
                    }

                    var member = XamlResolver.Resolve(name, context) as MemberResolveResult;

                    if (member == null || member.ResolvedMember == null)
                    {
                        break;
                    }

                    completionList.Items.AddRange(
                        CompletionDataHelper.MemberCompletion(context, member.ResolvedMember.ReturnType, string.Empty)
                        );
                    break;

                case "Property":
                    completionList.Items.AddRange(
                        typeName.GetProperties()
                        .Where(p => p.IsPublic && p.CanSet)
                        .Select(prop => new XamlCodeCompletionItem(prop))
                        );
                    break;

                case "Event":
                    completionList.Items.AddRange(
                        typeName.GetEvents()
                        .Where(e => e.IsPublic)
                        .Select(evt => new XamlCodeCompletionItem(evt))
                        );
                    break;

                case "Handler":
                    var            loc3    = context.Editor.Document.OffsetToPosition(XmlParser.GetActiveElementStartIndex(context.Editor.Document.Text, context.Editor.Caret.Offset));
                    AttributeValue evtType = MarkupExtensionParser.ParseValue(context.ActiveElement.GetAttributeValue("Event") ?? "");
                    if (!evtType.IsString)
                    {
                        break;
                    }

                    string evtName = evtType.StringValue;

                    if (!evtName.Contains("."))
                    {
                        evtName = typeNameString + "." + evtName;
                    }

                    var evtMember = XamlResolver.Resolve(evtName, context) as MemberResolveResult;

                    if (evtMember == null || evtMember.ResolvedMember == null || !(evtMember.ResolvedMember is IEvent) || evtMember.ResolvedMember.ReturnType == null)
                    {
                        break;
                    }

                    IClass c = (evtMember.ResolvedMember as IEvent).ReturnType.GetUnderlyingClass();

                    if (c == null)
                    {
                        break;
                    }

                    IMethod invoker = c.Methods.FirstOrDefault(m => m.Name == "Invoke");

                    if (invoker == null)
                    {
                        break;
                    }

                    completionList.Items.AddRange(
                        CompletionDataHelper.AddMatchingEventHandlers(context, invoker).Add(new NewEventCompletionItem(evtMember.ResolvedMember as IEvent, typeName.Name))
                        );
                    break;
                }
            }
        }
コード例 #17
0
            IEnumerable <HighlightingInfo> GetInfo()
            {
                int         index   = -1;
                XamlContext context = null;

                do
                {
                    if (index + 1 >= lineText.Length)
                    {
                        break;
                    }

                    index = lineText.IndexOfAny(index + 1, '=', '.');
                    if (index > -1)
                    {
                        context = CompletionDataHelper.ResolveContext(snapshot, fileName, offset + index);

                        if (context.ActiveElement == null || context.InAttributeValueOrMarkupExtension || context.InCommentOrCData)
                        {
                            continue;
                        }

                        string propertyName;
                        string token;
                        int    startIndex;

                        switch (context.Description)
                        {
                        case XamlContextDescription.AtTag:
                            token = context.ActiveElement.Name;
                            int propertyNameIndex = token.IndexOf('.');

                            if (propertyNameIndex == -1)
                            {
                                continue;
                            }

                            propertyName = token.Substring(propertyNameIndex + 1);
                            startIndex   = lineText.IndexOf(propertyName, index, StringComparison.Ordinal);
                            break;

                        case XamlContextDescription.InTag:
                            if (lineText[index] == '.' || context.Attribute == null)
                            {
                                continue;
                            }

                            token      = propertyName = context.Attribute.Name;
                            startIndex = lineText.LastIndexOf(propertyName, index, StringComparison.Ordinal);
                            break;

                        default:
                            continue;
                        }

                        if (startIndex > -1)
                        {
                            yield return(new HighlightingInfo(token, startIndex, startIndex + propertyName.Length, offset, context));
                        }
                    }
                } while (index > -1);
            }
コード例 #18
0
        public bool CtrlSpace(ITextEditor editor)
        {
            XamlCompletionContext context = CompletionDataHelper.ResolveCompletionContext(editor, ' ');

            context.Forced = trackForced;

            if (context.Description == XamlContextDescription.InComment || context.Description == XamlContextDescription.InCData)
            {
                return(false);
            }

            if (context.ActiveElement != null)
            {
                if (!XmlParser.IsInsideAttributeValue(editor.Document.Text, editor.Caret.Offset) && context.Description != XamlContextDescription.InAttributeValue)
                {
                    XamlCompletionItemList list = CompletionDataHelper.CreateListForContext(context);
                    string starter = editor.GetWordBeforeCaretExtended().TrimStart('/');
                    if (context.Description != XamlContextDescription.None && !string.IsNullOrEmpty(starter))
                    {
                        if (starter.Contains("."))
                        {
                            list.PreselectionLength = starter.Length - starter.IndexOf('.') - 1;
                        }
                        else
                        {
                            list.PreselectionLength = starter.Length;
                        }
                    }
                    editor.ShowCompletionWindow(list);
                    return(true);
                }
                else
                {
                    // DO NOT USE CompletionDataHelper.CreateListForContext here!!! results in endless recursion!!!!
                    if (context.Attribute != null)
                    {
                        if (!DoMarkupExtensionCompletion(context))
                        {
                            var completionList = new XamlCompletionItemList(context);
                            completionList.PreselectionLength = editor.GetWordBeforeCaretExtended().Length;

                            if ((context.ActiveElement.Name == "Setter" || context.ActiveElement.Name == "EventSetter") &&
                                (context.Attribute.Name == "Property" || context.Attribute.Name == "Value"))
                            {
                                DoSetterAndEventSetterCompletion(context, completionList);
                            }
                            else if ((context.ActiveElement.Name.EndsWith("Trigger") || context.ActiveElement.Name == "Condition") && context.Attribute.Name == "Value")
                            {
                                DoTriggerCompletion(context, completionList);
                            }
                            else
                            {
                                if (context.Attribute.Name == "xml:space")
                                {
                                    completionList.Items.AddRange(new[] { new SpecialCompletionItem("preserve"),
                                                                          new SpecialCompletionItem("default") });
                                }

                                var mrr = XamlResolver.Resolve(context.Attribute.Name, context) as MemberResolveResult;
                                if (mrr != null && mrr.ResolvedType != null)
                                {
                                    completionList.Items.AddRange(CompletionDataHelper.MemberCompletion(context, mrr.ResolvedType, string.Empty));
                                    editor.ShowInsightWindow(CompletionDataHelper.MemberInsight(mrr));
                                    if (mrr.ResolvedType.FullyQualifiedName == "System.Windows.PropertyPath")
                                    {
                                        string start = editor.GetWordBeforeCaretExtended();
                                        int    index = start.LastIndexOfAny(PropertyPathTokenizer.ControlChars);
                                        if (index + 1 < start.Length)
                                        {
                                            start = start.Substring(index + 1);
                                        }
                                        else
                                        {
                                            start = "";
                                        }
                                        completionList.PreselectionLength = start.Length;
                                    }
                                    else if (mrr.ResolvedType.FullyQualifiedName == "System.Windows.Media.FontFamily")
                                    {
                                        string text      = context.ValueStartOffset > -1 ? context.RawAttributeValue.Substring(0, Math.Min(context.ValueStartOffset, context.RawAttributeValue.Length)) : "";
                                        int    lastComma = text.LastIndexOf(',');
                                        completionList.PreselectionLength = lastComma == -1 ? context.ValueStartOffset : context.ValueStartOffset - lastComma - 1;
                                    }
                                }
                            }

                            completionList.SortItems();

                            if (context.Attribute.Prefix.Equals("xmlns", StringComparison.OrdinalIgnoreCase) ||
                                context.Attribute.Name.Equals("xmlns", StringComparison.OrdinalIgnoreCase))
                            {
                                completionList.Items.AddRange(CompletionDataHelper.CreateListForXmlnsCompletion(context.ProjectContent));
                            }

                            ICompletionListWindow window = editor.ShowCompletionWindow(completionList);

                            if ((context.Attribute.Prefix.Equals("xmlns", StringComparison.OrdinalIgnoreCase) ||
                                 context.Attribute.Name.Equals("xmlns", StringComparison.OrdinalIgnoreCase)) && window != null)
                            {
                                window.Width = 400;
                            }

                            return(completionList.Items.Any());
                        }
                        return(true);
                    }
                }
            }
            return(false);
        }
コード例 #19
0
        public CodeCompletionKeyPressResult HandleKeyPress(ITextEditor editor, char ch)
        {
            XamlCompletionContext  context = CompletionDataHelper.ResolveCompletionContext(editor, ch);
            XamlCompletionItemList list;

            if (context.Description == XamlContextDescription.InComment || context.Description == XamlContextDescription.InCData)
            {
                return(CodeCompletionKeyPressResult.None);
            }

            switch (ch)
            {
            case '<':
                context.Description = (context.Description == XamlContextDescription.None) ? XamlContextDescription.AtTag : context.Description;
                list = CompletionDataHelper.CreateListForContext(context);
                editor.ShowCompletionWindow(list);
                return(CodeCompletionKeyPressResult.Completed);

            case '>':
                return(CodeCompletionKeyPressResult.None);

            case '\'':
            case '"':
                if (!XmlParser.IsInsideAttributeValue(editor.Document.Text, editor.Caret.Offset))
                {
                    // count all " or ' chars before the next > char
                    int  search         = editor.Caret.Offset + 1;
                    int  endMarkerCount = 1;
                    char curCh          = editor.Document.GetCharAt(search);
                    while (search < editor.Document.TextLength - 1 && curCh != '>')
                    {
                        if (curCh == ch)
                        {
                            endMarkerCount++;
                        }
                        search++;
                        curCh = editor.Document.GetCharAt(search);
                    }
                    // if the count is odd we need to add an additional " or ' char
                    if (endMarkerCount % 2 != 0)
                    {
                        editor.Document.Insert(editor.Caret.Offset, ch.ToString());
                        editor.Caret.Offset--;
                        this.CtrlSpace(editor);
                        return(CodeCompletionKeyPressResult.Completed);
                    }
                }
                break;

            case '{':                     // starting point for Markup Extension Completion
                if (context.Attribute != null &&
                    XmlParser.IsInsideAttributeValue(editor.Document.Text, editor.Caret.Offset) &&
                    !(context.RawAttributeValue.StartsWith("{}", StringComparison.OrdinalIgnoreCase) && context.RawAttributeValue.Length != 2))
                {
                    if (editor.SelectionLength != 0)
                    {
                        editor.Document.Remove(editor.SelectionStart, editor.SelectionLength);
                    }

                    editor.Document.Insert(editor.Caret.Offset, "{}");
                    editor.Caret.Offset--;

                    this.CtrlSpace(editor);
                    return(CodeCompletionKeyPressResult.EatKey);
                }
                break;

            case '.':
                switch (context.Description)
                {
                case XamlContextDescription.AtTag:
                case XamlContextDescription.InTag:
                    if (context.ActiveElement != null && !XmlParser.IsInsideAttributeValue(editor.Document.Text, editor.Caret.Offset))
                    {
                        list = CompletionDataHelper.CreateListForContext(context);
                        editor.ShowCompletionWindow(list);
                        return(CodeCompletionKeyPressResult.Completed);
                    }
                    break;

                case XamlContextDescription.InMarkupExtension:
                    if (DoMarkupExtensionCompletion(context))
                    {
                        return(CodeCompletionKeyPressResult.Completed);
                    }
                    break;

                case XamlContextDescription.InAttributeValue:
                    if (editor.SelectionLength != 0)
                    {
                        editor.Document.Remove(editor.SelectionStart, editor.SelectionLength);
                    }

                    editor.Document.Insert(editor.Caret.Offset, ".");

                    this.CtrlSpace(editor);
                    return(CodeCompletionKeyPressResult.EatKey);
                }
                break;

            case '(':
            case '[':
                if (context.Description == XamlContextDescription.InAttributeValue)
                {
                    if (editor.SelectionLength != 0)
                    {
                        editor.Document.Remove(editor.SelectionStart, editor.SelectionLength);
                    }

                    if (ch == '(')
                    {
                        editor.Document.Insert(editor.Caret.Offset, "()");
                    }
                    if (ch == '[')
                    {
                        editor.Document.Insert(editor.Caret.Offset, "[]");
                    }
                    editor.Caret.Offset--;

                    this.CtrlSpace(editor);
                    return(CodeCompletionKeyPressResult.EatKey);
                }
                break;

            case ':':
                if (context.ActiveElement != null && XmlParser.GetQualifiedAttributeNameAtIndex(editor.Document.Text, editor.Caret.Offset) == null)
                {
                    if (context.Attribute != null && !context.Attribute.Name.StartsWith("xmlns", StringComparison.OrdinalIgnoreCase))
                    {
                        list = CompletionDataHelper.CreateListForContext(context);
                        list.PreselectionLength = editor.GetWordBeforeCaretExtended().Length;
                        editor.ShowCompletionWindow(list);
                        return(CodeCompletionKeyPressResult.CompletedIncludeKeyInCompletion);
                    }
                }
                break;

            case '/':                     // ignore '/' when trying to type '/>'
                return(CodeCompletionKeyPressResult.None);

            case '=':
                if (!XmlParser.IsInsideAttributeValue(editor.Document.Text, editor.Caret.Offset))
                {
                    int searchOffset = editor.Caret.Offset;

                    if (editor.SelectionLength != 0)
                    {
                        editor.Document.Remove(editor.SelectionStart, editor.SelectionLength);
                    }

                    while (searchOffset < editor.Document.TextLength - 1)
                    {
                        searchOffset++;
                        if (!char.IsWhiteSpace(editor.Document.GetCharAt(searchOffset)))
                        {
                            break;
                        }
                    }

                    if (searchOffset >= editor.Document.TextLength || editor.Document.GetCharAt(searchOffset) != '"')
                    {
                        editor.Document.Insert(editor.Caret.Offset, "=\"\"");
                        editor.Caret.Offset--;
                    }
                    else
                    {
                        editor.Document.Insert(editor.Caret.Offset, "=");
                        editor.Caret.Offset++;
                    }

                    this.CtrlSpace(editor);
                    return(CodeCompletionKeyPressResult.EatKey);
                }
                else
                {
                    DoMarkupExtensionCompletion(context);
                    return(CodeCompletionKeyPressResult.Completed);
                }

            default:
                if (context.Description != XamlContextDescription.None && !char.IsWhiteSpace(ch))
                {
                    string starter = editor.GetWordBeforeCaretExtended();
                    if (!string.IsNullOrEmpty(starter))
                    {
                        return(CodeCompletionKeyPressResult.None);
                    }
                    trackForced = false;

                    string attributeName = (context.Attribute != null) ? context.Attribute.Name : string.Empty;

                    if (!attributeName.StartsWith("xmlns", StringComparison.OrdinalIgnoreCase))
                    {
                        return(this.CtrlSpace(editor)
                                                                ? CodeCompletionKeyPressResult.CompletedIncludeKeyInCompletion
                                                                : CodeCompletionKeyPressResult.None);
                    }
                    trackForced = true;
                    return(CodeCompletionKeyPressResult.None);
                }
                break;
            }

            return(CodeCompletionKeyPressResult.None);
        }
コード例 #20
0
 private static IEnumerable <object[]> GetSnippetCompletionData() => CompletionDataHelper.GetSnippetCompletionData();
コード例 #21
0
        public override void Complete(CompletionContext context, ICompletionItem item)
        {
            using (context.Editor.Document.OpenUndoGroup()) {
                base.Complete(context, item);

                XamlCompletionContext xamlContext = CompletionDataHelper.ResolveCompletionContext(context.Editor, context.CompletionChar);

                if (xamlContext.Description == XamlContextDescription.None && (context.StartOffset <= 0 || context.Editor.Document.GetCharAt(context.StartOffset - 1) != '<'))
                {
                    context.Editor.Document.Insert(context.StartOffset, "<");
                    context.EndOffset++;
                }

                if (item is XamlCodeCompletionItem)
                {
                    XamlCodeCompletionItem cItem = item as XamlCodeCompletionItem;

                    if (cItem.Entity is IProperty || cItem.Entity is IEvent)
                    {
                        if (xamlContext.Description == XamlContextDescription.InTag)
                        {
                            context.Editor.Document.Insert(context.EndOffset, "=\"\"");
                            context.CompletionCharHandled = context.CompletionChar == '=';
                            context.Editor.Caret.Offset--;
                            new XamlCodeCompletionBinding().CtrlSpace(context.Editor);
                        }
                        else if (xamlContext.Description == XamlContextDescription.InMarkupExtension && !string.IsNullOrEmpty(xamlContext.RawAttributeValue))
                        {
                            string         valuePart = xamlContext.RawAttributeValue.Substring(0, xamlContext.ValueStartOffset);
                            AttributeValue value     = MarkupExtensionParser.ParseValue(valuePart);

                            if (value != null && !value.IsString)
                            {
                                var markup = Utils.GetMarkupExtensionAtPosition(value.ExtensionValue, context.Editor.Caret.Offset);
                                if (markup.NamedArguments.Count > 0 || markup.PositionalArguments.Count > 0)
                                {
                                    int oldOffset = context.Editor.Caret.Offset;
                                    context.Editor.Caret.Offset = context.StartOffset;
                                    string word          = context.Editor.GetWordBeforeCaret().TrimEnd();
                                    int    spaces        = CountWhiteSpacesAtEnd(context.Editor.GetWordBeforeCaret());
                                    int    typeNameStart = markup.ExtensionType.IndexOf(':') + 1;

                                    if (!(word == "." || word == "," || word == ":") && markup.ExtensionType.Substring(typeNameStart, markup.ExtensionType.Length - typeNameStart) != word)
                                    {
                                        context.Editor.Document.Replace(context.Editor.Caret.Offset - spaces, spaces, ", ");
                                        oldOffset += (2 - spaces);
                                    }

                                    context.Editor.Caret.Offset = oldOffset;
                                }
                            }

                            if (cItem.Text.EndsWith("=", StringComparison.OrdinalIgnoreCase))
                            {
                                new XamlCodeCompletionBinding().CtrlSpace(context.Editor);
                            }
                        }
                    }
                }

                if (item is NewEventCompletionItem)
                {
                    NewEventCompletionItem eventItem = item as NewEventCompletionItem;
                    int discriminator;
                    if (CreateEventHandlerCode(context, eventItem, out discriminator))
                    {
                        if (discriminator > 0)
                        {
                            context.Editor.Document.Insert(context.EndOffset, discriminator.ToString());
                        }
                    }
                }

                if (item is XmlnsCompletionItem)
                {
                    context.Editor.Caret.Offset++;
                }

                if (item is XamlCompletionItem && xamlContext.Description == XamlContextDescription.InTag)
                {
                    context.Editor.Document.Insert(context.EndOffset, "=\"\"");
                    context.Editor.Caret.Offset--;
                    new XamlCodeCompletionBinding().CtrlSpace(context.Editor);
                }

                switch (item.Text)
                {
                case "![CDATA[":
                    context.Editor.Document.Insert(context.Editor.Caret.Offset, "]]>");
                    context.Editor.Caret.Offset -= 3;
                    break;

                case "?":
                    context.Editor.Document.Insert(context.Editor.Caret.Offset, "?>");
                    context.Editor.Caret.Offset -= 2;
                    break;

                case "!--":
                    context.Editor.Document.Insert(context.Editor.Caret.Offset, "  -->");
                    context.Editor.Caret.Offset -= 4;
                    break;
                }

                if (item.Text.StartsWith("/", StringComparison.OrdinalIgnoreCase))
                {
                    context.Editor.Document.Insert(context.EndOffset, ">");
                    context.CompletionCharHandled = context.CompletionChar == '>';
                    context.Editor.Caret.Offset++;
                }
            }
        }