Beispiel #1
0
 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);
         }
     }
 }
Beispiel #2
0
 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);
     }
 }
Beispiel #3
0
        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);
        }
Beispiel #4
0
        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);
        }
Beispiel #5
0
        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);
            }
        }
Beispiel #6
0
 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);
 }