Exemple #1
0
        public static JsAnalyzer Analyze(string directory, AnalysisLimits limits = null, Action parseCallback = null)
        {
            List <AnalysisFile> files = new List <AnalysisFile>();

            foreach (var file in Directory.GetFiles(directory, "*", SearchOption.AllDirectories))
            {
                if (String.Equals(Path.GetExtension(file), ".js", StringComparison.OrdinalIgnoreCase))
                {
                    var relativeFile = file.Substring(directory.Length);
                    if (!limits.IsPathExceedNestingLimit(relativeFile))
                    {
                        files.Add(new AnalysisFile(file, File.ReadAllText(file)));
                    }
                }
                else if (String.Equals(Path.GetFileName(file), "package.json", StringComparison.OrdinalIgnoreCase))
                {
                    JavaScriptSerializer        serializer = new JavaScriptSerializer();
                    Dictionary <string, object> json;
                    try {
                        json = serializer.Deserialize <Dictionary <string, object> >(File.ReadAllText(file));
                    } catch {
                        continue;
                    }

                    object mainFile;
                    if (json != null && json.TryGetValue("main", out mainFile) && mainFile is string)
                    {
                        files.Add(AnalysisFile.PackageJson(file, (string)mainFile));
                    }
                }
            }

            return(Analyze(limits, parseCallback, files.ToArray()));
        }
        /// <summary>
        /// Loads a new instance from the specified registry key.
        /// </summary>
        /// <param name="key">
        /// The key to load settings from. Each setting is a DWORD value. If
        /// null, all settings are assumed to be unspecified and the default
        /// values are used.
        /// </param>
        /// <param name="defaultToStdLib">
        /// If True, unspecified settings are taken from the defaults for
        /// standard library analysis. Otherwise, they are taken from the
        /// usual defaults.
        /// </param>
        public static AnalysisLimits LoadFromStorage(RegistryKey key, bool defaultToStdLib = false)
        {
            var limits = defaultToStdLib ? AnalysisLimits.GetStandardLibraryLimits() : new AnalysisLimits();

            if (key != null)
            {
                limits.CrossModule                    = (key.GetValue(CrossModuleId) as int?) ?? limits.CrossModule;
                limits.CallDepth                      = (key.GetValue(CallDepthId) as int?) ?? limits.CallDepth;
                limits.DecreaseCallDepth              = (key.GetValue(DecreaseCallDepthId) as int?) ?? limits.DecreaseCallDepth;
                limits.NormalArgumentTypes            = (key.GetValue(NormalArgumentTypesId) as int?) ?? limits.NormalArgumentTypes;
                limits.ListArgumentTypes              = (key.GetValue(ListArgumentTypesId) as int?) ?? limits.ListArgumentTypes;
                limits.DictArgumentTypes              = (key.GetValue(DictArgumentTypesId) as int?) ?? limits.DictArgumentTypes;
                limits.ReturnTypes                    = (key.GetValue(ReturnTypesId) as int?) ?? limits.ReturnTypes;
                limits.YieldTypes                     = (key.GetValue(YieldTypesId) as int?) ?? limits.YieldTypes;
                limits.InstanceMembers                = (key.GetValue(InstanceMembersId) as int?) ?? limits.InstanceMembers;
                limits.DictKeyTypes                   = (key.GetValue(DictKeyTypesId) as int?) ?? limits.DictKeyTypes;
                limits.DictValueTypes                 = (key.GetValue(DictValueTypesId) as int?) ?? limits.DictValueTypes;
                limits.IndexTypes                     = (key.GetValue(IndexTypesId) as int?) ?? limits.IndexTypes;
                limits.AssignedTypes                  = (key.GetValue(AssignedTypesId) as int?) ?? limits.AssignedTypes;
                limits.UnifyCallsToNew                = ((key.GetValue(UnifyCallsToNewId) as int?) ?? (limits.UnifyCallsToNew ? 1 : 0)) != 0;
                limits.ProcessCustomDecorators        = ((key.GetValue(ProcessCustomDecoratorsId) as int?) ?? (limits.ProcessCustomDecorators ? 1 : 0)) != 0;
                limits.UseTypeStubPackages            = ((key.GetValue(UseTypeStubPackagesId) as int?) ?? (limits.UseTypeStubPackages ? 1 : 0)) != 0;
                limits.UseTypeStubPackagesExclusively = ((key.GetValue(UseTypeStubPackagesExclusivelyId) as int?) ?? (limits.UseTypeStubPackagesExclusively ? 1 : 0)) != 0;
            }

            return(limits);
        }
Exemple #3
0
        public static JsAnalyzer Analyze(AnalysisLimits limits, Action parseCallback, params AnalysisFile[] files)
        {
            Dictionary <string, IJsProjectEntry> entries = new Dictionary <string, IJsProjectEntry>();
            var analyzer = new JsAnalyzer(limits);

            foreach (var file in files)
            {
                if (Path.GetFileName(file.Filename).Equals("package.json", StringComparison.OrdinalIgnoreCase))
                {
                    analyzer.AddPackageJson(file.Filename, file.Content);
                }
                else
                {
                    var projEntry = analyzer.AddModule(file.Filename);
                    entries[file.Filename] = projEntry;
                }
            }

            foreach (var file in files)
            {
                if (!Path.GetFileName(file.Filename).Equals("package.json", StringComparison.OrdinalIgnoreCase))
                {
                    var source = Analysis.GetSourceUnit(file.Content);
                    Analysis.Prepare(
                        entries[file.Filename],
                        source
                        );
                }
            }

            if (parseCallback != null)
            {
                parseCallback();
            }

            foreach (var file in files)
            {
                if (!Path.GetFileName(file.Filename).Equals("package.json", StringComparison.OrdinalIgnoreCase))
                {
                    ((IGroupableAnalysisProjectEntry)entries[file.Filename]).Analyze(CancellationToken.None, true);
                }
            }

            foreach (var file in files)
            {
                IJsProjectEntry projEntry;
                if (entries.TryGetValue(file.Filename, out projEntry))
                {
                    projEntry.AnalysisGroup.AnalyzeQueuedEntries(CancellationToken.None);
                    break;
                }
            }

            return(analyzer);
        }
Exemple #4
0
        public TestAnalyzer(
            IPythonInterpreterFactory factory,
            string containerFilePath,
            string codeFileBasePath,
            Uri executorUri
            )
        {
            _analyzer        = PythonAnalyzer.CreateAsync(factory).WaitAndUnwrapExceptions();
            _analyzer.Limits = AnalysisLimits.GetStandardLibraryLimits();

            _containerFilePath = containerFilePath;
            _codeFileBasePath  = codeFileBasePath;
            _executorUri       = executorUri;

            _entries = new List <IPythonProjectEntry>();
        }
        protected async Task <IModuleAnalysis> GetStubBasedAnalysis(
            Server server,
            string code,
            AnalysisLimits limits,
            IEnumerable <string> searchPaths,
            IEnumerable <string> stubPaths)
        {
            if (limits != null)
            {
                server.Analyzer.Limits = limits;
            }
            server.Analyzer.SetSearchPaths(searchPaths);
            server.Analyzer.SetTypeStubPaths(stubPaths);

            var uri = await server.OpenDefaultDocumentAndGetUriAsync(code);

            return(await server.GetAnalysisAsync(uri));
        }
        /// <summary>
        /// Returns a new set of limits, set to the default for analyzing a
        /// standard library.
        /// </summary>
        public static AnalysisLimits GetStandardLibraryLimits()
        {
            var limits = new AnalysisLimits();

            limits.CrossModule             = 0;
            limits.CallDepth               = 2;
            limits.DecreaseCallDepth       = 20;
            limits.NormalArgumentTypes     = 10;
            limits.ListArgumentTypes       = 5;
            limits.DictArgumentTypes       = 5;
            limits.ReturnTypes             = 10;
            limits.YieldTypes              = 10;
            limits.InstanceMembers         = 5;
            limits.DictKeyTypes            = 5;
            limits.DictValueTypes          = 10;
            limits.IndexTypes              = 5;
            limits.AssignedTypes           = 10;
            limits.UnifyCallsToNew         = true;
            limits.ProcessCustomDecorators = true;
            return(limits);
        }
 public static Dictionary <string, int> ToDictionary(this AnalysisLimits analysisLimits)
 {
     return(new Dictionary <string, int> {
         { CrossModuleId, analysisLimits.CrossModule },
         { CallDepthId, analysisLimits.CallDepth },
         { DecreaseCallDepthId, analysisLimits.DecreaseCallDepth },
         { NormalArgumentTypesId, analysisLimits.NormalArgumentTypes },
         { ListArgumentTypesId, analysisLimits.ListArgumentTypes },
         { DictArgumentTypesId, analysisLimits.DictArgumentTypes },
         { ReturnTypesId, analysisLimits.ReturnTypes },
         { YieldTypesId, analysisLimits.YieldTypes },
         { InstanceMembersId, analysisLimits.InstanceMembers },
         { DictKeyTypesId, analysisLimits.DictKeyTypes },
         { DictValueTypesId, analysisLimits.DictValueTypes },
         { IndexTypesId, analysisLimits.IndexTypes },
         { AssignedTypesId, analysisLimits.AssignedTypes },
         { UnifyCallsToNewId, analysisLimits.UnifyCallsToNew ? 1 : 0 },
         { ProcessCustomDecoratorsId, analysisLimits.ProcessCustomDecorators ? 1 : 0 },
         { UseTypeStubPackagesId, analysisLimits.UseTypeStubPackages ? 1 : 0 },
         { UseTypeStubPackagesExclusivelyId, analysisLimits.UseTypeStubPackagesExclusively ? 1 : 0 }
     });
 }
Exemple #8
0
        internal PythonAnalyzer AnalyzeDir(string dir, PythonLanguageVersion version = PythonLanguageVersion.V27, IEnumerable <string> excludeDirectories = null, CancellationToken?cancel = null)
        {
            List <string> files = new List <string>();

            try {
                ISet <string> excluded = null;
                if (excludeDirectories != null)
                {
                    excluded = new HashSet <string>(excludeDirectories, StringComparer.InvariantCultureIgnoreCase);
                }
                CollectFiles(dir, files, excluded);
            } catch (DirectoryNotFoundException) {
                return(null);
            }

            List <FileStreamReader> sourceUnits = new List <FileStreamReader>();

            foreach (string file in files)
            {
                sourceUnits.Add(
                    new FileStreamReader(file)
                    );
            }

            Stopwatch sw = new Stopwatch();

            sw.Start();
            long start0 = sw.ElapsedMilliseconds;
            // Explicitly specify the builtins name because we are using a 2.7
            // interpreter for all versions.
            var fact         = InterpreterFactoryCreator.CreateAnalysisInterpreterFactory(version.ToVersion());
            var projectState = new PythonAnalyzer(fact, fact.CreateInterpreter(), "__builtin__");

            projectState.Limits = AnalysisLimits.GetStandardLibraryLimits();

            var modules = new List <IPythonProjectEntry>();

            foreach (var sourceUnit in sourceUnits)
            {
                try {
                    modules.Add(projectState.AddModule(
                                    ModulePath.FromFullPath(sourceUnit.Path).ModuleName,
                                    sourceUnit.Path,
                                    null
                                    ));
                } catch (ArgumentException) {
                    // Invalid module name, so skip the module
                }
            }
            long start1 = sw.ElapsedMilliseconds;

            Trace.TraceInformation("AddSourceUnit: {0} ms", start1 - start0);

            var nodes = new List <Microsoft.PythonTools.Parsing.Ast.PythonAst>();

            for (int i = 0; i < modules.Count; i++)
            {
                PythonAst ast = null;
                try {
                    var sourceUnit = sourceUnits[i];

                    ast = Parser.CreateParser(sourceUnit, version).ParseFile();
                } catch (Exception) {
                }
                nodes.Add(ast);
            }
            long start2 = sw.ElapsedMilliseconds;

            Trace.TraceInformation("Parse: {0} ms", start2 - start1);

            for (int i = 0; i < modules.Count; i++)
            {
                var ast = nodes[i];

                if (ast != null)
                {
                    modules[i].UpdateTree(ast, null);
                }
            }

            long start3 = sw.ElapsedMilliseconds;

            for (int i = 0; i < modules.Count; i++)
            {
                Trace.TraceInformation("Analyzing {1}: {0} ms", sw.ElapsedMilliseconds - start3, sourceUnits[i].Path);
                var ast = nodes[i];
                if (ast != null)
                {
                    modules[i].Analyze(cancel ?? CancellationToken.None, true);
                }
            }
            if (modules.Count > 0)
            {
                Trace.TraceInformation("Analyzing queue");
                modules[0].AnalysisGroup.AnalyzeQueuedEntries(cancel ?? CancellationToken.None);
            }

            long start4 = sw.ElapsedMilliseconds;

            Trace.TraceInformation("Analyze: {0} ms", start4 - start3);
            return(projectState);
        }
Exemple #9
0
 protected virtual AnalysisLimits GetLimits() => AnalysisLimits.GetDefaultLimits();
        public void RunDirectory(string testDir, string packageId, string[] packages, int runOrder)
        {
            Stopwatch sw = new Stopwatch();

            for (int i = 0; i < 3; i++)
            {
                GC.Collect(GC.MaxGeneration);
                GC.WaitForPendingFinalizers();
            }
            var  startingGcMem    = GC.GetTotalMemory(true);
            var  workingSet       = Process.GetCurrentProcess().WorkingSet64;
            var  startTime        = sw.ElapsedMilliseconds;
            long parserGcMem      = 0;
            long parserWorkingSet = 0;

            sw.Start();
            var analyzer = Analysis.Analyze(
                testDir,
                _lowAnalysis ? AnalysisLimits.MakeLowAnalysisLimits() : null,
                () => {
                for (int i = 0; i < 3; i++)
                {
                    GC.Collect(GC.MaxGeneration);
                    GC.WaitForPendingFinalizers();
                }
                parserGcMem      = GC.GetTotalMemory(true);
                parserWorkingSet = Process.GetCurrentProcess().WorkingSet64;
            }
                );

            sw.Stop();
            var endingGcMem   = GC.GetTotalMemory(true);
            var endWorkingSet = Process.GetCurrentProcess().WorkingSet64;

            int completionCount = 0, secondLevelCompletionCount = 0;

            foreach (var module in analyzer.AllModules)
            {
                if (String.Equals(Path.Combine(testDir, "app.js"), module.FilePath, StringComparison.OrdinalIgnoreCase) ||
                    String.Equals(Path.Combine(testDir, "index.js"), module.FilePath, StringComparison.OrdinalIgnoreCase) ||
                    String.Equals(Path.Combine(testDir, "server.js"), module.FilePath, StringComparison.OrdinalIgnoreCase))
                {
                    foreach (var package in packages)
                    {
                        string packageName = package.Split('@')[0];
                        string requireCode = String.Format("require('{0}')", packageName);

                        var moduleMembers = module.Analysis.GetMembersByIndex(requireCode, 0);
                        completionCount += moduleMembers.Count();

                        foreach (var moduleMember in moduleMembers)
                        {
                            var memberCode = requireCode + "." + moduleMember.Completion;

                            secondLevelCompletionCount += module.Analysis.GetMembersByIndex(memberCode, 0).Count();
                        }

                        if (_dumpMembers != null)
                        {
                            DumpMembers(module.Analysis, requireCode, 0);
                        }
                    }

                    break;
                }
            }

            var time                  = sw.ElapsedMilliseconds - startTime;
            int fileCount             = analyzer.AllModules.Count();
            var totalWorkingSet       = (endWorkingSet - workingSet) / (1024 * 1024);
            var parserTotalWorkingSet = (parserWorkingSet - workingSet) / (1024 * 1024);

            var stats = new RunStats(
                completionCount,
                secondLevelCompletionCount,
                time,
                fileCount,
                parserTotalWorkingSet,
                (parserGcMem - startingGcMem) / (1024 * 1024),
                totalWorkingSet,
                (endingGcMem - startingGcMem) / (1024 * 1024),
                runOrder
                );

            Log(stats, packageId);
            if (_wait)
            {
                Console.ReadLine();
            }
            GC.KeepAlive(analyzer);
#if DEBUG
            //Console.WriteLine(analyzer.GetAnalysisStats());
#endif
            if (_cleanup)
            {
                Directory.Delete(testDir, true);
            }
            else
            {
                Console.WriteLine("   Ran in {0}", testDir);
            }
        }
Exemple #11
0
 protected virtual AnalysisLimits GetLimits()
 {
     return(AnalysisLimits.GetDefaultLimits());
 }
Exemple #12
0
 public void SetLimits(AnalysisLimits limits)
 {
     _analyzer.Limits = limits;
 }
Exemple #13
0
 public static JsAnalyzer Analyze(AnalysisLimits limits, params AnalysisFile[] files)
 {
     return(Analyze(limits, null, files));
 }
Exemple #14
0
 /// <summary>
 /// Returns a new set of limits, set to the default for analyzing a
 /// standard library.
 /// </summary>
 public static AnalysisLimits GetStandardLibraryLimits()
 {
     var limits = new AnalysisLimits();
     limits.CallDepth = 1;
     limits.NormalArgumentTypes = 10;
     limits.ListArgumentTypes = 5;
     limits.DictArgumentTypes = 5;
     limits.ReturnTypes = 10;
     limits.YieldTypes = 10;
     limits.InstanceMembers = 5;
     limits.UnifyCallsToNew = true;
     return limits;
 }
        public static AnalysisLimits FromDictionary(Dictionary <string, int> limits)
        {
            var analysisLimits = new AnalysisLimits();
            int i;

            if (limits.TryGetValue(CrossModuleId, out i))
            {
                analysisLimits.CrossModule = i;
            }
            if (limits.TryGetValue(CallDepthId, out i))
            {
                analysisLimits.CallDepth = i;
            }
            if (limits.TryGetValue(DecreaseCallDepthId, out i))
            {
                analysisLimits.DecreaseCallDepth = i;
            }
            if (limits.TryGetValue(NormalArgumentTypesId, out i))
            {
                analysisLimits.NormalArgumentTypes = i;
            }
            if (limits.TryGetValue(ListArgumentTypesId, out i))
            {
                analysisLimits.ListArgumentTypes = i;
            }
            if (limits.TryGetValue(DictArgumentTypesId, out i))
            {
                analysisLimits.DictArgumentTypes = i;
            }
            if (limits.TryGetValue(ReturnTypesId, out i))
            {
                analysisLimits.ReturnTypes = i;
            }
            if (limits.TryGetValue(YieldTypesId, out i))
            {
                analysisLimits.YieldTypes = i;
            }
            if (limits.TryGetValue(InstanceMembersId, out i))
            {
                analysisLimits.InstanceMembers = i;
            }
            if (limits.TryGetValue(DictKeyTypesId, out i))
            {
                analysisLimits.DictKeyTypes = i;
            }
            if (limits.TryGetValue(DictValueTypesId, out i))
            {
                analysisLimits.DictValueTypes = i;
            }
            if (limits.TryGetValue(IndexTypesId, out i))
            {
                analysisLimits.IndexTypes = i;
            }
            if (limits.TryGetValue(AssignedTypesId, out i))
            {
                analysisLimits.AssignedTypes = i;
            }
            if (limits.TryGetValue(UnifyCallsToNewId, out i))
            {
                analysisLimits.UnifyCallsToNew = i != 0;
            }
            if (limits.TryGetValue(ProcessCustomDecoratorsId, out i))
            {
                analysisLimits.ProcessCustomDecorators = i != 0;
            }
            if (limits.TryGetValue(UseTypeStubPackagesId, out i))
            {
                analysisLimits.UseTypeStubPackages = i != 0;
            }
            if (limits.TryGetValue(UseTypeStubPackagesExclusivelyId, out i))
            {
                analysisLimits.UseTypeStubPackagesExclusively = i != 0;
            }

            return(analysisLimits);
        }