Skip to content

Commit

Permalink
Browse files Browse the repository at this point in the history
Initial Lambda Implementation
  • Loading branch information
Kathleen Dollard committed Nov 29, 2014
1 parent cc31bb6 commit 5d865b3
Show file tree
Hide file tree
Showing 10 changed files with 105 additions and 91 deletions.
2 changes: 1 addition & 1 deletion RoslynDom/Implementations/RDomParameter.cs
Expand Up @@ -71,7 +71,7 @@ internal RDomParameter(RDomParameter oldRDom)
{
Attributes.AddOrMoveAttributeRange(oldRDom.Attributes.Select(x => x.Copy()));
_name = oldRDom.Name;
_type = oldRDom.Type.Copy();
if (oldRDom.Type != null) { _type = oldRDom.Type.Copy(); }
_ordinal = oldRDom.Ordinal;
_isOut = oldRDom.IsOut;
_isRef = oldRDom.IsRef;
Expand Down
14 changes: 9 additions & 5 deletions RoslynDomCSharpFactories/Factories/RDomParameterFactory.cs
Expand Up @@ -44,11 +44,15 @@ protected override IDom CreateItemFrom(SyntaxNode syntaxNode, IDom parent, Seman

newItem.Name = newItem.TypedSymbol.Name;

var type = OutputContext.Corporation
.Create(syntax.Type, newItem, model)
.FirstOrDefault()
as IReferencedType;
newItem.Type = type;
// TODO: Determine if null types for anonymous methods are a fact of life, or a temporary bug
if (syntax.Type != null)
{
var type = OutputContext.Corporation
.Create(syntax.Type, newItem, model)
.FirstOrDefault()
as IReferencedType;
newItem.Type = type;
}

newItem.IsOut = newItem.TypedSymbol.RefKind == RefKind.Out;
newItem.IsRef = newItem.TypedSymbol.RefKind == RefKind.Ref;
Expand Down
Expand Up @@ -11,14 +11,14 @@
namespace RoslynDom.CSharp
{
public class RDomExpressionFactory
: RDomBaseSyntaxNodeFactory<RDomOtherExpression, ExpressionSyntax>
: RDomBaseSyntaxNodeFactory<RDomBaseExpression, ExpressionSyntax>
{
public RDomExpressionFactory(RDomCorporation corporation)
: base(corporation)
{ }

public override RDomPriority Priority
{ get { return RDomPriority.Fallback; } }
{ get { return RDomPriority.Fallback; } }

public override Type[] SpecialExplicitDomTypes
{ get { return new[] { typeof(IExpression) }; } }
Expand All @@ -27,27 +27,22 @@ protected override IDom CreateItemFrom(SyntaxNode syntaxNode, IDom parent, Seman
{
var syntax = syntaxNode as ExpressionSyntax;

var newItem = new RDomOtherExpression(syntaxNode, parent, model);
newItem.InitialExpressionString = syntax.ToString();
newItem.InitialExpressionLanguage = ExpectedLanguages.CSharp;
newItem.ExpressionType = ExpressionTypeFromSyntax(syntaxNode);

return newItem;

}

private ExpressionType ExpressionTypeFromSyntax(SyntaxNode syntaxNode)
{
if (syntaxNode is LiteralExpressionSyntax) { return ExpressionType.Literal; }
if (syntaxNode is ObjectCreationExpressionSyntax) { return ExpressionType.ObjectCreation; }
if (syntaxNode is InvocationExpressionSyntax) { return ExpressionType.Invocation; }
if (syntaxNode is IdentifierNameSyntax) { return ExpressionType.Identifier; }
if (syntaxNode is BinaryExpressionSyntax) { return ExpressionType.Complex; }
return ExpressionType.Unknown;
if (syntaxNode is IdentifierNameSyntax)
{
// TODO: Work out how to send this via the normal extensible system
var newItem = new RDomOtherExpression(syntaxNode, parent, model);
newItem.InitialExpressionString = syntax.ToString();
newItem.InitialExpressionLanguage = ExpectedLanguages.CSharp;
newItem.ExpressionType = ExpressionType.Identifier;
return newItem;
}
else
{
return OutputContext.Corporation.Create(syntaxNode, parent, model).FirstOrDefault();
}
}


public override IEnumerable<SyntaxNode> BuildSyntax(IDom item)
public override IEnumerable<SyntaxNode> BuildSyntax(IDom item)
{
var itemAsT = item as IExpression;
if (itemAsT.InitialExpressionLanguage != ExpectedLanguages.CSharp) { throw new InvalidOperationException(); }
Expand Down
Expand Up @@ -39,7 +39,7 @@ protected override IDom CreateItemFrom(SyntaxNode syntaxNode, IDom parent, Seman
newItem = CreateItemFromInternal(syntax.Body, syntaxNode,parent, model);
newItem.Parameters.CreateAndAdd(syntax, x => new[] { x.Parameter }, x => OutputContext.Corporation.Create(x, newItem, model).Cast<IParameter>());
}
newItem.InitialExpressionString = syntax.ToString();
newItem.InitialExpressionString = syntaxNode.ToString();
newItem.InitialExpressionLanguage = ExpectedLanguages.CSharp;

return newItem;
Expand Down
Expand Up @@ -11,20 +11,15 @@
namespace RoslynDom.CSharp
{
// Sample of extending factory
public class FooExpressionFactory
public class RDomOtherExpressionFactory
: RDomBaseSyntaxNodeFactory<RDomOtherExpression, ExpressionSyntax>
{
public FooExpressionFactory(RDomCorporation corporation)
public RDomOtherExpressionFactory(RDomCorporation corporation)
: base(corporation)
{ }

public override RDomPriority Priority
{
get
{
return RDomPriority.Top;
}
}
{ get { return RDomPriority.Top; } }

protected override IDom CreateItemFrom(SyntaxNode syntaxNode, IDom parent, SemanticModel model)
{
Expand Down
Expand Up @@ -91,6 +91,7 @@ protected override IEnumerable<IDom> CreateListFrom(SyntaxNode syntaxNode, IDom
{
var equalsClause = decl.Initializer;
newItem.Initializer = OutputContext.Corporation.CreateSpecial<IExpression>(equalsClause.Value, newItem, model).FirstOrDefault();
//newItem.Initializer = (IExpression)OutputContext.Corporation.Create(equalsClause.Value, newItem, model).FirstOrDefault();
CreateFromWorker.StandardInitialize(newItem.Initializer, decl, parent, model, OutputContext);
CreateFromWorker.StoreWhitespaceForToken(newItem, decl.Initializer.EqualsToken, LanguagePart.Current, LanguageElement.EqualsAssignmentOperator);
CreateFromWorker.StoreWhitespaceForFirstAndLastToken(newItem, decl.Initializer, LanguagePart.Current, LanguageElement.Expression);
Expand Down
2 changes: 1 addition & 1 deletion RoslynDomCSharpFactories/RoslynDomCSharpFactories.csproj
Expand Up @@ -81,7 +81,7 @@
<Compile Include="BaseFactories\RDomBaseFactory.cs" />
<Compile Include="BaseFactories\RDomBaseSyntaxNodeFactory.cs" />
<Compile Include="BaseFactories\RDomBaseSyntaxTriviaFactory.cs" />
<Compile Include="FactoriesForExpressions\RDomExpressionFactory - Copy.cs" />
<Compile Include="FactoriesForExpressions\RDomOtherExpressionFactory.cs" />
<Compile Include="FactoriesForExpressions\RDomLambdaExpressionFactory.cs" />
<Compile Include="FactoriesForExpressions\RDomInvocationExpressionFactory.cs" />
<Compile Include="Factories\RDomEventFactory.cs" />
Expand Down
2 changes: 1 addition & 1 deletion RoslynDomRDomCommon/RDomCorporation.cs
Expand Up @@ -165,7 +165,7 @@ public IEnumerable<TSpecial> CreateSpecial<TSpecial>(SyntaxNode node, IDom paren
return items.Cast<TSpecial>().ToList();
}

private IRDomFactory GetFactory(Type type, IDictionary<Type, IList<IRDomFactory>> dictionary, Func<IRDomFactory, bool> canUseDelegate)
private IRDomFactory GetFactory(Type type, IDictionary<Type, IList<IRDomFactory>> dictionary, Func<IRDomFactory, bool> canUseDelegate)
{
var factories = GetFactories(type, dictionary).ToArray();
if (!factories.Any()) { return null; }
Expand Down
2 changes: 1 addition & 1 deletion RoslynDomTests/AncestorsAndDependentsTests.cs
Expand Up @@ -349,7 +349,7 @@ public string FooBar
Console.WriteLine(csharpCode);
var root = RDom.CSharp.Load(csharpCode);
var actual = root.ReportHierarchy();
var expected = "RoslynDom.RDomRoot : <root>\r\n RoslynDom.RDomVerticalWhitespace : \r\n RoslynDom.RDomClass : Bar\r\n RoslynDom.RDomProperty : FooBar\r\n RoslynDom.RDomPropertyAccessor : get_FooBar\r\n RoslynDom.RDomDeclarationStatement : z {UInt16}\r\n RoslynDom.RDomOtherExpression : 432\r\n RoslynDom.RDomReturnStatement : \r\n RoslynDom.RDomOtherExpression : z.ToString()\r\n RoslynDom.RDomPropertyAccessor : set_FooBar\r\n RoslynDom.RDomAssignmentStatement : \r\n RoslynDom.RDomOtherExpression : value\r\n";
var expected = "RoslynDom.RDomRoot : <root>\r\n RoslynDom.RDomVerticalWhitespace : \r\n RoslynDom.RDomClass : Bar\r\n RoslynDom.RDomProperty : FooBar\r\n RoslynDom.RDomPropertyAccessor : get_FooBar\r\n RoslynDom.RDomDeclarationStatement : z {UInt16}\r\n RoslynDom.RDomOtherExpression : 432\r\n RoslynDom.RDomReturnStatement : \r\n RoslynDom.RDomInvocationExpression : z.ToString()\r\n RoslynDom.RDomPropertyAccessor : set_FooBar\r\n RoslynDom.RDomAssignmentStatement : \r\n RoslynDom.RDomOtherExpression : value\r\n";
Assert.AreEqual(expected, actual);

expected = "RoslynDom.RDomClass : Bar";
Expand Down
123 changes: 71 additions & 52 deletions RoslynDomTests/ExpressionTests.cs
Expand Up @@ -105,8 +105,8 @@ public void FooBar()
#endregion

#region lambda expressions
[TestMethod, TestCategory(InvocationExpressionCategory)]
public void Lambda_expression_correct_in_statement_with_no_params_and_no_generics()
[TestMethod, TestCategory(LambdaExpressionCategory)]
public void Lambda_expression_correct_in_statement_with_one_params()
{
var csharpCode =
@"public class Bar
Expand All @@ -125,57 +125,76 @@ public void FooBar()
});
}

//[TestMethod, TestCategory(InvocationExpressionCategory)]
//public void Lambda_expression_correct_in_statement_with_no_params_and_no_generics()
//{
// Func<int, int> y = x => x;
// Func<string, string, string> z = (x1, x2) => x1 + x2;
// Func<int, bool> z2 = x =>
// {
// if (x > 2) { return true; }
// return false;
// };
// z2(42);
// z("", "");
// var csharpCode =
// @"public class Bar
// {
// public void FooBar()
// {
// Foo();
// }
// }";
// var exp = VerifyInvocationExpressionStatement(csharpCode, x =>
// {
// Assert.AreEqual("Foo", x.MethodName);
// });
//}
[TestMethod, TestCategory(LambdaExpressionCategory)]
public void Lambda_expression_correct_in_statement_with_no_params()
{
var csharpCode =
@"public class Bar
{
public void FooBar()
{
Func<int> y = () => 42;
}
}";
var exp = VerifyLambdaExpressionStatement(csharpCode,
x => {
Assert.AreEqual("y", x.Name);
},
x => {
Assert.AreEqual("() => 42", x.InitialExpressionString);
});

}

[TestMethod, TestCategory(LambdaExpressionCategory)]
public void Lambda_expression_correct_in_statement_with_two_params()
{
var csharpCode =
@"public class Bar
{
public void FooBar()
{
Func<string, string, string> y = (x1, x2) => x1 + x2;
}
}";
var exp = VerifyLambdaExpressionStatement(csharpCode,
x => {
Assert.AreEqual("y", x.Name);
},
x => {
Assert.AreEqual("(x1, x2) => x1 + x2", x.InitialExpressionString);
});
}

[TestMethod, TestCategory(LambdaExpressionCategory)]
public void Lambda_expression_correct_in_statement_with_one_params_multiline()
{
var csharpCode =
@"public class Bar
{
public void FooBar()
{
Func<int, bool> y = x =>
{
if (x > 2) { return true; }
return false;
};
}
}";
var exp = VerifyLambdaExpressionStatement(csharpCode,
x => {
Assert.AreEqual("y", x.Name);
},
x => {
Assert.AreEqual(@"x =>
{
if (x > 2) { return true; }
return false;
}", x.InitialExpressionString);
});
}


//[TestMethod, TestCategory(InvocationExpressionCategory)]
//public void Lambda_expression_correct_in_statement_with_no_params_and_no_generics()
//{
// Func<int, int> y = x => x;
// Func<string, string, string> z = (x1, x2) => x1 + x2;
// Func<int, bool> z2 = x =>
// {
// if (x > 2) { return true; }
// return false;
// };
// z2(42);
// z("", "");
// var csharpCode =
// @"public class Bar
// {
// public void FooBar()
// {
// Foo();
// }
// }";
// var exp = VerifyInvocationExpressionStatement(csharpCode, x =>
// {
// Assert.AreEqual("Foo", x.MethodName);
// });
//}
#endregion

private IInvocationExpression VerifyInvocationExpressionStatement(string csharpCode,
Expand Down

0 comments on commit 5d865b3

Please sign in to comment.