public static bool IsRelated(string apexText, string apexClassName)
        {
            if (string.IsNullOrWhiteSpace(apexText) || string.IsNullOrWhiteSpace(apexClassName))
            {
                return(false);
            }

            try
            {
                // try to parse and analyze the file
                var ast = ApexSharpParser.GetApexAst(apexText);

                // ignore the class itself
                if (ast is ClassDeclarationSyntax @class && Comparer.Equals(@class.Identifier, apexClassName))
                {
                    return(false);
                }
                else if (ast is EnumDeclarationSyntax @enum && Comparer.Equals(@enum.Identifier, apexClassName))
                {
                    return(false);
                }

                // inspect the code structure
                var visitor = new RelatedClassHelper(apexClassName);
                ast.Accept(visitor);
                return(visitor.ClassIsRelated);
            }
        public void RelatedClassUseCases()
        {
            // positives
            Assert.IsTrue(RelatedClassHelper.IsRelated(SampleClass, "GreatUtility")); // variable
            Assert.IsTrue(RelatedClassHelper.IsRelated(SampleClass, "CoolStuff")); // expression
            Assert.IsTrue(RelatedClassHelper.IsRelated(SampleClass, "Object")); // variable
            Assert.IsTrue(RelatedClassHelper.IsRelated(SampleClass, "Something")); // property
            Assert.IsTrue(RelatedClassHelper.IsRelated(SampleClass, "AwesomeStuff")); // expression
            Assert.IsTrue(RelatedClassHelper.IsRelated(SampleClass, "ThatsPerfect")); // annotation
            Assert.IsTrue(RelatedClassHelper.IsRelated(SampleClass, "WhatElse")); // parameter

            // incomplete matches
            Assert.IsFalse(RelatedClassHelper.IsRelated(SampleClass, "Great")); // partial name
            Assert.IsFalse(RelatedClassHelper.IsRelated(SampleClass, "Utility")); // partial name
            Assert.IsFalse(RelatedClassHelper.IsRelated(SampleClass, "Awesome")); // partial name
            Assert.IsFalse(RelatedClassHelper.IsRelated(SampleClass, "Perfect")); // partial name

            // negatives
            Assert.IsFalse(RelatedClassHelper.IsRelated(SampleClass, "IsTest")); // string constant
            Assert.IsFalse(RelatedClassHelper.IsRelated(SampleClass, "global")); // keyword
            Assert.IsFalse(RelatedClassHelper.IsRelated(SampleClass, "Hello")); // string constant
            Assert.IsFalse(RelatedClassHelper.IsRelated(SampleClass, "BadStuff")); // commented out
            Assert.IsFalse(RelatedClassHelper.IsRelated(SampleClass, "main")); // method name
            Assert.IsFalse(RelatedClassHelper.IsRelated(SampleClass, "SomethingGreat")); // itself
            Assert.IsFalse(RelatedClassHelper.IsRelated(SampleClass, "Else")); // property name
        }
        public static List <FileInfo> GetAllRealatedApexFiles(DirectoryInfo apexDir, FileInfo rootApexClassName)
        {
            Stack <FileInfo> readFileNames = new Stack <FileInfo>();

            readFileNames.Push(rootApexClassName);

            List <FileInfo> apexFileFound = new List <FileInfo> {
                rootApexClassName
            };

            while (readFileNames.Count > 0)
            {
                // Need the Apex Class with out the .cls
                var apexClassName = readFileNames.Pop().Name.Replace(".cls", "");

                var apexFileList = GetFilesAsFileInfo(apexDir, "*.cls");
                foreach (var apexFile in apexFileList)
                {
                    var rootFile = File.ReadAllText(apexFile.FullName);

                    if (RelatedClassHelper.IsRelated(rootFile, apexClassName))
                    {
                        apexFileFound.AddItem(apexFile);

                        // Only push files we have not looked at.
                        if (apexFileFound.Contains((FileInfo)apexFile) == false)
                        {
                            readFileNames.Push(apexFile);
                        }
                    }
                }
            }

            return(apexFileFound);
        }
 public void InvalidRelatedClasses()
 {
     Assert.DoesNotThrow(() =>
     {
         Assert.IsFalse(RelatedClassHelper.IsRelated(null, null));
         Assert.IsFalse(RelatedClassHelper.IsRelated(null, string.Empty));
         Assert.IsFalse(RelatedClassHelper.IsRelated(string.Empty, null));
         Assert.IsFalse(RelatedClassHelper.IsRelated(string.Empty, string.Empty));
         Assert.IsFalse(RelatedClassHelper.IsRelated(null, "   "));
         Assert.IsFalse(RelatedClassHelper.IsRelated("   ", null));
         Assert.IsFalse(RelatedClassHelper.IsRelated("   ", "  "));
     });
 }