Skip to content
This repository has been archived by the owner on Sep 24, 2020. It is now read-only.

Commit

Permalink
try revert critical method
Browse files Browse the repository at this point in the history
  • Loading branch information
awatertree committed Apr 12, 2012
1 parent 9d29131 commit aff71a5
Showing 1 changed file with 78 additions and 66 deletions.
144 changes: 78 additions & 66 deletions ICSharpCode.NRefactory.CSharp/Parser/CSharpParser.cs
Expand Up @@ -2705,73 +2705,85 @@ public override object Visit (NewAnonymousType newAnonymousType)
}
return result;
}

ArrayInitializerExpression ConvertCollectionOrObjectInitializers (CollectionOrObjectInitializers minit)
{
if (minit == null)
return null;
var init = new ArrayInitializerExpression ();
AddConvertCollectionOrObjectInitializers (init, minit);
return init;
}

void AddConvertCollectionOrObjectInitializers (Expression init, CollectionOrObjectInitializers minit)
{
var initLoc = LocationsBag.GetLocations (minit);
var commaLoc = LocationsBag.GetLocations (minit.Initializers);
int curComma = 0;
if (initLoc != null)
init.AddChild (new CSharpTokenNode (Convert (initLoc [0])), Roles.LBrace);
foreach (var expr in minit.Initializers) {
var collectionInit = expr as CollectionElementInitializer;
if (collectionInit != null) {
var parent = new ArrayInitializerExpression ();

parent.AddChild (new CSharpTokenNode (Convert (expr.Location)), Roles.LBrace);

for (int i = 0; i < collectionInit.Arguments.Count; i++) {
var arg = collectionInit.Arguments [i] as CollectionElementInitializer.ElementInitializerArgument;
if (arg == null)
continue;
parent.AddChild ((ICSharpCode.NRefactory.CSharp.Expression)arg.Expr.Accept (this), Roles.Expression);
}

var braceLocs = LocationsBag.GetLocations (expr);
if (braceLocs != null)
parent.AddChild (new CSharpTokenNode (Convert (braceLocs [0])), Roles.RBrace);

init.AddChild (parent, Roles.Expression);
} else {
var eleInit = expr as ElementInitializer;
if (eleInit != null) {
var nexpr = new NamedExpression ();
nexpr.AddChild (Identifier.Create (eleInit.Name, Convert (eleInit.Location)), Roles.Identifier);
var assignLoc = LocationsBag.GetLocations (eleInit);
if (assignLoc != null)
nexpr.AddChild (new CSharpTokenNode (Convert (assignLoc [0])), Roles.Assign);
if (eleInit.Source != null) {
if (eleInit.Source is CollectionOrObjectInitializers) {
var arrInit = new ArrayInitializerExpression ();
AddConvertCollectionOrObjectInitializers (arrInit, eleInit.Source as CollectionOrObjectInitializers);
nexpr.AddChild (arrInit, Roles.Expression);
} else {
nexpr.AddChild ((Expression)eleInit.Source.Accept (this), Roles.Expression);
}
}

init.AddChild (nexpr, Roles.Expression);
}
}
if (commaLoc != null && curComma < commaLoc.Count)
init.AddChild (new CSharpTokenNode (Convert (commaLoc [curComma++])), Roles.Comma);

}
if (initLoc != null) {
if (initLoc.Count == 3) // optional comma
init.AddChild (new CSharpTokenNode (Convert (initLoc [1])), Roles.Comma);
init.AddChild (new CSharpTokenNode (Convert (initLoc [initLoc.Count - 1])), Roles.RBrace);
}
}
ArrayInitializerExpression ConvertCollectionOrObjectInitializers(CollectionOrObjectInitializers minit)
{
if (minit == null)
return null;
var init = new ArrayInitializerExpression();
AddConvertCollectionOrObjectInitializers(init, minit);
return init;
}

void AddConvertCollectionOrObjectInitializers(Expression init, CollectionOrObjectInitializers minit)
{
var initLoc = LocationsBag.GetLocations(minit);
var commaLoc = LocationsBag.GetLocations(minit.Initializers);
int curComma = 0;
if (initLoc != null)
init.AddChild(new CSharpTokenNode(Convert(initLoc[0])), Roles.LBrace);
foreach (var expr in minit.Initializers)
{
var collectionInit = expr as CollectionElementInitializer;
if (collectionInit != null)
{
var parent = new ArrayInitializerExpression();

var braceLocs = LocationsBag.GetLocations(expr);
if (braceLocs != null)
parent.AddChild(new CSharpTokenNode(Convert(braceLocs[0])), Roles.LBrace);

for (int i = 0; i < collectionInit.Arguments.Count; i++)
{
var arg = collectionInit.Arguments[i] as CollectionElementInitializer.ElementInitializerArgument;
if (arg == null)
continue;
parent.AddChild((ICSharpCode.NRefactory.CSharp.Expression)arg.Expr.Accept(this), Roles.Expression);
}

if (braceLocs != null)
parent.AddChild(new CSharpTokenNode(Convert(braceLocs[1])), Roles.RBrace);

init.AddChild(parent, Roles.Expression);
}
else
{
var eleInit = expr as ElementInitializer;
if (eleInit != null)
{
var nexpr = new NamedExpression();
nexpr.AddChild(Identifier.Create(eleInit.Name, Convert(eleInit.Location)), Roles.Identifier);
var assignLoc = LocationsBag.GetLocations(eleInit);
if (assignLoc != null)
nexpr.AddChild(new CSharpTokenNode(Convert(assignLoc[0])), Roles.Assign);
if (eleInit.Source != null)
{
if (eleInit.Source is CollectionOrObjectInitializers)
{
var arrInit = new ArrayInitializerExpression();
AddConvertCollectionOrObjectInitializers(arrInit, eleInit.Source as CollectionOrObjectInitializers);
nexpr.AddChild(arrInit, Roles.Expression);
}
else
{
nexpr.AddChild((Expression)eleInit.Source.Accept(this), Roles.Expression);
}
}

init.AddChild(nexpr, Roles.Expression);
}
}
if (commaLoc != null && curComma < commaLoc.Count)
init.AddChild(new CSharpTokenNode(Convert(commaLoc[curComma++])), Roles.Comma);

}
if (initLoc != null)
{
if (initLoc.Count == 3) // optional comma
init.AddChild(new CSharpTokenNode(Convert(initLoc[1])), Roles.Comma);
init.AddChild(new CSharpTokenNode(Convert(initLoc[initLoc.Count - 1])), Roles.RBrace);
}
}

public override object Visit (NewInitialize newInitializeExpression)
{
Expand Down

0 comments on commit aff71a5

Please sign in to comment.