[Monodevelop-patches-list] r2480 - in trunk/MonoDevelop: . Extras Extras/BooBinding Extras/BooBinding/Gui Extras/BooBinding/Gui/OptionPanels Extras/BooBinding/Parser Extras/BooBinding/Project Extras/BooBinding/Properties Extras/BooBinding/templates build/data/resources/icons
Peter Johanson <latexer@gentoo.org>
pjohanson at mono-cvs.ximian.com
Mon Apr 25 21:27:11 EDT 2005
Author: pjohanson
Date: 2005-04-25 21:27:10 -0400 (Mon, 25 Apr 2005)
New Revision: 2480
Added:
trunk/MonoDevelop/Extras/BooBinding/
trunk/MonoDevelop/Extras/BooBinding/BooAmbience.boo
trunk/MonoDevelop/Extras/BooBinding/BooBinding.addin.xml
trunk/MonoDevelop/Extras/BooBinding/BooBindingCompilerServices.boo
trunk/MonoDevelop/Extras/BooBinding/BooCompiler.boo
trunk/MonoDevelop/Extras/BooBinding/BooLanguageBinding.boo
trunk/MonoDevelop/Extras/BooBinding/BooShellPadContent.boo
trunk/MonoDevelop/Extras/BooBinding/ChangeLog
trunk/MonoDevelop/Extras/BooBinding/Gui/
trunk/MonoDevelop/Extras/BooBinding/Gui/BooShellModel.boo
trunk/MonoDevelop/Extras/BooBinding/Gui/IShellModel.boo
trunk/MonoDevelop/Extras/BooBinding/Gui/OptionPanels/
trunk/MonoDevelop/Extras/BooBinding/Gui/OptionPanels/CodeCompilationPanel.boo
trunk/MonoDevelop/Extras/BooBinding/Gui/OptionPanels/GeneralBooShellPanel.boo
trunk/MonoDevelop/Extras/BooBinding/Gui/OptionPanels/GeneralShellPanel.boo
trunk/MonoDevelop/Extras/BooBinding/Gui/ShellTextView.boo
trunk/MonoDevelop/Extras/BooBinding/Makefile.am
trunk/MonoDevelop/Extras/BooBinding/Parser/
trunk/MonoDevelop/Extras/BooBinding/Parser/BooParser.boo
trunk/MonoDevelop/Extras/BooBinding/Parser/ExpressionFinder.boo
trunk/MonoDevelop/Extras/BooBinding/Parser/ExpressionTypeVisitor.boo
trunk/MonoDevelop/Extras/BooBinding/Parser/Resolver.boo
trunk/MonoDevelop/Extras/BooBinding/Parser/ReturnType.boo
trunk/MonoDevelop/Extras/BooBinding/Parser/Tree.boo
trunk/MonoDevelop/Extras/BooBinding/Parser/TypeMembers.boo
trunk/MonoDevelop/Extras/BooBinding/Parser/VariableLookupVisitor.boo
trunk/MonoDevelop/Extras/BooBinding/Parser/Visitor.boo
trunk/MonoDevelop/Extras/BooBinding/Project/
trunk/MonoDevelop/Extras/BooBinding/Project/BooCompilerParameters.boo
trunk/MonoDevelop/Extras/BooBinding/Properties/
trunk/MonoDevelop/Extras/BooBinding/Properties/BooShellProperties.boo
trunk/MonoDevelop/Extras/BooBinding/Properties/ShellProperties.boo
trunk/MonoDevelop/Extras/BooBinding/templates/
trunk/MonoDevelop/Extras/BooBinding/templates/BooGtkSharpProject.xpt.xml
trunk/MonoDevelop/Extras/BooBinding/templates/BooGtkSharpWindow.xft.xml
trunk/MonoDevelop/Extras/BooBinding/templates/EmptyBooFile.xft.xml
trunk/MonoDevelop/Extras/BooBinding/templates/EmptyBooProject.xpt.xml
trunk/MonoDevelop/build/data/resources/icons/Boo.File.EmptyFile
trunk/MonoDevelop/build/data/resources/icons/Boo.File.Form
trunk/MonoDevelop/build/data/resources/icons/Boo.FileIcon
trunk/MonoDevelop/build/data/resources/icons/Boo.Project.EmptyProject
trunk/MonoDevelop/build/data/resources/icons/Boo.Project.Form
trunk/MonoDevelop/build/data/resources/icons/Boo.ProjectIcon
trunk/MonoDevelop/build/data/resources/icons/BooBinding.Base
Modified:
trunk/MonoDevelop/ChangeLog
trunk/MonoDevelop/Extras/Makefile.am
trunk/MonoDevelop/build/data/resources/icons/Makefile.am
trunk/MonoDevelop/configure.in
Log:
Say hello to a Boo addin.
Modified: trunk/MonoDevelop/ChangeLog
===================================================================
--- trunk/MonoDevelop/ChangeLog 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/ChangeLog 2005-04-26 01:27:10 UTC (rev 2480)
@@ -1,5 +1,9 @@
2005-04-18 Peter Johanson <latexer at gentoo.org>
+ * configure.in: Add Boo addin logic
+
+2005-04-18 Peter Johanson <latexer at gentoo.org>
+
* configure.in: Add monodevelop.pc generation
* Makefile.am: Add monodevelop.pc installation/cleanup
* monodevelop.pc.in: New monodevelop.pc file for external addins to
Added: trunk/MonoDevelop/Extras/BooBinding/BooAmbience.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/BooAmbience.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/BooAmbience.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,478 @@
+#region license
+// Copyright (c) 2004, Daniel Grunwald (daniel at danielgrunwald.de)
+// All rights reserved.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding
+
+import System
+import System.Collections
+import System.Text
+import MonoDevelop.Internal.Parser
+import MonoDevelop.Services
+import MonoDevelop.Core.Properties
+
+class BooAmbience(AbstractAmbience):
+ [Getter(TypeConversionTable)]
+ static _typeConversionTable = {
+ 'System.Void' : 'void',
+ 'System.Object' : 'object',
+ 'System.Boolean' : 'bool',
+ 'System.Byte' : 'byte',
+ 'System.SByte' : 'sbyte',
+ //'System.Char' : 'char',
+ //'System.Enum' : 'enum',
+ 'System.Int16' : 'short',
+ 'System.Int32' : 'int',
+ 'System.Int64' : 'long',
+ 'System.UInt16' : 'ushort',
+ 'System.UInt32' : 'uint',
+ 'System.UInt64' : 'ulong',
+ 'System.Single' : 'single',
+ 'System.Double' : 'double',
+ 'System.Decimal' : 'decimal',
+ 'System.String' : 'string',
+ 'System.DateTime' : 'date',
+ 'System.TimeSpan' : 'timespan',
+ 'System.Type' : 'type',
+ 'System.Array' : 'array',
+ 'System.Text.RegularExpressions.Regex' : 'regex'
+ }
+
+ static _reverseTypeConversionTable as Hashtable
+
+ static ReverseTypeConversionTable:
+ get:
+ if _reverseTypeConversionTable == null:
+ _reverseTypeConversionTable = Hashtable()
+ for e as DictionaryEntry in _typeConversionTable:
+ _reverseTypeConversionTable.Add(e.Value, e.Key)
+ return _reverseTypeConversionTable
+
+
+ private def ModifierIsSet(modifier as ModifierEnum, query as ModifierEnum) as bool:
+ return (modifier & query) == query
+
+ override def Convert(modifier as ModifierEnum) as string:
+ if ShowAccessibility:
+ if ModifierIsSet(modifier, ModifierEnum.Public):
+ return 'public '
+ elif ModifierIsSet(modifier, ModifierEnum.Private):
+ return 'private '
+ elif ModifierIsSet(modifier, ModifierEnum.ProtectedAndInternal):
+ return 'protected internal '
+ elif ModifierIsSet(modifier, ModifierEnum.ProtectedOrInternal):
+ return 'internal protected '
+ elif ModifierIsSet(modifier, ModifierEnum.Internal):
+ return 'internal '
+ elif ModifierIsSet(modifier, ModifierEnum.Protected):
+ return 'protected '
+ return ''
+
+ private def GetModifier(decoration as IDecoration) as string:
+ ret as string = ''
+ if IncludeHTMLMarkup:
+ ret += '<i>'
+
+ if decoration.IsStatic:
+ ret += 'static '
+ elif decoration.IsFinal:
+ ret += 'final '
+ elif decoration.IsVirtual:
+ ret += 'virtual '
+ elif decoration.IsOverride:
+ ret += 'override '
+ elif decoration.IsNew:
+ ret += 'new '
+
+ if IncludeHTMLMarkup:
+ ret += '</i>'
+
+ return ret
+
+ override def Convert(c as IClass) as string:
+ builder as StringBuilder = StringBuilder()
+ builder.Append(Convert(c.Modifiers))
+ if IncludeHTMLMarkup:
+ builder.Append('<i>')
+
+ cType = c.ClassType
+
+ if ShowModifiers:
+ if c.IsSealed:
+ if cType == ClassType.Delegate or cType == ClassType.Enum:
+ pass
+ else:
+ builder.Append('final ')
+ elif c.IsAbstract and cType != ClassType.Interface:
+ builder.Append('abstract ')
+
+ if IncludeHTMLMarkup:
+ builder.Append('</i>')
+
+ if ShowModifiers:
+ if cType == ClassType.Delegate:
+ builder.Append('callable ')
+ elif cType == ClassType.Class:
+ builder.Append('class ')
+ elif cType == ClassType.Struct:
+ builder.Append('struct ')
+ elif cType == ClassType.Interface:
+ builder.Append('interface ')
+ elif cType == ClassType.Enum:
+ builder.Append('enum ')
+
+ if cType == ClassType.Delegate and c.Methods.Count > 0:
+ for m as IMethod in c.Methods:
+ if m.Name == 'Invoke':
+ builder.Append(Convert(m.ReturnType))
+ builder.Append(' ')
+
+ if IncludeHTMLMarkup:
+ builder.Append('<b>')
+
+ if UseFullyQualifiedMemberNames:
+ builder.Append(c.FullyQualifiedName)
+ else:
+ builder.Append(c.Name)
+
+ if IncludeHTMLMarkup:
+ builder.Append('</b>')
+
+ if c.ClassType == ClassType.Delegate:
+ builder.Append(' (')
+ if IncludeHTMLMarkup:
+ builder.Append('<br>')
+
+ for m as IMethod in c.Methods:
+ if m.Name == 'Invoke':
+ for i in range(m.Parameters.Count):
+ if IncludeHTMLMarkup:
+ builder.Append(' ')
+
+ builder.Append(Convert(m.Parameters[i]))
+ if i + 1 < m.Parameters.Count:
+ builder.Append(', ')
+
+ if IncludeHTMLMarkup:
+ builder.Append('<br>')
+
+ builder.Append(Char.Parse(')'))
+ elif ShowInheritanceList:
+ if c.BaseTypes.Count > 0:
+ builder.Append('(')
+ for i in range(c.BaseTypes.Count):
+ builder.Append(c.BaseTypes[i])
+ if i + 1 < c.BaseTypes.Count:
+ builder.Append(', ')
+ builder.Append(')')
+
+ if IncludeBodies:
+ builder.Append(':\n')
+
+ return builder.ToString()
+
+ override def ConvertEnd(c as IClass) as string:
+ return ''
+
+ override def Convert(field as IField) as string:
+ builder as StringBuilder = StringBuilder()
+ builder.Append(Convert(field.Modifiers))
+ if IncludeHTMLMarkup:
+ builder.Append('<i>')
+
+ if ShowModifiers:
+ if field.IsStatic and field.IsLiteral:
+ builder.Append('const ')
+ elif field.IsStatic:
+ builder.Append('static ')
+
+ if field.IsReadonly:
+ builder.Append('readonly ')
+
+
+ if IncludeHTMLMarkup:
+ builder.Append('</i>')
+
+ if IncludeHTMLMarkup:
+ builder.Append('<b>')
+
+ if UseFullyQualifiedMemberNames:
+ builder.Append(field.FullyQualifiedName)
+ else:
+ builder.Append(field.Name)
+
+ if field.ReturnType != null:
+ builder.Append(' as ')
+ builder.Append(Convert(field.ReturnType))
+
+ if IncludeHTMLMarkup:
+ builder.Append('</b>')
+
+ return builder.ToString()
+
+ override def Convert(property as IProperty) as string:
+ builder as StringBuilder = StringBuilder()
+ builder.Append(Convert(property.Modifiers))
+ if ShowModifiers:
+ builder.Append(GetModifier(property))
+
+ if IncludeHTMLMarkup:
+ builder.Append('<b>')
+
+ if UseFullyQualifiedMemberNames:
+ builder.Append(property.FullyQualifiedName)
+ else:
+ builder.Append(property.Name)
+
+ if IncludeHTMLMarkup:
+ builder.Append('</b>')
+
+ if property.Parameters.Count > 0:
+ builder.Append('(')
+ if IncludeHTMLMarkup:
+ builder.Append('<br>')
+
+ for i in range(property.Parameters.Count):
+ if IncludeHTMLMarkup:
+ builder.Append(' ')
+
+ builder.Append(Convert(property.Parameters[i]))
+ if i + 1 < property.Parameters.Count:
+ builder.Append(', ')
+
+ if IncludeHTMLMarkup:
+ builder.Append('<br>')
+
+ builder.Append(')')
+
+ if property.ReturnType != null:
+ builder.Append(' as ')
+ builder.Append(Convert(property.ReturnType))
+
+ if IncludeBodies:
+ builder.Append(': ')
+ if property.CanGet:
+ builder.Append('get ')
+
+ if property.CanSet:
+ builder.Append('set ')
+
+ return builder.ToString()
+
+ override def Convert(e as IEvent) as string:
+ builder as StringBuilder = StringBuilder()
+ builder.Append(Convert(e.Modifiers))
+ if ShowModifiers:
+ builder.Append(GetModifier(e))
+
+ if IncludeHTMLMarkup:
+ builder.Append('<b>')
+
+ if UseFullyQualifiedMemberNames:
+ builder.Append(e.FullyQualifiedName)
+ else:
+ builder.Append(e.Name)
+
+ if IncludeHTMLMarkup:
+ builder.Append('</b>')
+
+ if e.ReturnType != null:
+ builder.Append(' as ')
+ builder.Append(Convert(e.ReturnType))
+
+ return builder.ToString()
+
+ override def Convert(m as IIndexer) as string:
+ builder as StringBuilder = StringBuilder()
+ builder.Append(Convert(m.Modifiers))
+ if IncludeHTMLMarkup:
+ builder.Append('<i>')
+
+ if ShowModifiers and m.IsStatic:
+ builder.Append('static ')
+
+ if IncludeHTMLMarkup:
+ builder.Append('</i>')
+
+ if m.ReturnType != null:
+ builder.Append(Convert(m.ReturnType))
+ builder.Append(' ')
+
+ if IncludeHTMLMarkup:
+ builder.Append('<b>')
+
+ if UseFullyQualifiedMemberNames:
+ builder.Append(m.FullyQualifiedName)
+ else:
+ builder.Append(m.Name)
+
+ if IncludeHTMLMarkup:
+ builder.Append('</b>')
+
+ builder.Append('Indexer(')
+ if IncludeHTMLMarkup:
+ builder.Append('<br>')
+
+ for i in range(m.Parameters.Count):
+ if IncludeHTMLMarkup:
+ builder.Append(' ')
+
+ builder.Append(Convert(m.Parameters[i]))
+ if i + 1 < m.Parameters.Count:
+ builder.Append(', ')
+
+ if IncludeHTMLMarkup:
+ builder.Append('<br>')
+
+ builder.Append(')')
+
+ return builder.ToString()
+
+ override def Convert(m as IMethod) as string:
+ builder as StringBuilder = StringBuilder()
+ builder.Append(Convert(m.Modifiers))
+ if ShowModifiers:
+ builder.Append(GetModifier(m))
+
+ //builder.Append('def ') if ShowReturnType
+
+ if IncludeHTMLMarkup:
+ builder.Append('<b>')
+
+ if m.IsConstructor:
+ builder.Append('constructor')
+ else:
+ if UseFullyQualifiedMemberNames:
+ builder.Append(m.FullyQualifiedName)
+ else:
+ builder.Append(m.Name)
+
+ if IncludeHTMLMarkup:
+ builder.Append('</b>')
+
+ builder.Append('(')
+ if IncludeHTMLMarkup:
+ builder.Append('<br>')
+
+ for i in range(m.Parameters.Count):
+ if IncludeHTMLMarkup:
+ builder.Append(' ')
+
+ builder.Append(Convert(m.Parameters[i]))
+ if i + 1 < m.Parameters.Count:
+ builder.Append(', ')
+
+ if IncludeHTMLMarkup:
+ builder.Append('<br>')
+
+ builder.Append(')')
+
+ //if m.ReturnType != null and ShowReturnType and not m.IsConstructor:
+ if m.ReturnType != null and not m.IsConstructor:
+ builder.Append(' as ')
+ builder.Append(Convert(m.ReturnType))
+
+ if IncludeBodies:
+ if m.DeclaringType != null:
+ if m.DeclaringType.ClassType != ClassType.Interface:
+ builder.Append(': ')
+ else:
+ builder.Append(': ')
+
+
+ return builder.ToString()
+
+ override def ConvertEnd(m as IMethod) as string:
+ return ''
+
+ override def Convert(returnType as IReturnType) as string:
+ if returnType == null:
+ return ''
+
+ builder as StringBuilder = StringBuilder()
+ /*
+ linkSet as bool = false
+ if UseLinkArrayList:
+ ret as SharpAssemblyReturnType = returnType as SharpAssemblyReturnType
+ if ret != null:
+ if ret.UnderlyingClass != null:
+ builder.Append('<a href=\'as://' + linkArrayList.Add(ret.UnderlyingClass) + '\'>')
+ linkSet = true
+ */
+
+ for i in range(returnType.ArrayCount):
+ builder.Append('(')
+
+ if returnType.FullyQualifiedName != null and _typeConversionTable[returnType.FullyQualifiedName] != null:
+ builder.Append(_typeConversionTable[returnType.FullyQualifiedName])
+ else:
+ if UseFullyQualifiedNames:
+ builder.Append(returnType.FullyQualifiedName)
+ else:
+ builder.Append(returnType.Name)
+
+
+ //if linkSet:
+ // builder.Append('</a>')
+
+ if returnType.PointerNestingLevel > 0:
+ // Sometimes there are negative pointer nesting levels
+ // (especially in exception constructors in the BCL
+ for i in range(returnType.PointerNestingLevel):
+ builder.Append('*')
+
+ for i in range(returnType.ArrayCount):
+ if returnType.ArrayDimensions[i] > 1:
+ builder.Append(',')
+ builder.Append(returnType.ArrayDimensions[i])
+ builder.Append(')')
+
+ return builder.ToString()
+
+ override def Convert(param as IParameter) as string:
+ builder as StringBuilder = StringBuilder()
+ if IncludeHTMLMarkup:
+ builder.Append('<i>')
+
+ if param.IsRef:
+ builder.Append('ref ')
+ elif param.IsOut:
+ builder.Append('out ')
+ elif param.IsParams:
+ builder.Append('params ')
+
+ if IncludeHTMLMarkup:
+ builder.Append('</i>')
+
+ if ShowParameterNames:
+ builder.Append(param.Name)
+ builder.Append(' as ')
+ builder.Append(Convert(param.ReturnType))
+
+ return builder.ToString()
+
+ override def WrapAttribute(attribute as string) as string:
+ return '[' + attribute + ']'
+
+ override def WrapComment(comment as string) as string:
+ return '// ' + comment
+
+ override def GetIntrinsicTypeName(dotNetTypeName as string) as string:
+ if _typeConversionTable[dotNetTypeName] != null:
+ return _typeConversionTable[dotNetTypeName]
+ return dotNetTypeName
Added: trunk/MonoDevelop/Extras/BooBinding/BooBinding.addin.xml
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/BooBinding.addin.xml 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/BooBinding.addin.xml 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,89 @@
+<AddIn name = "Boo Language Binding"
+ author = "Peter Johanson"
+ copyright = "GPL"
+ url = "http://boo.codehaus.org"
+ description = "Boo Language Binding"
+ version = "0.1">
+
+ <Runtime>
+ <Import assembly = "BooBinding.dll"/>
+ </Runtime>
+
+ <Extension path = "/SharpDevelop/Workbench/FileFilter">
+ <FileFilter id = "Boo"
+ insertbefore = "AllFiles"
+ name = "Boo Files (*.boo)"
+ extensions = "*.boo"/>
+ </Extension>
+
+ <Extension path = "/MonoDevelop/FileTemplates">
+ <FileTemplate id = "EmptyBooFile"
+ location = "templates/EmptyBooFile.xft.xml"/>
+ <FileTemplate id = "BooGtkSharpWindow"
+ location = "templates/BooGtkSharpWindow.xft.xml"/>
+ </Extension>
+
+ <Extension path = "/MonoDevelop/ProjectTemplates">
+ <ProjectTemplate id = "EmptyBooProject"
+ location = "templates/EmptyBooProject.xpt.xml"/>
+ <ProjectTemplate id = "BooGtkSharpProject"
+ location = "templates/BooGtkSharpProject.xpt.xml"/>
+ </Extension>
+
+ <Extension path = "/SharpDevelop/Workbench/ProjectOptions/ConfigurationProperties">
+ <Conditional activelanguage = "Boo">
+ <DialogPanel id = "BooCodeGenerationPanel"
+ _label = "Code Generation"
+ class = "BooBinding.Gui.OptionPanels.CodeGenerationPanel"/>
+ </Conditional>
+ </Extension>
+
+ <Extension path = "/Workspace/Icons">
+ <Icon id = "BooPrj"
+ language = "Boo"
+ resource = "Boo.ProjectIcon"/>
+ <Icon id = "BooFile"
+ extensions = ".boo"
+ resource = "Boo.FileIcon"/>
+ </Extension>
+
+ <Extension path = "/SharpDevelop/Workbench/LanguageBindings">
+ <LanguageBinding id = "Boo"
+ supportedextensions = ".boo"
+ class = "BooBinding.BooLanguageBinding" />
+ </Extension>
+
+ <Extension path = "/Workspace/Parser">
+ <Class id = "BooParser"
+ class = "BooBinding.Parser.BooParser"/>
+ </Extension>
+
+ <Extension path = "/SharpDevelop/Workbench/Ambiences">
+ <Class id = "Boo"
+ class = "BooBinding.BooAmbience"/>
+ </Extension>
+
+ <Extension path = "/SharpDevelop/Workbench/Views">
+ <Class id = "BooShell"
+ insertafter = "TaskList"
+ class = "BooBinding.Pads.BooShellPadContent"/>
+ </Extension>
+
+ <Extension path = "/SharpDevelop/Workbench/Pads">
+ <Pad id = "BooBinding.Pads.BooShellPadContent" class = "BooBinding.Pads.BooShellPadContent"/>
+ </Extension>
+
+ <Extension path = "/SharpDevelop/Workbench/Contexts/Edit">
+ <ContextPad id = "BooBinding.Pads.BooShellPadContent" />
+ </Extension>
+ <Extension path = "/SharpDevelop/Dialogs/OptionsDialog">
+ <DialogPanel id = "BooShellOptions"
+ insertafter = "ToolsOptions"
+ _label = "Boo Shell">
+ <DialogPanel id = "General"
+ _label = "General"
+ class = "BooBinding.Gui.OptionPanels.GeneralBooShellPanel" />
+ </DialogPanel>
+ </Extension>
+
+</AddIn>
Added: trunk/MonoDevelop/Extras/BooBinding/BooBindingCompilerServices.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/BooBindingCompilerServices.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/BooBindingCompilerServices.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,179 @@
+#region license
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding
+
+import System
+import System.Diagnostics
+import System.IO
+import System.CodeDom.Compiler
+import System.Text
+
+import MonoDevelop.Gui.Components
+import MonoDevelop.Services
+import MonoDevelop.Core.Services
+import MonoDevelop.Internal.Project
+
+public class BooBindingCompilerServices:
+ public def CanCompile (fileName as string):
+ return Path.GetExtension(fileName) == ".boo"
+
+ public def GetCompilerName (cp as BooCompilerParameters):
+ if (cp.Compiler == BooCompiler.Boo):
+ return "boo"
+
+ return "booc"
+
+ def Compile (projectFiles as ProjectFileCollection, references as ProjectReferenceCollection, configuration as DotNetProjectConfiguration, monitor as IProgressMonitor) as ICompilerResult:
+ compilerparameters = cast(BooCompilerParameters, configuration.CompilationParameters)
+ if compilerparameters is null:
+ compilerparameters = BooCompilerParameters()
+
+ // FIXME: Use outdir
+ //outdir = configuration.OutputDirectory
+ options = ""
+
+ compiler = GetCompilerName (compilerparameters)
+
+ if configuration.DebugMode:
+ options += " -debug "
+
+ options += " -o:" + configuration.CompiledOutputName
+
+ if references is not null:
+ for lib as ProjectReference in references:
+ fileName = lib.GetReferencedFileName()
+ // FIXME: DO we need all these tests?
+ if lib.ReferenceType == ReferenceType.Gac:
+ options += " -r:" + fileName + " "
+ elif lib.ReferenceType == ReferenceType.Assembly:
+ options += " -r:" + fileName + " "
+ elif lib.ReferenceType == ReferenceType.Project:
+ options += " -r:" + fileName + " "
+
+ files = ""
+
+ for finfo as ProjectFile in projectFiles:
+ if finfo.Subtype != Subtype.Directory:
+ if finfo.BuildAction == BuildAction.Compile:
+ files = files + " \"" + finfo.Name + "\""
+
+
+ // FIXME: Add selection of output assembly types (library, exe, etc)
+ if configuration.CompileTarget == CompileTarget.Exe:
+ options += " -t:exe "
+ elif configuration.CompileTarget == CompileTarget.Library:
+ options += " -t:library "
+ elif configuration.CompileTarget == CompileTarget.WinExe:
+ options += " -t:winexe "
+
+ if compilerparameters.Culture != String.Empty:
+ options += " -c:${compilerparameters.Culture} "
+
+ if compilerparameters.Ducky:
+ options += " -ducky "
+
+ options += files
+
+ tf = TempFileCollection ()
+ output, error = DoCompilation (monitor, compiler, options, tf, configuration, compilerparameters)
+ cr = ParseOutput (tf, output, error)
+ File.Delete (output)
+ File.Delete (error)
+ return cr
+
+ private def DoCompilation (monitor as IProgressMonitor , compiler as string , args as string , tf as TempFileCollection , configuration as DotNetProjectConfiguration , compilerparameters as BooCompilerParameters):
+ output = Path.GetTempFileName ()
+ error = Path.GetTempFileName ()
+
+ try:
+ monitor.BeginTask (null, 2)
+ monitor.Log.WriteLine ("Compiling Boo source code ...")
+ arguments = String.Format ("-c \"{0} {1} > {2} 2> {3}\"", (compiler, args, output, error))
+ si = ProcessStartInfo ("/bin/sh", arguments)
+ // print "${si.FileName}, ${si.Arguments}"
+ si.RedirectStandardOutput = true
+ si.RedirectStandardError = true
+ si.UseShellExecute = false
+ p = Process ()
+ p.StartInfo = si
+ p.Start ()
+ p.WaitForExit ()
+
+ monitor.Step (1)
+
+ return output, error;
+ ensure:
+ monitor.EndTask ()
+
+
+ def ParseOutput (tf as TempFileCollection , stdout as string, stderr as string) as ICompilerResult:
+ compilerOutput = StringBuilder ()
+ cr = CompilerResults (tf)
+
+ for s as string in ( stdout, stderr ):
+ sr = File.OpenText (s);
+ while true:
+ next = sr.ReadLine ()
+ if next is null:
+ break
+
+ error = CreateErrorFromString (next)
+
+ if error is not null:
+ cr.Errors.Add (error)
+
+ sr.Close ()
+
+ return DefaultCompilerResult (cr, compilerOutput.ToString ())
+
+ private static def CreateErrorFromString (error as string) as CompilerError:
+ //print "${error}"
+ // FIXME: Better checking to make sure we have an error we can parse
+
+ err_pieces = /:/.Split(error)
+
+ // FIXME: i18n of "Fatal Error" check
+ if err_pieces.Length == 2 and err_pieces[0] == "Fatal error":
+ cerror = CompilerError()
+ cerror.ErrorText = error
+ return cerror
+
+ if (err_pieces.Length < 3):
+ return null
+
+ // Uses extensive LastIndexOf to avoid problems with filenames
+ // and directories with "(" or ")" in their names
+ last_open_bracket = err_pieces[0].LastIndexOf("(")
+ last_close_bracket = err_pieces[0].LastIndexOf(")")
+
+ file = err_pieces[0].Substring(0,last_open_bracket)
+ line, column = /,/.Split (err_pieces[0].Substring (last_open_bracket + 1, last_close_bracket - last_open_bracket - 1))
+
+ cerror = CompilerError ()
+
+ // Rejoin the split error back the way it originally was
+ cerror.ErrorText = join(err_pieces[1:], ":")
+ cerror.FileName = file
+ cerror.Column = Int32.Parse(column)
+ cerror.Line = Int32.Parse(line)
+ if (err_pieces[2].Trim() == "WARNING"):
+ cerror.IsWarning = true
+
+ return cerror
Added: trunk/MonoDevelop/Extras/BooBinding/BooCompiler.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/BooCompiler.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/BooCompiler.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,26 @@
+#region license
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding
+
+import System
+
+public enum BooCompiler:
+ Booc
+ Boo
Added: trunk/MonoDevelop/Extras/BooBinding/BooLanguageBinding.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/BooLanguageBinding.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/BooLanguageBinding.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,65 @@
+#region license
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding
+
+import System
+import System.IO
+import System.Diagnostics
+import System.Collections
+import System.Reflection
+import System.Resources
+import System.Xml
+
+import MonoDevelop.Internal.Project
+import MonoDevelop.Internal.Templates
+import MonoDevelop.Gui
+import MonoDevelop.Services
+
+public class BooLanguageBinding(ILanguageBinding):
+ internal static LanguageName = "Boo"
+ compilerServices = BooBindingCompilerServices ()
+
+ public def constructor():
+ MonoDevelop.Services.Runtime.ProjectService.DataContext.IncludeType (typeof(BooCompilerParameters));
+
+ public Language as string:
+ get:
+ return LanguageName
+
+ public def CanCompile(fileName as string) as bool:
+ Debug.Assert(compilerServices is not null)
+ return compilerServices.CanCompile(fileName)
+
+ public def Compile (projectFiles as ProjectFileCollection , references as ProjectReferenceCollection , configuration as DotNetProjectConfiguration , monitor as IProgressMonitor ) as ICompilerResult:
+ Debug.Assert(compilerServices is not null)
+ return compilerServices.Compile (projectFiles, references, configuration, monitor)
+
+ public def GenerateMakefile (project as Project, parentCombine as Combine) as void:
+ // FIXME: dont abort for now
+ // throw NotImplementedException ()
+ return
+
+ public def CreateCompilationParameters (projectOptions as XmlElement) as object:
+ parameters = BooCompilerParameters ()
+ return parameters
+
+ public CommentTag as string:
+ get:
+ return "//";
Added: trunk/MonoDevelop/Extras/BooBinding/BooShellPadContent.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/BooShellPadContent.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/BooShellPadContent.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,55 @@
+#region license
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+
+namespace BooBinding.Pads
+
+import System
+
+import MonoDevelop.Core.AddIns
+import MonoDevelop.Services
+import MonoDevelop.Core.Services
+import MonoDevelop.Gui
+import BooBinding.Gui
+
+
+public class BooShellPadContent (AbstractPadContent):
+ private static _scroller as Gtk.ScrolledWindow
+ private static _shellView as ShellTextView
+
+ override Control:
+ get:
+ return _scroller
+
+ def constructor():
+ super( "Boo Shell", "md-boo-binding-base" )
+ CreateBooShell()
+
+ def CreateBooShell():
+ _scroller = Gtk.ScrolledWindow()
+ _shellView = ShellTextView (BooShellModel())
+ _scroller.Add(_shellView)
+
+ override def RedrawContent():
+ OnTitleChanged(null);
+ OnIconChanged(null);
+
+ override def Dispose():
+ _shellView.Dispose()
+
Added: trunk/MonoDevelop/Extras/BooBinding/ChangeLog
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/ChangeLog 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/ChangeLog 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,4 @@
+2005-04-25 Peter Johanson <latexer at gentoo.org>
+
+ * Initial import of the Boo addin.
+
Added: trunk/MonoDevelop/Extras/BooBinding/Gui/BooShellModel.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Gui/BooShellModel.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Gui/BooShellModel.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,89 @@
+#region license
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding.Gui
+
+import System
+import System.Collections
+import System.IO
+import Boo.Lang.Interpreter
+import Boo.Lang.Compiler
+import BooBinding.Properties
+
+class BooShellModel(IShellModel):
+
+ private _interpreter = InteractiveInterpreter(RememberLastValue: true, Print: print)
+
+ private _outSink as StreamWriter
+ private _outSource as StreamReader
+
+ private props = BooShellProperties()
+
+ MimeType as string:
+ get:
+ return "text/x-boo"
+
+ def constructor():
+ _stream = MemoryStream()
+ _outSink = StreamWriter(_stream)
+ _outSource = StreamReader (_stream)
+
+ Properties as ShellProperties:
+ get:
+ return props
+
+ def Reset() as bool:
+ _interpreter.Reset()
+ return true
+
+ def ProcessInput (line as String) as (string):
+ // Make sure our fake stdout is at the beginning
+ _outSink.BaseStream.SetLength(0)
+ _outSink.BaseStream.Seek(0, SeekOrigin.Begin)
+
+ // Save tradition stdout, and redirect Console
+ // to local StreamWriter. Catches any print, etc calls
+ // to be output to the local shell
+ _stdout = Console.Out
+ Console.SetOut(_outSink)
+
+ _interpreter.LoopEval(line)
+
+ // Restore stdout, and prep our fake stdout for reading
+ Console.SetOut(_stdout)
+ _outSink.Flush()
+ _outSink.BaseStream.Seek(0, SeekOrigin.Begin)
+
+ retList = ArrayList()
+ _outputLine as string = _outSource.ReadLine()
+
+ while _outputLine is not null:
+ retList.Add(_outputLine)
+ _outputLine = _outSource.ReadLine()
+
+ ret = cast ((string), retList.ToArray(typeof(string)))
+
+ _ = _interpreter.LastValue
+ if _ is not null:
+ _interpreter.SetValue("_", _)
+
+ return ret
+
+ def print(obj):
+ print "${obj}"
Added: trunk/MonoDevelop/Extras/BooBinding/Gui/IShellModel.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Gui/IShellModel.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Gui/IShellModel.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,39 @@
+#region license
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding.Gui
+
+import System
+import BooBinding.Properties
+
+interface IShellModel:
+ def Reset() as bool:
+ pass
+
+ def ProcessInput (line as String) as (string):
+ pass
+
+
+ Properties as ShellProperties:
+ get:
+ pass
+
+ MimeType as string:
+ get:
+ pass
Added: trunk/MonoDevelop/Extras/BooBinding/Gui/OptionPanels/CodeCompilationPanel.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Gui/OptionPanels/CodeCompilationPanel.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Gui/OptionPanels/CodeCompilationPanel.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,180 @@
+#region license
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding.Gui.OptionPanels
+
+import BooBinding
+
+import System
+import Gtk
+
+import MonoDevelop.Internal.Project
+import MonoDevelop.Internal.ExternalTool
+import MonoDevelop.Gui.Dialogs
+import MonoDevelop.Gui.Widgets
+import MonoDevelop.Services
+import MonoDevelop.Core.Services
+import MonoDevelop.Core.Properties
+import MonoDevelop.Core.AddIns.Codons
+
+public class CodeGenerationPanel(AbstractOptionPanel):
+ private codeGenerationLabel as Gtk.Label = Gtk.Label ()
+ private labelWarnings as Gtk.Label = Gtk.Label ()
+ private labelOutputDir as Gtk.Label = Gtk.Label ()
+ private outputLabel as Gtk.Label = Gtk.Label ()
+ private labelCompiler as Gtk.Label = Gtk.Label ()
+ private labelCulture as Gtk.Label = Gtk.Label ()
+
+ private labelCompileTarget as Gtk.Label = Gtk.Label ()
+ private compileTargetCombo as Gtk.ComboBox = Gtk.ComboBox ()
+
+ private checkDebug = CheckButton (GettextCatalog.GetString ("Enable debug"))
+ private checkDucky = CheckButton (GettextCatalog.GetString ("Enable ducky mode"))
+
+ // compiler chooser
+ private booc = RadioButton ("booc")
+ private boo as RadioButton
+
+ private outputAssembly = Entry ()
+ private outputDirectory = Entry()
+ // Waiting on resolution of a boo bug before we can use this
+ //private outputDirectory as FolderEntry = FolderEntry ("Output Directory")
+ private compilerPath = Entry ()
+ private culture = Entry ()
+
+ compilerParameters as BooCompilerParameters = null
+ configuration as DotNetProjectConfiguration = null
+
+ public def constructor():
+
+ InitializeComponent ()
+ vbox = VBox ()
+ hboxTmp = HBox ()
+ hboxTmp.PackStart (codeGenerationLabel, false, false, 0)
+ vbox.PackStart (hboxTmp, false, false, 12)
+
+ hboxTmp = HBox()
+ tableOutputOptions = Table (4, 2, false)
+ tableOutputOptions.Attach (outputLabel, 0, 1, 0, 1, AttachOptions.Shrink, AttachOptions.Shrink, 0, 0)
+ tableOutputOptions.Attach (outputAssembly, 1, 2, 0, 1, AttachOptions.Fill | AttachOptions.Expand, AttachOptions.Fill, 0, 3)
+ tableOutputOptions.Attach (labelOutputDir, 0, 1, 1, 2, AttachOptions.Shrink, AttachOptions.Shrink, 0, 0)
+ tableOutputOptions.Attach (outputDirectory, 1, 2, 1, 2, AttachOptions.Fill | AttachOptions.Expand , AttachOptions.Fill, 0, 3)
+ tableOutputOptions.Attach (labelCompileTarget, 0, 1, 2, 3, AttachOptions.Shrink, AttachOptions.Shrink, 0, 0)
+ tableOutputOptions.Attach (compileTargetCombo, 1, 2, 2, 3, AttachOptions.Fill | AttachOptions.Expand, AttachOptions.Fill, 0, 3)
+ tableOutputOptions.Attach (labelCulture, 0, 1, 3, 4, AttachOptions.Shrink, AttachOptions.Shrink, 0, 0)
+ tableOutputOptions.Attach (culture, 1, 2, 3, 4, AttachOptions.Fill | AttachOptions.Expand, AttachOptions.Fill, 0, 3)
+ hboxTmp.PackStart (tableOutputOptions, true, true, 6)
+ vbox.PackStart (hboxTmp, false, false, 0)
+
+ hboxTmp = HBox ()
+ hboxTmp.PackStart (labelWarnings, false, false, 0)
+ vbox.PackStart (hboxTmp, false, false, 12)
+ hboxTmp = HBox()
+ hboxTmp.PackStart (checkDebug, false, false, 6)
+ vbox.PackStart (hboxTmp, false, false, 0)
+ hboxTmp = HBox()
+ hboxTmp.PackStart (checkDucky, false, false, 6)
+ vbox.PackStart (hboxTmp, false, false, 0)
+ Add (vbox)
+
+ def OnCompilerToggled (o as object, args as EventArgs) as void:
+ if booc.Active:
+ compilerPath.Text = "booc"
+ else:
+ compilerPath.Text = "boo"
+
+ private def InitializeComponent() as void:
+ boo = RadioButton (booc, "boo")
+ boo.Toggled += OnCompilerToggled
+ booc.Toggled += OnCompilerToggled
+
+ codeGenerationLabel.Markup = String.Format ("<b>{0}</b>", GettextCatalog.GetString ("Code Generation"))
+ labelOutputDir.Markup = String.Format ("{0} :", GettextCatalog.GetString ("Output Path"))
+ labelOutputDir.Layout.Alignment = Pango.Alignment.Right
+ outputAssembly = Entry ()
+
+ outputLabel.Markup = String.Format ("{0} :", GettextCatalog.GetString ("Output Assembly"))
+ outputLabel.Layout.Alignment = Pango.Alignment.Right
+ labelWarnings.Markup = String.Format ("<b>{0}</b>", GettextCatalog.GetString ("Warnings and Compiler Options"))
+
+ labelCompiler.Markup = String.Format ("<b>{0}</b>", GettextCatalog.GetString ("Compiler"))
+ labelCulture.Markup = String.Format ("{0} :", GettextCatalog.GetString ("Culture"))
+ labelCulture.Layout.Alignment = Pango.Alignment.Right
+ labelCompileTarget.Markup = String.Format ("{0} :", GettextCatalog.GetString ("Output Assembly"))
+
+
+ typeArray = array(System.Type, 1)
+ typeArray[0] = typeof(string)
+ store = ListStore (typeArray)
+
+ stringArray = array(System.String, 1)
+ stringArray[0] = GettextCatalog.GetString ("Executable")
+ store.AppendValues (stringArray)
+
+ stringArray = array(System.String, 1)
+ stringArray[0] = GettextCatalog.GetString ("Library")
+ store.AppendValues (stringArray)
+
+ /*
+ stringArray = array(System.String, 1)
+ stringArray[0] = GettextCatalog.GetString ("Windows Executable")
+ store.AppendValues (stringArray)
+ */
+
+ compileTargetCombo.Model = store
+ cr = CellRendererText()
+ compileTargetCombo.PackStart(cr, true)
+ compileTargetCombo.AddAttribute(cr, "text", 0)
+
+
+ public override def LoadPanelContents() as void:
+ configuration = cast(DotNetProjectConfiguration,(cast(IProperties,CustomizationObject)).GetProperty("Config"))
+ compilerParameters = cast (BooCompilerParameters, configuration.CompilationParameters)
+
+ if (compilerParameters.Compiler == BooCompiler.Booc):
+ booc.Active = true
+ else:
+ boo.Active = true
+
+ checkDebug.Active = configuration.DebugMode
+ checkDucky.Active = compilerParameters.Ducky
+ outputAssembly.Text = configuration.OutputAssembly
+ //outputDirectory.DefaultPath = configuration.OutputDirectory
+ outputDirectory.Text = configuration.OutputDirectory
+
+ compilerPath.Text = compilerParameters.CompilerPath
+ culture.Text = compilerParameters.Culture
+ compileTargetCombo.Active = cast (int, configuration.CompileTarget)
+
+ public override def StorePanelContents() as bool:
+ if (compilerParameters is null):
+ return true
+
+
+ configuration.DebugMode = checkDebug.Active
+ configuration.CompileTarget = cast (CompileTarget, compileTargetCombo.Active)
+ configuration.OutputAssembly = outputAssembly.Text
+ configuration.OutputDirectory = outputDirectory.Text
+ //configuration.OutputDirectory = outputDirectory.Path
+
+ compilerParameters.Ducky = checkDucky.Active
+ compilerParameters.CompilerPath = compilerPath.Text
+ compilerParameters.Culture = culture.Text
+
+ return true
Added: trunk/MonoDevelop/Extras/BooBinding/Gui/OptionPanels/GeneralBooShellPanel.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Gui/OptionPanels/GeneralBooShellPanel.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Gui/OptionPanels/GeneralBooShellPanel.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,47 @@
+#region license
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding.Gui.OptionPanels
+
+import System
+import Gtk
+import Pango
+
+import MonoDevelop.Internal.Project
+import MonoDevelop.Internal.ExternalTool
+import MonoDevelop.Gui.Dialogs
+import MonoDevelop.Gui.Widgets
+import MonoDevelop.Services
+import MonoDevelop.Core.Services
+import MonoDevelop.Core.Properties
+import MonoDevelop.Core.AddIns.Codons
+
+import BooBinding.Properties
+
+public class GeneralBooShellPanel(GeneralShellPanel):
+
+ public Properties as ShellProperties:
+ get:
+ return BooShellProperties()
+
+ public override def LoadPanelContents() as void:
+ super()
+
+ public override def StorePanelContents() as bool:
+ return super()
Added: trunk/MonoDevelop/Extras/BooBinding/Gui/OptionPanels/GeneralShellPanel.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Gui/OptionPanels/GeneralShellPanel.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Gui/OptionPanels/GeneralShellPanel.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,124 @@
+#region license
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding.Gui.OptionPanels
+
+import System
+import Gtk
+import Pango
+
+import MonoDevelop.Internal.Project
+import MonoDevelop.Internal.ExternalTool
+import MonoDevelop.Gui.Dialogs
+import MonoDevelop.Gui.Widgets
+import MonoDevelop.Services
+import MonoDevelop.Core.Services
+import MonoDevelop.Core.Properties
+import MonoDevelop.Core.AddIns.Codons
+
+import BooBinding.Properties
+
+public class GeneralShellPanel(AbstractOptionPanel):
+ private generalOptionsLabel = Gtk.Label ()
+ private autoIndentCheckButton = Gtk.CheckButton ()
+ private resetClearsScrollbackCheckButton = Gtk.CheckButton ()
+ private resetClearsHistoryCheckButton = Gtk.CheckButton ()
+
+ private fontOptionsLabel = Gtk.Label ()
+ private fontButton = FontButton ()
+ private defaultMonoRadio as RadioButton
+ private customFontRadio as RadioButton
+
+ protected virtual Properties as ShellProperties:
+ get:
+ pass
+
+ private def InitializeComponent() as void:
+ generalOptionsLabel.Markup = String.Format ("<b>{0}</b>", GettextCatalog.GetString ("General Options"))
+
+ autoIndentCheckButton.Label = GettextCatalog.GetString ("Automatically indent new lines in code blocks")
+ resetClearsScrollbackCheckButton.Label = GettextCatalog.GetString ("Shell reset clears scollback")
+ resetClearsHistoryCheckButton.Label = GettextCatalog.GetString ("Shell reset clears command history")
+ fontOptionsLabel.Markup = String.Format ("<b>{0}</b>", GettextCatalog.GetString ("Font"))
+ defaultMonoRadio = RadioButton (GettextCatalog.GetString ("Use default monospace font"))
+ customFontRadio = RadioButton (defaultMonoRadio, GettextCatalog.GetString ("Use custom font:"))
+
+ defaultMonoRadio.Toggled += ItemToggled
+ customFontRadio.Toggled += ItemToggled
+
+
+
+ public override def LoadPanelContents() as void:
+ InitializeComponent ()
+ vbox = VBox ()
+ hboxTmp = HBox()
+ hboxTmp.PackStart (generalOptionsLabel, false, false, 0)
+ vbox.PackStart (hboxTmp, false, false, 12)
+ hboxTmp = HBox()
+ hboxTmp.PackStart (autoIndentCheckButton, false, false, 6)
+ vbox.PackStart (hboxTmp, false, false, 0)
+ hboxTmp = HBox()
+ hboxTmp.PackStart (resetClearsScrollbackCheckButton, false, false, 6)
+ vbox.PackStart (hboxTmp, false, false, 0)
+ hboxTmp = HBox()
+ hboxTmp.PackStart (resetClearsHistoryCheckButton, false, false, 6)
+ vbox.PackStart (hboxTmp, false, false, 0)
+ hboxTmp = HBox()
+ hboxTmp.PackStart (fontOptionsLabel, false, false, 0)
+ vbox.PackStart (hboxTmp, false, false, 12)
+ hboxTmp = HBox()
+ hboxTmp.PackStart(defaultMonoRadio, false, false, 6)
+ vbox.PackStart (hboxTmp, false, false, 0)
+ hboxTmp = HBox()
+ hboxTmp.PackStart (customFontRadio, false, false, 6)
+ hboxTmp.PackStart (fontButton, false, false, 0)
+ vbox.PackStart (hboxTmp, false, false, 0)
+ Add (vbox)
+
+ s = Properties.FontName
+
+ if s == "__default_monospace":
+ defaultMonoRadio.Active = true
+ else:
+ fontButton.FontName = s
+ customFontRadio.Active = true
+
+ fontButton.Sensitive = customFontRadio.Active
+ autoIndentCheckButton.Active = Properties.AutoIndentBlocks
+ resetClearsScrollbackCheckButton.Active = Properties.ResetClearsScrollback
+ resetClearsHistoryCheckButton.Active = Properties.ResetClearsHistory
+
+
+ public override def StorePanelContents() as bool:
+ if customFontRadio.Active:
+ Properties.FontName = fontButton.FontName
+ elif defaultMonoRadio.Active:
+ Properties.FontName = "__default_monospace"
+
+ if Properties.AutoIndentBlocks != autoIndentCheckButton.Active:
+ Properties.AutoIndentBlocks = autoIndentCheckButton.Active
+
+ if Properties.ResetClearsScrollback != resetClearsScrollbackCheckButton.Active:
+ Properties.ResetClearsScrollback = resetClearsScrollbackCheckButton.Active
+ if Properties.ResetClearsHistory != resetClearsHistoryCheckButton.Active:
+ Properties.ResetClearsHistory = resetClearsHistoryCheckButton.Active
+ return true
+
+ private def ItemToggled (o, args as EventArgs):
+ fontButton.Sensitive = customFontRadio.Active
Added: trunk/MonoDevelop/Extras/BooBinding/Gui/ShellTextView.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Gui/ShellTextView.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Gui/ShellTextView.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,315 @@
+#region license
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding.Gui
+
+import System
+import System.Collections
+import System.Runtime.InteropServices
+
+import Gtk
+import Gdk
+import Pango
+import GtkSourceView
+
+import MonoDevelop.Gui.Widgets
+import MonoDevelop.Core.Services
+import MonoDevelop.Services
+import MonoDevelop.Core.Properties
+import Boo.IO
+
+
+/*
+ * TODO
+ *
+ * 1) Code Completion - Nice way to handle code competion for arbitrary shell?
+ * 2) Don't record lines with errors in the _scriptLines buffer
+ */
+
+class ShellTextView (SourceView):
+ private static _promptRegular = ">>> "
+ private static _promptMultiline = "... "
+
+ [Getter(Model)]
+ model as IShellModel
+
+ private _scriptLines = ""
+
+ private _commandHistoryPast as Stack = Stack()
+ private _commandHistoryFuture as Stack = Stack()
+
+ private _inBlock as bool = false
+ private _blockText = ""
+
+ private _reset_clears_history as bool
+ private _reset_clears_scrollback as bool
+ private _auto_indent as bool
+
+ def constructor(model as IShellModel):
+ service = cast(SourceViewService,ServiceManager.GetService(typeof(SourceViewService)))
+ buf = SourceBuffer(service.GetLanguageFromMimeType(model.MimeType))
+
+ // This freaks out booc for some reason.
+ //super(buf, Highlight: true)
+ super(buf)
+ buf.Highlight = true
+
+ self.model = model
+ self.WrapMode = Gtk.WrapMode.Word
+ self.ModifyFont(Model.Properties.Font)
+
+ Model.Properties.InternalProperties.PropertyChanged += OnPropertyChanged
+
+ _auto_indent = Model.Properties.AutoIndentBlocks
+ _reset_clears_scrollback = Model.Properties.ResetClearsScrollback
+ _reset_clears_history = Model.Properties.ResetClearsHistory
+
+
+ // The 'Freezer' tag is used to keep everything except
+ // the input line from being editable
+ tag = TextTag ("Freezer")
+ tag.Editable = false
+ Buffer.TagTable.Add (tag)
+ prompt(false)
+
+ #region Overrides of the standard methods for event handling
+ override def OnPopulatePopup (menu as Gtk.Menu):
+ _copyScriptInput = ImageMenuItem (GettextCatalog.GetString ("Copy Script"))
+ _copyScriptInput.Activated += { Gtk.Clipboard.Get (Gdk.Atom.Intern ("PRIMARY", true)).SetText(_scriptLines) }
+ _copyScriptInput.Image = Gtk.Image (Stock.Copy, Gtk.IconSize.Menu)
+
+ _saveScriptToFile = ImageMenuItem (GettextCatalog.GetString ("Save Script As ..."))
+ _saveScriptToFile.Image = Gtk.Image (Stock.SaveAs, Gtk.IconSize.Menu)
+ _saveScriptToFile.Activated += OnSaveScript
+
+ _reset = ImageMenuItem (GettextCatalog.GetString ("Reset Shell"))
+ _reset.Image = Gtk.Image (Stock.Clear, Gtk.IconSize.Menu)
+ _reset.Activated += def():
+ if Model.Reset():
+ resetGui()
+
+ if _scriptLines.Length <= 0:
+ _copyScriptInput.Sensitive = false
+ _saveScriptToFile.Sensitive = false
+ _reset.Sensitive = false
+
+ _sep = Gtk.SeparatorMenuItem()
+ menu.Prepend(_sep)
+ menu.Prepend(_copyScriptInput)
+ menu.Prepend(_saveScriptToFile)
+ menu.Prepend(_reset)
+
+ _sep.Show()
+ _copyScriptInput.Show()
+ _saveScriptToFile.Show()
+ _reset.Show()
+
+ override def OnKeyPressEvent (ev as Gdk.EventKey):
+ // Short circuit to avoid getting moved back to the input line
+ // when paging up and down in the shell output
+ if ev.Key in Gdk.Key.Page_Up, Gdk.Key.Page_Down:
+ return super (ev)
+
+ // Needed so people can copy and paste, but always end up
+ // typing in the prompt.
+ if Cursor.Compare (InputLineBegin) < 0:
+ Buffer.MoveMark (Buffer.SelectionBound, InputLineEnd)
+ Buffer.MoveMark (Buffer.InsertMark, InputLineEnd)
+
+ if ev.Key == Gdk.Key.Return:
+ if _inBlock:
+ if InputLine == "":
+ processInput (_blockText)
+ _blockText = ""
+ _inBlock = false
+ else:
+ _blockText += "\n${InputLine}"
+ if _auto_indent:
+ _whiteSpace = /^(\s+).*/.Replace(InputLine, "$1")
+ if InputLine.Trim()[-1:] == ":":
+ _whiteSpace += "\t"
+ prompt (true, true)
+ if _auto_indent:
+ InputLine += "${_whiteSpace}"
+ else:
+ // Special case for start of new code block
+ if InputLine.Trim()[-1:] == ":":
+ _inBlock = true;
+ _blockText = InputLine
+ prompt (true, true)
+ if _auto_indent:
+ InputLine += "\t"
+ return true
+
+ // Bookkeeping
+ if InputLine != "":
+ // Everything but the last item (which was input),
+ //in the future stack needs to get put back into the
+ // past stack
+ while _commandHistoryFuture.Count > 1:
+ _commandHistoryPast.Push(cast(string,_commandHistoryFuture.Pop()))
+ // Clear the pesky junk input line
+ _commandHistoryFuture.Clear()
+
+ // Record our input line
+ _commandHistoryPast.Push(InputLine)
+ if _scriptLines == "":
+ _scriptLines += "${InputLine}"
+ else:
+ _scriptLines += "\n${InputLine}"
+
+ processInput (InputLine)
+ return true
+
+ // The next two cases handle command history
+ elif ev.Key == Gdk.Key.Up:
+ if (not _inBlock) and _commandHistoryPast.Count > 0:
+ if _commandHistoryFuture.Count == 0:
+ _commandHistoryFuture.Push(InputLine);
+ else:
+ if _commandHistoryPast.Count == 1:
+ return true
+ _commandHistoryFuture.Push(cast(string,_commandHistoryPast.Pop()))
+ InputLine = cast (string, _commandHistoryPast.Peek())
+ return true
+
+ elif ev.Key == Gdk.Key.Down:
+ if (not _inBlock) and _commandHistoryFuture.Count > 0:
+ if _commandHistoryFuture.Count == 1:
+ InputLine = cast(string, _commandHistoryFuture.Pop())
+ else:
+ _commandHistoryPast.Push (cast(string,_commandHistoryFuture.Pop()))
+ InputLine = cast (string, _commandHistoryPast.Peek())
+ return true
+
+ elif ev.Key == Gdk.Key.Left:
+ // Keep our cursor inside the prompt area
+ if Cursor.Compare (InputLineBegin) <= 0:
+ return true
+
+ elif ev.Key == Gdk.Key.Home:
+ Buffer.MoveMark (Buffer.InsertMark, InputLineBegin)
+ // Move the selection mark too, if shift isn't held
+ if (ev.State & Gdk.ModifierType.ShiftMask) == ev.State:
+ Buffer.MoveMark (Buffer.SelectionBound, InputLineBegin)
+ return true
+
+ // Short circuit to avoid getting moved back to the input line
+ // when paging up and down in the shell output
+ elif ev.Key in Gdk.Key.Page_Up, Gdk.Key.Page_Down:
+ return super (ev)
+
+ return super (ev)
+
+ #endregion
+
+ #region Public getters for useful values
+ public InputLineBegin as TextIter:
+ get:
+ iter = Buffer.GetIterAtLine(Buffer.LineCount)
+ // Really should be either _promptRegular or Multiline, but
+ // those are the same length
+ iter.ForwardChars(_promptRegular.Length)
+ return iter
+
+ public InputLineEnd as TextIter:
+ get:
+ return Buffer.EndIter
+
+ private Cursor as TextIter:
+ get:
+ return Buffer.GetIterAtMark (Buffer.InsertMark)
+ #endregion
+
+ // The current input line
+ public InputLine as string:
+ get:
+ return Buffer.GetText (InputLineBegin, InputLineEnd, false)
+ set:
+ start = InputLineBegin
+ end = InputLineEnd
+ Buffer.Delete (start, end)
+ start = InputLineBegin
+ Buffer.Insert (start, value)
+
+ #region local private methods
+ private def processInput (line as string):
+ // Send our input out to be processed by the model
+ // and handle any output received in return
+ _results = self.Model.ProcessInput (line)
+ if _results:
+ for line as string in _results:
+ processOutput (line)
+ prompt(true)
+
+ private def processOutput (line as string):
+ end = Buffer.EndIter
+ Buffer.Insert (end , "\n${line}")
+
+ private def prompt (newLine as bool):
+ prompt (newLine, false)
+
+ private def prompt (newLine as bool, multiline as bool):
+ end = Buffer.EndIter
+ if newLine:
+ Buffer.Insert (end , "\n")
+ if multiline:
+ Buffer.Insert (end , "${_promptMultiline}")
+ else:
+ Buffer.Insert (end , "${_promptRegular}")
+
+ Buffer.PlaceCursor (Buffer.EndIter)
+ ScrollMarkOnscreen(Buffer.InsertMark)
+ // Freeze all the text except our input line
+ Buffer.ApplyTag(Buffer.TagTable.Lookup("Freezer"), Buffer.StartIter, InputLineBegin)
+
+ private def resetGui():
+ if _reset_clears_scrollback:
+ Buffer.Text = ""
+ if _reset_clears_history:
+ _commandHistoryFuture.Clear()
+ _commandHistoryPast.Clear()
+
+ _scriptLines = ""
+ prompt(not _reset_clears_scrollback)
+
+ // FIXME: Make my FileChooser use suck less
+ private def OnSaveScript():
+ _sel = FileSelector("Save Script ...", FileChooserAction.Save)
+ _sel.Run()
+ if _sel.Filename:
+ _sel.Hide()
+ _path = _sel.Filename
+ TextFile.WriteFile (_path, _scriptLines)
+ else:
+ _sel.Hide()
+
+ def OnPropertyChanged (obj as object, e as PropertyEventArgs):
+ if e.Key == "Font":
+ self.ModifyFont(Model.Properties.Font)
+ elif e.Key == "AutoIndentBlocks":
+ _auto_indent = Model.Properties.AutoIndentBlocks
+ elif e.Key == "ResetClearsScrollback":
+ _reset_clears_scrollback = Model.Properties.ResetClearsScrollback
+ elif e.Key == "ResetClearsHistory":
+ _reset_clears_history = Model.Properties.ResetClearsHistory
+
+ return
+
+ #endregion
Added: trunk/MonoDevelop/Extras/BooBinding/Makefile.am
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Makefile.am 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Makefile.am 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,91 @@
+
+ADDIN_BUILD = $(top_builddir)/build/AddIns/BackendBindings
+ASSEMBLY = $(ADDIN_BUILD)/BooBinding.dll
+
+DLLS = -r:System.Drawing \
+ -r:System.Xml \
+ -r:$(top_builddir)/build/bin/MonoDevelop.Core.dll \
+ -r:$(top_builddir)/build/bin/MonoDevelop.SourceEditor.dll \
+ -r:$(top_builddir)/build/bin/MonoDevelop.Base.dll \
+ -r:$(top_builddir)/build/bin/ICSharpCode.SharpRefactory.dll \
+ -r:$(top_builddir)/build/bin/MonoDevelop.Gui.Widgets.dll \
+ $(BOO_LIBS) \
+ $(GTK_SHARP_LIBS) \
+ $(GCONF_SHARP_LIBS) \
+ $(GTKSOURCEVIEW_SHARP_LIBS)
+
+FILES = \
+Gui/ShellTextView.boo \
+Gui/IShellModel.boo \
+Gui/BooShellModel.boo \
+Gui/OptionPanels/CodeCompilationPanel.boo \
+Gui/OptionPanels/GeneralShellPanel.boo \
+Gui/OptionPanels/GeneralBooShellPanel.boo \
+Project/BooCompilerParameters.boo \
+Properties/ShellProperties.boo \
+Properties/BooShellProperties.boo \
+BooBindingCompilerServices.boo \
+BooAmbience.boo \
+BooShellPadContent.boo \
+BooCompiler.boo \
+BooLanguageBinding.boo \
+Parser/BooParser.boo \
+Parser/Resolver.boo \
+Parser/TypeMembers.boo \
+Parser/ExpressionFinder.boo \
+Parser/ReturnType.boo \
+Parser/VariableLookupVisitor.boo \
+Parser/ExpressionTypeVisitor.boo \
+Parser/Tree.boo \
+Parser/Visitor.boo
+
+TEMPLATES = \
+templates/BooGtkSharpProject.xpt.xml \
+templates/BooGtkSharpWindow.xft.xml \
+templates/EmptyBooFile.xft.xml \
+templates/EmptyBooProject.xpt.xml
+
+build_sources = $(addprefix $(srcdir)/, $(FILES))
+
+ADDIN = BooBinding.addin.xml
+
+
+TEMPLATES_DIR = $(ADDIN_BUILD)/templates
+
+build_TEMPLATES = $(addprefix $(TEMPLATES_DIR)/, $(notdir $(TEMPLATES)))
+
+src_TEMPLATES = $(addprefix $(srcdir)/, $(TEMPLATES))
+
+if ENABLE_BOO
+all: $(ASSEMBLY) $(ADDIN_BUILD)/$(ADDIN) $(build_TEMPLATES)
+else
+all:
+endif
+
+$(filter %.xft.xml, $(build_TEMPLATES)): $(TEMPLATES_DIR)/%.xft.xml: $(srcdir)/templates/%.xft.xml
+ mkdir -p $(TEMPLATES_DIR)
+ cp $(srcdir)/templates/$(notdir $@) $@
+
+$(filter %.xpt.xml, $(build_TEMPLATES)): $(TEMPLATES_DIR)/%.xpt.xml: $(srcdir)/templates/%.xpt.xml
+ mkdir -p $(TEMPLATES_DIR)
+ cp $(srcdir)/templates/$(notdir $@) $@
+
+$(ADDIN_BUILD)/$(ADDIN): $(srcdir)/$(ADDIN)
+ mkdir -p $(ADDIN_BUILD)
+ cp $(srcdir)/$(ADDIN) $(ADDIN_BUILD)/.
+
+$(ASSEMBLY): $(FILES)
+ mkdir -p $(ADDIN_BUILD)
+ $(BOOC) $(DLLS) $(build_sources) -o:$@ -t:library
+
+if ENABLE_BOO
+assemblydir = $(libdir)/monodevelop/AddIns/BackendBindings
+assembly_DATA = $(ASSEMBLY) $(ADDIN)
+
+templatedir = $(assemblydir)/templates
+template_DATA = $(TEMPLATES)
+endif
+
+CLEANFILES = $(ASSEMBLY) $(ASSEMBLY).mdb
+EXTRA_DIST = $(FILES) $(ADDIN) $(TEMPLATES)
+
Added: trunk/MonoDevelop/Extras/BooBinding/Parser/BooParser.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Parser/BooParser.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Parser/BooParser.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,166 @@
+#region license
+// Copyright (c) 2004-2005, Daniel Grunwald (daniel at danielgrunwald.de)
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// The BooBinding.Parser code is originally that of Daniel Grunwald
+// (daniel at danielgrunwald.de) from the SharpDevelop BooBinding. The code has
+// been imported here, and modified, including, but not limited to, changes
+// to function with MonoDevelop, additions, refactorings, etc.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding.Parser
+
+import System
+import System.Collections
+import System.Diagnostics
+import System.IO
+import MonoDevelop.Services
+import MonoDevelop.Internal.Project
+import MonoDevelop.Internal.Parser
+import Boo.Lang.Compiler
+import Boo.Lang.Compiler.IO
+import Boo.Lang.Compiler.Pipelines
+import Boo.Lang.Compiler.Steps
+
+class BooParser(IParser):
+ private _lexerTags as (string)
+
+ LexerTags as (string):
+ get:
+ return _lexerTags
+ set:
+ _lexerTags = value
+
+ ExpressionFinder as IExpressionFinder:
+ get:
+ return BooBinding.Parser.ExpressionFinder()
+
+ def CanParse(fileName as string):
+ return Path.GetExtension(fileName).ToLower() == ".boo"
+
+ def CanParse(project as Project):
+ return project.ProjectType == BooBinding.BooLanguageBinding.LanguageName
+
+ def Parse(fileName as string) as ICompilationUnitBase:
+ /*
+ compiler = BooCompiler()
+ compiler.Parameters.Input.Add(FileInput(fileName))
+ return Parse(fileName, compiler)
+ */
+ content as string
+ using r = StreamReader(fileName):
+ content = r.ReadToEnd()
+ return Parse(fileName, content)
+
+ def Parse(fileName as string, fileContent as string) as ICompilationUnitBase:
+ //print "Parse ${fileName} with content"
+
+ cr = '\r'[0]
+ ln = '\n'[0]
+ linecount = 1
+ for c as Char in fileContent:
+ linecount += 1 if c == ln
+ lineLength = array(int, linecount)
+ length = 0
+ i = 0
+ for c as Char in fileContent:
+ if c == ln:
+ lineLength[i] = length
+ i += 1
+ length = 0
+ elif c != cr:
+ length += 1
+ lineLength[i] = length
+
+ compiler = BooCompiler()
+ compiler.Parameters.Input.Add(StringInput(fileName, fileContent))
+ return Parse(fileName, lineLength, compiler)
+
+ private def Parse(fileName as string, lineLength as (int), compiler as BooCompiler):
+ compiler.Parameters.OutputWriter = StringWriter()
+ compiler.Parameters.TraceSwitch.Level = TraceLevel.Warning;
+
+ compilePipe = Compile()
+ parsingStep as Boo.Lang.Parser.BooParsingStep = compilePipe[0]
+ parsingStep.TabSize = 1
+ num = compilePipe.Find(typeof(StricterErrorChecking))
+ // Original cut out from this place onward, but this caused
+ // problems with [Property(A)]\na\n type properties
+ // and trying to figure out the types.
+ // What did we break by doing this extra Step?
+ //num = compilePipe.Find(typeof(ProcessMethodBodiesWithDuckTyping))
+ visitor = Visitor(LineLength:lineLength)
+ for c as IClass in visitor.Cu.Classes:
+ c.Region.FileName = fileName
+ compilePipe[num] = visitor
+ // Remove unneccessary compiler steps
+ while compilePipe.Count > num + 1:
+ compilePipe.RemoveAt(compilePipe.Count - 1)
+ num = compilePipe.Find(typeof(TransformCallableDefinitions))
+ compilePipe.RemoveAt(num)
+
+ //for i in range(compilePipe.Count):
+ // print compilePipe[i].ToString()
+
+ compilePipe.BreakOnErrors = false
+ compiler.Parameters.Pipeline = compilePipe
+
+ try:
+ compiler.Run()
+ // somehow the SD parser thread goes into an endless loop if this flag is not set
+ visitor.Cu.ErrorsDuringCompile = true //context.Errors.Count > 0
+ except e:
+ //ShowException(e)
+ print "ShowException ${e}"
+ return visitor.Cu
+
+ def CtrlSpace(parserService as IParserService, project as Project, caretLine as int, caretColumn as int, fileName as string) as ArrayList:
+ //print "Ctrl-Space (${caretLine}/${caretColumn})"
+ try:
+ return Resolver(project).CtrlSpace(parserService, caretLine, caretColumn, fileName)
+ except e:
+ //ShowException(e)
+ return null
+
+ def IsAsResolve (parserService as IParserService , project as Project , expression as string , caretLineNumber as int , caretColumn as int , fileName as string , fileContent as string ) as ArrayList:
+ return Resolver (project).IsAsResolve (parserService, expression, caretLineNumber, caretColumn, fileName, fileContent)
+
+ def Resolve(parserService as IParserService, project as Project, expression as string, caretLineNumber as int, caretColumn as int, fileName as string, fileContent as string) as ResolveResult:
+ //print "Resolve ${expression} (${caretLineNumber}/${caretColumn})"
+ try:
+ return Resolver(project).Resolve(parserService, expression, caretLineNumber, caretColumn, fileName, fileContent)
+ except e:
+ //ShowException(e)
+ return null
+
+ def MonodocResolver(parserService as IParserService, project as Project, expression as string, caretLineNumber as int, caretColumn as int, fileName as string, fileContent as string) as string:
+ //print "MonodocResolver ${expression} (${caretLineNumber}/${caretColumn})"
+ try:
+ return Resolver(project).MonodocResolver(parserService, expression, caretLineNumber, caretColumn, fileName, fileContent)
+ except e:
+ //ShowException(e)
+ return null
+
+ /*
+ static def ShowException(e as Exception):
+ //messageService as IMessageService = ServiceManager.Services.GetService(typeof(IMessageService))
+ //messageService.ShowError(e.ToString())
+ retur
+ */
+
+
Added: trunk/MonoDevelop/Extras/BooBinding/Parser/ExpressionFinder.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Parser/ExpressionFinder.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Parser/ExpressionFinder.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,214 @@
+#region license
+// Copyright (c) 2004-2005, Daniel Grunwald (daniel at danielgrunwald.de)
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// The BooBinding.Parser code is originally that of Daniel Grunwald
+// (daniel at danielgrunwald.de) from the SharpDevelop BooBinding. The code has
+// been imported here, and modified, including, but not limited to, changes
+// to function with MonoDevelop, additions, refactorings, etc.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding.Parser
+
+import System
+import System.Text
+import MonoDevelop.Internal.Parser
+
+class ExpressionFinder(IExpressionFinder):
+ // The expression finder can find an expression in a text
+ // inText is the full source code, offset the cursor position
+
+ // example: "_var = 'bla'\n_var^\nprint _var"
+ // where ^ is the cursor position
+ // in that simple case the expression finder should return 'n_var'.
+
+ // but also complex expressions like
+ // 'filename.Substring(filename.IndexOf("var="))'
+ // should be returned if the cursor is after the last ).
+
+ // implementation note: the text after offset is irrelevant, so
+ // every operation on the string aborts after reaching offset
+
+ static _closingBrackets = '}])'
+ static _openingBrackets = '{[('
+
+ def FindExpression(inText as string, offset as int) as string:
+ return null if inText == null
+ print "Trying quickfind for ${offset}"
+ // OK, first try a kind of "quick find"
+ i = offset + 1
+ forbidden = '"\'/#)]}'
+ finish = '([{=+*<,:'
+ start = -1
+ while i > 0:
+ i -= 1
+ c = inText[i]
+ if finish.IndexOf(c) >= 0:
+ start = i + 1
+ break
+ if forbidden.IndexOf(c) >= 0:
+ print "Quickfind failed: got ${c}"
+ break
+ if Char.IsWhiteSpace(c):
+ if i > 6 and inText.Substring(i - 6, 6) == "import":
+ i -= 7 // include 'import' in the expression
+ start = i + 1
+ break
+ if start >= 0:
+ if CheckString(inText, start, '/#"\'', '\r\n'):
+ return GetExpression(inText, start, offset + 1)
+
+ inText = SimplifyCode(inText, offset)
+ if inText == null:
+ print 'SimplifyCode returned null (cursor is in comment/string???)'
+ return null
+ // inText now has no comments or string literals, but the same meaning in
+ // terms of the type system
+ // Now go back until a finish-character or a whitespace character
+ bracketStack = StringBuilder() // use Stack<char> instead in .NET 2.0
+ i = inText.Length
+ while i > 0:
+ i -= 1
+ c = inText[i]
+ if bracketStack.Length == 0 and (finish.IndexOf(c) >= 0 or Char.IsWhiteSpace(c)):
+ return GetExpression(inText, i + 1, inText.Length)
+ if _closingBrackets.IndexOf(c) >= 0:
+ bracketStack.Append(c)
+ bracket = _openingBrackets.IndexOf(c)
+ if bracket >= 0:
+ while Pop(bracketStack) > bracket:
+ pass
+
+ return null
+
+ private def CheckString(text as string, offset as int, forbidden as string, finish as string):
+ i = offset
+ while i > 0:
+ i -= 1
+ c = text[i]
+ return false if forbidden.IndexOf(c) >= 0
+ return true if finish.IndexOf(c) >= 0
+ return true
+
+ private def Pop(bracketStack as StringBuilder):
+ return -1 if bracketStack.Length == 0
+ c = bracketStack[bracketStack.Length - 1]
+ bracketStack.Length -= 1
+ return _closingBrackets.IndexOf(c)
+
+ private def GetExpression(inText as string, start as int, end as int):
+ b = StringBuilder()
+ wasSpace = true
+ i = start
+ while i < end:
+ c = inText[i]
+ if Char.IsWhiteSpace(c):
+ b.Append(' ') unless wasSpace
+ wasSpace = true
+ else:
+ wasSpace = false
+ b.Append(c)
+ i += 1
+ print "Expression is '${b}'"
+ return b.ToString().Trim()
+
+ // this method makes boo source code "simpler" by removing all comments
+ // and replacing all types of strings through string.Empty.
+
+ // TODO: We could need some unit tests for this.
+
+ static _elseIndex = 10
+
+ static _stateTable = ( // " ' \ \n $ { } # / * else
+ /* 0: in Code */ ( 1 , 7 , 0 , 0 , 0 , 0 , 0 , 13 , 12 , 0 , 0 ),
+ /* 1: after " */ ( 2 , 6 , 10 , 0 , 8 , 6 , 6 , 6 , 6 , 6 , 6 ),
+ /* 2: after "" */ ( 3 , 7 , 0 , 0 , 0 , 0 , 0 , 13 , 12 , 0 , 0 ),
+ /* 3: in """ */ ( 4 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 ),
+ /* 4: in """, " */ ( 5 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 ),
+ /* 5: in """, "" */ ( 0 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 , 3 ),
+ /* 6: in "-string */ ( 0 , 6 , 10 , 0 , 8 , 6 , 6 , 6 , 6 , 6 , 6 ),
+ /* 7: in '-string */ ( 7 , 0 , 11 , 0 , 7 , 7 , 7 , 7 , 7 , 7 , 7 ),
+ /* 8: after $ in " */ ( 0 , 6 , 10 , 0 , 8 , 9 , 6 , 6 , 6 , 6 , 6 ),
+ /* 9: in "{ */ ( 9 , 9 , 9 , 9 , 9 , 9 , 6 , 9 , 9 , 9 , 9 ),
+ /* 10: after \ in " */ ( 6 , 6 , 6 , 0 , 6 , 6 , 6 , 6 , 6 , 6 , 6 ),
+ /* 11: after \ in ' */ ( 7 , 7 , 7 , 0 , 7 , 7 , 7 , 7 , 7 , 7 , 7 ),
+ /* 12: after / */ ( 1 , 7 , 0 , 0 , 0 , 0 , 0 , 0 , 13 ,-14 , 0 ),
+ /* 13: line comment */ ( 13 , 13 , 13 , 0 , 13 , 13 , 13 , 13 , 13 , 13 , 13 ),
+ /* 14: block comment*/ ( 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 , 15 , 14 ),
+ /* 15: after * in bc*/ ( 14 , 14 , 14 , 14 , 14 , 14 , 14 , 14 ,-15 , 15 , 14 )
+ )
+
+ def SimplifyCode(inText as string, offset as int):
+ result = StringBuilder()
+ inStringResult = StringBuilder(' ')
+ state = 0
+ commentblocks = 0
+ inputTable = array(int, 128)
+ for i in range(128):
+ inputTable[i] = _elseIndex
+ inputTable[ 34] = 0 // "
+ inputTable[ 39] = 1 // '
+ inputTable[ 92] = 2 // \
+ inputTable[ 10] = 3 // \n
+ inputTable[ 13] = 3 // \r
+ inputTable[ 36] = 4 // $
+ inputTable[123] = 5 // {
+ inputTable[125] = 6 // }
+ inputTable[ 35] = 7 // #
+ inputTable[ 47] = 8 // /
+ inputTable[ 42] = 9 // *
+ for i in range(offset + 1):
+ c as Char = inText[i]
+ // TODO: Direct char->int conversion
+ charNum as int = Encoding.ASCII.GetBytes((c,))[0]
+ if charNum > 127:
+ input = _elseIndex
+ else:
+ input = inputTable[charNum]
+ action = _stateTable[state][input]
+ if action == -14:
+ // enter block comment
+ commentblocks += 1
+ state = 14
+ elif action == -15:
+ // leave block comment
+ commentblocks -= 1
+ if commentblocks == 0:
+ state = 0
+ else:
+ state = 14
+ elif action == 9:
+ if state == 9:
+ inStringResult.Append(c)
+ else:
+ inStringResult.Length = 1
+ state = action
+ elif action == 0 or action == 12:
+ if state == 2 or (state >= 6 and state <= 11):
+ result.Append("string.Empty")
+ if state == 0 or state == 2 or state == 12:
+ result.Append(c)
+ state = action
+ else:
+ state = action
+ if state == 0 or state == 2 or state == 12:
+ return result.ToString()
+ elif state == 9:
+ return inStringResult.ToString()
+ else:
+ return null
Added: trunk/MonoDevelop/Extras/BooBinding/Parser/ExpressionTypeVisitor.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Parser/ExpressionTypeVisitor.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Parser/ExpressionTypeVisitor.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,268 @@
+#region license
+// Copyright (c) 2004-2005, Daniel Grunwald (daniel at danielgrunwald.de)
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// The BooBinding.Parser code is originally that of Daniel Grunwald
+// (daniel at danielgrunwald.de) from the SharpDevelop BooBinding. The code has
+// been imported here, and modified, including, but not limited to, changes
+// to function with MonoDevelop, additions, refactorings, etc.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding.Parser
+
+import System
+import System.Collections
+import MonoDevelop.Internal.Parser
+import Boo.Lang.Compiler.Ast
+
+class ExpressionTypeVisitor(DepthFirstVisitor):
+ protected override def OnError(node as Node, error as Exception):
+ //BooParser.ShowException(error)
+ super(node, error)
+
+ [Property(ReturnType)]
+ _returnType as IReturnType
+
+ [Property(ReturnClass)]
+ _returnClass as IClass
+
+ [Property(Resolver)]
+ _resolver as Resolver
+
+ private def CreateReturnType(fullClassName as string):
+ _returnClass = null
+ if fullClassName == null:
+ _returnType = null
+ else:
+ print "CreateReturnType: type set to ${fullClassName}"
+ _returnType = BooBinding.Parser.ReturnType(fullClassName)
+
+ private def CreateReturnType(reference as TypeReference):
+ _returnClass = null
+ if reference == null:
+ _returnType = null
+ else:
+ _returnType = BooBinding.Parser.ReturnType(reference)
+
+ private def CreateReturnType(c as IClass):
+ _returnClass = c
+ if c == null:
+ _returnType = null
+ else:
+ _returnType = BooBinding.Parser.ReturnType(c)
+
+ private def SetReturnType(r as IReturnType):
+ _returnClass = null
+ _returnType = r
+
+ private def Debug(node):
+ if node == null:
+ print "-- null --"
+ else:
+ print "${node.ToString()} - ${node.GetType().FullName}"
+
+ override def OnCallableBlockExpression(node as CallableBlockExpression):
+ Debug(node)
+ CreateReturnType("System.Delegate")
+
+ override def OnMethodInvocationExpression(node as MethodInvocationExpression):
+ Debug(node)
+ Debug(node.Target)
+ if node.Target isa MemberReferenceExpression:
+ // call a method on another object
+ mre as MemberReferenceExpression = node.Target
+ Visit(mre.Target)
+ if _returnClass == null and _returnType != null:
+ _returnClass = _resolver.SearchType(_returnType.FullyQualifiedName)
+ return if ProcessMethod(node, mre.Name, _returnClass)
+ // try if the MemberReferenceExpression is a fully qualified class name (constructor call)
+ ProcessMemberReferenceExpression(mre.Name)
+ CreateReturnType(_returnClass)
+ elif node.Target isa ReferenceExpression:
+ re as ReferenceExpression = node.Target
+ // try if it is a method on the current object
+ return if ProcessMethod(node, re.Name, _resolver.CallingClass)
+ // try if it is a builtin method
+ return if ProcessMethod(node, re.Name, _resolver.BuiltinClass)
+ // try if it is a class name -> constructor
+ CreateReturnType(_resolver.SearchType(re.Name))
+ else:
+ SetReturnType(null)
+
+ private def ProcessMethod(node as MethodInvocationExpression, name as string, c as IClass) as bool:
+ return false if c == null
+ possibleOverloads = FindMethods(c, name, node.Arguments.Count)
+ print "found ${possibleOverloads.Count} overloads (multiple overloads not supported yet)"
+ if possibleOverloads.Count >= 1:
+ SetReturnType(cast(IMethod, possibleOverloads[0]).ReturnType)
+ return true
+ /*// find best overload
+ argumentTypes = array(IReturnType, node.Arguments.Count)
+ for i as int in range(argumentTypes.Length):
+ Visit(node.Arguments[i])
+ argumentTypes[i] = _returnType
+ ...
+ */
+ return false
+
+ private def FindMethods(c as IClass, name as string, arguments as int):
+ possibleOverloads = ArrayList()
+ //for cl as IClass in c.ClassInheritanceTree:
+ for cl as IClass in _resolver.ParserService.GetClassInheritanceTree(_resolver.Project, c):
+ for m as IMethod in cl.Methods:
+ if m.Parameters.Count == arguments and name == m.Name:
+ possibleOverloads.Add(m)
+ return possibleOverloads
+
+ override def OnSlicingExpression(node as SlicingExpression):
+ Debug(node)
+ Visit(node.Target)
+ slice as Slice = node.Indices[0]
+ if (slice.End != null):
+ // Boo slice, returns a part of the source -> same type as source
+ return
+ if _returnType != null and _returnType.ArrayDimensions != null and _returnType.ArrayDimensions.Length > 0:
+ SetReturnType(BooBinding.Parser.ReturnType(_returnType.FullyQualifiedName, _returnType.ArrayDimensions[0 : _returnType.ArrayDimensions.Length - 1], 0))
+ return
+ if _returnClass == null and _returnType != null:
+ _returnClass = _resolver.SearchType(_returnType.FullyQualifiedName)
+ if _returnClass != null:
+ indexers = FindIndexer(_returnClass, 1)
+ if indexers.Count > 0:
+ SetReturnType(cast(IIndexer, indexers[0]).ReturnType)
+ return
+ SetReturnType(null)
+
+ private def FindIndexer(c as IClass, arguments as int):
+ possibleOverloads = ArrayList()
+ //for cl as IClass in c.ClassInheritanceTree:
+ for cl as IClass in _resolver.ParserService.GetClassInheritanceTree(_resolver.Project, c):
+ for m as IIndexer in cl.Indexer:
+ if m.Parameters.Count == arguments:
+ possibleOverloads.Add(m)
+ return possibleOverloads
+
+ override def OnBinaryExpression(node as BinaryExpression):
+ Debug(node)
+ CombineTypes(node.Left, node.Right)
+
+ override def OnTernaryExpression(node as TernaryExpression):
+ Debug(node)
+ CombineTypes(node.TrueValue, node.FalseValue)
+
+ private def CombineTypes(a as Expression, b as Expression):
+ Visit(a)
+
+ override def OnReferenceExpression(node as ReferenceExpression):
+ // Resolve reference (to a variable, field, parameter or type)
+ rt = _resolver.GetTypeFromLocal(node.Name)
+ if rt != null:
+ SetReturnType(rt)
+
+ return if ProcessMember(node.Name, _resolver.CallingClass)
+ if _resolver.IsNamespace(node.Name):
+ SetReturnType(NamespaceReturnType(node.Name))
+ else:
+ CreateReturnType(_resolver.SearchType(node.Name))
+
+ override def OnMemberReferenceExpression(node as MemberReferenceExpression):
+ Debug(node)
+ Visit(node.Target)
+ ProcessMemberReferenceExpression(node.Name)
+
+ private def ProcessMemberReferenceExpression(name as string):
+ """Gets the return type of the MemberReferenceExpression with the specified name
+ on the current return type."""
+ if _returnType isa NamespaceReturnType:
+ name = _returnType.FullyQualifiedName + '.' + name
+ if _resolver.IsNamespace(name):
+ SetReturnType(NamespaceReturnType(name))
+ else:
+ CreateReturnType(_resolver.SearchType(name))
+ return
+ if _returnClass == null and _returnType != null:
+ _returnClass = _resolver.SearchType(_returnType.FullyQualifiedName)
+ return if ProcessMember(name, _returnClass)
+ SetReturnType(null)
+
+ private def ProcessMember(name as string, parentClass as IClass):
+ return false if parentClass == null
+ for cl as IClass in _resolver.ParserService.GetClassInheritanceTree(_resolver.Project, parentClass):
+ for c as IClass in cl.InnerClasses:
+ if c.Name == name:
+ CreateReturnType(c)
+ return true
+ for f as IField in cl.Fields:
+ if f.Name == name:
+ SetReturnType(f.ReturnType)
+ return true
+ for p as IProperty in cl.Properties:
+ if p.Name == name:
+ print "ProcessMember: Set property return type to ${p.ReturnType}"
+ SetReturnType(p.ReturnType)
+ return true
+ for m as IMethod in cl.Methods:
+ if m.Name == name:
+ CreateReturnType("System.Delegate")
+ return true
+ return false
+
+ override def OnTimeSpanLiteralExpression(node as TimeSpanLiteralExpression):
+ CreateReturnType("System.TimeSpan")
+
+ override def OnIntegerLiteralExpression(node as IntegerLiteralExpression):
+ CreateReturnType("System.Int32")
+
+ override def OnDoubleLiteralExpression(node as DoubleLiteralExpression):
+ CreateReturnType("System.Double")
+
+ override def OnNullLiteralExpression(node as NullLiteralExpression):
+ CreateReturnType("System.Object")
+
+ override def OnStringLiteralExpression(node as StringLiteralExpression):
+ CreateReturnType("System.String")
+
+ override def OnSelfLiteralExpression(node as SelfLiteralExpression):
+ CreateReturnType(_resolver.CallingClass)
+
+ override def OnSuperLiteralExpression(node as SuperLiteralExpression):
+ CreateReturnType(_resolver.ParentClass)
+
+ override def OnBoolLiteralExpression(node as BoolLiteralExpression):
+ CreateReturnType("System.Boolean")
+
+ override def OnRELiteralExpression(node as RELiteralExpression):
+ CreateReturnType("System.Text.RegularExpressions.Regex")
+
+ override def OnHashLiteralExpression(node as HashLiteralExpression):
+ CreateReturnType("System.Collections.Hashtable")
+
+ override def OnListLiteralExpression(node as ListLiteralExpression):
+ CreateReturnType("System.Collections.ArrayList")
+
+ override def OnArrayLiteralExpression(node as ArrayLiteralExpression):
+ CreateReturnType("System.Array")
+
+ override def OnAsExpression(node as AsExpression):
+ CreateReturnType(node.Type)
+
+ override def OnCastExpression(node as CastExpression):
+ CreateReturnType(node.Type)
+
+ override def OnTypeofExpression(node as TypeofExpression):
+ CreateReturnType("System.Type")
Added: trunk/MonoDevelop/Extras/BooBinding/Parser/Resolver.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Parser/Resolver.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Parser/Resolver.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,467 @@
+#region license
+// Copyright (c) 2004-2005, Daniel Grunwald (daniel at danielgrunwald.de)
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// The BooBinding.Parser code is originally that of Daniel Grunwald
+// (daniel at danielgrunwald.de) from the SharpDevelop BooBinding. The code has
+// been imported here, and modified, including, but not limited to, changes
+// to function with MonoDevelop, additions, refactorings, etc.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding.Parser
+
+import BooBinding
+import System
+import System.Collections
+import System.Diagnostics
+import System.IO
+import MonoDevelop.Services
+import MonoDevelop.Internal.Parser
+import MonoDevelop.Internal.Project
+import Boo.Lang.Compiler
+import Boo.Lang.Compiler.Ast as AST
+import Boo.Lang.Compiler.IO
+import Boo.Lang.Compiler.Steps
+
+class Resolver:
+ [Getter(ParserService)]
+ _parserService as IParserService
+
+ _caretLine as int
+ _caretColumn as int
+
+ [Getter(Project)]
+ _project as Project
+
+ [Getter(CallingClass)]
+ _callingClass as IClass
+ _compilationUnit as ICompilationUnit
+
+ [Property(ShowStatic)]
+ _showStatic as bool
+
+ _parentClass as IClass
+ ParentClass as IClass:
+ get:
+ curClass = GetInnermostClass(_compilationUnit) as IClass
+ return BaseClass(curClass)
+
+ _resolvedMember = false
+ _currentMember as IMember
+
+ CurrentMember as IMember:
+ get:
+ if not _resolvedMember:
+ _resolvedMember = true
+ _currentMember = ResolveCurrentMember()
+ return _currentMember
+
+
+ def constructor ():
+ pass
+
+ def constructor (project as Project):
+ _project = project
+
+ #region Helper methods
+ private def ResolveCurrentMember() as IMember:
+ print "Getting current method... caretLine = ${_caretLine}, caretColumn = ${_caretColumn}"
+ return null if _callingClass == null
+ best as IMember = null
+ line = 0
+ for m as IMember in _callingClass.Methods:
+ if m.Region != null:
+ if m.Region.BeginLine <= _caretLine and m.Region.BeginLine > line:
+ line = m.Region.BeginLine
+ best = m
+ for m as IMember in _callingClass.Properties:
+ if m.Region != null:
+ if m.Region.BeginLine <= _caretLine and m.Region.BeginLine > line:
+ line = m.Region.BeginLine
+ best = m
+ if _callingClass.Region == null:
+ for m as IMember in _callingClass.Methods:
+ if m.Region == null:
+ if best == null or best.Region.EndLine < _caretLine:
+ return m
+ return best
+
+ _localTypes as Hashtable = {}
+
+ def GetTypeFromLocal(name as string) as IReturnType:
+ // gets the type of a local variable or method parameter
+ print "Trying to get local variable ${name}..."
+ return _localTypes[name] if _localTypes.ContainsKey(name)
+ _localTypes[name] = null // prevent stack overflow by caching null first
+ rt = InnerGetTypeFromLocal(name)
+ _localTypes[name] = rt
+ return rt
+
+ def InnerGetTypeFromLocal(name as string) as IReturnType:
+ member = self.CurrentMember
+ Print("member", member)
+ if member isa BooAbstractMethod:
+ method as BooAbstractMethod = member
+ for para as IParameter in method.Parameters:
+ return para.ReturnType if para.Name == name
+ if method.Node != null and method.Node.Body != null:
+ varLookup = VariableLookupVisitor(Resolver: self, LookFor: name)
+ print "Visiting method body..."
+ varLookup.Visit(method.Node.Body)
+ print "Finished visiting method body!"
+ return varLookup.ReturnType
+ elif member isa Property:
+ print "name: ${name}"
+ property as Property = member
+ /*
+ if property.ReturnType isa BooBinding.Parser.InferredReturnType:
+ print "Return type is an inferred, zapping it!"
+ return ReturnType("System.Object")
+ */
+ return property.ReturnType if name == "value"
+ for para as IParameter in property.Parameters:
+ return para.ReturnType if para.Name == name
+ if property.Node != null:
+ varLookup = VariableLookupVisitor(Resolver: self, LookFor: name)
+ // TODO: visit only the correct body
+ print "Visiting property body..."
+ varLookup.Visit(property.Node.Getter) unless property.Node.Getter == null
+ varLookup.Visit(property.Node.Setter) unless property.Node.Setter == null
+ print "Finished visiting property body!"
+ /*
+ if varLookup.ReturnType is null:
+ print "null return type!"
+ return ReturnType("System.Object");
+ */
+ print "ReturnType: ${varLookup.ReturnType}"
+ return varLookup.ReturnType
+ return null
+
+ def SearchType(name as string) as IClass:
+ expandedName = BooAmbience.ReverseTypeConversionTable[name]
+ return _parserService.GetClass(_project, expandedName) if expandedName != null
+ //return _parserService.SearchType(_project, name, _callingClass, _caretLine, _caretColumn)
+ return _parserService.SearchType(_project, name, _callingClass, null)
+
+ builtinClass as IClass
+
+ BuiltinClass as IClass:
+ get:
+ builtinClass = _parserService.GetClass(_project, "Boo.Lang.Builtins") if builtinClass == null
+ return builtinClass
+
+ def IsNamespace(name as string) as bool:
+ return _parserService.NamespaceExists(_project, name)
+
+ #endregion
+
+ #region CtrlSpace-Completion
+ def CtrlSpace(parserService as IParserService, caretLine as int, caretColumn as int, fileName as string) as ArrayList:
+ _parserService = parserService
+ _caretLine = caretLine
+ _caretColumn = caretColumn
+ result = ArrayList(BooAmbience.TypeConversionTable.Values)
+ result.Add("System") // system namespace can be used everywhere
+
+ builtinClass = self.BuiltinClass
+ if builtinClass != null:
+ for method as IMethod in builtinClass.Methods:
+ result.Add(method)
+
+ parseInfo = parserService.GetParseInformation(fileName)
+ cu = parseInfo.MostRecentCompilationUnit as CompilationUnit
+ _compilationUnit = cu
+ if cu != null:
+ curClass = GetInnermostClass(cu) as IClass
+ _callingClass = curClass
+ if curClass != null:
+ result = AddCurrentClassMembers(result, curClass)
+ result.AddRange(parserService.GetNamespaceContents(_project, curClass.Namespace, true, true))
+ for u as IUsing in cu.Usings:
+ if u != null and (u.Region == null or u.Region.IsInside(caretLine, caretColumn)):
+ for name as string in u.Usings:
+ result.AddRange(parserService.GetNamespaceContents(_project, name, true, true))
+ for alias as string in u.Aliases.Keys:
+ result.Add(alias)
+ member = self.CurrentMember
+ Print("member", member)
+ if member != null:
+ varList as Hashtable = null
+ if member isa BooAbstractMethod:
+ method as BooAbstractMethod = member
+ for para as IParameter in method.Parameters:
+ result.Add(Field(para.ReturnType, para.Name, ModifierEnum.Private, null))
+ if method.Node != null:
+ varLookup = VariableListLookupVisitor(Resolver: self)
+ print "Visiting method body..."
+ varLookup.Visit(cast(BooAbstractMethod, member).Node.Body)
+ print "Finished visiting method body!"
+ varList = varLookup.Results
+ elif member isa Property:
+ property as Property = member
+ if property.Node != null:
+ varLookup = VariableListLookupVisitor(Resolver: self)
+ // TODO: visit only the correct body
+ print "Visiting property body..."
+ varLookup.Visit(property.Node.Getter) unless property.Node.Getter == null
+ varLookup.Visit(property.Node.Setter) unless property.Node.Setter == null
+ print "Finished visiting property body!"
+ varList = varLookup.Results
+ if varList != null:
+ for e as DictionaryEntry in varList:
+ result.Add(Field(e.Value, e.Key, ModifierEnum.Private, null))
+ result.AddRange(parserService.GetNamespaceContents(_project, "", true, true))
+ return result
+
+ def AddCurrentClassMembers(result as ArrayList, curClass as IClass) as ArrayList:
+ if self.CurrentMember != null and self.CurrentMember.IsStatic == false:
+ //result = ListMembers(result, curClass, curClass, false)
+ result = ListMembers(result, curClass)
+ // Add static members, but only from this class (not from base classes)
+ for method as IMethod in curClass.Methods:
+ result.Add(method) if (method.Modifiers & ModifierEnum.Static) == ModifierEnum.Static
+ for field as IField in curClass.Fields:
+ result.Add(field) if (field.Modifiers & ModifierEnum.Static) == ModifierEnum.Static
+ for property as IProperty in curClass.Properties:
+ result.Add(property) if (property.Modifiers & ModifierEnum.Static) == ModifierEnum.Static
+ for e as Event in curClass.Events:
+ result.Add(e) if (e.Modifiers & ModifierEnum.Static) == ModifierEnum.Static
+ return result
+ #endregion
+
+ #region IsAsResolve
+
+ def IsAsResolve(parserService as IParserService, expression as string, caretLine as int, caretColumn as int, fileName as string, fileContent as string) as ArrayList:
+ return null
+
+ def MonodocResolver(parserService as IParserService, expression as string, caretLine as int, caretColumn as int, fileName as string, fileContent as string) as string:
+ return null
+
+ #region Resolve CC
+ def Initialize(parserService as IParserService, caretLine as int, caretColumn as int, fileName as string):
+ _parserService = parserService
+ _caretLine = caretLine
+ _caretColumn = caretColumn
+
+ parseInfo = parserService.GetParseInformation(fileName)
+ cu = parseInfo.MostRecentCompilationUnit as CompilationUnit
+ _compilationUnit = cu
+ if _compilationUnit == null:
+ print "BooResolver: No parse information!"
+ return false
+ _callingClass = GetInnermostClass(cu)
+ if _callingClass == null:
+ return false if cu.Classes.Count == 0
+ _callingClass = cu.Classes[cu.Classes.Count - 1]
+ if _callingClass.Region != null:
+ return false if _callingClass.Region.BeginLine > caretLine
+ return true
+
+ def Resolve(parserService as IParserService, expression as string, caretLine as int, caretColumn as int, fileName as string, fileContent as string) as ResolveResult:
+ if expression == null or expression == '':
+ return null
+
+ if expression.StartsWith("import "):
+ expression = expression.Substring(7).Trim()
+ if parserService.NamespaceExists(_project, expression):
+ return ResolveResult(parserService.GetNamespaceList(_project, expression, true, true))
+ return null
+
+ if not Initialize(parserService, caretLine, caretColumn, fileName):
+ return null
+ callingClass = _callingClass
+ returnClass as IClass = null
+ if expression == "self":
+ returnClass = callingClass
+ elif expression == "this":
+ // SharpDevelop uses "this" as expression when requesting method insight information
+ // for a method on the current class
+ returnClass = callingClass
+ elif expression == "super":
+ returnClass = self.ParentClass
+ else:
+ // try looking if the expression is the name of a class
+ expressionClass = self.SearchType(expression)
+ if expressionClass != null:
+ //return ResolveResult(expressionClass, ListMembers(ArrayList(), expressionClass, callingClass, true))
+ return ResolveResult(expressionClass, ListMembers(ArrayList(), expressionClass))
+
+ // try if it is the name of a namespace
+ if parserService.NamespaceExists(_project, expression):
+ return ResolveResult(array(string, 0), parserService.GetNamespaceContents(_project, expression, true, true))
+
+ expr = Boo.Lang.Parser.BooParser.ParseExpression("expression", expression)
+ return null if expr isa AST.IntegerLiteralExpression
+ visitor = ExpressionTypeVisitor(Resolver : self)
+ visitor.Visit(expr)
+ retType = visitor.ReturnType
+ Print ("result", retType)
+ if visitor.ReturnClass != null:
+ returnClass = visitor.ReturnClass
+ elif retType != null:
+ if retType.ArrayDimensions != null and retType.ArrayDimensions.Length > 0:
+ returnClass = self.SearchType("System.Array")
+ else:
+ returnClass = self.SearchType(retType.FullyQualifiedName)
+
+ return null if returnClass == null
+ //return ResolveResult(returnClass, ListMembers(ArrayList(), returnClass, callingClass, false))
+ return ResolveResult(returnClass, ListMembers(ArrayList(), returnClass))
+
+ private def Print(name as string, obj):
+ Console.Write(name)
+ Console.Write(' = ')
+ if obj == null:
+ print('null')
+ else:
+ print("${obj} (${obj.GetType().FullName})")
+ #endregion
+
+ #region Code converted from CSharpBinding/Parser/Resolver.cs
+ def MustBeShowen(c as IClass, member as IDecoration) as bool:
+ // FIXME: _showStatic should be coming from elsewhere... but where? (See CSharpBinding)
+ _showStatic = false
+// print("member:" + member.Modifiers);
+ if (((not _showStatic) and ((member.Modifiers & ModifierEnum.Static) == ModifierEnum.Static)) or
+ ( _showStatic and not ((member.Modifiers & ModifierEnum.Static) == ModifierEnum.Static))):
+ //// enum type fields are not shown here - there is no info in member about enum field
+ return false
+
+// print("Testing Accessibility");
+ return IsAccessible(c, member)
+
+ def IsAccessible(c as IClass, member as IDecoration) as bool:
+// print("member.Modifiers = " + member.Modifiers);
+ if ((member.Modifiers & ModifierEnum.Internal) == ModifierEnum.Internal):
+ return true
+
+ if ((member.Modifiers & ModifierEnum.Public) == ModifierEnum.Public):
+// print("IsAccessible")
+ return true
+
+ if ((member.Modifiers & ModifierEnum.Protected) == ModifierEnum.Protected and IsClassInInheritanceTree(c, _callingClass)):
+// print("IsAccessible")
+ return true
+
+ return c.FullyQualifiedName == _callingClass.FullyQualifiedName
+
+ /// <remarks>
+ /// Returns true, if class possibleBaseClass is in the inheritance tree from c
+ /// </remarks>
+ def IsClassInInheritanceTree(possibleBaseClass as IClass , c as IClass) as bool:
+ if (possibleBaseClass == null or c == null):
+ return false
+
+ if (possibleBaseClass.FullyQualifiedName == c.FullyQualifiedName):
+ return true
+
+ for baseClass as string in c.BaseTypes:
+ bc = _parserService.GetClass (_project, baseClass, true, true)
+ if (IsClassInInheritanceTree(possibleBaseClass, bc)):
+ return true
+
+ return false
+
+ def BaseClass(curClass as IClass) as IClass:
+ for s as string in curClass.BaseTypes:
+ baseClass = _parserService.GetClass (_project, s, true, true)
+ if ((baseClass != null) and (baseClass.ClassType != ClassType.Interface)):
+ return baseClass
+ return null
+
+ def ListMembers(members as ArrayList, curType as IClass) as ArrayList:
+ // FIXME: _showStatic should be coming from elsewhere... but where? (See CSharpBinding)
+ _showStatic = false
+// print("LIST MEMBERS!!!");
+// print("_showStatic = " + _showStatic);
+// print(curType.InnerClasses.Count + " classes");
+// print(curType.Properties.Count + " properties");
+// print(curType.Methods.Count + " methods");
+// print(curType.Events.Count + " events");
+// print(curType.Fields.Count + " fields");
+ if _showStatic:
+ for c as IClass in curType.InnerClasses:
+ if IsAccessible(curType, c):
+ members.Add(c)
+// print("Member added")
+
+ for p as IProperty in curType.Properties:
+ if (MustBeShowen(curType, p)):
+ members.Add(p)
+// print("Member added")
+
+// print("ADDING METHODS!!!");
+ for m as IMethod in curType.Methods:
+// print("Method : " + m)
+ if (MustBeShowen(curType, m)):
+ members.Add(m)
+// print("Member added");
+
+ for e as IEvent in curType.Events:
+ if (MustBeShowen(curType, e)):
+ members.Add(e)
+// print("Member added");
+
+ for f as IField in curType.Fields:
+ if (MustBeShowen(curType, f)):
+ members.Add(f)
+// print("Member added")
+ else:
+ //// enum fields must be shown here if present
+ if (curType.ClassType == ClassType.Enum):
+ members.Add(f) if (IsAccessible(curType,f))
+// print("Member {0} added", f.FullyQualifiedName);
+
+// print("ClassType = " + curType.ClassType);
+ if (curType.ClassType == ClassType.Interface and not _showStatic):
+ for s as string in curType.BaseTypes:
+ baseClass = _parserService.GetClass (_project, s, true, true)
+ if (baseClass != null and baseClass.ClassType == ClassType.Interface):
+ ListMembers(members, baseClass)
+ else:
+ baseClass = BaseClass(curType)
+ if (baseClass != null):
+// print("Base Class = " + baseClass.FullyQualifiedName)
+ ListMembers(members, baseClass)
+
+// print("listing finished");
+ return members;
+
+ def GetResolvedClass (cls as IClass) as IClass:
+ // Returns an IClass in which all type names have been properly resolved
+ return _parserService.GetClass (_project, cls.FullyQualifiedName);
+
+ def GetInnermostClass(cu as ICompilationUnit) as IClass:
+ if (cu != null):
+ for c as IClass in cu.Classes:
+ if (c != null and c.Region != null and c.Region.IsInside(_caretLine, _caretColumn)):
+ return GetInnermostClass(c)
+ return null;
+
+ def GetInnermostClass(curClass as IClass) as IClass:
+ if (curClass == null):
+ return null
+
+ if (curClass.InnerClasses == null):
+ return GetResolvedClass (curClass)
+
+ for c as IClass in curClass.InnerClasses:
+ if (c != null and c.Region != null and c.Region.IsInside(_caretLine, _caretColumn)):
+ return GetInnermostClass(c)
+
+ return GetResolvedClass (curClass)
Added: trunk/MonoDevelop/Extras/BooBinding/Parser/ReturnType.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Parser/ReturnType.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Parser/ReturnType.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,198 @@
+#region license
+// Copyright (c) 2004-2005, Daniel Grunwald (daniel at danielgrunwald.de)
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// The BooBinding.Parser code is originally that of Daniel Grunwald
+// (daniel at danielgrunwald.de) from the SharpDevelop BooBinding. The code has
+// been imported here, and modified, including, but not limited to, changes
+// to function with MonoDevelop, additions, refactorings, etc.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding.Parser
+
+import System
+import System.Collections
+import System.Diagnostics
+import MonoDevelop.Internal.Parser
+import MonoDevelop.Services
+import Boo.Lang.Compiler.Ast as AST
+
+/////////////////////////////////////
+/// Return Type ///
+/////////////////////////////////////
+class ReturnType(AbstractReturnType):
+ def constructor(fullyQualifiedName as string):
+ self(fullyQualifiedName, array(int, 0), 0)
+
+ def constructor(fullyQualifiedName as string, arrayDimensions as (int), pointerNestingLevel as int):
+ self.FullyQualifiedName = fullyQualifiedName
+ self.arrayDimensions = arrayDimensions
+ self.pointerNestingLevel = pointerNestingLevel
+
+ def constructor(t as AST.TypeReference):
+ super.pointerNestingLevel = 0
+ if t isa AST.SimpleTypeReference:
+ super.arrayDimensions = array(int, 0)
+ name = cast(AST.SimpleTypeReference, t).Name
+ expandedName = BooBinding.BooAmbience.ReverseTypeConversionTable[name]
+ name = expandedName if expandedName != null
+ super.FullyQualifiedName = name
+ elif t isa AST.ArrayTypeReference:
+ ar as AST.ArrayTypeReference = t
+ depth = 1
+ while ar.ElementType isa AST.ArrayTypeReference:
+ depth += 1
+ ar = ar.ElementType
+ dimensions = array(int, depth)
+ for i as int in range(depth):
+ dimensions[i] = 1
+ self.arrayDimensions = dimensions
+ if ar.ElementType isa AST.SimpleTypeReference:
+ super.FullyQualifiedName = cast(AST.SimpleTypeReference, ar.ElementType).Name
+ else:
+ print ("Got unknown TypeReference in Array: ${t}")
+ super.FullyQualifiedName = "<Error>"
+ else:
+ super.arrayDimensions = array(int, 0)
+ super.FullyQualifiedName = "<Error>"
+ print ("Got unknown TypeReference ${t}")
+
+ static def CreateReturnType(node as AST.Node) as IReturnType:
+ if node isa AST.Field:
+ t = (node as AST.Field).Type
+ elif node isa AST.Property:
+ t = (node as AST.Property).Type
+ elif node isa AST.Method:
+ t = (node as AST.Method).ReturnType
+ else:
+ raise "Unknown node ${node.GetType().FullName}"
+ str = t as AST.SimpleTypeReference
+ if (str != null and str.Name != "unknown") or t isa AST.ArrayTypeReference:
+ return ReturnType(t)
+ else:
+ if node isa AST.Field:
+ return InferredReturnType((node as AST.Field).Initializer, node.LexicalInfo)
+ elif node isa AST.Property:
+ prop as AST.Property = node
+ return InferredReturnType(GetReturnExpression(prop.Getter), node.LexicalInfo)
+ elif node isa AST.Method:
+ return InferredReturnType(GetReturnExpression(node), node.LexicalInfo)
+
+ private static def GetReturnExpression(method as AST.Method):
+ return null if method == null
+ return null if method.Body == null
+ visitor = FindReturnExpressionVisitor()
+ method.Body.Accept(visitor)
+ return visitor.Expression
+
+ private class FindReturnExpressionVisitor(AST.DepthFirstVisitor):
+ [Getter(Expression)]
+ _expression as AST.Expression
+
+ override def OnReturnStatement(node as AST.ReturnStatement):
+ if _expression isa AST.NullLiteralExpression or not (node.Expression isa AST.NullLiteralExpression):
+ _expression = node.Expression
+
+ def constructor(t as AST.TypeDefinition):
+ self(t.FullName)
+
+ def constructor(c as IClass):
+ self(c.FullyQualifiedName)
+
+ def Clone() as ReturnType:
+ return ReturnType(FullyQualifiedName, arrayDimensions, pointerNestingLevel)
+
+ override def ToString():
+ return "[${GetType().Name} Name=${FullyQualifiedName}]"
+
+/////////////////////////////////////
+/// Namespace Return Type ///
+/////////////////////////////////////
+class NamespaceReturnType(AbstractReturnType):
+ def constructor(fullyQualifiedName as string):
+ self.FullyQualifiedName = fullyQualifiedName
+ self.arrayDimensions = array(int, 0)
+ self.pointerNestingLevel = 0
+
+ override def ToString():
+ return "[${GetType().Name} Name=${FullyQualifiedName}]"
+
+/////////////////////////////////////
+/// Inferred Return Type ///
+/////////////////////////////////////
+class InferredReturnType(AbstractReturnType):
+ _expression as AST.Expression
+
+ _filename as string
+ _caretLine as int
+ _caretColumn as int
+
+ def constructor(expression as AST.Expression, info as AST.LexicalInfo):
+ _expression = expression
+ if info == null or expression == null:
+ _resolved = true // don't resolve but return error
+ else:
+ _filename = info.FileName
+ _caretLine = info.Line
+ _caretColumn = info.Column
+
+ _baseType as IReturnType
+ _resolved as bool = false
+
+ override FullyQualifiedName as string:
+ get:
+ r = self.BaseType
+ if r == null:
+ return "<Error>"
+ else:
+ return r.FullyQualifiedName
+ set:
+ raise NotSupportedException()
+
+ override PointerNestingLevel as int:
+ get:
+ r = self.BaseType
+ if r == null:
+ return 0
+ else:
+ return r.PointerNestingLevel
+
+ override ArrayDimensions as (int):
+ get:
+ r = self.BaseType
+ if r == null:
+ return array(int, 0)
+ else:
+ return r.ArrayDimensions
+
+ BaseType as IReturnType:
+ get:
+ if not _resolved:
+ _resolved = true
+ _baseType = Resolve()
+ return _baseType
+
+ def Resolve() as IReturnType:
+ resolver = Resolver()
+ parserService = MonoDevelop.Core.Services.ServiceManager.GetService(typeof(IParserService))
+ if resolver.Initialize(parserService, _caretLine, _caretColumn, _filename):
+ visitor = ExpressionTypeVisitor(Resolver : resolver)
+ visitor.Visit(_expression)
+ return visitor.ReturnType
+ else:
+ return null
Added: trunk/MonoDevelop/Extras/BooBinding/Parser/Tree.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Parser/Tree.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Parser/Tree.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,127 @@
+#region license
+// Copyright (c) 2004-2005, Daniel Grunwald (daniel at danielgrunwald.de)
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// The BooBinding.Parser code is originally that of Daniel Grunwald
+// (daniel at danielgrunwald.de) from the SharpDevelop BooBinding. The code has
+// been imported here, and modified, including, but not limited to, changes
+// to function with MonoDevelop, additions, refactorings, etc.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding.Parser
+
+import System
+import System.Collections
+import System.Diagnostics
+import MonoDevelop.Internal.Parser
+import Boo.Lang.Compiler.Ast as AST
+
+/////////////////////////////////////
+/// Compilation Unit ///
+/////////////////////////////////////
+class CompilationUnit(AbstractCompilationUnit):
+ override MiscComments as CommentCollection:
+ get:
+ return null
+
+ override DokuComments as CommentCollection:
+ get:
+ return null
+
+ override TagComments as TagCollection:
+ get:
+ return null
+
+/////////////////////////////////////
+/// Class ///
+/////////////////////////////////////
+class Class(AbstractClass):
+ _cu as ICompilationUnit
+
+ override CompilationUnit as ICompilationUnit:
+ get:
+ return _cu
+
+ def constructor(cu as CompilationUnit, t as ClassType, m as ModifierEnum, region as IRegion):
+ _cu = cu
+ classType = t
+ self.region = region
+ modifiers = m
+
+ def UpdateModifier():
+ if classType == ClassType.Enum:
+ for f as Field in Fields:
+ f.AddModifier(ModifierEnum.Public)
+
+ return
+
+ for f as Field in Fields:
+ if f.Modifiers == ModifierEnum.None:
+ f.AddModifier(ModifierEnum.Protected)
+
+ if classType != ClassType.Interface:
+ return
+
+ for c as Class in InnerClasses:
+ c.modifiers = c.modifiers | ModifierEnum.Public
+
+ for m as IMethod in Methods:
+ if m isa BooAbstractMethod:
+ cast(BooAbstractMethod, m).AddModifier(ModifierEnum.Public)
+ else:
+ Debug.Assert(false, 'Unexpected type in method of interface. Can not set modifier to public!')
+
+ for e as Event in Events:
+ e.AddModifier(ModifierEnum.Public)
+
+ for f as Field in Fields:
+ f.AddModifier(ModifierEnum.Public)
+
+ for i as Indexer in Indexer:
+ i.AddModifier(ModifierEnum.Public)
+
+ for p as Property in Properties:
+ p.AddModifier(ModifierEnum.Public)
+
+
+
+
+/////////////////////////////////////
+/// Parameter ///
+/////////////////////////////////////
+class Parameter(AbstractParameter):
+ def constructor(name as string, rtype as ReturnType):
+ Name = name
+ returnType = rtype
+
+/////////////////////////////////////
+/// Attributes ///
+/////////////////////////////////////
+class AttributeSection(AbstractAttributeSection):
+ def constructor(attributeTarget as AttributeTarget, attributes as AttributeCollection):
+ self.attributeTarget = attributeTarget
+ self.attributes = attributes
+
+class ASTAttribute(AbstractAttribute):
+ def constructor(name as string, positionalArguments as ArrayList, namedArguments as SortedList):
+ self.name = name
+ self.positionalArguments = positionalArguments
+ self.namedArguments = namedArguments
+
+
+
Added: trunk/MonoDevelop/Extras/BooBinding/Parser/TypeMembers.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Parser/TypeMembers.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Parser/TypeMembers.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,134 @@
+#region license
+// Copyright (c) 2004-2005, Daniel Grunwald (daniel at danielgrunwald.de)
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// The BooBinding.Parser code is originally that of Daniel Grunwald
+// (daniel at danielgrunwald.de) from the SharpDevelop BooBinding. The code has
+// been imported here, and modified, including, but not limited to, changes
+// to function with MonoDevelop, additions, refactorings, etc.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding.Parser
+
+import System
+import MonoDevelop.Internal.Parser
+import Boo.Lang.Compiler.Ast as AST
+
+/////////////////////////////////////
+/// Constructor ///
+/////////////////////////////////////
+class Constructor(BooAbstractMethod):
+ def constructor(m as ModifierEnum, region as IRegion, bodyRegion as IRegion):
+ FullyQualifiedName = '#ctor'
+ self.region = region
+ self.bodyRegion = bodyRegion
+ modifiers = m
+
+
+/////////////////////////////////////
+/// Destructor ///
+/////////////////////////////////////
+class Destructor(BooAbstractMethod):
+ def constructor(className as string, m as ModifierEnum, region as IRegion, bodyRegion as IRegion):
+ FullyQualifiedName = '~' + className
+ self.region = region
+ self.bodyRegion = bodyRegion
+ modifiers = m
+
+class BooAbstractMethod(AbstractMethod):
+ [Property(Node)]
+ _node as AST.Method
+
+ def AddModifier(m as ModifierEnum):
+ modifiers = modifiers | m
+
+/////////////////////////////////////
+/// Event ///
+/////////////////////////////////////
+class Event(AbstractEvent):
+ def AddModifier(m as ModifierEnum):
+ modifiers = modifiers | m
+
+ def constructor(name as string, rtype as IReturnType, m as ModifierEnum, region as IRegion, bodyRegion as IRegion):
+ FullyQualifiedName = name
+ returnType = rtype
+ self.region = region
+ self.bodyRegion = bodyRegion
+ modifiers = m
+
+
+/////////////////////////////////////
+/// Field ///
+/////////////////////////////////////
+class Field(AbstractField):
+ def AddModifier(m as ModifierEnum):
+ modifiers = modifiers | m
+
+ def constructor(rtype as IReturnType, fullyQualifiedName as string, m as ModifierEnum, region as IRegion):
+ self.returnType = rtype
+ self.FullyQualifiedName = fullyQualifiedName
+ self.region = region
+ modifiers = m
+
+ def SetModifiers(m as ModifierEnum):
+ modifiers = m
+
+
+/////////////////////////////////////
+/// Indexer ///
+/////////////////////////////////////
+class Indexer(AbstractIndexer):
+ def AddModifier(m as ModifierEnum):
+ modifiers = modifiers | m
+
+ def constructor(rtype as IReturnType, parameters as ParameterCollection, m as ModifierEnum, region as IRegion, bodyRegion as IRegion):
+ returnType = rtype
+ self.parameters = parameters
+ self.region = region
+ self.bodyRegion = bodyRegion
+ modifiers = m
+
+
+/////////////////////////////////////
+/// Method ///
+/////////////////////////////////////
+class Method(BooAbstractMethod):
+ def constructor(name as string, rtype as IReturnType, m as ModifierEnum, region as IRegion, bodyRegion as IRegion):
+ FullyQualifiedName = name
+ self.returnType = rtype
+ self.region = region
+ self.bodyRegion = bodyRegion
+ modifiers = m
+
+
+/////////////////////////////////////
+/// Property ///
+/////////////////////////////////////
+class Property(AbstractProperty):
+ [Property(Node)]
+ _node as AST.Property
+
+ def AddModifier(m as ModifierEnum):
+ modifiers = modifiers | m
+
+ def constructor(fullyQualifiedName as string, rtype as IReturnType, m as ModifierEnum, region as IRegion, bodyRegion as IRegion):
+ self.FullyQualifiedName = fullyQualifiedName
+ self.returnType = rtype
+ self.region = region
+ self.bodyRegion = bodyRegion
+ modifiers = m
Added: trunk/MonoDevelop/Extras/BooBinding/Parser/VariableLookupVisitor.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Parser/VariableLookupVisitor.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Parser/VariableLookupVisitor.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,101 @@
+#region license
+// Copyright (c) 2004-2005, Daniel Grunwald (daniel at danielgrunwald.de)
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// The BooBinding.Parser code is originally that of Daniel Grunwald
+// (daniel at danielgrunwald.de) from the SharpDevelop BooBinding. The code has
+// been imported here, and modified, including, but not limited to, changes
+// to function with MonoDevelop, additions, refactorings, etc.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding.Parser
+
+import System
+import System.Collections
+import MonoDevelop.Internal.Parser
+import Boo.Lang.Compiler.Ast
+
+class VariableLookupVisitor(DepthFirstVisitor):
+ [Property(Resolver)]
+ _resolver as Resolver
+
+ [Property(LookFor)]
+ _lookFor as string
+
+ [Getter(ReturnType)]
+ _returnType as IReturnType
+
+ private def Finish(expr as Expression):
+ return if expr == null
+ return if _returnType != null
+ visitor = ExpressionTypeVisitor(Resolver: _resolver)
+ visitor.Visit(expr)
+ _returnType = visitor.ReturnType
+
+ private def Finish(reference as TypeReference):
+ return if _returnType != null
+ return if reference == null
+ _returnType = BooBinding.Parser.ReturnType(reference)
+
+ override def OnDeclaration(node as Declaration):
+ return if node.Name != _lookFor
+ Finish(node.Type)
+
+ override def OnDeclarationStatement(node as DeclarationStatement):
+ return if node.Declaration.Name != _lookFor
+ Visit(node.Declaration)
+ Finish(node.Initializer)
+
+ override def OnBinaryExpression(node as BinaryExpression):
+ if node.Operator == BinaryOperatorType.Assign and node.Left isa ReferenceExpression:
+ reference as ReferenceExpression = node.Left
+ if reference.Name == _lookFor:
+ Finish(node.Right) unless reference isa MemberReferenceExpression
+ super(node)
+
+class VariableListLookupVisitor(DepthFirstVisitor):
+ [Property(Resolver)]
+ _resolver as Resolver
+
+ [Getter(Results)]
+ _results as Hashtable = {}
+
+ private def Add(name as string, expr as Expression):
+ return if name == null or expr == null
+ return if _results.ContainsKey(name)
+ visitor = ExpressionTypeVisitor(Resolver: _resolver)
+ visitor.Visit(expr)
+ _results.Add(name, visitor.ReturnType)
+
+ private def Add(name as string, reference as TypeReference):
+ return if reference == null or name == null
+ return if _results.ContainsKey(name)
+ _results.Add(name, BooBinding.Parser.ReturnType(reference))
+
+ override def OnDeclaration(node as Declaration):
+ Add(node.Name, node.Type)
+
+ override def OnDeclarationStatement(node as DeclarationStatement):
+ Visit(node.Declaration)
+ Add(node.Declaration.Name, node.Initializer)
+
+ override def OnBinaryExpression(node as BinaryExpression):
+ if node.Operator == BinaryOperatorType.Assign and node.Left isa ReferenceExpression:
+ reference as ReferenceExpression = node.Left
+ Add(reference.Name, node.Right) unless reference isa MemberReferenceExpression
+ super(node)
Added: trunk/MonoDevelop/Extras/BooBinding/Parser/Visitor.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Parser/Visitor.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Parser/Visitor.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,287 @@
+#region license
+// Copyright (c) 2004-2005, Daniel Grunwald (daniel at danielgrunwald.de)
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// The BooBinding.Parser code is originally that of Daniel Grunwald
+// (daniel at danielgrunwald.de) from the SharpDevelop BooBinding. The code has
+// been imported here, and modified, including, but not limited to, changes
+// to function with MonoDevelop, additions, refactorings, etc.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding.Parser
+
+import System
+import System.Collections
+import MonoDevelop.Services
+import MonoDevelop.Internal.Parser
+import Boo.Lang.Compiler
+import Boo.Lang.Compiler.Ast as AST
+import Boo.Lang.Compiler.IO
+import Boo.Lang.Compiler.Steps
+
+class Using(AbstractUsing):
+ pass
+
+class Visitor(AbstractVisitorCompilerStep):
+ [Getter(Cu)]
+ _cu as CompilationUnit = CompilationUnit()
+
+ _currentClass as Stack = Stack()
+ _firstModule = true
+
+ override def Run():
+ //print "RUN"
+ try:
+ Visit(CompileUnit)
+ except e:
+ print e.ToString()
+ //msg as IMessageService = ServiceManager.Services.GetService(typeof(IMessageService))
+ //msg.ShowError(e)
+
+ private def GetModifier(m as AST.TypeMember) as ModifierEnum:
+ r = ModifierEnum.None
+ r = r | ModifierEnum.Public if m.IsPublic
+ r = r | ModifierEnum.Protected if m.IsProtected
+ r = r | ModifierEnum.Private if m.IsPrivate
+ r = r | ModifierEnum.Internal if m.IsInternal
+
+ r = r | ModifierEnum.Static if m.IsStatic
+ r = r | ModifierEnum.Virtual if m.IsModifierSet(AST.TypeMemberModifiers.Virtual)
+ r = r | ModifierEnum.Abstract if m.IsModifierSet(AST.TypeMemberModifiers.Abstract)
+ r = r | ModifierEnum.Override if m.IsModifierSet(AST.TypeMemberModifiers.Override)
+
+ r = r | ModifierEnum.Final if m.IsFinal
+ return r
+
+ [Property(LineLength)]
+ _lineLength as (int)
+
+ private def GetLineEnd(line as int) as int:
+ return 0 if _lineLength == null or line < 1 or line > _lineLength.Length
+ return _lineLength[line - 1] + 1
+
+ private def GetRegion(m as AST.Node):
+ l = m.LexicalInfo
+ return null if (l.Line < 0)
+ return DefaultRegion(l.Line, 0 /*l.Column*/, l.Line, GetLineEnd(l.Line))
+
+ private def GetClientRegion(m as AST.Node) as DefaultRegion:
+ l = m.LexicalInfo
+ return null if l.Line < 0
+ l2 as AST.SourceLocation = null
+ if m isa AST.Method:
+ l2 = cast(AST.Method, m).Body.EndSourceLocation
+ elif m isa AST.Property:
+ p as AST.Property = m
+ if p.Getter != null and p.Getter.Body != null:
+ l2 = cast(AST.Property, m).Getter.Body.EndSourceLocation
+ if p.Setter != null and p.Setter.Body != null:
+ l3 = cast(AST.Property, m).Setter.Body.EndSourceLocation
+ l2 = l3 if l3.Line > l2.Line
+ elif p.Setter != null and p.Setter.Body != null:
+ l2 = cast(AST.Property, m).Setter.Body.EndSourceLocation
+ else:
+ l2 = m.EndSourceLocation
+ return null if l2 == null or l2.Line < 0 or l.Line == l2.Line
+ // TODO: use l.Column / l2.Column when the tab-bug has been fixed
+ return DefaultRegion(l.Line, GetLineEnd(l.Line), l2.Line, GetLineEnd(l2.Line))
+
+ override def OnImport(p as AST.Import):
+ u = Using()
+ if p.Alias == null:
+ u.Usings.Add(p.Namespace)
+ else:
+ u.Aliases[p.Alias.Name] = p.Namespace
+ _cu.Usings.Add(u)
+
+ override def OnCallableDefinition(node as AST.CallableDefinition):
+ //print "OnCallableDefinition: ${node.FullName}"
+ region = GetRegion(node)
+ modifier = GetModifier(node)
+ c = Class(_cu, ClassType.Delegate, modifier, region)
+ c.BaseTypes.Add('System.Delegate')
+ c.FullyQualifiedName = node.FullName
+ if _currentClass.Count > 0:
+ cast(Class, _currentClass.Peek()).InnerClasses.Add(c)
+ else:
+ _cu.Classes.Add(c)
+ invokeMethod = Method('Invoke', ReturnType(node.ReturnType), modifier, region, region)
+ invokeMethod.Parameters = GetParameters(node.Parameters)
+ c.Methods.Add(invokeMethod)
+
+ override def EnterClassDefinition(node as AST.ClassDefinition):
+ EnterTypeDefinition(node, ClassType.Class)
+ return super(node)
+
+ override def EnterInterfaceDefinition(node as AST.InterfaceDefinition):
+ EnterTypeDefinition(node, ClassType.Interface)
+ return super(node)
+
+ override def EnterEnumDefinition(node as AST.EnumDefinition):
+ EnterTypeDefinition(node, ClassType.Enum)
+ return super(node)
+
+ override def EnterModule(node as AST.Module):
+ EnterTypeDefinition(node, ClassType.Class) unless _firstModule
+ _firstModule = false
+ return super(node)
+
+ private def EnterTypeDefinition(node as AST.TypeDefinition, classType as ClassType):
+ try:
+ //print "Enter ${node.GetType().Name} (${node.FullName})"
+ region = GetClientRegion(node)
+ modifier = GetModifier(node)
+ c = Class(_cu, classType, modifier, region)
+ c.FullyQualifiedName = node.FullName
+ c.Documentation = node.Documentation
+ if _currentClass.Count > 0:
+ cast(Class, _currentClass.Peek()).InnerClasses.Add(c)
+ else:
+ _cu.Classes.Add(c)
+ if node.BaseTypes != null:
+ for r as AST.SimpleTypeReference in node.BaseTypes:
+ c.BaseTypes.Add(r.Name)
+ _currentClass.Push(c)
+ except ex:
+ print ex.ToString()
+ raise
+
+ override def LeaveClassDefinition(node as AST.ClassDefinition):
+ LeaveTypeDefinition(node)
+ super(node)
+
+ override def LeaveInterfaceDefinition(node as AST.InterfaceDefinition):
+ LeaveTypeDefinition(node)
+ super(node)
+
+ override def LeaveEnumDefinition(node as AST.EnumDefinition):
+ LeaveTypeDefinition(node)
+ super(node)
+
+ override def LeaveModule(node as AST.Module):
+ LeaveTypeDefinition(node) unless _currentClass.Count == 0
+ super(node)
+
+ private def LeaveTypeDefinition(node as AST.TypeDefinition):
+ c as Class = _currentClass.Pop()
+ //print "Leave ${node.GetType().Name} ${node.FullName} (Class = ${c.FullyQualifiedName})"
+ c.UpdateModifier()
+
+ override def OnMethod(node as AST.Method):
+ try:
+ // Since we visit after ProcessMethodBodies, we may have
+ // some compiler generated methods (prefixed with ___)
+ if node.Name.StartsWith("___"):
+ return
+
+ print "Method: ${node.FullName}"
+ method = Method(node.Name, ReturnType.CreateReturnType(node), GetModifier(node), GetRegion(node), GetClientRegion(node))
+ method.Parameters = GetParameters(node.Parameters)
+ method.Node = node
+ method.Documentation = node.Documentation
+ cast(Class, _currentClass.Peek()).Methods.Add(method)
+ except ex:
+ print ex.ToString()
+ raise
+
+ private def GetParameters(params as AST.ParameterDeclarationCollection):
+ parameters = ParameterCollection()
+ return parameters if params == null
+ for par as AST.ParameterDeclaration in params:
+ parameters.Add(Parameter(par.Name, ReturnType(par.Type)))
+ return parameters
+
+ override def OnConstructor(node as AST.Constructor):
+ return if node.Body.Statements.Count == 0
+ ctor = Constructor(GetModifier(node), GetRegion(node), GetClientRegion(node))
+ ctor.Parameters = GetParameters(node.Parameters)
+ ctor.Node = node
+ ctor.Documentation = node.Documentation
+ cast(Class, _currentClass.Peek()).Methods.Add(ctor)
+
+ override def OnEnumMember(node as AST.EnumMember):
+ try:
+ c as Class = _currentClass.Peek()
+ field = Field(ReturnType(c), node.Name, GetModifier(node), GetRegion(node))
+ field.Documentation = node.Documentation
+ field.SetModifiers(ModifierEnum.Const | ModifierEnum.SpecialName)
+ c.Fields.Add(field)
+ except x:
+ print x
+ raise
+
+ override def OnField(node as AST.Field):
+ try:
+ //print "Field ${node.Name}"
+ c as Class = _currentClass.Peek()
+ field = Field(ReturnType.CreateReturnType(node), node.Name, GetModifier(node), GetRegion(node))
+ field.Documentation = node.Documentation
+ c.Fields.Add(field)
+ except ex:
+ print ex.ToString()
+ raise
+
+ override def OnProperty(node as AST.Property):
+ try:
+ property = Property(node.Name, ReturnType.CreateReturnType(node), GetModifier(node), GetRegion(node), GetClientRegion(node))
+ property.Documentation = node.Documentation
+ property.Node = node
+ cast(Class, _currentClass.Peek()).Properties.Add(property)
+ except ex:
+ print ex.ToString()
+ raise
+
+ /*
+ // TODO: Event Declaration
+ override def Visit(eventDeclaration as AST.EventDeclaration, data as object) as object:
+ region as DefaultRegion = GetRegion(eventDeclaration.StartLocation, eventDeclaration.EndLocation)
+ bodyRegion as DefaultRegion = GetRegion(eventDeclaration.BodyStart, eventDeclaration.BodyEnd)
+ type as ReturnType = ReturnType(eventDeclaration.TypeReference)
+ c as Class = _currentClass.Peek()
+ e as Event = null
+ if eventDeclaration.VariableDeclarators != null:
+ for varDecl as ICSharpCode.SharpRefactory.Parser.AST.VariableDeclaration in eventDeclaration.VariableDeclarators:
+ e = Event(varDecl.Name, type, eventDeclaration.Modifier, region, bodyRegion)
+ c.Events.Add(e)
+
+ else:
+ e = Event(eventDeclaration.Name, type, eventDeclaration.Modifier, region, bodyRegion)
+ c.Events.Add(e)
+
+ return null
+
+ // TODO: Detect indexer method and add it as Indexer
+ override def Visit(indexerDeclaration as AST.IndexerDeclaration, data as object) as object:
+ region as DefaultRegion = GetRegion(indexerDeclaration.StartLocation, indexerDeclaration.EndLocation)
+ bodyRegion as DefaultRegion = GetRegion(indexerDeclaration.BodyStart, indexerDeclaration.BodyEnd)
+ parameters as ParameterCollection = ParameterCollection()
+ i as Indexer = Indexer(ReturnType(indexerDeclaration.TypeReference), parameters, indexerDeclaration.Modifier, region, bodyRegion)
+ if indexerDeclaration.Parameters != null:
+ for par as AST.ParameterDeclarationExpression in indexerDeclaration.Parameters:
+ parType as ReturnType = ReturnType(par.TypeReference)
+ p as Parameter = Parameter(par.ParameterName, parType)
+ parameters.Add(p)
+
+
+ c as Class = _currentClass.Peek()
+ c.Indexer.Add(i)
+ return null
+ */
+
+
+
Added: trunk/MonoDevelop/Extras/BooBinding/Project/BooCompilerParameters.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Project/BooCompilerParameters.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Project/BooCompilerParameters.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,73 @@
+#region license
+// Copyright (c) 2005, Peter Johanson (latexer at gentoo.org)
+// All rights reserved.
+//
+// BooBinding is free software; you can redistribute it and/or modify
+// it under the terms of the GNU General Public License as published by
+// the Free Software Foundation; either version 2 of the License, or
+// (at your option) any later version.
+//
+// BooBinding is distributed in the hope that it will be useful,
+// but WITHOUT ANY WARRANTY; without even the implied warranty of
+// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
+// GNU General Public License for more details.
+//
+// You should have received a copy of the GNU General Public License
+// along with BooBinding; if not, write to the Free Software
+// Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA
+#endregion
+
+namespace BooBinding
+
+import System
+import System.Xml
+import System.Diagnostics
+
+import MonoDevelop.Internal.Project
+import MonoDevelop.Internal.Serialization
+
+public class BooCompilerParameters:
+ [ItemProperty ("compiler")]
+ compiler = BooCompiler.Booc
+
+ [ItemProperty("compilerpath")]
+ compilerpath = "booc"
+
+ [ItemProperty("genwarnings")]
+ genwarnings = false
+
+ [ItemProperty("ducky")]
+ ducky = false
+
+ [ItemProperty("culture")]
+ culture = ""
+
+ public GenWarnings as bool:
+ get:
+ return genwarnings
+ set:
+ genwarnings = value
+
+ public Compiler as BooCompiler:
+ get:
+ return compiler
+ set:
+ compiler = value
+
+ public CompilerPath as string:
+ get:
+ return compilerpath
+ set:
+ compilerpath = value
+
+ public Ducky as bool:
+ get:
+ return ducky
+ set:
+ ducky = value
+
+ public Culture as string:
+ get:
+ return culture
+ set:
+ culture = value
Added: trunk/MonoDevelop/Extras/BooBinding/Properties/BooShellProperties.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Properties/BooShellProperties.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Properties/BooShellProperties.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,18 @@
+
+
+namespace BooBinding.Properties
+
+import System
+
+import Gtk
+import Gdk
+
+import MonoDevelop.Gui.Widgets
+import MonoDevelop.Core.Services
+import MonoDevelop.Core.Properties
+import MonoDevelop.Services
+
+class BooShellProperties (ShellProperties):
+ override PropertyName as string:
+ get:
+ return "BooBinding.BooShell.ShellProps"
Added: trunk/MonoDevelop/Extras/BooBinding/Properties/ShellProperties.boo
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/Properties/ShellProperties.boo 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/Properties/ShellProperties.boo 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,58 @@
+
+
+namespace BooBinding.Properties
+
+import System
+
+import Gtk
+import Gdk
+import Pango
+
+import MonoDevelop.Gui.Widgets
+import MonoDevelop.Core.Services
+import MonoDevelop.Core.Properties
+import MonoDevelop.Services
+
+class ShellProperties:
+ private propertyService = cast (PropertyService, ServiceManager.GetService (typeof(PropertyService)))
+ private properties = cast (IProperties, propertyService.GetProperty (PropertyName, DefaultProperties()))
+
+ public virtual PropertyName as string:
+ get:
+ pass
+
+ public InternalProperties as IProperties:
+ get:
+ return properties
+
+ FontName as string:
+ get:
+ return properties.GetProperty ("Font", "__default_monospace")
+ set:
+ properties.SetProperty ("Font", value)
+
+ Font as FontDescription:
+ get:
+ if FontName == "__default_monospace":
+ return FontDescription.FromString (GConf.Client ().Get ("/desktop/gnome/interface/monospace_font_name"))
+ else:
+ return FontDescription.FromString (FontName)
+
+
+ AutoIndentBlocks as bool:
+ get:
+ return properties.GetProperty ("AutoIndentBlocks", true)
+ set:
+ properties.SetProperty ("AutoIndentBlocks", value)
+
+ ResetClearsScrollback as bool:
+ get:
+ return properties.GetProperty ("ResetClearsScrollback", true)
+ set:
+ properties.SetProperty ("ResetClearsScrollback", value)
+
+ ResetClearsHistory as bool:
+ get:
+ return properties.GetProperty ("ResetClearsHistory", true)
+ set:
+ properties.SetProperty ("ResetClearsHistory", value)
Added: trunk/MonoDevelop/Extras/BooBinding/templates/BooGtkSharpProject.xpt.xml
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/templates/BooGtkSharpProject.xpt.xml 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/templates/BooGtkSharpProject.xpt.xml 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,49 @@
+<?xml version="1.0"?>
+<Template originator = "Peter Johanson"
+ created = "10/13/2004"
+ lastModified = "10/13/2004">
+
+ <!-- Template Header -->
+ <TemplateConfiguration>
+ <_Name>Gtk# Project</_Name>
+ <Category>Boo</Category>
+ <Icon>Boo.Project.Form</Icon>
+ <LanguageName>Boo</LanguageName>
+ <_Description>Creates a Boo/Gtk# project</_Description>
+ </TemplateConfiguration>
+
+ <Actions>
+ <Open filename = "Main.boo"/>
+ </Actions>
+
+ <Combine name = "${ProjectName}" directory = ".">
+ <Options>
+ <StartupProject>${ProjectName}</StartupProject>
+ </Options>
+
+ <Project name = "${ProjectName}" directory = ".">
+ <References>
+ <Reference type="Gac" refto="gtk-sharp, Version=2.0.0.0, Culture=neutral, PublicKeyToken=35e10195dab3c99f" />
+ </References>
+ <Files>
+ <File name="Main.boo"><![CDATA[// project created on ${Date} at ${Time}
+import Gtk
+
+Application.Init()
+w = MyWindow("Window")
+w.ShowAll()
+Application.Run()]]></File>
+ <File name="MyWindow.boo"><![CDATA[import System
+import Gtk
+
+class MyWindow(Window):
+ def constructor(title as string):
+ super(title)
+ SetDefaultSize(400, 300)
+ DeleteEvent += { Application.Quit() }]]></File>
+ </Files>
+
+ </Project>
+ </Combine>
+</Template>
+
Added: trunk/MonoDevelop/Extras/BooBinding/templates/BooGtkSharpWindow.xft.xml
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/templates/BooGtkSharpWindow.xft.xml 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/templates/BooGtkSharpWindow.xft.xml 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,29 @@
+<?xml version="1.0"?>
+<Template Originator = "Peter Johanson"
+ Language = "Boo"
+ Created = "04/04/2005"
+ LastModified = "04/04/2005">
+
+ <TemplateConfiguration>
+ <_Name>Gtk# Window</_Name>
+ <Icon>Boo.File.Form</Icon>
+ <Category>Boo</Category>
+ <LanguageName>Boo</LanguageName>
+ <_Description>Creates a top-level Gtk# window</_Description>
+ </TemplateConfiguration>
+
+ <TemplateFiles>
+ <File DefaultExtension=".boo" DefaultName="CreatedWindow">
+<![CDATA[// created on ${Date} at ${Time}
+import System
+import Gtk
+
+class CreatedWindow(Window):
+ constructor():
+ super("CreatedWindow")
+]]></File>
+ </TemplateFiles>
+
+ <FileOptions/>
+
+</Template>
Added: trunk/MonoDevelop/Extras/BooBinding/templates/EmptyBooFile.xft.xml
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/templates/EmptyBooFile.xft.xml 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/templates/EmptyBooFile.xft.xml 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,20 @@
+<?xml version="1.0"?>
+<Template Originator="Peter Johanson" Language="Boo" Created="04/03/2005" LastModified="04/03/2005">
+
+ <TemplateConfiguration>
+ <_Name>Empty File</_Name>
+ <Icon>Boo.File.EmptyFile</Icon>
+ <Category>Boo</Category>
+ <LanguageName>Boo</LanguageName>
+ <_Description>Creates an empty Boo file.</_Description>
+ </TemplateConfiguration>
+
+ <TemplateFiles>
+ <File DefaultExtension=".boo" DefaultName="EmptyBoofile">
+ <![CDATA[// created on ${Date} at ${Time}]]>
+ </File>
+ </TemplateFiles>
+
+ <FileOptions/>
+
+</Template>
Added: trunk/MonoDevelop/Extras/BooBinding/templates/EmptyBooProject.xpt.xml
===================================================================
--- trunk/MonoDevelop/Extras/BooBinding/templates/EmptyBooProject.xpt.xml 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/BooBinding/templates/EmptyBooProject.xpt.xml 2005-04-26 01:27:10 UTC (rev 2480)
@@ -0,0 +1,19 @@
+<?xml version="1.0"?>
+<Template originator = "Peter Johanson"
+ created = "04/03/2005"
+ lastModified = "04/03/2005">
+
+ <!-- Template Header -->
+ <TemplateConfiguration>
+ <_Name>Empty Project</_Name>
+ <Category>Boo</Category>
+ <Icon>Boo.Project.EmptyProject</Icon>
+ <LanguageName>Boo</LanguageName>
+ <_Description>Creates an empty Boo solution.</_Description>
+ </TemplateConfiguration>
+
+ <!-- Template Content -->
+ <Combine name = "${ProjectName}" directory = ".">
+ <Project name = "${ProjectName}" directory = "."/>
+ </Combine>
+</Template>
Modified: trunk/MonoDevelop/Extras/Makefile.am
===================================================================
--- trunk/MonoDevelop/Extras/Makefile.am 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/Extras/Makefile.am 2005-04-26 01:27:10 UTC (rev 2480)
@@ -1,3 +1,3 @@
#SUBDIRS = PythonBinding MonoQuery
-SUBDIRS = MonoQuery MonoDeveloperExtensions JavaBinding
+SUBDIRS = MonoQuery MonoDeveloperExtensions JavaBinding BooBinding
Added: trunk/MonoDevelop/build/data/resources/icons/Boo.File.EmptyFile
===================================================================
(Binary files differ)
Property changes on: trunk/MonoDevelop/build/data/resources/icons/Boo.File.EmptyFile
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/MonoDevelop/build/data/resources/icons/Boo.File.Form
===================================================================
(Binary files differ)
Property changes on: trunk/MonoDevelop/build/data/resources/icons/Boo.File.Form
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/MonoDevelop/build/data/resources/icons/Boo.FileIcon
===================================================================
(Binary files differ)
Property changes on: trunk/MonoDevelop/build/data/resources/icons/Boo.FileIcon
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/MonoDevelop/build/data/resources/icons/Boo.Project.EmptyProject
===================================================================
(Binary files differ)
Property changes on: trunk/MonoDevelop/build/data/resources/icons/Boo.Project.EmptyProject
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/MonoDevelop/build/data/resources/icons/Boo.Project.Form
===================================================================
(Binary files differ)
Property changes on: trunk/MonoDevelop/build/data/resources/icons/Boo.Project.Form
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/MonoDevelop/build/data/resources/icons/Boo.ProjectIcon
===================================================================
(Binary files differ)
Property changes on: trunk/MonoDevelop/build/data/resources/icons/Boo.ProjectIcon
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Added: trunk/MonoDevelop/build/data/resources/icons/BooBinding.Base
===================================================================
(Binary files differ)
Property changes on: trunk/MonoDevelop/build/data/resources/icons/BooBinding.Base
___________________________________________________________________
Name: svn:mime-type
+ application/octet-stream
Modified: trunk/MonoDevelop/build/data/resources/icons/Makefile.am
===================================================================
--- trunk/MonoDevelop/build/data/resources/icons/Makefile.am 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/build/data/resources/icons/Makefile.am 2005-04-26 01:27:10 UTC (rev 2480)
@@ -2,7 +2,14 @@
monodevelopdir = $(libdir)/monodevelop
iconsdir = $(monodevelopdir)/data/resources/icons
-icons_DATA = C\#.File.EmptyFile \
+icons_DATA = BooBinding.Base \
+Boo.File.EmptyFile \
+Boo.File.Form \
+Boo.FileIcon \
+Boo.Project.EmptyProject \
+Boo.Project.Form \
+Boo.ProjectIcon \
+C\#.File.EmptyFile \
C++.File.EmptyFile \
C\#.File.Form \
C++.File.Form \
Modified: trunk/MonoDevelop/configure.in
===================================================================
--- trunk/MonoDevelop/configure.in 2005-04-25 20:37:23 UTC (rev 2479)
+++ trunk/MonoDevelop/configure.in 2005-04-26 01:27:10 UTC (rev 2480)
@@ -113,6 +113,20 @@
enable_java=no)
AM_CONDITIONAL(ENABLE_JAVA, test x$enable_java = xyes)
+BOO_REQUIRED_VERSION=0.5.2.99
+AC_ARG_ENABLE(boo,
+ AC_HELP_STRING([--enable-boo],
+ [enable support for boo [default=no]]),
+ [PKG_CHECK_MODULES(BOO, boo >= $BOO_REQUIRED_VERSION, enable_boo=yes, enable_boo=no)],
+ enable_boo=no)
+
+AM_CONDITIONAL(ENABLE_BOO, test x$enable_boo = xyes)
+AC_SUBST(BOO_LIBS)
+
+if test "x$enable_boo" = "xyes" ; then
+ AC_PATH_PROG(BOOC, booc)
+fi
+
MOZILLA_HOME="`$PKG_CONFIG --variable=libdir mozilla-gtkmozembed`"
AC_SUBST(MOZILLA_HOME)
@@ -216,6 +230,7 @@
Extras/MonoQuery/MonoQuery.addin.xml
Extras/MonoDeveloperExtensions/Makefile
Extras/JavaBinding/Makefile
+Extras/BooBinding/Makefile
contrib/Makefile
])
@@ -231,4 +246,5 @@
echo " * MySQL: yes"
echo " * SQLite: $enable_monoquery_sqlite"
echo " * java support: $enable_java"
+echo " * boo support: $enable_boo"
echo ""
More information about the Monodevelop-patches-list
mailing list