Beispiel #1
0
 public void Append(CodeSource source)
 {
     foreach (var seg in source._segments)
     {
         Append(seg.text, seg.fileName, seg.startPos, seg.endPos, seg.actualContent, seg.primaryFile, seg.disabled);
     }
 }
Beispiel #2
0
            public CodeSourcePreprocessorReader(CodeSource src)
            {
#if DEBUG
                if (src == null)
                {
                    throw new ArgumentNullException("src");
                }
#endif
                _src = src;

                _segIndex  = 0;
                _segOffset = 0;
                if (_src._segments.Count > 0)
                {
                    _seg       = _src._segments[_segIndex];
                    _pos       = _seg.startPos;
                    _segLength = _seg.length;
                }
                else
                {
                    _seg       = null;
                    _pos       = 0;
                    _segLength = 0;
                }
            }
Beispiel #3
0
        public CodeModel CreatePreprocessedModel(ProbeAppSettings appSettings, string fileName, VsText.ITextSnapshot snapshot, bool visible, string reason)
        {
            CodeSource source;
            IEnumerable <Preprocessor.IncludeDependency> includeDependencies = null;

            if (visible)
            {
                source = new CodeSource();
                source.Append(snapshot.GetText(), fileName, 0, snapshot.Length, true, true, false);
                source.Flush();
            }
            else
            {
                var merger = new FileMerger();
                merger.MergeFile(appSettings, fileName, snapshot.GetText(), false, true);
                source = merger.MergedContent;

                includeDependencies = (from f in merger.FileNames
                                       select new Preprocessor.IncludeDependency(f, false, true, merger.GetFileContent(f))).ToArray();
            }

            var model = CreatePreprocessedModel(appSettings, source, fileName, visible, reason, includeDependencies);

            model.Snapshot = snapshot;
            return(model);
        }
Beispiel #4
0
        public PreprocessorModel(CodeSource source, DefinitionProvider defProv, string fileName, bool visible, IEnumerable <Preprocessor.IncludeDependency> includeDependencies)
        {
#if DEBUG
            if (source == null)
            {
                throw new ArgumentNullException("source");
            }
            if (defProv == null)
            {
                throw new ArgumentNullException("defProv");
            }
#endif
            _source   = source;
            _code     = new CodeParser(source.Text);
            _defProv  = defProv;
            _fileName = fileName;
            FunctionFileScanning.FFUtil.FileNameIsClass(_fileName, out _className);
            _fileContext = FileContextUtil.GetFileContextFromFileName(fileName);
            _visible     = visible;

            if (includeDependencies != null)
            {
                _includeDependencies = includeDependencies.ToArray();
            }
            else
            {
                _includeDependencies = new Preprocessor.IncludeDependency[0];
            }

            Parse();
        }
Beispiel #5
0
            public CodeSource GetSource(ProbeAppSettings appSettings)
            {
                if (_source == null)
                {
                    try
                    {
                        var merger = new FileMerger();
                        merger.MergeFile(appSettings, _fullPathName, null, false, false);
                        _source = merger.MergedContent;

                        var fileInfo = new FileInfo(_fullPathName);
                        _lastModifiedDate = fileInfo.LastWriteTime;
                        _lastCheck        = DateTime.Now;

                        foreach (var mergeFileName in merger.FileNames)
                        {
                            var content = merger.GetFileContent(mergeFileName);
                            if (content == null)
                            {
                                throw new InvalidOperationException("Merger content is null.");
                            }
                            _preMergeContent[mergeFileName.ToLower()] = content;
                        }
                    }
                    catch (Exception ex)
                    {
                        Log.Error(ex, "Exception when attempting to read content of include file '{0}'.", _fullPathName);
                        _source = null;
                    }
                }
                return(_source);
            }
Beispiel #6
0
            private static CodeModel.CodeSource GetCodeSourceForActiveView(out string fileName)
            {
                ThreadHelper.ThrowIfNotOnUIThread();

                var view = Shell.ActiveView;

                if (view != null)
                {
                    fileName = VsTextUtil.TryGetDocumentFileName(view.TextBuffer);
                    var content = view.TextBuffer.CurrentSnapshot.GetText();

                    try
                    {
                        var merger = new CodeModel.FileMerger();
                        merger.MergeFile(ProbeEnvironment.CurrentAppSettings, fileName, content, true, true);
                        return(merger.MergedContent);
                    }
                    catch (Exception ex)
                    {
                        Log.WriteEx(ex);

                        var codeSource = new CodeModel.CodeSource();
                        codeSource.Append(content, new CodeModel.CodeAttributes(fileName, 0, content.Length, true, true, false));
                        codeSource.Flush();

                        return(codeSource);
                    }
                }

                fileName = null;
                return(null);
            }
Beispiel #7
0
        public static CodeModel CreateFullModelForPreprocessed(CodeSource source, ProbeAppSettings appSettings, FileStore store, PreprocessorModel prepModel)
        {
            var model    = new CodeModel(appSettings, store);
            var codeFile = new CodeFile(model);

            model.Init(source, codeFile, prepModel.FileName, false, prepModel.DefinitionProvider);
            return(model);
        }
Beispiel #8
0
        private void AppendIncludeFile(PreprocessorParams p, string fileName, bool searchSameDir)
        {
            // Load the include file
            string[] parentFiles;
            if (string.IsNullOrEmpty(p.fileName))
            {
                parentFiles = p.parentFiles;
                if (parentFiles == null)
                {
                    parentFiles = new string[0];
                }
            }
            else
            {
                if (p.parentFiles != null)
                {
                    parentFiles = p.parentFiles.Concat(new string[] { p.fileName }).ToArray();
                }
                else
                {
                    parentFiles = new string[0];
                }
            }

            var includeNode = _store.GetIncludeFile(_appSettings, p.fileName, fileName, searchSameDir, parentFiles);

            if (includeNode == null)
            {
                return;
            }

            if (p.stopAtIncludeFile != null && includeNode.FullPathName.Equals(p.stopAtIncludeFile, StringComparison.OrdinalIgnoreCase))
            {
                p.result.IncludeFileReached = true;
                return;
            }

            var rawSource = includeNode.GetSource(_appSettings);

            if (rawSource == null)
            {
                return;
            }
            var reader = new CodeSource.CodeSourcePreprocessorReader(rawSource);

            // Run the preprocessor on the include file.
            var includeSource = new CodeSource();
            var parms         = new PreprocessorParams(reader, includeSource, includeNode.FullPathName, parentFiles, p.fileContext, p.contentType, p.stopAtIncludeFile);

            p.result.Merge(Preprocess(parms));

            p.writer.Append(includeSource);

            foreach (var preMergeFileName in includeNode.PreMergeFileNames)
            {
                AddIncludeDependency(preMergeFileName, true, false, includeNode.GetPreMergeContent(preMergeFileName));
            }
        }
Beispiel #9
0
        public CodeModel CreatePreprocessedModel(ProbeAppSettings appSettings, string fileName, VsText.ITextSnapshot snapshot, string reason)
        {
            var source = new CodeSource();

            source.Append(snapshot.GetText(), fileName, 0, snapshot.Length, true, true, false);
            source.Flush();

            var model = CreatePreprocessedModel(appSettings, source, fileName, true, reason, null);

            model.Snapshot = snapshot;
            return(model);
        }
Beispiel #10
0
        private static void CreateStdLibModel(ProbeAppSettings appSettings)
        {
            var tempStore   = new FileStore();
            var includeFile = tempStore.GetIncludeFile(appSettings, null, "stdlib.i", false, new string[0]);

            if (includeFile != null)
            {
                _stdLibModel = tempStore.CreatePreprocessedModel(appSettings, includeFile.GetSource(appSettings),
                                                                 includeFile.FullPathName, false, "stdlib.i model", null);
            }
            else
            {
                var blankSource = new CodeSource();
                blankSource.Flush();

                _stdLibModel = tempStore.CreatePreprocessedModel(appSettings, blankSource, "stdlib.i", false,
                                                                 "stdlib.i model (blank)", null);
            }

            _stdLibDefines = _stdLibModel.PreprocessorModel.Preprocessor.Defines.ToArray();
        }
Beispiel #11
0
        private void Init(CodeSource source, CodeFile file, string fileName, bool visible, DefinitionProvider defProvider)
        {
#if DEBUG
            if (defProvider == null)
            {
                throw new ArgumentNullException("defProvider");
            }
#endif
            this.RefreshTime = DateTime.Now;

            _fileName = fileName;
            if (!string.IsNullOrEmpty(_fileName))
            {
                _fileTitle = Path.GetFileNameWithoutExtension(_fileName);
            }

            _fileContext = FileContextUtil.GetFileContextFromFileName(_fileName);

            if (FunctionFileScanning.FFUtil.FileNameIsFunction(fileName))
            {
                _modelType = ModelType.Function;
            }
            else if (FunctionFileScanning.FFUtil.FileNameIsClass(fileName, out _className))
            {
                _modelType = DkTools.CodeModel.ModelType.Class;
            }
            else
            {
                _modelType = DkTools.CodeModel.ModelType.Other;
            }

            _defProvider = defProvider;
            _file        = new CodeFile(this);

            _file.Parse(source, _fileName, new string[0], visible);

            this.RefreshTime = DateTime.Now;
        }
 public void Append(CodeSource source)
 {
     Append(source.Text, CodeAttributes.Empty);
 }
Beispiel #13
0
 private void OnFileChangeSuspected()
 {
     _source   = null;
     _codeFile = null;
 }
Beispiel #14
0
        public Definition[] GetIncludeParentDefinitions(ProbeAppSettings appSettings, string includePathName)
        {
            Definition[] cachedDefs;
            if (_includeParentDefs.TryGetValue(includePathName.ToLower(), out cachedDefs))
            {
                return(cachedDefs);
            }

            Log.Debug("Getting include file parent definitions: {0}", includePathName);

            IEnumerable <string> parentFileNames;

            using (var searcher = ProbeToolsPackage.Instance.FunctionFileScanner.CurrentApp.CreateSearcher())
            {
                parentFileNames = searcher.GetIncludeParentFiles(includePathName, 3);                   // TODO: make limit configurable
            }

            Definition[] commonDefines = null;

            if (!parentFileNames.Any())
            {
                Log.Debug("This file is not included by any other file.");
                commonDefines = new Definition[0];
                _includeParentDefs[includePathName.ToLower()] = commonDefines;
                return(commonDefines);
            }

            foreach (var parentPathName in parentFileNames)
            {
                Log.Debug("Preprocessing include parent: {0}", parentPathName);

                var merger = new FileMerger();
                merger.MergeFile(appSettings, parentPathName, null, false, true);
                var source = merger.MergedContent;

                var reader     = new CodeSource.CodeSourcePreprocessorReader(source);
                var prepSource = new CodeSource();

                var fileContext = FileContextUtil.GetFileContextFromFileName(parentPathName);
                var prep        = new Preprocessor(appSettings, this);
                var prepResult  = prep.Preprocess(reader, prepSource, parentPathName, new string[0], fileContext, includePathName);
                if (!prepResult.IncludeFileReached)
                {
                    Log.Warning("Include file not reached when preprocessing parent.\r\nInclude File: {0}\r\nParent File: {1}",
                                includePathName, parentPathName);
                    continue;
                }

                var defs = prep.ActiveDefineDefinitions;
                if (!defs.Any())
                {
                    // No defines will be common
                    Log.Debug("No definitions found in include parent file: {0}", parentPathName);
                    commonDefines = new Definition[0];
                    break;
                }

                if (commonDefines == null)
                {
                    commonDefines = defs.ToArray();
                    Log.Debug("{1} definition(s) found in include parent file: {0}", parentPathName, commonDefines.Length);
                }
                else
                {
                    // Create array of defines common to all
                    commonDefines = (from c in commonDefines where defs.Any(d => d.Name == c.Name) select c).ToArray();
                    Log.Debug("{1} definition(s) found in include parent file: {0}", parentPathName, commonDefines.Length);
                    if (commonDefines.Length == 0)
                    {
                        break;
                    }
                }
            }

            if (commonDefines == null)
            {
                commonDefines = new Definition[0];
            }
            Log.Debug("Using {0} definition(s) from include parent files.", commonDefines.Length);
            _includeParentDefs[includePathName.ToLower()] = commonDefines;
            return(commonDefines);
        }
Beispiel #15
0
        public CodeModel CreatePreprocessedModel(ProbeAppSettings appSettings, CodeSource source, string fileName,
                                                 bool visible, string reason, IEnumerable <Preprocessor.IncludeDependency> includeDependencies)
        {
#if DEBUG
            Log.Debug("Creating preprocessed model. Reason: {0}", reason);
            var startTime = DateTime.Now;
#endif

            var reader     = new CodeSource.CodeSourcePreprocessorReader(source);
            var prepSource = new CodeSource();

            var defProvider = new DefinitionProvider(appSettings, fileName);

            var fileContext = FileContextUtil.GetFileContextFromFileName(fileName);
            var prep        = new Preprocessor(appSettings, this);
            if (includeDependencies != null)
            {
                prep.AddIncludeDependencies(includeDependencies);
            }
            prep.Preprocess(reader, prepSource, fileName, new string[0], fileContext, stdlibDefines: _stdLibDefines);
            prep.AddDefinitionsToProvider(defProvider);

            if (fileContext == FileContext.Include && !string.IsNullOrEmpty(fileName))
            {
                var includeParentDefs = GetIncludeParentDefinitions(appSettings, fileName);
                defProvider.AddGlobalFromFile(includeParentDefs);
            }

#if DEBUG
            var midTime1 = DateTime.Now;
#endif

            var prepModel = new PreprocessorModel(prepSource, defProvider, fileName, visible, prep.IncludeDependencies)
            {
                Preprocessor = prep
            };

#if DEBUG
            var midTime2 = DateTime.Now;
#endif

            CodeModel modelToReturn;
            if (visible)
            {
                modelToReturn = CodeModel.CreateVisibleModelForPreprocessed(source, appSettings, this, prepModel);
                modelToReturn.PreprocessorModel = prepModel;
                modelToReturn.DisabledSections  = prepSource.GenerateDisabledSections().ToArray();
            }
            else
            {
                modelToReturn = CodeModel.CreateFullModelForPreprocessed(prepSource, appSettings, this, prepModel);
                modelToReturn.PreprocessorModel = prepModel;
            }

            modelToReturn.PreprocessorReferences = prep.References;

#if DEBUG
            var endTime     = DateTime.Now;
            var elapsedTime = endTime.Subtract(startTime).TotalMilliseconds;
            var prepTime    = midTime1.Subtract(startTime).TotalMilliseconds;
            var modelTime   = midTime2.Subtract(midTime1).TotalMilliseconds;
            var visTime     = endTime.Subtract(midTime2).TotalMilliseconds;
            Log.Debug("Created model in {0} msecs ({1} preprocessor, {2} model, {3} visible)", elapsedTime, prepTime, modelTime, visTime);
#endif

            return(modelToReturn);
        }
Beispiel #16
0
        public void MergeFile(ProbeAppSettings appSettings, string fileName, string content, bool showMergeComments, bool fileIsPrimary)
        {
            if (appSettings == null)
            {
                throw new ArgumentNullException(nameof(appSettings));
            }

            _appSettings = appSettings;

            // Locate all needed copies of files
            _primaryFileName = fileName;
            _origFileName    = "";
            _localFileNames.Clear();
            _showMergeComments = showMergeComments;

            var rawFileName = fileName;

            if (Path.IsPathRooted(fileName))
            {
                fileName = UnrootFileName(fileName);
            }
            FindFiles(fileName);

            if (string.IsNullOrEmpty(_origFileName))
            {
                throw new FileMergeException(string.Format("Could not find base file for '{0}'.", rawFileName));
            }

            if (content == null)
            {
                _origContent = File.ReadAllText(_origFileName);
            }
            else
            {
                _origContent = content;
            }

            // Perform localization
            CreateLineDataFromOrigFile(_origContent);
            foreach (string localFileName in _localFileNames)
            {
                try
                {
                    MergeFile(localFileName);
                }
                catch (Exception ex)
                {
                    Log.Error(ex, "Error when merging local file '{0}' into '{1}'.", localFileName, fileName);
                }
            }

            // Generate the final source.
            _mergedContent = new CodeSource();
            int lineIndex = 0;

            foreach (var line in _lines)
            {
                var primary = fileIsPrimary && _primaryFileName.Equals(line.fileName, StringComparison.OrdinalIgnoreCase);
                var endPos  = line.pos + line.text.Length;
                _mergedContent.Append(line.text, new CodeAttributes(line.fileName, line.pos, endPos, true, primary, false));
                if (!line.text.EndsWith("\n") && lineIndex + 1 < _lines.Count)
                {
                    // Does not end with crlf. Need to insert between the lines.
                    _mergedContent.Append("\r\n", new CodeAttributes(line.fileName, endPos, endPos, false, primary, false));
                }
                lineIndex++;
            }
            _mergedContent.Flush();
        }