Browse Source

Improved handling of incomplete lambda expressions.

git-svn-id: svn://svn.sharpdevelop.net/sharpdevelop/trunk@3012 1ccf3a8d-04fe-1044-b7c0-cef0b8235c61
shortcuts
Daniel Grunwald 18 years ago
parent
commit
fa9d4b17a3
  1. 2
      src/Libraries/NRefactory/Project/Src/Ast/Generated.cs
  2. 473
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs
  3. 5
      src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG
  4. 2
      src/Libraries/NRefactory/Project/Src/Visitors/LookupTableVisitor.cs
  5. 19
      src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/TypeInference.cs

2
src/Libraries/NRefactory/Project/Src/Ast/Generated.cs

@ -2562,6 +2562,8 @@ namespace ICSharpCode.NRefactory.Ast { @@ -2562,6 +2562,8 @@ namespace ICSharpCode.NRefactory.Ast {
}
}
public Location ExtendedEndLocation { get; set; }
public LambdaExpression() {
parameters = new List<ParameterDeclarationExpression>();
statementBody = BlockStatement.Null;

473
src/Libraries/NRefactory/Project/Src/Parser/CSharp/Parser.cs

File diff suppressed because it is too large Load Diff

5
src/Libraries/NRefactory/Project/Src/Parser/CSharp/cs.ATG

@ -2020,9 +2020,9 @@ LambdaExpression<out Expression outExpr> @@ -2020,9 +2020,9 @@ LambdaExpression<out Expression outExpr>
=
"("
[
LambdaExpressionParameter<out p> (. if (p != null) lambda.Parameters.Add(p); .)
LambdaExpressionParameter<out p> (. SafeAdd(lambda, lambda.Parameters, p); .)
{ ","
LambdaExpressionParameter<out p> (. if (p != null) lambda.Parameters.Add(p); .)
LambdaExpressionParameter<out p> (. SafeAdd(lambda, lambda.Parameters, p); .)
}
]
")"
@ -2070,6 +2070,7 @@ LambdaExpressionBody<LambdaExpression lambda> @@ -2070,6 +2070,7 @@ LambdaExpressionBody<LambdaExpression lambda>
| Expr<out expr> (. lambda.ExpressionBody = expr; .)
)
(. lambda.EndLocation = t.EndLocation; .)
(. lambda.ExtendedEndLocation = la.Location; .)
.
AnonymousMethodExpr<out Expression outExpr>

2
src/Libraries/NRefactory/Project/Src/Visitors/LookupTableVisitor.cs

@ -134,7 +134,7 @@ namespace ICSharpCode.NRefactory.Visitors @@ -134,7 +134,7 @@ namespace ICSharpCode.NRefactory.Visitors
{
foreach (ParameterDeclarationExpression p in lambdaExpression.Parameters) {
AddVariable(p.TypeReference, p.ParameterName,
lambdaExpression.StartLocation, lambdaExpression.EndLocation,
lambdaExpression.StartLocation, lambdaExpression.ExtendedEndLocation,
false, false, null, lambdaExpression);
}
return base.VisitLambdaExpression(lambdaExpression, data);

19
src/Main/ICSharpCode.SharpDevelop.Dom/Project/Src/CSharp/TypeInference.cs

@ -27,16 +27,10 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -27,16 +27,10 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
ti.parameterTypes = method.Parameters.Select(p => p.ReturnType).Take(arguments.Count).ToList();
ti.arguments = arguments.Take(ti.parameterTypes.Count).ToArray();
ti.PhaseOne();
if (ti.PhaseTwo()) {
IReturnType[] result = ti.typeParameters.Select(tp => tp.FixedTo).ToArray();
Log("Type inference for " + method.DotNetName + " succeeded: ", result);
success = true;
return result;
} else {
Log("Type inference for " + method.DotNetName + " failed.");
success = false;
return null;
}
success = ti.PhaseTwo();
IReturnType[] result = ti.typeParameters.Select(tp => tp.FixedTo).ToArray();
Log("Type inference for " + method.DotNetName + " " + (success ? "succeeded" : "failed") + ": ", result);
return result;
}
List<TP> typeParameters;
@ -130,10 +124,13 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp @@ -130,10 +124,13 @@ namespace ICSharpCode.SharpDevelop.Dom.CSharp
}
}
// now fix 'em
bool errorDuringFix = false;
foreach (TP tp in typeParametersToFix) {
if (!Fix(tp))
return false;
errorDuringFix = true;
}
if (errorDuringFix)
return false;
bool unfixedTypeVariablesExist = typeParameters.Any((TP X) => X.Fixed == false);
if (typeParametersToFix.Count == 0 && unfixedTypeVariablesExist) {
// If no such type variables exist and there are still unfixed type variables, type inference fails.

Loading…
Cancel
Save