示例#1
0
        public void InsertOrUpdate(FFDatabase db, CodeModel.FileStore store, CodeModel.CodeModel model)
        {
            if (_id != 0)
            {
                using (var cmd = db.CreateCommand("update file_ set modified = @modified, visible = @visible where rowid = @id"))
                {
                    cmd.Parameters.AddWithValue("@id", _id);
                    cmd.Parameters.AddWithValue("@modified", _modified);
                    cmd.Parameters.AddWithValue("@visible", _visible ? 1 : 0);
                    cmd.ExecuteNonQuery();
                }
            }
            else
            {
                using (var cmd = db.CreateCommand(
                           "insert into file_ (app_id, file_name, modified, visible) values (@app_id, @file_name, @modified, @visible);"
                           + " select last_insert_rowid();"))
                {
                    cmd.Parameters.AddWithValue("@app_id", _app.Id);
                    cmd.Parameters.AddWithValue("@file_name", _fileName);
                    cmd.Parameters.AddWithValue("@modified", _modified);
                    cmd.Parameters.AddWithValue("@visible", _visible ? 1 : 0);
                    _id = Convert.ToInt64(cmd.ExecuteScalar());
                }
            }

            UpdateIncludeDependencies(db, store, model);
        }
 private IEnumerable <ProbeSignature> GetSignatures(CodeModel.CodeModel model, int modelPos, string className, string funcName, VsText.ITrackingSpan applicableToSpan)
 {
     foreach (var sig in GetAllSignaturesForFunction(model, modelPos, className, funcName))
     {
         yield return(CreateSignature(_textBuffer, sig, applicableToSpan));
     }
 }
示例#3
0
        public IEnumerable <ITagSpan <ErrorTag> > GetTags(NormalizedSnapshotSpanCollection spans)
        {
            ThreadHelper.ThrowIfNotOnUIThread();

            var appSettings = ProbeEnvironment.CurrentAppSettings;

            var fileName = VsTextUtil.TryGetDocumentFileName(_view.TextBuffer);

            _model = _store.GetMostRecentModel(appSettings, fileName, _view.TextSnapshot, "ErrorTagger.GetTags()");

            return(ErrorTaskProvider.Instance.GetErrorTagsForFile(_model.FileName, spans));
        }
        public static IEnumerable <FunctionSignature> GetAllSignaturesForFunction(CodeModel.CodeModel model, int modelPos, string className, string funcName)
        {
            if (string.IsNullOrEmpty(className))
            {
                foreach (var def in model.DefinitionProvider.GetGlobalFromAnywhere <CodeModel.Definitions.FunctionDefinition>(funcName))
                {
                    var funcDef = (def as CodeModel.Definitions.FunctionDefinition);
                    if (string.IsNullOrEmpty(funcDef.ClassName) || funcDef.ClassName == model.ClassName)
                    {
                        yield return(def.Signature);
                    }
                }
            }
            else
            {
                foreach (var def in model.DefinitionProvider.GetGlobalFromAnywhere <CodeModel.Definitions.FunctionDefinition>(funcName))
                {
                    if ((def as CodeModel.Definitions.FunctionDefinition).ClassName == className)
                    {
                        yield return(def.Signature);

                        yield break;
                    }
                }

                foreach (var def1 in model.DefinitionProvider.GetAny(modelPos, className))
                {
                    if (def1 is CodeModel.Definitions.VariableDefinition)
                    {
                        var varDef   = def1 as CodeModel.Definitions.VariableDefinition;
                        var dataType = varDef.DataType;

                        foreach (var opt in dataType.CompletionOptions)
                        {
                            if (opt.ArgumentsRequired)
                            {
                                yield return(opt.ArgumentsSignature);
                            }
                        }
                    }
                }
            }
        }
示例#5
0
        public void SetSource(string source, int offset, VsText.ITextSnapshot snapshot, CodeModel.CodeModel model)
        {
            _source    = source;
            _pos       = 0;
            _posOffset = offset;
            _length    = _source.Length;
            _snapshot  = snapshot;
            _model     = model;

            var transStart = snapshot.TranslateOffsetToSnapshot(offset, _model.Snapshot);
            var transEnd   = snapshot.TranslateOffsetToSnapshot(offset + source.Length, _model.Snapshot);

            _tokenMap = new Dictionary <int, Token>();
            foreach (var token in _model.File.FindDownward(transStart, transEnd - transStart))
            {
                var snapStart = _model.Snapshot.TranslateOffsetToSnapshot(token.Span.Start, snapshot);
                _tokenMap[snapStart] = token;
            }
        }
示例#6
0
        private void ProcessFunctionFile(FunctionFileApp app, string fileName)
        {
            try
            {
                if (!File.Exists(fileName)) return;

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

                if (modified == DateTime.MinValue || Math.Abs(File.GetLastWriteTime(fileName).Subtract(modified).TotalSeconds) >= 1.0)
                {
                    var merger = new FileMerger();
                    merger.MergeFile(fileName, false);

                    var fileTitle = Path.GetFileNameWithoutExtension(fileName);

                    var model = new CodeModel.CodeModel(merger.MergedContent, fileName);
                    var funcs = (from f in model.FunctionSignatures
                                 where string.Equals(f.Name, fileTitle, StringComparison.OrdinalIgnoreCase)
                                 select f).ToArray();
                    if (funcs.Length > 0)
                    {
                        foreach (var func in funcs)
                        {
                            app.AddFunction(func.Name, func.Signature);
                        }
                    }
                    else
                    {
                        app.RemoveFunctionIgnoreCase(fileTitle);
                    }

                    foreach (var fn in merger.FileNames)
                    {
                        app.UpdateFile(fn, File.GetLastWriteTime(fn));
                    }
                }
            }
            catch (Exception)
            {
                try
                {
                    // Don't show the error because this is just a non-critical background thread.
                    if (File.Exists(fileName)) app.UpdateFile(fileName, File.GetLastWriteTime(fileName));
                }
                catch (Exception)
                { }
            }
        }
示例#7
0
        public void UpdateFromModel(CodeModel.CodeModel model, FFDatabase db, FileStore store, DateTime fileModified, FFScanMode scanMode)
        {
            if (scanMode == FFScanMode.Deep)
            {
                _modified = fileModified;
            }
            else
            {
                _modified = Constants.ZeroDate;
            }
            UpdateVisibility();
            InsertOrUpdate(db, store, model);

            // Only extract functions for .f files or class files.
            switch (_context)
            {
            case CodeModel.FileContext.Function:
            case CodeModel.FileContext.ClientClass:
            case CodeModel.FileContext.ServerClass:
            case CodeModel.FileContext.NeutralClass:

                // Get the list of functions defined in the file.
                var modelFuncs = (from f in model.DefinitionProvider.GetGlobalFromFile <CodeModel.Definitions.FunctionDefinition>()
                                  where f.Extern == false
                                  select f).ToArray();

                // Insert/update the functions that exist in the model.
                foreach (var modelFunc in modelFuncs)
                {
                    var func = _functions.FirstOrDefault(f => f.Name == modelFunc.Name);
                    if (func != null)
                    {
                        func.UpdateFromDefinition(modelFunc);
                    }
                    else
                    {
                        func = new FFFunction(_app, this, _class, modelFunc);
                        _functions.Add(func);
                    }

                    func.InsertOrUpdate(db);
                }

                // Purge functions that no longer exist in the model.
                var removeFuncs = (from f in _functions where !modelFuncs.Any(m => m.Name == f.Name) select f).ToArray();
                foreach (var removeFunc in removeFuncs)
                {
                    removeFunc.Remove(db);
                    _functions.Remove(removeFunc);
                }

                break;
            }

            // Get all permanent extracts in the file
            UpdatePermExList(db, model.File.FindDownward <CodeModel.Tokens.Statements.ExtractStatement>().Where(x => x.IsPermanent).ToArray());

            if (scanMode == FFScanMode.Deep)
            {
                // Get all references in the file.
                var refList = new List <Reference>();
                foreach (var token in model.File.FindDownward(t => t.SourceDefinition != null &&
                                                              !string.IsNullOrEmpty(t.SourceDefinition.ExternalRefId) &&
                                                              t.File != null))
                {
                    var localPos = token.File.CodeSource.GetFilePosition(token.Span.Start);

                    var def   = token.SourceDefinition;
                    var refId = def.ExternalRefId;
                    if (!string.IsNullOrEmpty(refId))
                    {
                        refList.Add(new Reference
                        {
                            ExternalRefId = refId,
                            TrueFileName  = string.Equals(localPos.FileName, model.FileName, StringComparison.OrdinalIgnoreCase) ? null : localPos.FileName,
                            Position      = localPos.Position
                        });
                    }
                }

                foreach (var rf in model.PreprocessorReferences)
                {
                    var def   = rf.Definition;
                    var refId = def.ExternalRefId;
                    if (!string.IsNullOrEmpty(refId))
                    {
                        var filePos = rf.FilePosition;
                        if (filePos.PrimaryFile)
                        {
                            refList.Add(new Reference
                            {
                                ExternalRefId = refId,
                                TrueFileName  = filePos.FileName,
                                Position      = filePos.Position
                            });
                        }
                    }
                }

                UpdateRefList(db, refList);
            }
        }
示例#8
0
        private void UpdateIncludeDependencies(FFDatabase db, CodeModel.FileStore store, CodeModel.CodeModel model)
        {
            var modelIncludeList = model.PreprocessorModel.IncludeDependencies.ToArray();

            var dbIncludes = new List <DbInclude>();

            using (var cmd = db.CreateCommand("select rowid, include_file_name, include, localized_file from include_depends where file_id = @file_id"))
            {
                cmd.Parameters.AddWithValue("@file_id", _id);
                using (var rdr = cmd.ExecuteReader())
                {
                    while (rdr.Read())
                    {
                        dbIncludes.Add(new DbInclude
                        {
                            id            = rdr.GetInt64(0),
                            fileName      = rdr.GetString(1),
                            include       = rdr.GetTinyIntBoolean(2),
                            localizedFile = rdr.GetTinyIntBoolean(3)
                        });
                    }
                }
            }

            // Remove dependencies that are no longer there
            var recordsToRemove = (from d in dbIncludes
                                   where !modelIncludeList.Any(m => m.FileName.Equals(d.fileName, StringComparison.OrdinalIgnoreCase) &&
                                                               m.Include == d.include &&
                                                               m.LocalizedFile == d.localizedFile)
                                   select d).ToArray();

            if (recordsToRemove.Length > 0)
            {
                using (var cmd = db.CreateCommand("delete from include_depends where rowid = @rowid"))
                {
                    foreach (var id in recordsToRemove)
                    {
                        cmd.Parameters.Clear();
                        cmd.Parameters.AddWithValue("@rowid", id);
                        cmd.ExecuteNonQuery();
                    }
                }
            }

            // Add new dependencies
            var recordsToAdd = (from m in modelIncludeList
                                where !dbIncludes.Any(d => d.fileName.Equals(m.FileName, StringComparison.OrdinalIgnoreCase) &&
                                                      d.include == m.Include &&
                                                      d.localizedFile == m.LocalizedFile)
                                select m).ToArray();

            if (recordsToAdd.Length > 0)
            {
                using (var cmd = db.CreateCommand(@"
					insert into include_depends (app_id, file_id, include_file_name, include, localized_file)
					values (@app_id, @file_id, @include_file_name, @include, @localized_file)
					"                    ))
                {
                    foreach (var incl in recordsToAdd)
                    {
                        cmd.Parameters.Clear();
                        cmd.Parameters.AddWithValue("@app_id", _app.Id);
                        cmd.Parameters.AddWithValue("@file_id", _id);
                        cmd.Parameters.AddWithValue("@include_file_name", incl.FileName);
                        cmd.Parameters.AddWithValue("@include", incl.Include ? 1 : 0);
                        cmd.Parameters.AddWithValue("@localized_file", incl.LocalizedFile ? 1 : 0);
                        cmd.ExecuteNonQuery();
                    }
                }
            }
        }