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();
         }
     }
 }
예제 #2
0
        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);
        }