- // ensure:
- // Monitor.Leave
- TryStatement stmt = new TryStatement();
- stmt.ProtectedBlock = body;
- stmt.EnsureBlock = new Block();
- stmt.EnsureBlock.Add(
- AstUtil.CreateMethodInvocationExpression(Monitor_Exit, monitorReference));
-
- block.Add(stmt);
-
- return block;
- }
- }
-}
Index: src/Boo.Lang.Compiler/TypeSystem/ExternalMethod.cs
===================================================================
--- src/Boo.Lang.Compiler/TypeSystem/ExternalMethod.cs (revision 2748)
+++ src/Boo.Lang.Compiler/TypeSystem/ExternalMethod.cs (working copy)
@@ -56,7 +56,7 @@
{
if (-1 == _isMeta)
{
- _isMeta = IsStatic && MetadataUtil.IsAttributeDefined(_memberInfo, typeof(Boo.Lang.Compiler.MetaProgramming.MetaAttribute))
+ _isMeta = IsStatic && MetadataUtil.IsAttributeDefined(_memberInfo, typeof(Boo.Lang.MetaAttribute))
? 1
: 0;
}
Index: src/Boo.Lang.Compiler/Boo.Lang.Compiler.mdp
===================================================================
--- src/Boo.Lang.Compiler/Boo.Lang.Compiler.mdp (revision 2748)
+++ src/Boo.Lang.Compiler/Boo.Lang.Compiler.mdp (working copy)
@@ -20,6 +20,7 @@
+
@@ -273,24 +274,9 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Index: src/Boo.Lang.Compiler/Steps/IntroduceGlobalNamespaces.cs
===================================================================
--- src/Boo.Lang.Compiler/Steps/IntroduceGlobalNamespaces.cs (revision 2748)
+++ src/Boo.Lang.Compiler/Steps/IntroduceGlobalNamespaces.cs (working copy)
@@ -38,6 +38,7 @@
NameResolutionService.GlobalNamespace = new NamespaceDelegator(
NameResolutionService.GlobalNamespace,
SafeGetNamespace("Boo.Lang"),
+ SafeGetNamespace("Boo.Lang.Extensions"),
TypeSystemServices.BuiltinsType);
}
Index: src/Boo.Lang.Compiler/Boo.Lang.Compiler-VS2005.csproj
===================================================================
--- src/Boo.Lang.Compiler/Boo.Lang.Compiler-VS2005.csproj (revision 2748)
+++ src/Boo.Lang.Compiler/Boo.Lang.Compiler-VS2005.csproj (working copy)
@@ -63,6 +63,7 @@
+
@@ -316,24 +317,9 @@
-
-
-
-
-
-
-
-
-
-
-
-
-
-
-
Index: src/Boo.Lang.Compiler/Attributes/GetterAttribute.cs
===================================================================
--- src/Boo.Lang.Compiler/Attributes/GetterAttribute.cs (revision 2748)
+++ src/Boo.Lang.Compiler/Attributes/GetterAttribute.cs (working copy)
@@ -1,55 +0,0 @@
-#region license
-// Copyright (c) 2004, Rodrigo B. de Oliveira (rbo@acm.org)
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without modification,
-// are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Rodrigo B. de Oliveira nor the names of its
-// contributors may be used to endorse or promote products derived from this
-// software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-using System;
-using Boo.Lang.Compiler.Ast;
-
-namespace Boo.Lang
-{
- ///
- /// Creates a field accessor.
- ///
- ///
- ///
- /// class Customer:
- /// [getter(FirstName)] _fname as string
- /// [getter(LastName)] _lname as string
- ///
- ///
- public class GetterAttribute : PropertyAttribute
- {
- public GetterAttribute(ReferenceExpression propertyName) : base(propertyName)
- {
- }
-
- override protected Method CreateSetter(Field f)
- {
- return null;
- }
- }
-}
Index: src/Boo.Lang.Compiler/Attributes/RequiredAttribute.cs
===================================================================
--- src/Boo.Lang.Compiler/Attributes/RequiredAttribute.cs (revision 2748)
+++ src/Boo.Lang.Compiler/Attributes/RequiredAttribute.cs (working copy)
@@ -1,141 +0,0 @@
-#region license
-// Copyright (c) 2004, Rodrigo B. de Oliveira (rbo@acm.org)
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without modification,
-// are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Rodrigo B. de Oliveira nor the names of its
-// contributors may be used to endorse or promote products derived from this
-// software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-using System;
-using Boo.Lang.Compiler.Ast;
-
-namespace Boo.Lang
-{
- ///
- /// Parameter validation.
- ///
- ///
- ///
- /// def constructor([required] name as string):
- /// _name = name
- ///
- ///
- //[AstAttributeTarget(typeof(ParameterDeclaration))]
- public class RequiredAttribute : Boo.Lang.Compiler.AbstractAstAttribute
- {
- protected Expression _condition;
-
- public RequiredAttribute()
- {
- }
-
- public RequiredAttribute(Expression condition)
- {
- if (null == condition)
- {
- throw new ArgumentNullException("condition");
- }
- _condition = condition;
- }
-
- override public void Apply(Boo.Lang.Compiler.Ast.Node node)
- {
- string name;
- Node parent;
- string errorMessage = null;
-
- ParameterDeclaration pd = node as ParameterDeclaration;
- if (pd !=null)
- {
- name = pd.Name;
- parent = pd.ParentNode;
- }
- else
- {
- Property prop = node as Property;
- if (prop != null && prop.Setter != null)
- {
- name = "value";
- parent = prop.Setter;
- }
- else
- {
- InvalidNodeForAttribute("ParameterDeclaration or Property");
- return;
- }
- }
-
- string exceptionClass = null;
- StatementModifier modifier = null;
- if (null == _condition)
- {
- exceptionClass = "ArgumentNullException";
- modifier = new StatementModifier(
- StatementModifierType.If,
- new BinaryExpression(BinaryOperatorType.ReferenceEquality,
- new ReferenceExpression(name),
- new NullLiteralExpression()));
- }
- else
- {
- exceptionClass = "ArgumentException";
- modifier = new StatementModifier(
- StatementModifierType.Unless,
- _condition);
- errorMessage = "Expected: " + _condition.ToString();
- }
-
- MethodInvocationExpression x = new MethodInvocationExpression();
- x.Target = new MemberReferenceExpression(
- new ReferenceExpression("System"),
- exceptionClass);
- if (null != errorMessage)
- {
- x.Arguments.Add(new StringLiteralExpression(errorMessage));
- }
- x.Arguments.Add(new StringLiteralExpression(name));
-
- RaiseStatement rs = new RaiseStatement(x, modifier);
- rs.LexicalInfo = LexicalInfo;
-
- Method method = parent as Method;
- if (null != method)
- {
- method.Body.Statements.Insert(0, rs);
- }
- else
- {
- Property property = (Property)parent;
- if (null != property.Getter)
- {
- property.Getter.Body.Statements.Insert(0, rs);
- }
- if (null != property.Setter)
- {
- property.Setter.Body.Statements.Insert(0, rs.CloneNode());
- }
- }
-
- }
- }
-}
Index: src/Boo.Lang.Compiler/Attributes/DefaultAttribute.cs
===================================================================
--- src/Boo.Lang.Compiler/Attributes/DefaultAttribute.cs (revision 2748)
+++ src/Boo.Lang.Compiler/Attributes/DefaultAttribute.cs (working copy)
@@ -1,123 +0,0 @@
-#region license
-// Copyright (c) 2004, Rodrigo B. de Oliveira (rbo@acm.org)
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without modification,
-// are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Rodrigo B. de Oliveira nor the names of its
-// contributors may be used to endorse or promote products derived from this
-// software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-using System;
-using Boo.Lang.Compiler;
-using Boo.Lang.Compiler.Ast;
-using Boo.Lang.Compiler.TypeSystem;
-
-namespace Boo.Lang
-{
- ///
- /// Parameter default value (when parameter is not a valuetype).
- ///
- ///
- ///
- /// def constructor([default("Cedric")] name as string):
- /// _name = name
- ///
- ///
- //[AstAttributeTarget(typeof(ParameterDeclaration))]
- public class DefaultAttribute : Boo.Lang.Compiler.AbstractAstAttribute
- {
- protected Expression _value;
-
- public DefaultAttribute(Expression value)
- {
- if (null == value)
- {
- throw new ArgumentNullException("value");
- }
- _value = value;
- }
-
- override public void Apply(Boo.Lang.Compiler.Ast.Node node)
- {
- string name;
- Node parent;
- IType type;
-
- ParameterDeclaration pd = node as ParameterDeclaration;
- if (pd != null)
- {
- name = pd.Name;
- parent = pd.ParentNode;
- type = NameResolutionService.Resolve(pd.Type.ToString(), EntityType.Type) as IType;
- }
- else
- {
- Property prop = node as Property;
- if (prop != null && prop.Setter != null)
- {
- name = "value";
- parent = prop.Setter;
- type = NameResolutionService.Resolve(prop.Type.ToString(), EntityType.Type) as IType;
- }
- else
- {
- InvalidNodeForAttribute("ParameterDeclaration or Property");
- return;
- }
- }
-
- // error if parameter is a valuetype
- // TODO: check nullable (type.IsValueType true or not here?)
- if (null != type && type.IsValueType) {
- Errors.Add(CompilerErrorFactory.ValueTypeParameterCannotUseDefaultAttribute(parent, name));
- return;
- }
-
- //TODO: check if default value is type-compatible with argument type?
- //TODO: handle nullable through assignIfHasValue
- IfStatement assignIfNull = new IfStatement(LexicalInfo);
- assignIfNull.Condition = new BinaryExpression(
- BinaryOperatorType.ReferenceEquality,
- new ReferenceExpression(name),
- new NullLiteralExpression());
- assignIfNull.TrueBlock = new Block(LexicalInfo);
- assignIfNull.TrueBlock.Add(
- new BinaryExpression(BinaryOperatorType.Assign,
- new ReferenceExpression(name),
- _value));
-
- Method method = parent as Method;
- if (null != method)
- {
- method.Body.Statements.Insert(0, assignIfNull);
- }
- else
- {
- Property property = (Property) parent;
- if (null != property.Setter)
- {
- property.Setter.Body.Statements.Insert(0, assignIfNull);
- }
- }
- }
- }
-}
Index: src/Boo.Lang.Compiler/Attributes/PropertyAttribute.cs
===================================================================
--- src/Boo.Lang.Compiler/Attributes/PropertyAttribute.cs (revision 2748)
+++ src/Boo.Lang.Compiler/Attributes/PropertyAttribute.cs (working copy)
@@ -1,268 +0,0 @@
-#region license
-// Copyright (c) 2004, Rodrigo B. de Oliveira (rbo@acm.org)
-// All rights reserved.
-//
-// Redistribution and use in source and binary forms, with or without modification,
-// are permitted provided that the following conditions are met:
-//
-// * Redistributions of source code must retain the above copyright notice,
-// this list of conditions and the following disclaimer.
-// * Redistributions in binary form must reproduce the above copyright notice,
-// this list of conditions and the following disclaimer in the documentation
-// and/or other materials provided with the distribution.
-// * Neither the name of Rodrigo B. de Oliveira nor the names of its
-// contributors may be used to endorse or promote products derived from this
-// software without specific prior written permission.
-//
-// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS "AS IS" AND
-// ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
-// WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
-// DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT OWNER OR CONTRIBUTORS BE LIABLE
-// FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
-// DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
-// SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER
-// CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY,
-// OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
-// THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
-#endregion
-
-using System;
-using Boo.Lang.Compiler.Ast;
-
-namespace Boo.Lang
-{
- ///
- /// Creates a property over a field.
- ///
- public class PropertyAttribute : Boo.Lang.Compiler.AbstractAstAttribute
- {
- protected ReferenceExpression _propertyName;
-
- protected Expression _setPreCondition;
-
- protected BoolLiteralExpression _protected;
-
- protected BoolLiteralExpression _observable;
-
- protected ListLiteralExpression _attributes;
-
- public PropertyAttribute(ReferenceExpression propertyName) : this(propertyName, null)
- {
- }
-
- public PropertyAttribute(ReferenceExpression propertyName, Expression setPreCondition)
- {
- if (null == propertyName)
- {
- throw new ArgumentNullException("propertyName");
- }
- _propertyName = propertyName;
- _setPreCondition = setPreCondition;
- }
-
- public BoolLiteralExpression Protected
- {
- get
- {
- return _protected;
- }
-
- set
- {
- _protected = value;
- }
- }
-
- protected bool IsProtected
- {
- get
- {
- if (null == _protected)
- {
- return false;
- }
- return _protected.Value;
- }
- }
-
- public BoolLiteralExpression Observable
- {
- get
- {
- return _observable;
- }
-
- set
- {
- _observable = value;
- }
- }
-
- protected bool IsObservable
- {
- get
- {
- if (null == _observable)
- {
- return false;
- }
- return _observable.Value;
- }
- }
-
- protected string ChangedEventName
- {
- get
- {
- return _propertyName.Name + "Changed";
- }
- }
-
- public ListLiteralExpression Attributes
- {
- get
- {
- return _attributes;
- }
-
- set
- {
- _attributes = value;
- }
- }
-
- override public void Apply(Node node)
- {
- Field f = node as Field;
- if (null == f)
- {
- InvalidNodeForAttribute("Field");
- return;
- }
-
- Property p = new Property();
- if (f.IsStatic)
- {
- p.Modifiers |= TypeMemberModifiers.Static;
- }
- if (IsProtected)
- {
- p.Modifiers |= TypeMemberModifiers.Protected;
- }
- p.Name = _propertyName.Name;
- p.Type = f.Type;
- p.Getter = CreateGetter(f);
- p.Setter = CreateSetter(f);
- p.LexicalInfo = LexicalInfo;
-
- if (Attributes != null && Attributes.Items.Count > 0)
- {
- foreach (Expression item in Attributes.Items)
- {
- p.Attributes.Add(ConvertExpressionToAttribute(item));
- }
- }
-
- f.DeclaringType.Members.Add(p);
-
- if (IsObservable)
- {
- f.DeclaringType.Members.Add(CreateChangedEvent(f));
- }
- }
-
- static public Boo.Lang.Compiler.Ast.Attribute ConvertExpressionToAttribute(
- Expression item)
- {
- Boo.Lang.Compiler.Ast.Attribute att =
- new Boo.Lang.Compiler.Ast.Attribute(item.LexicalInfo);
- if (item is MethodInvocationExpression)
- {
- MethodInvocationExpression m = (MethodInvocationExpression)item;
- att.Name = m.Target.ToString();
- att.Arguments = m.Arguments;
- att.NamedArguments = m.NamedArguments;
- }
- else
- {
- att.Name = item.ToString();
- }
- return att;
- }
-
- virtual protected Method CreateGetter(Field f)
- {
- // get:
- // return
- Method getter = new Method();
- getter.Name = "get";
- getter.Body.Statements.Add(
- new ReturnStatement(
- base.LexicalInfo,
- new ReferenceExpression(f.Name),
- null)
- );
- return getter;
- }
-
- virtual protected Method CreateSetter(Field f)
- {
- Method setter = new Method();
- setter.Name = "set";
-
- if (null != _setPreCondition)
- {
- setter.Body.Add(
- new RaiseStatement(
- _setPreCondition.LexicalInfo,
- AstUtil.CreateMethodInvocationExpression(
- AstUtil.CreateReferenceExpression("System.ArgumentException"),
- new StringLiteralExpression("precondition '" +
- _setPreCondition.ToString() +
- "' failed:")),
- new StatementModifier(
- StatementModifierType.Unless,
- _setPreCondition)));
- }
- setter.Body.Add(
- new BinaryExpression(
- base.LexicalInfo,
- BinaryOperatorType.Assign,
- new MemberReferenceExpression(
- CreateRefTarget(f),
- f.Name),
- new ReferenceExpression("value")
- )
- );
-
- if (IsObservable)
- {
- MethodInvocationExpression mie = new MethodInvocationExpression(
- new ReferenceExpression(ChangedEventName));
- mie.Arguments.Add(new SelfLiteralExpression());
- mie.Arguments.Add(
- new MemberReferenceExpression(
- new MemberReferenceExpression(
- new ReferenceExpression("System"),
- "EventArgs"),
- "Empty"));
- setter.Body.Add(mie);
- }
- return setter;
- }
-
- private Expression CreateRefTarget(Field f)
- {
- if (f.IsStatic) return new ReferenceExpression(LexicalInfo, f.DeclaringType.Name);
- return new SelfLiteralExpressio