예제 #1
0
        static void Main(string[] args)
        {
            Console.ForegroundColor = ConsoleColor.Blue;
            Console.OutputEncoding  = System.Text.Encoding.GetEncoding(28591);
            Console.WriteLine(Logo.Art);
            Console.WriteLine("Ultramarine QueryLanguage CLI");
            Console.ResetColor();

            while (true)
            {
                Console.Write('>');
                var input = Console.ReadLine();
                if (input.Equals("exit", StringComparison.OrdinalIgnoreCase))
                {
                    break;
                }
                try
                {
                    var compiler = new ConditionCompiler(input);
                    Console.WriteLine(compiler.Execute());
                }
                catch
                {
                    //TODO: proper parsing error
                    Console.WriteLine("Can't understand that expression. Yet!");
                }
            }
        }
예제 #2
0
        public List <ICodeElementModel> GetCodeElements(string expression)
        {
            var result    = new List <CodeElement>();
            var codeModel = GetCodeModel(_projectItem);

            if (codeModel == null)
            {
                return(null);
            }

            foreach (CodeElement codeElement in _projectItem.FileCodeModel.CodeElements)
            {
                if (codeElement.IsCodeType)
                {
                    var condition = new ConditionCompiler(expression, codeElement.Name);
                    if (condition.Execute())
                    {
                        result.Add(codeElement);
                    }
                    else
                    {
                        result.AddRange(GetInnerCodeElements(codeElement, expression));
                    }
                }
                else
                {
                    result.AddRange(GetInnerCodeElements(codeElement, expression));
                }
            }

            return(result.Select <CodeElement, ICodeElementModel>(c => new CodeElementModel(c)).ToList());
        }
예제 #3
0
        public static bool Check(string propertyName, string conditionTemplate)
        {
            var condition = conditionTemplate.Replace("${property}", propertyName);
            var compiler  = new ConditionCompiler(condition);

            return((bool)compiler.Execute());
        }
예제 #4
0
        public void ShouldEvaluateEqualsConditionAsTrue()
        {
            var expression = "'Test1' equals 'Test1'";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsTrue(result);
        }
예제 #5
0
        public void ShouldEvaluateOrTruthyComplexConditions()
        {
            var expression = "'Test1' equals 'Test1' or 'Test2' equals 'Test2'";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsTrue(result);
        }
예제 #6
0
        public void ShouldEvaluateFalsyComplexConditions()
        {
            var expression = "Test2 endsWith Test1 and Test2 endsWith Test2";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsFalse(result);
        }
예제 #7
0
        public void ShouldEvaluateAndTruthyComplexConditionsWrappedInParens()
        {
            var expression = "(Test1 endsWith Test1) and (Test2 endsWith Test2)";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsTrue(result);
        }
예제 #8
0
        public void ShouldEvaluateEndsWithConditionAsTrue()
        {
            var expression = "Test1 endsWith Test1";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsTrue(result);
        }
예제 #9
0
        public void ShouldEvaluateOrTruthyComplexConditions()
        {
            var expression = "Test1 endsWith Test1 or Test2 endsWith Test2";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsTrue(result);
        }
예제 #10
0
        public void ShouldEvaluateEqualsConditionAsFalse()
        {
            var expression = "Test1 equals Test2";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsFalse(result);
        }
예제 #11
0
        public void ShouldEvaluateAndTruthyComplexConditions()
        {
            var expression = "Test1 equals Test1 and Test2 equals Test2";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsTrue(result);
        }
예제 #12
0
        public void ShouldEvaluateEqualsConditionAsTrueWrappedInParens()
        {
            var expression = "(Test1 equals Test1)";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsTrue(result);
        }
예제 #13
0
        public void ShouldEvaluateConditionsContainingTrueKeyword()
        {
            var expression = "true contains true";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsTrue(result);
        }
예제 #14
0
        public void ShouldEvaluateContainsConditionAsTrueWrappedInParens()
        {
            var expression = "('Test1' contains 't1')";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsTrue(result);
        }
예제 #15
0
        public void ShouldEvaluateContainsConditionWithWhitespacesAsFalse()
        {
            var expression = "'Solution items' contains 'Test2'";
            var compiler   = new ConditionCompiler(expression);
            var result     = compiler.Execute();

            Assert.IsFalse(result);
        }
예제 #16
0
        public void ShouldEvaluateContainsWithNoContainingString()
        {
            var expression = "'test1' contains 'p'";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsFalse(result);
        }
예제 #17
0
        public void ShouldEvaluateOrTruthyComplexConditionsWithSpecialOperands()
        {
            var expression = "'Test1.Test1' contains 'Test1' or 'Test2' contains 'Test2'";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsTrue(result);
        }
예제 #18
0
        public void ShouldEvaluateContainsConditionWithAliasAsFalse()
        {
            var expression = "$this contains 'Test2'";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsFalse(result);
        }
예제 #19
0
        public void ShouldEvaluateAndTruthyComplexConditionsWrappedInParens()
        {
            var expression = "('Test1' contains 'Test1') and ('Test2' contains 'Test2')";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsTrue(result);
        }
예제 #20
0
        public void ShouldEvaluateFalseComplexConditions()
        {
            var expression = "'Test2' contains 'Test1' and 'Test1' contains 'Test2'";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsFalse(result);
        }
예제 #21
0
        public void ShouldEvaluateStartsWithConditionAsFalse()
        {
            var expression = "'Test1' startsWith 'Test2'";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsFalse(result);
        }
예제 #22
0
        public void ShouldEvaluateAndTruthyComplexConditions()
        {
            var expression = "'Test1' startsWith 'Test1' and 'Test2' startsWith 'Test2'";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsTrue(result);
        }
예제 #23
0
        public void ShouldEvaluateConditionsContainingCombinedKeyword()
        {
            var expression = "true startsWith false";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsFalse(result);
        }
예제 #24
0
        public void ShouldEvaluateStartsWithConditionAsTrueWrappedInParens()
        {
            var expression = "('Test1' startsWith 'te')";
            var compiler   = new ConditionCompiler(expression);
            var result     = (bool)compiler.Execute();

            Assert.IsTrue(result);
        }
예제 #25
0
        /// <summary>
        /// Gets all the projects which satisfy given expression
        /// </summary>
        /// <param name="projectNameExpression">Expression given in the QueryLanguage form</param>
        /// <returns>List of Visual Studio projects</returns>
        public List <Project> GetProjects(string expression)
        {
            var result   = new List <Project>();
            var projects = GetProjects();

            foreach (var project in projects)
            {
                var projectName = project.Name;
                var condition   = new ConditionCompiler(expression, projectName);
                if (condition.Execute())
                {
                    result.Add(project);
                }
            }
            return(result);
        }
예제 #26
0
        public IEnumerable<IProjectItemModel> GetProjectItems(string expression, string propertyName = "FileName")
        {
            var result = new List<IProjectItemModel>();
            foreach (var item in ProjectItems)
            {
                var condition = new ConditionCompiler(expression, item.GetProperty(propertyName));
                if (condition.Execute())
                    result.Add(item);

                var subItems = item.GetProjectItems(expression);
                if (subItems != null)
                {
                    subItems.Remove(item);
                    result.AddRange(subItems);
                }
            }
            return result;
        }
예제 #27
0
        public List <IProjectItemModel> GetProjectItems(string expression)
        {
            var result    = new List <IProjectItemModel>();
            var condition = new ConditionCompiler(expression, Name);

            if (condition.Execute())
            {
                result.Add(this);
            }

            foreach (var item in ProjectItems)
            {
                var subItems = item.GetProjectItems(expression);
                if (subItems != null)
                {
                    result.AddRange(subItems);
                }
            }
            return(result);
        }
예제 #28
0
        private List <CodeElement> GetCodeElements(CodeElement codeElement, string expression)
        {
            var result   = new List <CodeElement>();
            var elements = new List <CodeElement>();

            switch (codeElement.Kind)
            {
            case vsCMElement.vsCMElementInterface:
            {
                var codeInterface = codeElement as CodeInterface2;
                elements.AddRange(codeInterface.Parts.Cast <CodeElement>());
                break;
            }

            case vsCMElement.vsCMElementClass:
            {
                var codeClass = codeElement as CodeClass2;
                elements.AddRange(codeClass.Parts.Cast <CodeElement>());
                break;
            }

            case vsCMElement.vsCMElementStruct:
            {
                var codeStruct = codeElement as CodeStruct2;
                elements.AddRange(codeStruct.Parts.Cast <CodeElement>());
                break;
            }

            case vsCMElement.vsCMElementNamespace:
            {
                elements.AddRange(new List <CodeElement> {
                        codeElement
                    });
                break;
            }
            }
            if (!elements.Any())
            {
                elements.Add(codeElement);
            }

            foreach (var element in elements)
            {
                foreach (CodeElement child in element.Children)
                {
                    var children = GetCodeElements(child, expression);
                    result.AddRange(children);
                    if (child.HasName())
                    {
                        var condition = new ConditionCompiler(expression, child.Name);

                        if (condition.Execute())
                        {
                            result.Add(child);
                            continue;
                        }
                    }

                    result.AddRange(GetInnerCodeElements(child, expression));
                }
            }

            return(result);
        }