Пример #1
0
 /// <summary>
 /// Loads a new instance from the specified registry key.
 /// </summary>
 /// <param name="key">
 /// The key to load settings from. If
 /// null, all settings are assumed to be unspecified and the default
 /// values are used.
 /// </param>
 /// <param name="defaults">
 /// The default analysis limits if they're not available in the regkey.
 /// </param>
 public static AnalysisLimits LoadLimitsFromStorage(RegistryKey key, AnalysisLimits defaults)
 {
     return(new AnalysisLimits()
     {
         ReturnTypes = GetSetting(key, ReturnTypesId) ?? defaults.ReturnTypes,
         InstanceMembers = GetSetting(key, InstanceMembersId) ?? defaults.InstanceMembers,
         DictKeyTypes = GetSetting(key, DictKeyTypesId) ?? defaults.DictKeyTypes,
         DictValueTypes = GetSetting(key, DictValueTypesId) ?? defaults.DictValueTypes,
         IndexTypes = GetSetting(key, IndexTypesId) ?? defaults.IndexTypes,
         AssignedTypes = GetSetting(key, AssignedTypesId) ?? defaults.AssignedTypes,
         NestedModulesLimit = GetSetting(key, NestedModulesLimitId) ?? defaults.NestedModulesLimit
     });
 }
Пример #2
0
        public JsAnalyzer(AnalysisLimits limits = null)
        {
            _modules      = new ModuleTable();
            _itemCache    = new Dictionary <object, AnalysisValue>();
            _builtinEntry = new ProjectEntry(this, String.Empty, null);

            Limits = limits ?? new AnalysisLimits();

            _queue = new Deque <AnalysisUnit>();

            _nullInst  = new NullValue(this);
            _trueInst  = new BooleanValue(true, this);
            _falseInst = new BooleanValue(false, this);
            _undefined = new UndefinedValue(this);

            _emptyStringValue = GetConstant(String.Empty);
            _zeroIntValue     = GetConstant(0.0);

            var globals = GlobalBuilder.MakeGlobal(this);

            _globalObject      = globals.GlobalObject;
            _numberPrototype   = globals.NumberPrototype;
            _stringPrototype   = globals.StringPrototype;
            _booleanPrototype  = globals.BooleanPrototype;
            _functionPrototype = globals.FunctionPrototype;
            _arrayFunction     = globals.ArrayFunction;
            _objectPrototype   = globals.ObjectPrototype;
            _requireFunc       = globals.RequireFunction;
            _arrayPrototype    = globals.ArrayPrototype;
            _objectGetOwnPropertyDescriptor = globals.ObjectGetOwnPropertyDescriptor;
            _immutableObject = new ImmutableObjectValue(_builtinEntry);

            var allJson = Path.Combine(
                Path.GetDirectoryName(Assembly.GetExecutingAssembly().Location),
                "all.json"
                );


            if (File.Exists(allJson))
            {
                NodejsModuleBuilder.Build(allJson, this);
            }
            else
            {
                Debug.Fail("Could not find all.json");
            }
        }
        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;
        }
Пример #4
0
        public override bool Equals(object obj)
        {
            AnalysisLimits other = obj as AnalysisLimits;

            if (other != null)
            {
                return
                    (other.ReturnTypes == ReturnTypes &&
                     other.InstanceMembers == InstanceMembers &&
                     other.DictKeyTypes == DictKeyTypes &&
                     other.DictValueTypes == DictValueTypes &&
                     other.IndexTypes == IndexTypes &&
                     other.AssignedTypes == AssignedTypes &&
                     other.MergedArgumentTypes == MergedArgumentTypes &&
                     other.MaxArrayLiterals == MaxArrayLiterals &&
                     other.MaxObjectLiteralProperties == MaxObjectLiteralProperties &&
                     other.MaxObjectKeysTypes == MaxObjectKeysTypes &&
                     other.MaxMergeTypes == MaxMergeTypes);
            }
            return(false);
        }
 /// <summary>
 /// Loads a new instance from the specified registry key.
 /// </summary>
 /// <param name="key">
 /// The key to load settings from. If
 /// null, all settings are assumed to be unspecified and the default
 /// values are used.
 /// </param>
 /// <param name="defaults">
 /// The default analysis limits if they're not available in the regkey.
 /// </param>
 public static AnalysisLimits LoadLimitsFromStorage(RegistryKey key, AnalysisLimits defaults) {
     return new AnalysisLimits() {
         ReturnTypes = GetSetting(key, ReturnTypesId) ?? defaults.ReturnTypes,
         InstanceMembers = GetSetting(key, InstanceMembersId) ?? defaults.InstanceMembers,
         DictKeyTypes = GetSetting(key, DictKeyTypesId) ?? defaults.DictKeyTypes,
         DictValueTypes = GetSetting(key, DictValueTypesId) ?? defaults.DictValueTypes,
         IndexTypes = GetSetting(key, IndexTypesId) ?? defaults.IndexTypes,
         AssignedTypes = GetSetting(key, AssignedTypesId) ?? defaults.AssignedTypes,
         NestedModulesLimit = GetSetting(key, NestedModulesLimitId) ?? defaults.NestedModulesLimit
     };
 }
 private void CreateNewAnalyzer(AnalysisLimits limits) {
     if (_analysisLevel == AnalysisLevel.NodeLsNone || _analysisLevel == AnalysisLevel.Preview) {
         return;
     }
     _jsAnalyzer = new JsAnalyzer(limits);
     if (ShouldEnqueue()) {
         _analysisQueue = new AnalysisQueue(this);
     }
     _fullyLoaded = true;
 }
        private bool LoadCachedAnalysis(AnalysisLimits limits) {
            if (_analysisLevel == AnalysisLevel.NodeLsNone || _analysisLevel == AnalysisLevel.Preview) {
                return false;
            }

            string analysisDb = GetAnalysisPath();
            if (File.Exists(analysisDb) && ShouldEnqueue()) {
                FileStream stream = null;
                bool disposeStream = true;
                try {
                    stream = new FileStream(analysisDb, FileMode.Open);
                    byte[] header = new byte[DbHeader.Length];
                    stream.Read(header, 0, header.Length);
                    if (DbHeader.SequenceEqual(header)) {
                        var statusbar = (IVsStatusbar)NodejsPackage.GetGlobalService(typeof(SVsStatusbar));
                        if (statusbar != null) {
                            statusbar.SetText(SR.GetString(SR.StatusAnalysisLoading));
                        }

                        Task.Run(() => {
                            try {
                                using (new DebugTimer("LoadAnalysis")) {
                                    var serializer = new AnalysisSerializer();
                                    var analyzer = (JsAnalyzer)serializer.Deserialize(stream);
                                    AnalysisQueue queue;
                                    if (analyzer.Limits.Equals(limits)) {
                                        queue = new AnalysisQueue(this);
                                        foreach (var entry in analyzer.AllModules) {
                                            _projectFiles[entry.FilePath] = new ProjectItem(entry);
                                        }
                                        _reparseDateTime = new FileInfo(analysisDb).LastWriteTime;

                                        _analysisQueue = queue;
                                        _jsAnalyzer = analyzer;

                                        if (statusbar != null) {
                                            statusbar.SetText(SR.GetString(SR.StatusAnalysisLoaded));
                                        }
                                    }
                                }
                            } catch (InvalidOperationException) {
                                // corrupt or invalid DB
                                if (statusbar != null) {
                                    statusbar.SetText(SR.GetString(SR.StatusAnalysisLoadFailed));
                                }
                            } catch (Exception e) {
                                Debug.Fail(String.Format("Unexpected exception while loading analysis: {0}", e));
                                // bug in deserialization
                                if (statusbar != null) {
                                    statusbar.SetText(SR.GetString(SR.StatusAnalysisLoadFailed));
                                }
                            } finally {
                                stream.Dispose();

                                // apply any changes 
                                lock (_loadingDeltas) {
                                    if (_jsAnalyzer == null) {
                                        // we failed to load the cached analysis, create a new
                                        // analyzer now...
                                        CreateNewAnalyzer(LoadLimits());
                                    }

                                    _fullyLoaded = true;
                                    foreach (var delta in _loadingDeltas) {
                                        delta();
                                    }
                                }
                            }
                        }).HandleAllExceptions(SR.GetString(SR.NodejsToolsForVisualStudio)).DoNotWait();
                        disposeStream = false;
                        return true;
                    }
                } catch (IOException) {
                } finally {
                    if (stream != null && disposeStream) {
                        stream.Dispose();
                    }
                }
            }
            return false;
        }
        internal VsProjectAnalyzer(
            AnalysisLevel analysisLevel,
            bool saveToDisk,
            string projectFileDir = null
        ) {
            _projectFiles = new ConcurrentDictionary<string, ProjectItem>(StringComparer.OrdinalIgnoreCase);

            _analysisLevel = analysisLevel;
            _saveToDisk = saveToDisk;

            _limits = LoadLimits();
            if (projectFileDir != null) {
                _projectFileDir = projectFileDir;
                if (!LoadCachedAnalysis(_limits)) {
                    CreateNewAnalyzer(_limits);
                }
            } else {
                _implicitProject = true;
                CreateNewAnalyzer(_limits);
            }

            if (!_saveToDisk) {
                DeleteAnalysis();
            }

            _userCount = 1;

            InitializeCodeSettings();
        }
Пример #9
0
 private void CreateNewAnalyzer(AnalysisLimits limits) {
     _jsAnalyzer = new JsAnalyzer(limits);
     if (_analysisLevel != AnalysisLevel.None) {
         _analysisQueue = new AnalysisQueue(this);
     }
     _fullyLoaded = true;
 }
Пример #10
0
        /// <summary>
        /// Loads a new instance from the specified registry key.
        /// </summary>
        /// <param name="key">
        /// The key to load settings from. If
        /// null, all settings are assumed to be unspecified and the default
        /// values are used.
        /// </param>
        /// <param name="defaults">
        /// The default analysis limits if they're not available in the regkey.
        /// </param>
        private static AnalysisLimits LoadLimitsFromStorage(RegistryKey key, AnalysisLimits defaults) {
            AnalysisLimits limits = new AnalysisLimits();

            limits.ReturnTypes = GetSetting(key, ReturnTypesId) ?? defaults.ReturnTypes;
            limits.InstanceMembers = GetSetting(key, InstanceMembersId) ?? defaults.InstanceMembers;
            limits.DictKeyTypes = GetSetting(key, DictKeyTypesId) ?? defaults.DictKeyTypes;
            limits.DictValueTypes = GetSetting(key, DictValueTypesId) ?? defaults.DictValueTypes;
            limits.IndexTypes = GetSetting(key, IndexTypesId) ?? defaults.IndexTypes;
            limits.AssignedTypes = GetSetting(key, AssignedTypesId) ?? defaults.AssignedTypes;
            limits.NestedModulesLimit = GetSetting(key, NestedModulesLimitId) ?? defaults.NestedModulesLimit;

            return limits;
        }
Пример #11
0
 private void CreateNewAnalyzer(AnalysisLimits limits) {
     _jsAnalyzer = new JsAnalyzer(limits);
     if (ShouldEnqueue()) {
         _analysisQueue = new AnalysisQueue(this);
     }
     _fullyLoaded = true;
 }
 public static JsAnalyzer Analyze(AnalysisLimits limits, params AnalysisFile[] files) {
     return Analyze(limits, null, files);
 }
        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);
                    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());
        }
Пример #14
0
 public void AnalyzeX() {
     var limits = new AnalysisLimits() {
         ReturnTypes = 1,
         AssignedTypes = 1,
         DictKeyTypes = 1,
         DictValueTypes = 1,
         IndexTypes = 1,
         InstanceMembers = 1
     };
     var sw = new Stopwatch();
     sw.Start();
     Analysis.Analyze("C:\\Source\\azure-sdk-tools-xplat", limits);
     Console.WriteLine("Time: {0}", sw.Elapsed);
 }