Beispiel #1
0
        public override int CompareTo(UstNode other)
        {
            if (other == null)
            {
                return((int)NodeType);
            }

            if (other.NodeType == NodeType.PatternTryCatchStatement)
            {
                return(0);
            }

            if (other.NodeType != NodeType.TryCatchStatement)
            {
                return(NodeType - other.NodeType);
            }

            var otherTryCatch = (TryCatchStatement)other;

            if (otherTryCatch.CatchClauses == null)
            {
                return(-1);
            }
            else
            {
                if (otherTryCatch.CatchClauses.Any(catchClause => catchClause.Body.Statements.Count() == 0))
                {
                    return(0);
                }
                else
                {
                    return(-1);
                }
            }
        }
Beispiel #2
0
 private static CodeEntityDetails CreateCodeEntity(string name,
                                                   string @namespace,
                                                   string signature,
                                                   PackageVersionPair package,
                                                   string originalDefinition,
                                                   CodeEntityType codeEntityType,
                                                   UstNode ustNode)
 {
     return(new CodeEntityDetails
     {
         Name = name,
         Namespace = @namespace ?? string.Empty,
         Signature = signature,
         OriginalDefinition = originalDefinition,
         CodeEntityType = codeEntityType,
         TextSpan = new TextSpan
         {
             StartCharPosition = ustNode.TextSpan?.StartCharPosition,
             EndCharPosition = ustNode.TextSpan?.EndCharPosition,
             StartLinePosition = ustNode.TextSpan?.StartLinePosition,
             EndLinePosition = ustNode.TextSpan?.EndLinePosition
         },
         // If we found an matching sdk assembly, assume the code is using the sdk.
         Package = package ?? new PackageVersionPair()
         {
             PackageId = "", Version = ""
         }
     });
 }
Beispiel #3
0
 public MatchingResult(Pattern pattern, UstNode node, TextSpan textSpan)
     : this(pattern, new List <UstNode> {
     node
 })
 {
     TextSpan = textSpan;
 }
Beispiel #4
0
        public UstNode Deserialize(string data, LanguageFlags sourceLanguage)
        {
            if (string.IsNullOrEmpty(data))
            {
                throw new ParsingException("Pattern value can not be empty.")
                      {
                          IsPattern = true
                      };
            }

            Parser.Logger       = Logger;
            UstConverter.Logger = Logger;
            DslParser.PatternContext patternContext = Parser.Parse(data);
            UstConverter.SourceLanguage = sourceLanguage;
            UstConverter.Data           = data;
            DslNode dslNode = UstConverter.Convert(patternContext);
            UstNode result  = dslNode.Collection.First();

            ResultPatternVars = dslNode.PatternVarDefs;
            var preprocessor = new UstPreprocessor();

            preprocessor.Logger = Logger;
            result = new PatternNode(result, dslNode.PatternVarDefs);
            result = preprocessor.Preprocess(result);

            return(result);
        }
Beispiel #5
0
        /// <summary>
        /// TODO: possible replace with binary serialization or protobuf.net for performance reason.
        /// </summary>
        /// <param name="source"></param>
        /// <returns></returns>
        public static UstNode Clone(this UstNode source)
        {
            var json   = JsonConvert.SerializeObject(source, stringEnumConverter);
            var result = JsonConvert.DeserializeObject <UstNode>(json, astJsonConverter);

            return(result);
        }
Beispiel #6
0
        private static CodeEntityDetails CreateCodeEntityDetails(
            string name,
            string @namespace,
            string signature,
            string originalDefinition,
            CodeEntityType codeEntityType,
            UstNode ustNode,
            Reference reference,
            ExternalReferences externalReferences)
        {
            var package = GetPackageVersionPair(reference, externalReferences, @namespace);

            if (package == null)
            {
                //If any of these values are populated, this is an internal reference. If they are all null, this is a code entity with no references
                if (reference?.Assembly != null ||
                    reference?.Namespace != null ||
                    reference?.AssemblySymbol != null ||
                    reference?.Version != null ||
                    reference?.AssemblyLocation != null ||
                    !string.IsNullOrEmpty(@namespace))
                {
                    return(null);
                }
            }

            // Otherwise return the code entity
            return(CreateCodeEntity(name, @namespace, signature, package, originalDefinition,
                                    codeEntityType, ustNode));
        }
Beispiel #7
0
        public override UstNode VisitConditionalAccessExpression(ConditionalAccessExpressionSyntax node)
        {
            UstNode    ustNode    = base.Visit(node.Expression);
            Expression expression = ustNode as Expression;

            if (expression == null)
            {
                expression = new MultichildExpression(((ArgsNode)ustNode).Collection, ustNode.TextSpan, FileNode);
            }
            Expression whenNotNullExpression;

            if (node.WhenNotNull is ElementBindingExpressionSyntax)
            {
                var args = (ArgsNode)VisitElementBindingExpression((ElementBindingExpressionSyntax)node.WhenNotNull);
                whenNotNullExpression = new IndexerExpression(expression, args, args.TextSpan, FileNode);
            }
            else
            {
                whenNotNullExpression = (Expression)base.Visit(node.WhenNotNull);
            }
            var nullExpr       = new NullLiteral(default(TextSpan), FileNode);
            var binayOpLiteral = new BinaryOperatorLiteral(BinaryOperator.Equal, default(TextSpan), FileNode);
            var condition      = new BinaryOperatorExpression(expression, binayOpLiteral, nullExpr, default(TextSpan), FileNode);

            var result = new ConditionalExpression(condition, nullExpr, whenNotNullExpression, node.GetTextSpan(), FileNode);

            return(result);
        }
Beispiel #8
0
        public override UstNode Visit(PatternNode patternVars)
        {
            UstNode data = Visit(patternVars.Node);
            List <PatternVarDef> vars = patternVars.Vars.Select(v => (PatternVarDef)Visit(v)).ToList();

            vars.Sort();
            return(new PatternNode(data, vars));
        }
Beispiel #9
0
 public void ProcessDsl_PatternVarAlreadyDefined_HandleErrors(string data)
 {
     Assert.Throws(typeof(ConversionException), () =>
     {
         var processor  = new DslProcessor();
         UstNode result = processor.Deserialize(data, LanguageExt.AllPatternLanguages);
     });
 }
Beispiel #10
0
        public override int CompareTo(UstNode other)
        {
            Value = null;
            if (other == null)
            {
                return((int)NodeType);
            }

            if (other.NodeType == NodeType.PatternVarDef)
            {
                var otherPatternVarDef = (PatternVarDef)other;

                /*var idCompareResult = Id.CompareTo(otherPatternVarDef.Id);
                 * if (idCompareResult != 0)
                 * {
                 *  return idCompareResult;
                 * }*/

                var childrenCountCompareResult = Values.Count - otherPatternVarDef.Values.Count;
                if (childrenCountCompareResult != 0)
                {
                    return(childrenCountCompareResult);
                }

                for (int i = 0; i < Values.Count; i++)
                {
                    if (Values[i] == null)
                    {
                        if (otherPatternVarDef.Values[i] != null)
                        {
                            return(-1);
                        }
                    }
                    else
                    {
                        var childCompareResult = Values[i].CompareTo(otherPatternVarDef.Values[i]);
                        if (childCompareResult != 0)
                        {
                            return(childCompareResult);
                        }
                    }
                }

                return(0);
            }

            foreach (var value in Values)
            {
                if (value == null || value.CompareTo(other) == 0)
                {
                    Value = value;
                    return(0);
                }
            }

            return(1);
        }
Beispiel #11
0
        public override int CompareTo(UstNode other)
        {
            if (other == null)
            {
                return((int)NodeType);
            }

            int compareResult;

            if (other.NodeType == NodeType.PatternExpression)
            {
                var otherPatternExpression = (PatternExpression)other;

                if (Expression == null ^ otherPatternExpression.Expression == null)
                {
                    return(1);
                }
                if (Expression == null)
                {
                    if (otherPatternExpression.Expression == null)
                    {
                        return(Not == otherPatternExpression.Not ? 0 : 1);
                    }
                    else
                    {
                        return(1);
                    }
                }

                compareResult = Expression.CompareTo(otherPatternExpression.Expression);
                if (compareResult != 0)
                {
                    return(compareResult);
                }

                return(Not == otherPatternExpression.Not ? 0 : 1);
            }

            if (!(other is Expression)) // compare only with expressions.
            {
                return(-1);
            }

            if (Expression == null)     // Any expression.
            {
                return(Not ? (int)NodeType : 0);
            }

            compareResult = Compare(other);
            if (Not)
            {
                compareResult = compareResult != 0 ? 0 : 1;
            }

            return(compareResult);
        }
Beispiel #12
0
        public override int CompareTo(UstNode other)
        {
            if (other == null)
            {
                return((int)NodeType);
            }

            int compareResult;

            if (other.NodeType == NodeType.PatternStatement)
            {
                var otherPatternStatement = (PatternStatement)other;

                if (Statement == null ^ otherPatternStatement.Statement == null)
                {
                    return(1);
                }
                if (Statement == null)
                {
                    if (otherPatternStatement.Statement == null)
                    {
                        return(Not == otherPatternStatement.Not ? 0 : 1);
                    }
                    else
                    {
                        return(1);
                    }
                }

                compareResult = Statement.CompareTo(otherPatternStatement.Statement);
                if (compareResult != 0)
                {
                    return(compareResult);
                }

                return(Not == otherPatternStatement.Not ? 0 : 1);
            }

            if (!(other is Statement))  // Compare only with statements.
            {
                return(-1);
            }

            if (Statement == null)     // Any statement.
            {
                return(0);
            }

            compareResult = Compare(other);
            if (Not)
            {
                compareResult = compareResult > 0 ? 0 : compareResult;
            }

            return(compareResult);
        }
Beispiel #13
0
        public void JsonSerialize_PatternWithVar_JsonEqualsToDsl()
        {
            var pwdVar = new PatternVarDef {
                Id = "pwd", Values = new List <Expression>()
                {
                    new PatternIdToken("password")
                }
            };
            var patternNode = new PatternNode
            {
                Vars = new List <PatternVarDef>()
                {
                    pwdVar
                },
                Node = new PatternStatements(
                    new ExpressionStatement
                {
                    Expression = new AssignmentExpression
                    {
                        Left  = new PatternVarRef(pwdVar),
                        Right = new PatternExpression()
                    }
                },
                    new PatternMultipleStatements(),
                    new ExpressionStatement
                {
                    Expression = new InvocationExpression
                    {
                        Target    = new PatternExpression(),
                        Arguments = new PatternExpressions(
                            new PatternMultipleExpressions(),
                            new PatternVarRef(pwdVar),
                            new PatternMultipleExpressions())
                    }
                }
                    )
            };

            var jsonSerializer = new JsonUstNodeSerializer(typeof(UstNode), typeof(PatternVarDef));

            jsonSerializer.Indented         = true;
            jsonSerializer.IncludeTextSpans = false;

            string  json         = jsonSerializer.Serialize(patternNode);
            UstNode nodeFromJson = jsonSerializer.Deserialize(json, LanguageExt.AllPatternLanguages);

            var dslSeializer = new DslProcessor()
            {
                PatternExpressionInsideStatement = false
            };
            var nodeFromDsl = dslSeializer.Deserialize("<[@pwd:password]> = #; ... #(#*, <[@pwd]>, #*);", LanguageExt.AllPatternLanguages);

            Assert.IsTrue(nodeFromJson.Equals(patternNode));
            Assert.IsTrue(nodeFromJson.Equals(nodeFromDsl));
        }
Beispiel #14
0
        public void Preprocess_MultiMultiPattern_RemovedDuplicates()
        {
            UstNode patternWithDuplicateMultiStatementsExpressions = new PatternStatements
            {
                Statements = new List <Statement>()
                {
                    new ExpressionStatement(
                        new InvocationExpression
                    {
                        Target    = new IdToken("test_call"),
                        Arguments = new PatternExpressions
                        {
                            Collection = new List <Expression>
                            {
                                new IdToken("a"),
                                new IdToken("b"),
                                new PatternMultipleExpressions(),
                                new PatternMultipleExpressions(),
                                new IdToken("z")
                            }
                        }
                    }),

                    new PatternMultipleStatements(),
                    new PatternMultipleStatements(),

                    new ExpressionStatement(
                        new VariableDeclarationExpression
                    {
                        Type      = new TypeToken("int"),
                        Variables = new List <AssignmentExpression>()
                        {
                            new AssignmentExpression
                            {
                                Left  = new IdToken("a"),
                                Right = new IntLiteral {
                                    Value = 42
                                }
                            }
                        }
                    }
                        )
                }
            };
            var             logger       = new LoggerMessageCounter();
            var             processor    = new DslProcessor();
            UstPreprocessor preprocessor = new UstPreprocessor()
            {
                Logger = logger
            };
            UstNode result = preprocessor.Preprocess(patternWithDuplicateMultiStatementsExpressions);

            Assert.AreEqual(1, result.GetAllDescendants().Count(child => child.NodeType == NodeType.PatternMultipleStatements));
            Assert.AreEqual(1, result.GetAllDescendants().Count(child => child.NodeType == NodeType.PatternMultipleExpressions));
        }
Beispiel #15
0
        public override int CompareTo(UstNode other)
        {
            var baseCompareResult = base.CompareTo(other);

            if (baseCompareResult != 0)
            {
                return(baseCompareResult);
            }

            return(String.Compare(Text, ((StringLiteral)other).Text, StringComparison.Ordinal)); // TODO: Regular expressions ???
        }
Beispiel #16
0
        public override int CompareTo(UstNode other)
        {
            var baseCompareResult = base.CompareTo(other);

            if (baseCompareResult != 0)
            {
                return(baseCompareResult);
            }

            return(String.Compare(Id, ((IdToken)other).Id, StringComparison.Ordinal));
        }
Beispiel #17
0
        public override int CompareTo(UstNode other)
        {
            var baseCompareResult = base.CompareTo(other);

            if (baseCompareResult != 0)
            {
                return(baseCompareResult);
            }

            return(Value.CompareTo(((FloatLiteral)other).Value));
        }
Beispiel #18
0
 protected override UstNode VisitChildren(UstNode ustNode)
 {
     try
     {
         return(base.VisitChildren(ustNode));
     }
     catch
     {
         return(null);
     }
 }
Beispiel #19
0
        private void CheckPattern()
        {
            if (oldPattern != patternTextBox.Text || oldLanguages != Languages)
            {
                oldPattern   = patternTextBox.Text;
                oldLanguages = Languages;

                Dispatcher.UIThread.InvokeAsync(PatternErrors.Clear);
                patternLogger.Clear();

                UstNode patternNode = null;
                try
                {
                    if (!string.IsNullOrEmpty(patternTextBox.Text))
                    {
                        patternNode = dslProcessor.Deserialize(patternTextBox.Text, Languages);
                    }
                }
                catch
                {
                }

                if (patternLogger.ErrorCount == 0)
                {
                    PatternErrorsIsVisible = false;
                    PatternErrorsText      = "";
                    if (IsDeveloperMode && patternNode != null)
                    {
                        PatternJson = ustNodeJsonSerializer.Serialize(patternNode);
                        File.WriteAllText(Path.Combine(ServiceLocator.TempDirectory, "Pattern UST.json"), PatternJson);
                    }
                }
                else
                {
                    PatternErrorsIsVisible = true;
                    PatternErrorsText      = $"ERRORS ({patternLogger.ErrorCount})";
                    if (IsDeveloperMode)
                    {
                        PatternJson = "";
                    }
                }
                Dispatcher.UIThread.InvokeAsync(() =>
                {
                    this.RaisePropertyChanged(nameof(PatternErrorsIsVisible));
                    this.RaisePropertyChanged(nameof(PatternErrorsText));
                    this.RaisePropertyChanged(nameof(PatternJson));
                });

                if (ServiceLocator.MainWindowViewModel != null)
                {
                    ServiceLocator.MainWindowViewModel.UpdateMatchings();
                }
            }
        }
Beispiel #20
0
        public void ProcessDsl_SampleWithSyntaxError_HandleErrors()
        {
            var logger    = new LoggerMessageCounter();
            var data      = "(?i)password(?-i)]> = <[\"\\w*\" || null]>";
            var processor = new DslProcessor()
            {
                Logger = logger
            };
            UstNode result = processor.Deserialize(data, LanguageExt.AllPatternLanguages);

            Assert.AreEqual(5, logger.ErrorCount);
        }
Beispiel #21
0
        public void Parse_Dsl_WithoutErrors(string fileName)
        {
            var data      = File.ReadAllText(Path.Combine(TestHelper.TestsDataPath, fileName));
            var logger    = new LoggerMessageCounter();
            var processor = new DslProcessor()
            {
                Logger = logger
            };
            UstNode result = processor.Deserialize(data, LanguageExt.AllPatternLanguages);

            Assert.AreEqual(0, logger.ErrorCount);
        }
Beispiel #22
0
        public override UstNode[] GetChildren()
        {
            var result = new UstNode[Members.Count + 1];
            int index  = 0;

            result[index++] = Name;
            foreach (var member in Members)
            {
                result[index++] = member;
            }
            return(result);
        }
Beispiel #23
0
        public override int CompareTo(UstNode other)
        {
            var baseCompareResult = base.CompareTo(other);

            if (baseCompareResult != 0)
            {
                return(baseCompareResult);
            }

            var unaryOperatorResult = UnaryOperator - ((UnaryOperatorLiteral)other).UnaryOperator;

            return(unaryOperatorResult);
        }
Beispiel #24
0
        public override int CompareTo(UstNode other)
        {
            var baseCompareResult = base.CompareTo(other);

            if (baseCompareResult != 0)
            {
                return(baseCompareResult);
            }

            TypeToken otherTypeToken = (TypeToken)other;

            return(String.Compare(TextValue, otherTypeToken.TextValue, StringComparison.Ordinal));
        }
Beispiel #25
0
        public override int CompareTo(UstNode other)
        {
            var baseCompareResult = base.CompareTo(other);

            if (baseCompareResult != 0)
            {
                return(baseCompareResult);
            }

            var classTypeCompareResult = TypeType - ((TypeTypeLiteral)other).TypeType;

            return(classTypeCompareResult);
        }
Beispiel #26
0
        public override int CompareTo(UstNode other)
        {
            var baseCompareResult = base.CompareTo(other);

            if (baseCompareResult != 0)
            {
                return(baseCompareResult);
            }

            var modifierCompareResult = Modifier - ((ModifierLiteral)other).Modifier;

            return(modifierCompareResult);
        }
Beispiel #27
0
        public static UstNode GetObject(string type)
        {
            UstNode ustNode = null;

            switch (type)
            {
            case IdConstants.RootIdName:
                ustNode = new RootUstNode();
                break;

            case IdConstants.UsingDirectiveIdName:
                ustNode = new UsingDirective();
                break;

            case IdConstants.NamespaceIdName:
                ustNode = new NamespaceDeclaration();
                break;

            case IdConstants.ClassIdName:
                ustNode = new ClassDeclaration();
                break;

            case IdConstants.InterfaceIdName:
                ustNode = new InterfaceDeclaration();
                break;

            case IdConstants.BodyIdName:
                ustNode = new BlockStatement();
                break;

            case IdConstants.ObjectCreationIdName:
                ustNode = new ObjectCreationExpression();
                break;

            case IdConstants.InvocationIdName:
                ustNode = new InvocationExpression();
                break;

            case IdConstants.LiteralIdName:
                ustNode = new LiteralExpression();
                break;

            case IdConstants.MethodIdName:
                ustNode = new MethodDeclaration();
                break;

            default: break;
            }

            return(ustNode);
        }
Beispiel #28
0
 protected override UstNode VisitChildren(UstNode ustNode)
 {
     try
     {
         return(base.VisitChildren(ustNode));
     }
     catch (Exception ex)
     {
         Logger.LogError(new ConversionException(ustNode.FileNode?.FileName?.Text ?? "", ex)
         {
             TextSpan = ustNode.TextSpan
         });
         return(null);
     }
 }
Beispiel #29
0
        public override int CompareTo(UstNode other)
        {
            if (other == null)
            {
                return((int)other.NodeType);
            }

            if (other is Statement)
            {
                return(0);
            }
            else
            {
                return(NodeType - other.NodeType);
            }
        }
Beispiel #30
0
        public void Parse_NewLine_CorrectLineColumn()
        {
            string fileText = File.ReadAllText(Path.Combine(TestHelper.TestsDataPath, "newLine -r-n.php"));
            var    lineEnds = new string[] { "\r", "\n", "\r\n" };

            foreach (var lineEnd in lineEnds)
            {
                var    phpParser      = new PhpAntlrParser();
                string code           = fileText.Replace("\r\n", lineEnd);
                var    sourceCodeFile = new SourceCodeFile
                {
                    Name = "newLine.php",
                    Code = code
                };
                var parseTree = (PhpAntlrParseTree)phpParser.Parse(sourceCodeFile);
                var converter = new PhpAntlrParseTreeConverter();
                Ust ust       = converter.Convert(parseTree);

                UstNode intNode = ust.Root.GetAllDescendants(
                    node => node.NodeType == NodeType.IntLiteral &&
                    ((IntLiteral)node).Value == 42).First();

                int beginLine, beginColumn, endLine, endColumn;
                TextHelper.ToLineColumn(intNode.TextSpan, code, out beginLine, out beginColumn, out endLine, out endColumn);
                Assert.AreEqual(1, beginLine);
                Assert.AreEqual(12, beginColumn);
                Assert.AreEqual(14, endColumn);

                UstNode heredocNode = ust.Root.GetAllDescendants(
                    node => node.NodeType == NodeType.StringLiteral &&
                    ((StringLiteral)node).Text.StartsWith("Heredoc text")).First();

                TextHelper.ToLineColumn(heredocNode.TextSpan, code, out beginLine, out beginColumn, out endLine, out endColumn);
                Assert.AreEqual(3, beginLine);
                Assert.AreEqual(6, endLine);

                UstNode serverAddressNode = ust.Root.GetAllDescendants(
                    node => node.NodeType == NodeType.StringLiteral &&
                    ((StringLiteral)node).Text.Contains("http://127.0.0.1")).First();

                TextHelper.ToLineColumn(serverAddressNode.TextSpan, code, out beginLine, out beginColumn, out endLine, out endColumn);
                Assert.AreEqual(8, beginLine);
                Assert.AreEqual(15, beginColumn);
            }
        }