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; } }
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(); }
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(); }
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(); }
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)); } }
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(); }
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); }
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); } }
public FFSearcher(FFApp app) { _app = app; _db = new FFDatabase(); }