private void TestParseIfStatementInternal(Func <string, NativeXIfStatement> parser) { { NativeXIfStatement s = parser("if(true)f**k();"); Assert.AreEqual("true", ((NativeXPrimitiveExpression)s.Condition).Code); { NativeXInvokeExpression e = (NativeXInvokeExpression)((NativeXExpressionStatement)s.TrueStatement).Expression; Assert.AreEqual("f**k", ((NativeXReferenceExpression)e.Function).ReferencedName); Assert.AreEqual(0, e.Arguments.Count); } Assert.IsNull(s.FalseStatement); } { NativeXIfStatement s = parser("if(true)f**k();else damn();"); Assert.AreEqual("true", ((NativeXPrimitiveExpression)s.Condition).Code); { NativeXInvokeExpression e = (NativeXInvokeExpression)((NativeXExpressionStatement)s.TrueStatement).Expression; Assert.AreEqual("f**k", ((NativeXReferenceExpression)e.Function).ReferencedName); Assert.AreEqual(0, e.Arguments.Count); } { NativeXInvokeExpression e = (NativeXInvokeExpression)((NativeXExpressionStatement)s.FalseStatement).Expression; Assert.AreEqual("damn", ((NativeXReferenceExpression)e.Function).ReferencedName); Assert.AreEqual(0, e.Arguments.Count); } } }
private void TestParseExp1(Func <string, NativeXExpression> parser) { { NativeXSubscribeExpression e = (NativeXSubscribeExpression)parser("a[b][c]"); Assert.AreEqual("c", ((NativeXReferenceExpression)e.Subscribe).ReferencedName); NativeXSubscribeExpression e2 = (NativeXSubscribeExpression)e.Operand; Assert.AreEqual("b", ((NativeXReferenceExpression)e2.Subscribe).ReferencedName); Assert.AreEqual("a", ((NativeXReferenceExpression)e2.Operand).ReferencedName); } { NativeXInvokeExpression e = (NativeXInvokeExpression)parser("a()(b)(c,d)"); Assert.AreEqual(2, e.Arguments.Count); Assert.AreEqual("c", ((NativeXReferenceExpression)e.Arguments[0]).ReferencedName); Assert.AreEqual("d", ((NativeXReferenceExpression)e.Arguments[1]).ReferencedName); NativeXInvokeExpression e2 = (NativeXInvokeExpression)e.Function; Assert.AreEqual(1, e2.Arguments.Count); Assert.AreEqual("b", ((NativeXReferenceExpression)e2.Arguments[0]).ReferencedName); NativeXInvokeExpression e3 = (NativeXInvokeExpression)e2.Function; Assert.AreEqual(0, e3.Arguments.Count); Assert.AreEqual("a", ((NativeXReferenceExpression)e3.Function).ReferencedName); } { NativeXPointerMemberExpression e = (NativeXPointerMemberExpression)parser("a.b->c"); Assert.AreEqual("c", e.MemberName); NativeXMemberExpression e2 = (NativeXMemberExpression)e.Operand; Assert.AreEqual("b", e2.MemberName); Assert.AreEqual("a", ((NativeXReferenceExpression)e2.Operand).ReferencedName); } }
private void TestParseLoopStatementInternal(Func <string, NativeXWhileStatement> parser) { NativeXWhileStatement s = parser("loop x();"); NativeXInvokeExpression a = (NativeXInvokeExpression)((NativeXExpressionStatement)s.Statement).Expression; Assert.AreEqual("x", ((NativeXReferenceExpression)a.Function).ReferencedName); Assert.AreEqual(0, a.Arguments.Count); Assert.IsNull(s.BeginCondition); Assert.IsNull(s.EndCondition); }
private void TestParseTryCatchStatementInternal(Func <string, NativeXTryCatchStatement> parser) { NativeXTryCatchStatement s = parser("try x(); catch y();"); NativeXInvokeExpression a = (NativeXInvokeExpression)((NativeXExpressionStatement)s.TryStatement).Expression; Assert.AreEqual("x", ((NativeXReferenceExpression)a.Function).ReferencedName); Assert.AreEqual(0, a.Arguments.Count); NativeXInvokeExpression b = (NativeXInvokeExpression)((NativeXExpressionStatement)s.CatchStatement).Expression; Assert.AreEqual("y", ((NativeXReferenceExpression)b.Function).ReferencedName); Assert.AreEqual(0, b.Arguments.Count); }
private void TestParseForStatementInternal(Func <string, NativeXForStatement> parser) { NativeXForStatement s = parser("for (variable int i = 0; variable int j = 0; when (i - j > 5) with i+=2; j+=1;) do x();"); Assert.AreEqual(2, s.Initializer.Count); { NativeXVariableStatement s1 = (NativeXVariableStatement)s.Initializer[0]; Assert.AreEqual("i", s1.Name); Assert.AreEqual("int", ((NativeXReferenceType)s1.Type).ReferencedName); Assert.AreEqual("0", ((NativeXPrimitiveExpression)s1.Initializer).Code); } { NativeXVariableStatement s2 = (NativeXVariableStatement)s.Initializer[1]; Assert.AreEqual("j", s2.Name); Assert.AreEqual("int", ((NativeXReferenceType)s2.Type).ReferencedName); Assert.AreEqual("0", ((NativeXPrimitiveExpression)s2.Initializer).Code); } Assert.AreEqual(2, s.SideEffect.Count); { NativeXBinaryExpression e1 = (NativeXBinaryExpression)((NativeXExpressionStatement)s.SideEffect[0]).Expression; Assert.AreEqual("+=", e1.Operator); Assert.AreEqual("i", ((NativeXReferenceExpression)e1.LeftOperand).ReferencedName); Assert.AreEqual("2", ((NativeXPrimitiveExpression)e1.RightOperand).Code); } { NativeXBinaryExpression e2 = (NativeXBinaryExpression)((NativeXExpressionStatement)s.SideEffect[1]).Expression; Assert.AreEqual("+=", e2.Operator); Assert.AreEqual("j", ((NativeXReferenceExpression)e2.LeftOperand).ReferencedName); Assert.AreEqual("1", ((NativeXPrimitiveExpression)e2.RightOperand).Code); } { NativeXInvokeExpression a = (NativeXInvokeExpression)((NativeXExpressionStatement)s.Statement).Expression; Assert.AreEqual("x", ((NativeXReferenceExpression)a.Function).ReferencedName); Assert.AreEqual(0, a.Arguments.Count); } { NativeXBinaryExpression e1 = (NativeXBinaryExpression)s.Condition; Assert.AreEqual(">", e1.Operator); Assert.AreEqual("5", ((NativeXPrimitiveExpression)e1.RightOperand).Code); NativeXBinaryExpression e2 = (NativeXBinaryExpression)e1.LeftOperand; Assert.AreEqual("-", e2.Operator); Assert.AreEqual("i", ((NativeXReferenceExpression)e2.LeftOperand).ReferencedName); Assert.AreEqual("j", ((NativeXReferenceExpression)e2.RightOperand).ReferencedName); } }
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); }