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

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

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

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

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

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

@ -0,0 +1,76 @@ @@ -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 @@ @@ -1,6 +1,6 @@
// <file>
// <copyright see="prj:///doc/copyright.txt">2004 Rodrigo B. de Oliveira; 2005 AlphaSierraPapa</copyright>
// <license see="prj:///doc/license.txt">GNU General Public License</license>
// <copyright see="prj:///doc/copyright.txt"/>
// <license see="prj:///doc/license.txt"/>
// <owner name="Daniel Grunwald" email="daniel@danielgrunwald.de"/>
// <version>$Revision$</version>
// </file>
@ -12,45 +12,130 @@ import System.Windows.Forms @@ -12,45 +12,130 @@ import System.Windows.Forms
import ICSharpCode.Core
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):
"""Description of InterpreterPad"""
ctl = InteractiveInterpreterControl()
[getter(Contexts)]
_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:
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:
get:
return ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.EnableCut
return CurrentTextArea.ClipboardHandler.EnableCut
EnableCopy:
get:
return ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.EnableCopy
return CurrentTextArea.ClipboardHandler.EnableCopy
EnablePaste:
get:
return ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.EnablePaste
return CurrentTextArea.ClipboardHandler.EnablePaste
EnableDelete:
get:
return ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.EnableDelete
return CurrentTextArea.ClipboardHandler.EnableDelete
EnableSelectAll:
get:
return ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.EnableSelectAll
return CurrentTextArea.ClipboardHandler.EnableSelectAll
def Cut():
ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.Cut(null, null)
CurrentTextArea.ClipboardHandler.Cut(null, null)
def Copy():
ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.Copy(null, null)
CurrentTextArea.ClipboardHandler.Copy(null, null)
def Paste():
ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.Paste(null, null)
CurrentTextArea.ClipboardHandler.Paste(null, null)
def Delete():
ctl.ActiveTextAreaControl.TextArea.ClipboardHandler.Delete(null, null)
CurrentTextArea.ClipboardHandler.Delete(null, null)
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 @@ @@ -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 @@ -106,7 +106,7 @@ namespace ICSharpCode.Core
public override bool Equals(object obj)
{
DefaultNavigationPoint b = obj as DefaultNavigationPoint;
if (b == null) return false;
if (object.ReferenceEquals(b, null)) return false;
return this.FileName == b.FileName;
}
@ -132,7 +132,7 @@ namespace ICSharpCode.Core @@ -132,7 +132,7 @@ namespace ICSharpCode.Core
// violates rule: OverrideMethodsOnComparableTypes.
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)
{

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

@ -156,6 +156,12 @@ namespace ICSharpCode.Core @@ -156,6 +156,12 @@ namespace ICSharpCode.Core
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)
{
ArrayList items = new ArrayList(codons.Count);

Loading…
Cancel
Save