Example #1
0
        private void LoadCurrentApp()
        {
            try
            {
                if (!_appSettings.Initialized)
                {
                    return;
                }

                Log.Write(LogLevel.Info, "Loading function file database...");
                var startTime = DateTime.Now;

                using (var db = new FFDatabase())
                {
                    _currentApp = new FFApp(this, db, _appSettings);
                }

                var elapsed = DateTime.Now.Subtract(startTime);
                Log.Write(LogLevel.Info, "Function file database loaded. (elapsed: {0})", elapsed);
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Error when loading function file database.");
                _currentApp = null;
            }
        }
Example #2
0
        public FFFile(FFApp app, FFDatabase db, SQLiteDataReader fileRdr)
        {
#if DEBUG
            if (app == null)
            {
                throw new ArgumentNullException("app");
            }
            if (db == null)
            {
                throw new ArgumentNullException("db");
            }
            if (fileRdr == null)
            {
                throw new ArgumentNullException("rdr");
            }
#endif
            _app      = app;
            _id       = fileRdr.GetInt64(fileRdr.GetOrdinal("rowid"));
            _fileName = fileRdr.GetString(fileRdr.GetOrdinal("file_name"));
            _context  = FileContextUtil.GetFileContextFromFileName(_fileName);
            _modified = fileRdr.GetDateTime(fileRdr.GetOrdinal("modified"));

            var className = FileContextUtil.GetClassNameFromFileName(_fileName);
            if (!string.IsNullOrEmpty(className))
            {
                _class = new FFClass(_app, this, className);
            }

            UpdateVisibility();
        }
Example #3
0
        public FFFile(FFApp app, string fileName)
        {
#if DEBUG
            if (app == null)
            {
                throw new ArgumentNullException("app");
            }
            if (string.IsNullOrEmpty(fileName))
            {
                throw new ArgumentNullException("fileName");
            }
#endif
            _app      = app;
            _id       = 0L;             // Will be inserted during next database update
            _fileName = fileName;
            _modified = Constants.ZeroDate;
            _context  = FileContextUtil.GetFileContextFromFileName(_fileName);

            var className = FileContextUtil.GetClassNameFromFileName(_fileName);
            if (!string.IsNullOrEmpty(className))
            {
                _class = new FFClass(_app, this, className);
            }

            UpdateVisibility();
        }
Example #4
0
        public FFFunction(FFApp app, FFFile file, FFClass cls, CodeModel.Definitions.FunctionDefinition def)
        {
#if DEBUG
            if (app == null)
            {
                throw new ArgumentNullException("app");
            }
            if (file == null)
            {
                throw new ArgumentNullException("file");
            }
            if (def == null)
            {
                throw new ArgumentNullException("def");
            }
#endif

            _app   = app;
            _file  = file;
            _class = cls;
            _name  = def.Name;
            _sig   = def.Signature;
            _span  = new CodeModel.Span(def.SourceStartPos, def.SourceStartPos);
            _def   = def;

            UpdateVisibility();
        }
Example #5
0
        private void ProcessSourceDir(FFApp app, string dir, List <ScanInfo> scanList)
        {
            try
            {
                foreach (var fileName in Directory.GetFiles(dir))
                {
                    if (!FileContextUtil.IsLocalizedFile(fileName))
                    {
                        var fileContext = FileContextUtil.GetFileContextFromFileName(fileName);
                        switch (fileContext)
                        {
                        case FileContext.Include:
                            // Ignore include files.
                            break;

                        case FileContext.Dictionary:
                            // Deep scan for dictionary only; no exports produced.
                            scanList.Add(new ScanInfo {
                                fileName = fileName, mode = FFScanMode.Deep
                            });
                            break;

                        case FileContext.Function:
                        case FileContext.ClientClass:
                        case FileContext.NeutralClass:
                        case FileContext.ServerClass:
                        case FileContext.ServerProgram:
                            // Files that export global functions must be scanned twice:
                            // First for the exports before everything else, then again for the deep info.
                            scanList.Add(new ScanInfo {
                                fileName = fileName, mode = FFScanMode.Exports
                            });
                            scanList.Add(new ScanInfo {
                                fileName = fileName, mode = FFScanMode.Deep
                            });
                            break;

                        default:
                            scanList.Add(new ScanInfo {
                                fileName = fileName, mode = FFScanMode.Deep
                            });
                            break;
                        }
                    }
                }

                foreach (var subDir in Directory.GetDirectories(dir))
                {
                    ProcessSourceDir(app, subDir, scanList);
                }
            }
            catch (Exception ex)
            {
                Log.Error(ex, string.Format("Exception when scanning directory '{0}' for functions.", dir));
            }
        }
Example #6
0
        public FFFunction(FFApp app, FFFile file, FFClass cls, SQLiteDataReader rdr)
        {
#if DEBUG
            if (app == null)
            {
                throw new ArgumentNullException("app");
            }
            if (file == null)
            {
                throw new ArgumentNullException("file");
            }
#endif

            _app   = app;
            _file  = file;
            _class = cls;

            _id   = rdr.GetInt64(rdr.GetOrdinal("rowid"));
            _name = rdr.GetString(rdr.GetOrdinal("name"));
            _sig  = FunctionSignature.ParseFromDb(rdr.GetString(rdr.GetOrdinal("sig")));

            var devDescValue = rdr.GetStringOrNull(rdr.GetOrdinal("description"));
            if (devDescValue != null)
            {
                // TODO: Transitionary until the next database version
                if (_sig.Description == null)
                {
                    _sig.Description = devDescValue;
                }
            }

            var fileName    = _file.FileName;
            var altFileName = rdr.GetStringOrNull(rdr.GetOrdinal("alt_file_name"));
            if (!string.IsNullOrEmpty(altFileName))
            {
                fileName = altFileName;
            }
            var pos     = rdr.GetInt32(rdr.GetOrdinal("pos"));
            var filePos = new FilePosition(fileName, pos);

            _def = new CodeModel.Definitions.FunctionDefinition(_sig, filePos, 0, 0, 0, _span);

            UpdateVisibility();
        }
Example #7
0
        public FFClass(FFApp app, FFFile file, string name)
        {
#if DEBUG
            if (app == null)
            {
                throw new ArgumentNullException("app");
            }
            if (file == null)
            {
                throw new ArgumentNullException("file");
            }
            if (string.IsNullOrWhiteSpace(name))
            {
                throw new ArgumentNullException("name");
            }
#endif

            _app  = app;
            _file = file;
            _name = name;
            _def  = new CodeModel.Definitions.ClassDefinition(_name, _file.FileName);
        }
Example #8
0
        private void ProcessFile(FFDatabase db, FFApp app, ScanInfo scan)
        {
            try
            {
                if (!File.Exists(scan.fileName))
                {
                    return;
                }
                if (FileContextUtil.IsLocalizedFile(scan.fileName))
                {
                    return;
                }

                var fileContext = CodeModel.FileContextUtil.GetFileContextFromFileName(scan.fileName);
                if (fileContext == FileContext.Include)
                {
                    return;
                }

                DateTime modified;
                if (!app.TryGetFileDate(scan.fileName, out modified))
                {
                    modified = DateTime.MinValue;
                }

                var fileModified = File.GetLastWriteTime(scan.fileName);
                if (!scan.forceScan)
                {
                    if (modified != DateTime.MinValue && fileModified.Subtract(modified).TotalSeconds < 1.0)
                    {
                        return;
                    }
                }

                var ffFile = app.GetFileForScan(db, scan.fileName);

                Log.Debug("Processing file: {0} (modified={1}, last modified={2})", scan.fileName, fileModified, modified);
                if (scan.mode == FFScanMode.Exports)
                {
                    ProbeToolsPackage.Instance.SetStatusText(string.Format("DkTools background scanning file: {0} (exports only)", scan.fileName));
                }
                else
                {
                    ProbeToolsPackage.Instance.SetStatusText(string.Format("DkTools background scanning file: {0}", scan.fileName));
                }

                var fileTitle = Path.GetFileNameWithoutExtension(scan.fileName);

                var defProvider = new CodeModel.DefinitionProvider(_appSettings, scan.fileName);

                var fileContent = File.ReadAllText(scan.fileName);
                var fileStore   = new CodeModel.FileStore();

                var merger = new FileMerger();
                merger.MergeFile(_appSettings, scan.fileName, null, false, true);
                var includeDependencies = (from f in merger.FileNames
                                           select new Preprocessor.IncludeDependency(f, false, true, merger.GetFileContent(f))).ToArray();

                var model = fileStore.CreatePreprocessedModel(_appSettings, merger.MergedContent, scan.fileName, false, string.Concat("Function file processing: ", scan.fileName), includeDependencies);

                var className = fileContext.IsClass() ? Path.GetFileNameWithoutExtension(scan.fileName) : null;
                var classList = new List <FFClass>();
                var funcList  = new List <FFFunction>();

                using (var txn = db.BeginTransaction())
                {
                    ffFile.UpdateFromModel(model, db, fileStore, fileModified, scan.mode);
                    txn.Commit();
                }

                if (ffFile.Visible)
                {
                    app.OnVisibleFileChanged(ffFile);
                }
                else
                {
                    app.OnInvisibleFileChanged(ffFile);
                }

#if DEBUG
                FFDatabase.DumpMemoryStats();
#endif
            }
            catch (Exception ex)
            {
                Log.Error(ex, "Exception when background processing function name: {0} (mode: {1})", scan.fileName, scan.mode);
            }
        }
Example #9
0
 public FFSearcher(FFApp app)
 {
     _app = app;
     _db  = new FFDatabase();
 }