Ejemplo n.º 1
0
        public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
        {
            var preSelection = PreSelection.ToLower();
            var returnValues = new List <ICompletionData>();
            var sources      = new List <Source>();

            foreach (var symbol in Project.Symbols)
            {
                if (symbol.Key.ToLower().Contains(preSelection))
                {
                    var source = new Source {
                        Text = symbol.Value.Text, File = symbol.Value.Source, Line = symbol.Value.Line, Character = symbol.Value.Character
                    };
                    if (sources.Contains(source))
                    {
                        continue;
                    }
                    returnValues.Add(new NavigationData(symbol.Value, Project, Events));
                    sources.Add(source);
                }
            }

            foreach (var file in Project.Files)
            {
                if (file.File.Name.ToLower().Contains(preSelection))
                {
                    returnValues.Add(new NavigationData(file, Events));
                }
            }

            return(returnValues.ToArray());
        }
Ejemplo n.º 2
0
        public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
        {
            var returnValues = new List <ICompletionData>();

            if (!PreSelection.StartsWith("\""))
            {
                return(returnValues.ToArray());
            }

            var baseDir      = "";
            var preSelection = PreSelection.Substring(1);
            var lastSlash    = preSelection.LastIndexOfAny(new[] { '/', '\\' });

            if (lastSlash >= 0)
            {
                baseDir      = preSelection.Substring(0, lastSlash + 1);
                preSelection = lastSlash < preSelection.Length ? preSelection.Substring(lastSlash + 1) : "";
            }

            var searchedDirectories = new List <string>();

            foreach (var originalDirectory in _directories)
            {
                try
                {
                    var directory = new DirectoryInfo(Path.Combine(originalDirectory.FullName, baseDir));

                    if (!directory.Exists)
                    {
                        continue;
                    }
                    if (searchedDirectories.Contains(directory.FullName))
                    {
                        continue;
                    }
                    searchedDirectories.Add(directory.FullName);
                    foreach (var subDirectory in directory.GetDirectories().Where(dir => dir.Name.StartsWith(preSelection, StringComparison.InvariantCultureIgnoreCase)))
                    {
                        returnValues.Add(new DirectoryData(subDirectory.Name, _reOpen));
                    }
                    foreach (var file in directory.GetFiles().Where(file => file.Name.StartsWith(preSelection, StringComparison.InvariantCultureIgnoreCase)))
                    {
                        returnValues.Add(new FileData(file.Name));
                    }
                }
                catch
                {
                    // Directory is an invalid name, user doesn't have access, etc.
                    continue;
                }
            }

            return(returnValues.ToArray());
        }
Ejemplo n.º 3
0
        public override bool InsertAction(ICompletionData data, TextArea textArea, int insertionOffset, char key)
        {
            var preOffset = PreSelection.LastIndexOfAny(new[] { '\\', '/', '"' });

            if (preOffset < 0)
            {
                return(false);
            }
            textArea.Caret.Position = textArea.Document.OffsetToPosition(insertionOffset);
            textArea.InsertString(PreSelection.Substring(0, preOffset + 1));
            return(data.InsertAction(textArea, key));
        }
Ejemplo n.º 4
0
        public override ICompletionData[] GenerateCompletionData(string fileName, TextArea textArea, char charTyped)
        {
            var preSelection = PreSelection.ToLower();

            // TODO: Don't parse file in this method, do it async while editing file!!
            var symbols         = new List <string>();
            var importedSymbols = new List <string>();
            var returnValues    = new List <ICompletionData>();

            using (var reader = new StringReader(textArea.Document.TextContent))
            {
                string line;
                while ((line = reader.ReadLine()) != null)
                {
                    var importMatch = AsmProjectFile.ImportSymbolRegex.Match(line);
                    if (importMatch.Success)
                    {
                        importedSymbols.AddRange(importMatch.Groups[1].Value.Split(new[] { ',' }, StringSplitOptions.RemoveEmptyEntries).Select(symbol => symbol.Trim()));
                        continue;
                    }

                    var defineMatch = AsmProjectFile.DefineSymbolRegex.Match(line);
                    if (!defineMatch.Success)
                    {
                        defineMatch = AsmProjectFile.DefineProcSymbolRegex.Match(line);
                    }
                    if (defineMatch.Success)
                    {
                        symbols.Add(defineMatch.Groups[1].Value);
                    }
                }
            }

            foreach (var globalSymbol in GlobalSymbols)
            {
                if (!globalSymbol.Value.Text.ToLower().Contains(preSelection))
                {
                    continue;
                }

                /*if (symbols.Contains(globalSymbol.Key) && globalSymbol.Value.Source == fileName)
                 * {
                 *      // TODO: This shouldn't be necessary when we're parsing include-files. Remove commenting if symbols are missing anywhere, but watch out for symbols appearing as duplicates
                 *      returnValues.Add(new Ca65SymbolData(globalSymbol.Value, 1, _getSymbolDescription));
                 * }
                 * else*/if (globalSymbol.Value.Public || (importedSymbols.Contains(globalSymbol.Key) && globalSymbol.Value.Source != fileName))
                {
                    returnValues.Add(new Ca65SymbolData(globalSymbol.Value, 2, _getSymbolDescription));
                }
                else if (!globalSymbol.Value.Public && globalSymbol.Value.LocalToFile == fileName)
                {
                    returnValues.Add(new Ca65SymbolData(globalSymbol.Value, 2, _getSymbolDescription));
                }
            }

            foreach (var opcode in OpcodeParser.GetOpcodes(_project.Type).Values)
            {
                if (!opcode.Command.StartsWith(preSelection, true, CultureInfo.InvariantCulture))
                {
                    continue;
                }
                returnValues.Add(new OpcodeData(opcode)
                {
                    Focus = () => _events.HighlightOpcode(opcode)
                });
            }

            if (PreSelection.StartsWith("."))
            {
                var commands = Ca65Parser.GetCommands();
                foreach (var command in commands.Keys.OrderBy(k => k))
                {
                    if (!command.StartsWith(preSelection, true, CultureInfo.InvariantCulture))
                    {
                        continue;
                    }
                    returnValues.Add(new CommandData(commands[command], command.ToLower())
                    {
                        Focus = () => _events.HighlightCommand(commands[command])
                    });
                }
            }

            //CompletionData = returnValues.OrderBy(d => !d.Text.StartsWith(PreSelection)).ToArray();
            CompletionData = returnValues.ToArray();
            return(CompletionData);
        }