How to PyDev + IronPython + code completion for Common Language Runtime.

1) Install IronPython (1.1.1), PyDev (1.3.13) and standart python library (tested library from FePy).
2) Make backup copy of directory PySrc (located in %ECLIPSEHOME%/plugins/org.python.pydev_1.3.13).
3) Apply path to directory PySrc (see below).
4) Setup IronPython interpreter for PyDev and add namespaces from CLR (eg: System, System.Data, System.Windows.Forms,...) to "Forced builtin libs".
5) Done! You have limited code completion for CLR objects.

Limitations: Working only if [Imported Namespace] = [Assembly Name] (but you can add reference to any Assembly in importsTipper.py)

=================== Path-Start =====================

--- importsTipper.py    Mon Feb 04 14:07:22 2008
+++ importsTipper.py    Mon Feb 25 02:07:16 2008
@@ -16,9 +16,22 @@

TYPE_BUILTIN_AS_STR = '4'

+if sys.platform == "cli":
+    import clr
+    def _clr_imp(name):
+        try:
+            return __import__(name)
+        except:
+            clr.AddReference( name )
+            return __import__( name )
+       
+   
def _imp(name):
     try:
-        return __import__(name)
+        if sys.platform == "cli":
+            return _clr_imp( name )
+        else:
+            return __import__(name)
     except:
         if '.' in name:
             sub = name[0:name.rfind('.')]
@@ -30,12 +43,15 @@
def GetFile(mod):
     f = None
     try:
-        f = inspect.getsourcefile(mod) or inspect.getfile(mod)
+        if sys.platform != "cli":
+            f = inspect.getsourcefile(mod) or inspect.getfile(mod)
     except:
+        pass
+    if f is None:
         if hasattr(mod,'__file__'):
-            f = mod.__file__
-            if f.lower(f[-4:]) in ['.pyc', '.pyo']:
-                filename = f[:-4] + '.py'
+            filename = str(mod.__file__)
+            if filename[-4:].lower() in ['.pyc', '.pyo']:
+                filename = filename[:-4] + '.py'
                 if os.path.exists(filename):
                     f = filename
            
@@ -155,7 +171,7 @@
     ret = []
    
     dirComps = dir( mod )
-    if hasattr(mod, '__dict__'):
+    if hasattr(mod, '__dict__') and sys.platform != "cli":
         dirComps.append('__dict__')
        
     getCompleteInfo = True
@@ -283,7 +299,7 @@
                     retType = TYPE_ATTR
                 #ok, no complete info, let's try to do this as fast and clean as possible
                 #so, no docs for this kind of information, only the signatures
-                ret.append(   (d, '', args, retType)   )
+                ret.append(   (d, '', args, str(retType))   )
            
     return ret

--- pycompletionserver.py    Mon Feb 04 14:07:22 2008
+++ pycompletionserver.py    Mon Feb 25 02:57:22 2008
@@ -3,6 +3,8 @@
@author Fabio Zadrozny
'''

+import sys
+
try:
     import java.lang
     True = 1
@@ -25,18 +27,34 @@
        
     IS_JYTHON = False
     SERVER_NAME = 'pycompletionserver'
-    from threading import Thread
     import importsTipper
-    try:
-        import refactoring
-    except:
+    if sys.platform == "cli":
+        import System, System.Threading
+
+        class Thread:
+            def __init__(self):
+                self._thread = None
+            def run(self):
+                pass
+            def start(self):
+                self._thread = System.Threading.Thread( System.Threading.ThreadStart( self.run) )
+                self._thread.Start()
+
         class RefactoringWrapper:
             def HandleRefactorMessage(*args, **kwargs):
                 return ''
         refactoring = RefactoringWrapper()
+    else:
+        from threading import Thread
+        try:
+            import refactoring
+        except:
+            class RefactoringWrapper:
+                def HandleRefactorMessage(*args, **kwargs):
+                    return ''
+            refactoring = RefactoringWrapper()

-import sys
#initial sys.path
_sys_path = []
for p in sys.path:
@@ -315,6 +333,7 @@
                                
                             else:
                                 returnMsg = MSG_INVALID_REQUEST
+
                     except :
                         dbg( SERVER_NAME+' exception ocurred', ERROR )
                         s = StringIO.StringIO()
====================== Path-End ===========================

==
Vadim