Browse Source

Boo.InterpreterAddIn now can host multiple interpreters

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@1580 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 19 years ago
parent
commit
09b610b3ae
  1. 5
      src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/Boo.Interpreter.addin
  2. 2
      src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/Boo.InterpreterAddIn.booproj
  3. 6
      src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/CodeCompletionData.boo
  4. 6
      src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/InteractiveInterpreterControl.boo
  5. 76
      src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/InterpreterContext.boo
  6. 115
      src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/InterpreterPad.boo
  7. 43
      src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/InterpreterWrapper.boo
  8. 4
      src/Main/Base/Project/Src/Services/NavigationService/DefaultNavigationPoint.cs
  9. 6
      src/Main/Core/Project/Src/AddInTree/AddInTreeNode.cs

5
src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/Boo.Interpreter.addin

@ -1,6 +1,5 @@
<AddIn name = "Boo Interpreter Console" <AddIn name = "Boo Interpreter Console"
author = "Daniel Grunwald" author = "Daniel Grunwald"
copyright = "GPL"
url = "http://www.icsharpcode.net" url = "http://www.icsharpcode.net"
description = "Interactive interpreter for boo"> description = "Interactive interpreter for boo">
@ -20,4 +19,8 @@
shortcut = "Control|Shift|B" shortcut = "Control|Shift|B"
class = "Boo.InterpreterAddIn.InterpreterPad"/> class = "Boo.InterpreterAddIn.InterpreterPad"/>
</Path> </Path>
<Path name="/AddIns/InterpreterAddIn/InterpreterContexts">
<Class id="Default" class="Boo.InterpreterAddIn.DefaultBooInterpreterContext"/>
</Path>
</AddIn> </AddIn>

2
src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/Boo.InterpreterAddIn.booproj

@ -38,7 +38,7 @@
<Compile Include="CodeCompletionData.boo" /> <Compile Include="CodeCompletionData.boo" />
<Compile Include="InteractiveInterpreterControl.boo" /> <Compile Include="InteractiveInterpreterControl.boo" />
<Compile Include="InterpreterPad.boo" /> <Compile Include="InterpreterPad.boo" />
<Compile Include="InterpreterWrapper.boo" /> <Compile Include="InterpreterContext.boo" />
</ItemGroup> </ItemGroup>
<ItemGroup> <ItemGroup>
<ProjectReference Include="..\..\..\..\..\Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj"> <ProjectReference Include="..\..\..\..\..\Libraries\ICSharpCode.TextEditor\Project\ICSharpCode.TextEditor.csproj">

6
src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/CodeCompletionData.boo

@ -97,7 +97,7 @@ internal class CodeCompletionData(AbstractCompletionData):
_entities.Add(entity) _entities.Add(entity)
internal class GlobalsCompletionDataProvider(ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.AbstractCompletionDataProvider): internal class GlobalsCompletionDataProvider(ICSharpCode.SharpDevelop.DefaultEditor.Gui.Editor.AbstractCompletionDataProvider):
_interpreter as InterpreterWrapper _interpreter as InterpreterContext
class GlobalCompletionData(AbstractCompletionData): class GlobalCompletionData(AbstractCompletionData):
@ -112,14 +112,14 @@ internal class GlobalsCompletionDataProvider(ICSharpCode.SharpDevelop.DefaultEdi
_imageIndex = imageIndex _imageIndex = imageIndex
_description = description _description = description
def constructor(interpreter as InterpreterWrapper): def constructor(interpreter as InterpreterContext):
_interpreter = interpreter _interpreter = interpreter
override def GenerateCompletionData(fileName as string, textArea as TextArea, charTyped as System.Char) as (ICompletionData): override def GenerateCompletionData(fileName as string, textArea as TextArea, charTyped as System.Char) as (ICompletionData):
globals = _interpreter.GetGlobals() globals = _interpreter.GetGlobals()
data = array(ICompletionData, len(globals)) data = array(ICompletionData, len(globals))
for index, key in enumerate(globals): for index, key in enumerate(globals):
value = _interpreter.GetValue(key) value = null #_interpreter.GetValue(key) TODO
delegate = value as System.Delegate delegate = value as System.Delegate
if delegate is null: if delegate is null:
if value is not null: if value is not null:

6
src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/InteractiveInterpreterControl.boo

@ -66,13 +66,15 @@ class InteractiveInterpreterControl(TextEditorControl):
_block = System.IO.StringWriter() _block = System.IO.StringWriter()
[getter(Interpreter)] [getter(Interpreter)]
_interpreter = InterpreterWrapper() _interpreter as InterpreterContext
_codeCompletionWindow as CodeCompletionWindow _codeCompletionWindow as CodeCompletionWindow
_lineHistory as LineHistory _lineHistory as LineHistory
def constructor(): def constructor([required] interpreter as InterpreterContext):
self._interpreter = interpreter
self._interpreter.LinePrinted += self.print self._interpreter.LinePrinted += self.print
self._interpreter.Cleared += self.cls self._interpreter.Cleared += self.cls
self._lineHistory = LineHistory(CurrentLineChanged: _lineHistory_CurrentLineChanged) self._lineHistory = LineHistory(CurrentLineChanged: _lineHistory_CurrentLineChanged)

76
src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/InterpreterContext.boo

@ -0,0 +1,76 @@
// <file>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version>
// </file>
namespace Boo.InterpreterAddIn
import System
abstract class InterpreterContext:
[property(Visible, Observable: true)]
private _visible as bool = true
[property(Image, Observable: true)]
private _image as System.Drawing.Image
[property(Title, Observable: true)]
private _title as string = '${res:ICSharpCode.BooInterpreter}'
[property(ToolTipText, Observable: true)]
private _toolTipText as string
event LinePrinted as callable(string)
"""Callback when interpreter outputs a text line.
You can raise the event on any thread, InterpreterAddIn takes care of invoking"""
event Cleared as callable()
"""Callback when interpreter clears the text box.
You can raise the event on any thread, InterpreterAddIn takes care of invoking"""
protected def RaiseClear():
"""Raise the Cleared event."""
Cleared()
protected def PrintLine(line as string):
"""Raise LinePrinted event to output a line in the interpreter"""
LinePrinted(line)
abstract def RunCommand(code as string) as void:
"""Execute the passed code."""
pass
virtual def GetGlobals() as (string):
"""Gets a list of globally available types/variables. Used for Ctrl+Space completion"""
return null
virtual def SuggestCodeCompletion(code as string) as (string):
"""Gets list of available members for completion on the passed expression. Used for '.' completion"""
return null
class DefaultBooInterpreterContext(InterpreterContext):
_interpreter as Boo.Lang.Interpreter.InteractiveInterpreter
def constructor():
self.Image = ICSharpCode.Core.ResourceService.GetBitmap("Boo.ProjectIcon")
private def InitInterpreter():
_interpreter = Boo.Lang.Interpreter.InteractiveInterpreter(
RememberLastValue: true,
Print: self.PrintLine)
_interpreter.SetValue("cls", RaiseClear)
_interpreter.LoopEval("""
import System
import System.IO
import System.Text
""")
def RunCommand(code as string):
InitInterpreter() if _interpreter is null
_interpreter.LoopEval(code)
def GetGlobals():
InitInterpreter() if _interpreter is null
return _interpreter.globals()

115
src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/InterpreterPad.boo

@ -1,6 +1,6 @@
// <file> // <file>
// <copyright see="prj:///doc/copyright.txt">2004 Rodrigo B. de Oliveira; 2005 AlphaSierraPapa</copyright> // <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt">GNU General Public License</license> // <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/> // <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version> // <version>$Revision$</version>
// </file> // </file>
@ -12,45 +12,130 @@ import System.Windows.Forms
import ICSharpCode.Core import ICSharpCode.Core
import ICSharpCode.SharpDevelop.Gui import ICSharpCode.SharpDevelop.Gui
class ContextEntry:
[getter(InterpreterControl)]
_ctl as InteractiveInterpreterControl
[getter(Context)]
_context as InterpreterContext
[getter(ToolBarItem)]
_item as ToolStripButton
_parentPad as InterpreterPad
def constructor([required] context as InterpreterContext, [required] parentPad as InterpreterPad):
_context = context
_parentPad = parentPad
_ctl = InteractiveInterpreterControl(context)
_ctl.Dock = DockStyle.Fill
_item = ToolStripButton(StringParser.Parse(context.Title), context.Image)
_item.ToolTipText = context.ToolTipText
_item.Visible = context.Visible
_item.DisplayStyle = ToolStripItemDisplayStyle.ImageAndText
context.ImageChanged += AutoInvoke() do:
_item.Image = _context.Image
context.TitleChanged += AutoInvoke() do:
_item.Text = StringParser.Parse(_context.Title)
context.ToolTipTextChanged += AutoInvoke() do:
_item.ToolTipText = StringParser.Parse(_context.ToolTipText)
context.VisibleChanged += AutoInvoke() do:
_item.Visible = _context.Visible
_parentPad.UpdateToolBarVisible()
if _parentPad.CurrentContext is self and _context.Visible == false:
_parentPad.ActivateFirstVisibleContext()
_item.Click += def:
_parentPad.CurrentContext = self
private static def AutoInvoke(what as callable()) as EventHandler:
return def(sender as object, e as EventArgs):
WorkbenchSingleton.SafeThreadAsyncCall(what)
class InterpreterPad(AbstractPadContent, IClipboardHandler): class InterpreterPad(AbstractPadContent, IClipboardHandler):
"""Description of InterpreterPad""" [getter(Contexts)]
ctl = InteractiveInterpreterControl() _contexts = []
_currentContext as ContextEntry
_toolStrip = ToolStrip(GripStyle: ToolStripGripStyle.Hidden)
_panel = Panel()
def constructor():
_panel.Controls.Add(_toolStrip)
for context as InterpreterContext in AddInTree.GetTreeNode("/AddIns/InterpreterAddIn/InterpreterContexts").BuildChildItemsArrayList(self):
newContext = ContextEntry(context, self)
_toolStrip.Items.Add(newContext.ToolBarItem)
_contexts.Add(newContext)
ActivateFirstVisibleContext()
UpdateToolBarVisible()
def UpdateToolBarVisible():
count = 0
for c as ContextEntry in self.Contexts:
count += 1 if c.Context.Visible
_toolStrip.Visible = (count > 1)
def ActivateFirstVisibleContext():
for c as ContextEntry in self.Contexts:
if c.Context.Visible:
self.CurrentContext = c
return
Control as Control: Control as Control:
get: get:
return ctl return _panel
CurrentContext:
get:
return _currentContext
set:
return if _currentContext is value
if _currentContext is not null:
_panel.Controls.Remove(_currentContext.InterpreterControl)
if value is not null:
_panel.Controls.Add(value.InterpreterControl)
_panel.Controls.SetChildIndex(_toolStrip, 1)
_currentContext = value
for c as ContextEntry in self.Contexts:
c.ToolBarItem.Checked = c is value
CurrentTextArea:
get:
return _currentContext.InterpreterControl.ActiveTextAreaControl.TextArea
EnableCut: EnableCut:
get: get:
return ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.EnableCut return CurrentTextArea.ClipboardHandler.EnableCut
EnableCopy: EnableCopy:
get: get:
return ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.EnableCopy return CurrentTextArea.ClipboardHandler.EnableCopy
EnablePaste: EnablePaste:
get: get:
return ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.EnablePaste return CurrentTextArea.ClipboardHandler.EnablePaste
EnableDelete: EnableDelete:
get: get:
return ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.EnableDelete return CurrentTextArea.ClipboardHandler.EnableDelete
EnableSelectAll: EnableSelectAll:
get: get:
return ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.EnableSelectAll return CurrentTextArea.ClipboardHandler.EnableSelectAll
def Cut(): def Cut():
ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.Cut(null, null) CurrentTextArea.ClipboardHandler.Cut(null, null)
def Copy(): def Copy():
ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.Copy(null, null) CurrentTextArea.ClipboardHandler.Copy(null, null)
def Paste(): def Paste():
ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.Paste(null, null) CurrentTextArea.ClipboardHandler.Paste(null, null)
def Delete(): def Delete():
ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.Delete(null, null) CurrentTextArea.ClipboardHandler.Delete(null, null)
def SelectAll(): def SelectAll():
ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.SelectAll(null, null) CurrentTextArea.ClipboardHandler.SelectAll(null, null)

43
src/AddIns/BackendBindings/Boo/Boo.InterpreterAddIn/Project/InterpreterWrapper.boo

@ -1,43 +0,0 @@
// <file>
// <copyright see="prj:///doc/copyright.txt">2005 AlphaSierraPapa</copyright>
// <license see="prj:///doc/license.txt">GNU General Public License</license>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version>
// </file>
namespace Boo.InterpreterAddIn
import System
import System.Windows.Forms
class InterpreterWrapper:
_interpreter as Boo.Lang.Interpreter.InteractiveInterpreter
def constructor():
_interpreter = Boo.Lang.Interpreter.InteractiveInterpreter(
RememberLastValue: true,
Print: self.OnPrintLine)
_interpreter.SetValue("cls", RaiseClear)
event LinePrinted as callable(string)
event Cleared as MethodInvoker
private def RaiseClear():
Cleared()
private def OnPrintLine(text as string):
LinePrinted(text)
def RunCommand(code as string):
_interpreter.LoopEval(code)
def SuggestCodeCompletion(code as string):
// David: the code completion items have to be passed as strings;
// but it's not important, you can return null if you want.
return _interpreter.SuggestCodeCompletion(code)
def GetGlobals():
return _interpreter.globals()
def GetValue(variableName as string):
return _interpreter.GetValue(variableName)

4
src/Main/Base/Project/Src/Services/NavigationService/DefaultNavigationPoint.cs

@ -106,7 +106,7 @@ namespace ICSharpCode.Core
public override bool Equals(object obj) public override bool Equals(object obj)
{ {
DefaultNavigationPoint b = obj as DefaultNavigationPoint; DefaultNavigationPoint b = obj as DefaultNavigationPoint;
if (b == null) return false; if (object.ReferenceEquals(b, null)) return false;
return this.FileName == b.FileName; return this.FileName == b.FileName;
} }
@ -132,7 +132,7 @@ namespace ICSharpCode.Core
// violates rule: OverrideMethodsOnComparableTypes. // violates rule: OverrideMethodsOnComparableTypes.
public static bool operator == (DefaultNavigationPoint p1, DefaultNavigationPoint p2) public static bool operator == (DefaultNavigationPoint p1, DefaultNavigationPoint p2)
{ {
return p1==null ? p2==null : p1.Equals(p2); return object.Equals(p1, p2); // checks for null and calls p1.Equals(p2)
} }
public static bool operator != (DefaultNavigationPoint p1, DefaultNavigationPoint p2) public static bool operator != (DefaultNavigationPoint p1, DefaultNavigationPoint p2)
{ {

6
src/Main/Core/Project/Src/AddInTree/AddInTreeNode.cs

@ -156,6 +156,12 @@ namespace ICSharpCode.Core
return items; return items;
} }
// Workaround for Boo compiler (it cannot distinguish between the generic and non-generic method)
public ArrayList BuildChildItemsArrayList(object caller)
{
return BuildChildItems(caller);
}
public ArrayList BuildChildItems(object caller) public ArrayList BuildChildItems(object caller)
{ {
ArrayList items = new ArrayList(codons.Count); ArrayList items = new ArrayList(codons.Count);

Loading…
Cancel
Save