public PythonParsedDocument Parse (string fileName, string content) { if (!m_Initialized) Initialize (); PythonParsedDocument doc = new PythonParsedDocument (fileName); if (m_ProcessSuccess) doc.Parse (GetXml (content), content); return doc; }
public override ICompletionDataList HandleCodeCompletion(CodeCompletionContext completionContext, char completionChar) { switch (completionChar) { case '(': case ' ': case '=': case '\t': case '\n': case '.': PythonParsedDocument doc = Document.ParsedDocument as PythonParsedDocument; if (doc != null) { return(GenerateCompletionData(completionContext, doc, Editor, completionChar)); } return(null); default: return(null); } }
public override void BuildChildNodes(ITreeBuilder treeBuilder, object dataObject) { PackageNode packageNode = dataObject as PackageNode; PythonParsedDocument parsed = ProjectDomService.ParseFile(null, packageNode.ProjectFile.Name) as PythonParsedDocument; if (parsed != null && parsed.Module != null) { foreach (PythonClass pyClass in parsed.Module.Classes) { treeBuilder.AddChild(pyClass); } foreach (PythonAttribute pyAttr in parsed.Module.Attributes) { treeBuilder.AddChild(pyAttr); } foreach (PythonFunction pyFunc in parsed.Module.Functions) { treeBuilder.AddChild(pyFunc); } } }
ICompletionDataList GenerateCompletionData(CodeCompletionContext completionContext, PythonParsedDocument document, TextEditorData editor, char completionChar) { if (document == null) { return(null); } var triggerWord = GetTriggerWord(editor, completionContext); // Its annoying when the data is poped up during an assignment such as: // abc = _ if (completionChar == '=' && String.IsNullOrEmpty(triggerWord)) { return(null); } var triggerLine = editor.GetLineText(completionContext.TriggerLine); // if completionChar is ' ' and it is not a known completion type // that we can handle, return as early as possible if (completionChar == ' ') { if (!triggerWord.Contains('.') && !triggerLine.StartsWith("class") && !triggerLine.StartsWith("def") && !triggerLine.StartsWith("from") && !triggerLine.StartsWith("import")) { return(null); } } // "self." if (document.Module != null && triggerWord == "self" && completionChar == '.') { var klass = GetClass(document.Module, completionContext.TriggerLine); if (klass == null) { return(null); // nothing to complete, self not in a class } return(new CompletionDataList(SelfDotCompletionData(klass))); } var inFrom = triggerLine.StartsWith("from "); var inClass = triggerLine.StartsWith("class ") || (triggerLine.StartsWith("class") && completionChar == ' '); var inDef = triggerLine.StartsWith("def ") || (triggerLine.StartsWith("def") && completionChar == ' '); var parts = triggerLine.Split(' '); // "from blah " if (inFrom && parts.Length == 2 && parts [parts.Length - 1].Trim().Length > 0 && completionChar == ' ') { return(new CompletionDataList(new CompletionData[] { new CompletionData("import") })); } // "from blah import " else if (inFrom && parts.Length > 2) { triggerWord = parts [1] + "."; return(new CompletionDataList( from ParserItem item in m_site.Database.Find(triggerWord) where !item.FullName.Substring(triggerWord.Length).Contains('.') select CreateCompletionData(item, triggerWord)) ); } // if we are in a new class line and not to '(' yet // we cannot complete anything at this time, finish now if (inClass && parts.Length < 2) { return(null); } // if we are in a new def line, the only time we can complete // is after an equal '='. so ignore space trigger if (inDef && completionChar == ' ') { return(null); } else if (inDef && completionChar == '=') { triggerWord = ""; } if (inClass) { if (completionChar == '(') { triggerWord = ""; } else { triggerWord = triggerLine.Substring(triggerLine.LastIndexOf('(') + 1); } } // limit the depth of search to number of "." in trigger // "xml." has depth of 1 so anything matching ^xml. and no more . with match int depth = 0; foreach (var c in triggerWord) { if (c == '.') { depth++; } } // anything in the sqlite store if (!String.IsNullOrEmpty(triggerWord)) { // todo: try to complete on class/module/func/attr data return(new CompletionDataList( from ParserItem item in m_site.Database.Find(triggerWord, ParserItemType.Any, depth) select CreateCompletionData(item, triggerWord)) ); } ParserItemType itemType = String.IsNullOrEmpty(triggerWord) ? ParserItemType.Module : ParserItemType.Any; return(new CompletionDataList( from ParserItem item in m_site.Database.Find("", itemType, depth) select CreateCompletionData(item, triggerWord)) ); }
ICompletionDataList GenerateCompletionData (CodeCompletionContext completionContext, PythonParsedDocument document, TextEditor editor, char completionChar) { if (document == null) return null; var triggerWord = GetTriggerWord (editor, completionContext); // Its annoying when the data is poped up during an assignment such as: // abc = _ if (completionChar == '=' && String.IsNullOrEmpty (triggerWord)) return null; var triggerLine = editor.GetLineText (completionContext.TriggerLine); // if completionChar is ' ' and it is not a known completion type // that we can handle, return as early as possible if (completionChar == ' ') { if (!triggerWord.Contains ('.') && !triggerLine.StartsWith ("class") && !triggerLine.StartsWith ("def") && !triggerLine.StartsWith ("from") && !triggerLine.StartsWith ("import")) return null; } // "self." if (document.Module != null && triggerWord.Equals ("self.")) { var klass = GetClass (document.Module, completionContext.TriggerLine); if (klass == null) return null; // nothing to complete, self not in a class return new CompletionDataList (SelfDotCompletionData (klass)); } var inFrom = triggerLine.StartsWith ("from "); var inClass = triggerLine.StartsWith ("class ") || (triggerLine.StartsWith ("class") && completionChar == ' '); var inDef = triggerLine.StartsWith ("def ") || (triggerLine.StartsWith ("def") && completionChar == ' '); var parts = triggerLine.Split (' '); // "from blah " if (inFrom && parts.Length == 2 && parts [parts.Length-1].Trim ().Length > 0 && completionChar == ' ') { return new CompletionDataList (new CompletionData[] { new CompletionData ("import") }); } // "from blah import " else if (inFrom && parts.Length > 2) { triggerWord = parts [1] + "."; return new CompletionDataList ( from ParserItem item in m_site.Database.Find (triggerWord) where !item.FullName.Substring (triggerWord.Length).Contains ('.') select CreateCompletionData (item, triggerWord)) ; } // if we are in a new class line and not to '(' yet // we cannot complete anything at this time, finish now if (inClass && parts.Length < 2) return null; // if we are in a new def line, the only time we can complete // is after an equal '='. so ignore space trigger if (inDef && completionChar == ' ') return null; else if (inDef && completionChar == '=') triggerWord = ""; if (inClass) { if (completionChar == '(') triggerWord = ""; else triggerWord = triggerLine.Substring (triggerLine.LastIndexOf ('(') + 1); } // limit the depth of search to number of "." in trigger // "xml." has depth of 1 so anything matching ^xml. and no more . with match int depth = 0; foreach (var c in triggerWord) if (c == '.') depth++; // anything in the sqlite store if (!String.IsNullOrEmpty (triggerWord)) { // todo: try to complete on class/module/func/attr data return new CompletionDataList ( from ParserItem item in m_site.Database.Find (triggerWord, ParserItemType.Any, depth) select CreateCompletionData (item, triggerWord)) ; } ParserItemType itemType = String.IsNullOrEmpty (triggerWord) ? ParserItemType.Module : ParserItemType.Any; return new CompletionDataList ( from ParserItem item in m_site.Database.Find ("", itemType, depth) select CreateCompletionData (item, triggerWord)) ; }