@ -15,6 +15,7 @@ using Boo.Lang.Compiler.Ast.Visitors;
@@ -15,6 +15,7 @@ using Boo.Lang.Compiler.Ast.Visitors;
using Boo.Lang.Parser ;
using ICSharpCode.Core ;
using ICSharpCode.SharpDevelop.Dom ;
using Grunwald.BooBinding.CodeCompletion ;
namespace Grunwald.BooBinding.Designer
{
@ -297,14 +298,41 @@ namespace Grunwald.BooBinding.Designer
@@ -297,14 +298,41 @@ namespace Grunwald.BooBinding.Designer
}
}
public override void OnDeclarationStatement ( DeclarationStatement node )
{
CodeVariableDeclarationStatement var = new CodeVariableDeclarationStatement ( ConvTypeRef ( node . Declaration . Type ) ,
node . Declaration . Name ) ;
if ( node . Initializer ! = null ) {
_ expression = null ;
node . Initializer . Accept ( this ) ;
var . InitExpression = _ expression ;
}
_ statements . Add ( var ) ;
}
CodeVariableDeclarationStatement GetLocalVariable ( string name )
{
foreach ( CodeStatement stmt in _ statements ) {
CodeVariableDeclarationStatement var = stmt as CodeVariableDeclarationStatement ;
if ( var ! = null & & var . Name = = name ) {
return var ;
}
}
return null ;
}
public override void OnReferenceExpression ( ReferenceExpression node )
{
if ( pc . GetClass ( node . Name ) ! = null )
if ( pc . GetClass ( node . Name ) ! = null ) {
_ expression = new CodeTypeReferenceExpression ( node . Name ) ;
else if ( pc . NamespaceExists ( node . Name ) )
} else if ( pc . NamespaceExists ( node . Name ) ) {
_ expression = new CodeTypeReferenceExpression ( node . Name ) ;
else
} else if ( GetLocalVariable ( node . Name ) ! = null ) {
_ expression = new CodeVariableReferenceExpression ( node . Name ) ;
} else {
_ expression = CreateMemberExpression ( new CodeThisReferenceExpression ( ) , node . Name ) ;
}
}
CodeExpression CreateMemberExpression ( CodeExpression expr , string name )
@ -319,6 +347,10 @@ namespace Grunwald.BooBinding.Designer
@@ -319,6 +347,10 @@ namespace Grunwald.BooBinding.Designer
if ( _f ieldReferenceType = = null )
return new CodePropertyReferenceExpression ( expr , name ) ;
return CreateMemberExpression ( expr , _f ieldReferenceType . FullyQualifiedName , name , false ) ;
} else if ( expr is CodeVariableReferenceExpression ) {
string varName = ( ( CodeVariableReferenceExpression ) expr ) . VariableName ;
CodeVariableDeclarationStatement varDecl = GetLocalVariable ( varName ) ;
return CreateMemberExpression ( expr , varDecl . Type . BaseType , name , false ) ;
} else {
_f ieldReferenceType = null ;
return new CodePropertyReferenceExpression ( expr , name ) ;
@ -429,5 +461,25 @@ namespace Grunwald.BooBinding.Designer
@@ -429,5 +461,25 @@ namespace Grunwald.BooBinding.Designer
{
_ expression = new CodeBaseReferenceExpression ( ) ;
}
public override void OnTypeofExpression ( TypeofExpression node )
{
_ expression = new CodeTypeOfExpression ( ConvTypeRef ( node . Type ) ) ;
}
public override void OnArrayLiteralExpression ( ArrayLiteralExpression node )
{
BooResolver resolver = new BooResolver ( ) ;
IReturnType createType = resolver . GetTypeOfExpression ( node , null ) ;
if ( createType = = null )
createType = ReflectionReturnType . Object ;
CodeExpression [ ] initializers = new CodeExpression [ node . Items . Count ] ;
for ( int i = 0 ; i < initializers . Length ; i + + ) {
_ expression = null ;
node . Items [ i ] . Accept ( this ) ;
initializers [ i ] = _ expression ;
}
_ expression = new CodeArrayCreateExpression ( createType . FullyQualifiedName , initializers ) ;
}
}
}