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()); }
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); }