Browse Source

Fixed collection initializer parsing.

newNRvisualizers
Mike Krüger 14 years ago
parent
commit
0ecf1fc71e
  1. 32
      ICSharpCode.NRefactory/CSharp/Parser/CSharpParser.cs
  2. 1288
      ICSharpCode.NRefactory/CSharp/Parser/mcs/cs-parser.cs
  3. 8
      ICSharpCode.NRefactory/CSharp/Parser/mcs/cs-parser.jay
  4. 14
      ICSharpCode.NRefactory/CSharp/Parser/mcs/expression.cs

32
ICSharpCode.NRefactory/CSharp/Parser/CSharpParser.cs

@ -2262,7 +2262,6 @@ namespace ICSharpCode.NRefactory.CSharp @@ -2262,7 +2262,6 @@ namespace ICSharpCode.NRefactory.CSharp
return;
var commaLocations = LocationsBag.GetLocations (args);
for (int i = 0; i < args.Count; i++) {
parent.AddChild (ConvertArgument (args[i]), InvocationExpression.Roles.Argument);
if (commaLocations != null && i > 0) {
@ -2279,7 +2278,8 @@ namespace ICSharpCode.NRefactory.CSharp @@ -2279,7 +2278,8 @@ namespace ICSharpCode.NRefactory.CSharp
{
var result = new InvocationExpression ();
var location = LocationsBag.GetLocations (invocationExpression);
result.AddChild ((Expression)invocationExpression.Expression.Accept (this), InvocationExpression.Roles.TargetExpression);
if (invocationExpression.Expression != null)
result.AddChild ((Expression)invocationExpression.Expression.Accept (this), InvocationExpression.Roles.TargetExpression);
if (location != null)
result.AddChild (new CSharpTokenNode (Convert (location[0]), 1), InvocationExpression.Roles.LPar);
AddArguments (result, location, invocationExpression.Arguments);
@ -2292,7 +2292,6 @@ namespace ICSharpCode.NRefactory.CSharp @@ -2292,7 +2292,6 @@ namespace ICSharpCode.NRefactory.CSharp
public override object Visit (New newExpression)
{
var result = new ObjectCreateExpression ();
var location = LocationsBag.GetLocations (newExpression);
result.AddChild (new CSharpTokenNode (Convert (newExpression.Location), "new".Length), ObjectCreateExpression.Roles.Keyword);
@ -2345,6 +2344,33 @@ namespace ICSharpCode.NRefactory.CSharp @@ -2345,6 +2344,33 @@ namespace ICSharpCode.NRefactory.CSharp
if (location != null)
result.AddChild (new CSharpTokenNode (Convert (location[1]), 1), ObjectCreateExpression.Roles.RPar);
var minit = newInitializeExpression.Initializers;
if (minit != null){
var init = new ArrayInitializerExpression ();
var initLoc = LocationsBag.GetLocations (newInitializeExpression);
if (initLoc != null)
result.AddChild (new CSharpTokenNode (Convert (location[0]), 1), ArrayInitializerExpression.Roles.LBrace);
var commaLoc = LocationsBag.GetLocations (minit.Initializers);
int curComma = commaLoc != null ? commaLoc.Count - 1 : -1;
foreach (var expr in minit.Initializers) {
var eleInit = expr as CollectionElementInitializer;
if (eleInit == null)
continue;
for (int i = 0; i < eleInit.Arguments.Count; i++) {
var arg = eleInit.Arguments[i] as CollectionElementInitializer.ElementInitializerArgument;
if (arg == null)
continue;
init.AddChild ((ICSharpCode.NRefactory.CSharp.Expression)arg.Expr.Accept (this), ArrayInitializerExpression.Roles.Expression);
if (curComma >= 0)
init.AddChild (new CSharpTokenNode (Convert (commaLoc[curComma--]), 1), ArrayInitializerExpression.Roles.Comma);
}
}
if (initLoc != null)
result.AddChild (new CSharpTokenNode (Convert (location[1]), 1), ArrayInitializerExpression.Roles.RBrace);
result.AddChild (init, ObjectCreateExpression.InitializerRole);
}
return result;
}

1288
ICSharpCode.NRefactory/CSharp/Parser/mcs/cs-parser.cs

File diff suppressed because it is too large Load Diff

8
ICSharpCode.NRefactory/CSharp/Parser/mcs/cs-parser.jay

@ -753,6 +753,7 @@ attribute_list @@ -753,6 +753,7 @@ attribute_list
{
var attrs = (List<Attribute>) $1;
attrs.Add ((Attribute) $3);
lbag.AppendTo (attrs, GetLocation ($2));
$$ = attrs;
}
@ -2762,6 +2763,7 @@ type_arguments @@ -2762,6 +2763,7 @@ type_arguments
{
TypeArguments type_args = (TypeArguments) $1;
type_args.Add ((FullNamedExpression) $3);
lbag.AppendTo (type_args, GetLocation ($2));
$$ = type_args;
locationListStack.Peek ().Add (GetLocation ($2));
}
@ -2984,6 +2986,7 @@ type_list @@ -2984,6 +2986,7 @@ type_list
{
var types = (List<FullNamedExpression>) $1;
types.Add ((FullNamedExpression) $3);
lbag.AppendTo (types, GetLocation ($2));
$$ = types;
}
;
@ -3208,6 +3211,7 @@ member_initializer_list @@ -3208,6 +3211,7 @@ member_initializer_list
{
var a = (List<Expression>)$1;
a.Add ((Expression) $3);
lbag.AppendTo (a, GetLocation ($2));
$$ = a;
}
| member_initializer_list error {
@ -3536,6 +3540,8 @@ anonymous_type_parameters @@ -3536,6 +3540,8 @@ anonymous_type_parameters
{
var a = (List<AnonymousTypeParameter>) $1;
a.Add ((AnonymousTypeParameter) $3);
lbag.AppendTo (a, GetLocation ($2));
$$ = a;
}
;
@ -4121,6 +4127,8 @@ lambda_parameter_list @@ -4121,6 +4127,8 @@ lambda_parameter_list
}
pars.Add (p);
lbag.AppendTo (pars, GetLocation ($2));
$$ = pars;
}
;

14
ICSharpCode.NRefactory/CSharp/Parser/mcs/expression.cs

@ -8855,7 +8855,7 @@ namespace Mono.CSharp @@ -8855,7 +8855,7 @@ namespace Mono.CSharp
public override void EmitSideEffect (EmitContext ec)
{
}
public override object Accept (StructuralVisitor visitor)
{
return visitor.Visit (this);
@ -9527,6 +9527,12 @@ namespace Mono.CSharp @@ -9527,6 +9527,12 @@ namespace Mono.CSharp
}
}
public IList<Expression> Initializers {
get {
return initializers;
}
}
protected override void CloneTo (CloneContext clonectx, Expression target)
{
CollectionOrObjectInitializers t = (CollectionOrObjectInitializers) target;
@ -9681,6 +9687,12 @@ namespace Mono.CSharp @@ -9681,6 +9687,12 @@ namespace Mono.CSharp
CollectionOrObjectInitializers initializers;
IMemoryLocation instance;
public CollectionOrObjectInitializers Initializers {
get {
return initializers;
}
}
public NewInitialize (FullNamedExpression requested_type, Arguments arguments, CollectionOrObjectInitializers initializers, Location l)
: base (requested_type, arguments, l)
{

Loading…
Cancel
Save