Exemplo n.º 1
0
		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;
		}
Exemplo n.º 2
0
        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);
            }
        }
Exemplo n.º 3
0
        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);
                }
            }
        }
Exemplo n.º 4
0
        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))
				;
		}