public void UpdateDatabase(string fileName, CXTranslationUnit TU, CancellationToken cancellationToken, bool force = false) { if (!cancellationToken.IsCancellationRequested) { if (!force) { using (var cmd = Connection.CreateCommand()) { cmd.CommandText = "SELECT LASTWRITETIME FROM TRACKING WHERE NAME=@N;"; cmd.CommandType = CommandType.Text; cmd.Parameters.AddWithValue("@N", TableName(fileName)); using (var result = cmd.ExecuteReader()) { result.Read(); string lwt = result.GetString(0); if (lwt.Equals(new FileInfo(fileName).LastWriteTime.ToString())) { return; } } } } Reset(fileName); CXCursor TUcursor = clang.getTranslationUnitCursor(TU); var parser = new TranslationUnitParser(this, fileName, cancellationToken, TUcursor); using (var tr = Connection.BeginTransaction()) { clang.visitChildren(TUcursor, parser.Visit, new CXClientData(new IntPtr(0))); tr.Commit(); } } }
public CXChildVisitResult Visit(CXCursor cursor, CXCursor parent, IntPtr data) { if (!File.Equals(TranslationUnitParser.GetFileName(cursor))) { return(CXChildVisitResult.Continue); } CXCursor referenced = project.ClangManager.GetCursorReferenced(cursor); string Usr = project.ClangManager.GetCursorUsrString(referenced); if (UsrReferenced.Equals(Usr)) { CXSourceRange range = clang.Cursor_getSpellingNameRange(cursor, 0, 0); var reference = new Reference(project, cursor, range); //FIXME: don't block! Document doc = IdeApp.Workbench.OpenDocument(reference.FileName, project, false).Result; if (!references.Contains(reference) //this check is needed because explicit namespace qualifiers, eg: "std" from std::toupper //are also found when finding eg:toupper references, but has the same cursorkind as eg:"toupper" && doc.Editor.GetTextAt(reference.Begin.Offset, reference.Length).Equals(referenced.ToString())) { references.Add(reference); } } return(CXChildVisitResult.Recurse); }