public void OnAfterEdit(TextPosition start, TextPosition oldEnd, TextPosition newEnd) { if (this.Callback.TextEditorBox.PressingChar && this.EditingObserverExtension.EditingNode != null && this.EditingObserverExtension.EditingNode.Scope != null ) { var editingNode = this.EditingObserverExtension.EditingNode; TextPosition pos = this.EditingObserverExtension.CodePositionToEditing(newEnd); string inputText = this.Callback.TextEditorBox.TextProvider.GetString(start, newEnd); switch (inputText) { case "(": case ",": { if (editingNode.FindDeepest <NativeXInvokeExpression>(pos) != null) { this.Callback.TextEditorBox.UIExtensions.OpenQuickInfoTooltip(); } } break; case ")": { NativeXNode node = editingNode.FindDeepest <NativeXNode>(pos); if (node == null || node.FindParent <NativeXInvokeExpression>() == null) { this.Callback.TextEditorBox.UIExtensions.CloseQuickInfoTooltip(); } } break; } } }
public virtual string OnGetSimpleTooltip(TextPosition pos) { if (this.EditingObserverExtension.AnalyzingResult == null || this.EditingObserverExtension.AnalyzingResult.Unit == null) { return(null); } NativeXNode node = this.EditingObserverExtension.AnalyzingResult.Unit.FindDeepest <NativeXNode>(pos); NativeXNode hint = null; { NativeXReferenceExpression exp = node as NativeXReferenceExpression; if (exp != null && exp.Scope != null) { hint = (NativeXNode)exp.Scope.Find(exp.ReferencedName); goto SHOW_HINT; } } { NativeXReferenceType type = node as NativeXReferenceType; if (type != null && type.Scope != null) { hint = (NativeXNode)type.Scope.Find(type.ReferencedName); goto SHOW_HINT; } } { NativeXConceptReference concept = node as NativeXConceptReference; if (concept != null && concept.Scope != null) { hint = (NativeXNode)concept.Scope.Find(concept.ReferenceName); goto SHOW_HINT; } } { NativeXInstanciatedExpression exp = node as NativeXInstanciatedExpression; if (exp != null && exp.Scope != null) { hint = (NativeXNode)exp.Scope.Find(exp.ReferencedName); goto SHOW_HINT; } } { NativeXInstanceFunctionExpression exp = node as NativeXInstanceFunctionExpression; if (exp != null && exp.Scope != null && exp.ConceptName != null) { hint = (NativeXNode)exp.Scope.Find(exp.ConceptName.ReferenceName); goto SHOW_HINT; } } { NativeXInstanceDeclaration inst = node as NativeXInstanceDeclaration; if (inst != null && inst.Scope != null && inst.ConceptName != null) { if (this.EditingObserverExtension.AnalyzingResult.IdTokens.ContainsKey(pos.row)) { CodeToken token = this.EditingObserverExtension.AnalyzingResult.IdTokens[pos.row].Where(t => t.Start <= pos && pos <= t.End).FirstOrDefault(); if (token.Value == inst.ConceptName.ReferenceName) { hint = (NativeXNode)inst.Scope.Find(inst.ConceptName.ReferenceName); } } } } { NativeXGenericConstraint genecons = node as NativeXGenericConstraint; if (genecons != null && genecons.Scope != null && genecons.ConceptName != null) { if (this.EditingObserverExtension.AnalyzingResult.IdTokens.ContainsKey(pos.row)) { CodeToken token = this.EditingObserverExtension.AnalyzingResult.IdTokens[pos.row].Where(t => t.Start <= pos && pos <= t.End).FirstOrDefault(); if (token.Value == genecons.ConceptName.ReferenceName) { hint = (NativeXNode)genecons.Scope.Find(genecons.ConceptName.ReferenceName); } } } } SHOW_HINT: if (hint != null) { NativeXFunctionDeclaration function = hint as NativeXFunctionDeclaration; TextPosition start, end; if (function == null) { start = hint.Start; end = hint.End; } else { start = hint.Start; end = function.Statement == null ? function.End : function.Statement.Start; } if (start < end) { start = this.Callback.TextEditorBox.Controller.Normalize(start); end = this.Callback.TextEditorBox.Controller.Normalize(end); string text = this.Callback.TextEditorBox.TextProvider.GetString(start, end); if (!string.IsNullOrWhiteSpace(text)) { return(text); } } } return(null); }
public Tuple <XDocument, TextPosition> OnGetQuickInfoTooltip() { if (this.EditingObserverExtension.EditingNode != null && this.EditingObserverExtension.EditingNode.Scope != null ) { var editingNode = this.EditingObserverExtension.EditingNode; TextPosition pos = this.EditingObserverExtension.NodePositionToEditing(this.Callback.TextEditorBox.SelectionCaret); NativeXNode node = editingNode.FindDeepest <NativeXNode>(pos); if (node != null) { NativeXInvokeExpression invoke = (node as NativeXInvokeExpression) ?? node.FindParent <NativeXInvokeExpression>(); while (invoke != null && invoke.Function != null) { TextPosition start = invoke.Function.End; TextPosition end = this.EditingObserverExtension.CodePositionToEditing(this.Callback.TextEditorBox.SelectionCaret); if (!this.EditingObserverExtension.IsTemporaryEditingNode) { start = this.EditingObserverExtension.CodePositionToEditing(start); } if (start < end) { string inside = this.EditingObserverExtension.EditingNodeCode.GetString(start, end); int openCount = inside.Where(c => c == '(').Count(); int closeCount = inside.Where(c => c == ')').Count(); if (openCount > closeCount) { break; } } invoke = invoke.FindParent <NativeXInvokeExpression>(); } if (invoke != null && invoke.Function != null) { NativeXExpression function = invoke.Function; int index = 0; if (invoke.Arguments != null) { for (int i = 0; i < invoke.Arguments.Count; i++) { NativeXNode argument = invoke.Arguments[i]; if (argument != null && argument.Start <= pos && pos <= argument.End) { index = i; break; } else { index = Math.Min(index + 1, invoke.Arguments.Count - 1); } } } Tuple <string, string, string> info = function.GetFormattedFunctionQuickInfo(index); if (!string.IsNullOrEmpty(info.Item1 + info.Item2 + info.Item3)) { var content = new RichContent.Content( new RichContent.Text(info.Item1), new RichContent.Bold(new RichContent.Text(info.Item2)), new RichContent.Text(info.Item3) ); return(Tuple.Create <XDocument, TextPosition>(content, this.EditingObserverExtension.NodePositionToGlobal(invoke.Start))); } } } } return(null); }