Skip to content

Commit

Permalink
Merge pull request dotnet#19237 from genlu/fix2
Browse files Browse the repository at this point in the history
Reuse local rewriter to derive arguments for IHasArgumentsExpression
  • Loading branch information
genlu authored May 18, 2017
2 parents 3f402e9 + ac6e7c9 commit c5f8e63
Show file tree
Hide file tree
Showing 38 changed files with 1,882 additions and 515 deletions.
6 changes: 5 additions & 1 deletion src/Compilers/CSharp/Portable/Binder/Binder_Expressions.cs
Original file line number Diff line number Diff line change
Expand Up @@ -3431,6 +3431,7 @@ private BoundExpression BindConstructorInitializerCore(
invokedAsExtensionMethod: false,
argsToParamsOpt: memberResolutionResult.Result.ArgsToParamsOpt,
resultKind: LookupResultKind.Viable,
binderOpt: this,
type: constructorReturnType,
hasErrors: hasErrors)
{ WasCompilerGenerated = initializerArgumentListOpt == null };
Expand Down Expand Up @@ -4524,6 +4525,7 @@ protected BoundExpression BindClassCreationExpression(
memberResolutionResult.Result.ArgsToParamsOpt,
constantValueOpt,
boundInitializerOpt,
this,
type,
hasError);

Expand Down Expand Up @@ -4663,7 +4665,7 @@ private BoundExpression BindComImportCoClassCreationExpression(ObjectCreationExp
var creation = (BoundObjectCreationExpression)classCreation;
return creation.Update(creation.Constructor, creation.ConstructorsGroup, creation.Arguments, creation.ArgumentNamesOpt,
creation.ArgumentRefKindsOpt, creation.Expanded, creation.ArgsToParamsOpt, creation.ConstantValueOpt,
creation.InitializerExpressionOpt, interfaceType);
creation.InitializerExpressionOpt, creation.BinderOpt, interfaceType);

case BoundKind.BadExpression:
var bad = (BoundBadExpression)classCreation;
Expand Down Expand Up @@ -6827,6 +6829,8 @@ private BoundExpression BindIndexerOrIndexedPropertyAccess(
argumentRefKinds,
isExpanded,
argsToParams,
this,
false,
property.Type,
gotError);
}
Expand Down
8 changes: 4 additions & 4 deletions src/Compilers/CSharp/Portable/Binder/Binder_Invocation.cs
Original file line number Diff line number Diff line change
Expand Up @@ -982,7 +982,7 @@ private BoundCall BindInvocationExpressionContinued(
{
return new BoundCall(node, receiver, method, args, argNames, argRefKinds, isDelegateCall: true,
expanded: expanded, invokedAsExtensionMethod: invokedAsExtensionMethod,
argsToParamsOpt: argsToParams, resultKind: LookupResultKind.Viable, type: returnType, hasErrors: gotError);
argsToParamsOpt: argsToParams, resultKind: LookupResultKind.Viable, binderOpt: this, type: returnType, hasErrors: gotError);
}
else
{
Expand All @@ -1003,7 +1003,7 @@ private BoundCall BindInvocationExpressionContinued(

return new BoundCall(node, receiver, method, args, argNames, argRefKinds, isDelegateCall: false,
expanded: expanded, invokedAsExtensionMethod: invokedAsExtensionMethod,
argsToParamsOpt: argsToParams, resultKind: LookupResultKind.Viable, type: returnType, hasErrors: gotError);
argsToParamsOpt: argsToParams, resultKind: LookupResultKind.Viable, binderOpt: this, type: returnType, hasErrors: gotError);
}
}

Expand Down Expand Up @@ -1124,7 +1124,7 @@ private BoundCall CreateBadCall(
args = BuildArgumentsForErrorRecovery(analyzedArguments, methods);
var argNames = analyzedArguments.GetNames();
var argRefKinds = analyzedArguments.RefKinds.ToImmutableOrNull();
return BoundCall.ErrorCall(node, receiver, method, args, argNames, argRefKinds, isDelegate, invokedAsExtensionMethod: invokedAsExtensionMethod, originalMethods: methods, resultKind: resultKind);
return BoundCall.ErrorCall(node, receiver, method, args, argNames, argRefKinds, isDelegate, invokedAsExtensionMethod: invokedAsExtensionMethod, originalMethods: methods, resultKind: resultKind, binder: this);
}

private static bool IsUnboundGeneric(MethodSymbol method)
Expand Down Expand Up @@ -1330,7 +1330,7 @@ private BoundCall CreateBadCall(
var argRefKinds = analyzedArguments.RefKinds.ToImmutableOrNull();
var originalMethods = (expr.Kind == BoundKind.MethodGroup) ? ((BoundMethodGroup)expr).Methods : ImmutableArray<MethodSymbol>.Empty;

return BoundCall.ErrorCall(node, expr, method, args, argNames, argRefKinds, isDelegateCall: false, invokedAsExtensionMethod: false, originalMethods: originalMethods, resultKind: resultKind);
return BoundCall.ErrorCall(node, expr, method, args, argNames, argRefKinds, isDelegateCall: false, invokedAsExtensionMethod: false, originalMethods: originalMethods, resultKind: resultKind, binder: this);
}

private static TypeSymbol GetCommonTypeOrReturnType<TMember>(ImmutableArray<TMember> members)
Expand Down
2 changes: 1 addition & 1 deletion src/Compilers/CSharp/Portable/Binder/Binder_Query.cs
Original file line number Diff line number Diff line change
Expand Up @@ -224,7 +224,7 @@ private static BoundCall ReverseLastTwoParameterOrder(BoundCall result)
return result.Update(
result.ReceiverOpt, result.Method, arguments.ToImmutableAndFree(), default(ImmutableArray<string>),
default(ImmutableArray<RefKind>), result.IsDelegateCall, result.Expanded, result.InvokedAsExtensionMethod,
argsToParams.ToImmutableAndFree(), result.ResultKind, result.Type);
argsToParams.ToImmutableAndFree(), result.ResultKind, result.BinderOpt, result.Type);
}

private void ReduceQuery(QueryTranslationState state, DiagnosticBag diagnostics)
Expand Down
23 changes: 21 additions & 2 deletions src/Compilers/CSharp/Portable/Binder/Binder_Statements.cs
Original file line number Diff line number Diff line change
Expand Up @@ -1744,7 +1744,7 @@ private BoundExpression InferTypeForDiscardAssignment(BoundDiscardExpression op1
}

private BoundAssignmentOperator BindAssignment(SyntaxNode node, BoundExpression op1, BoundExpression op2, DiagnosticBag diagnostics)
{
{
Debug.Assert(op1 != null);
Debug.Assert(op2 != null);

Expand Down Expand Up @@ -1773,7 +1773,7 @@ private BoundAssignmentOperator BindAssignment(SyntaxNode node, BoundExpression
{
// Event assignment is a call to void WindowsRuntimeMarshal.AddEventHandler<T>().
type = this.GetSpecialType(SpecialType.System_Void, diagnostics, node);
}
}
else
{
type = op1.Type;
Expand Down Expand Up @@ -1933,6 +1933,25 @@ private BoundExpression CheckValue(BoundExpression expr, BindValueKind valueKind
GetNonMethodMemberType(otherSymbol));
}
}
else if (expr.Kind == BoundKind.IndexerAccess)
{
// Assigning to an non ref return indexer needs to set 'useSetterForDefaultArgumentGeneration' to true.
// This is for IOperation purpose.
var indexerAccess = (BoundIndexerAccess)expr;
if (valueKind == BindValueKind.Assignment && !indexerAccess.Indexer.ReturnsByRef)
{
expr = indexerAccess.Update(indexerAccess.ReceiverOpt,
indexerAccess.Indexer,
indexerAccess.Arguments,
indexerAccess.ArgumentNamesOpt,
indexerAccess.ArgumentRefKindsOpt,
indexerAccess.Expanded,
indexerAccess.ArgsToParamsOpt,
indexerAccess.BinderOpt,
useSetterForDefaultArgumentGeneration: true,
type: indexerAccess.Type);
}
}

if (!hasResolutionErrors && CheckValueKind(expr, valueKind, diagnostics) ||
expr.HasAnyErrors && valueKind == BindValueKind.RValueOrMethodGroup)
Expand Down
1 change: 1 addition & 0 deletions src/Compilers/CSharp/Portable/BoundTree/BoundExpression.cs
Original file line number Diff line number Diff line change
Expand Up @@ -424,6 +424,7 @@ internal BoundObjectCreationExpression UpdateArgumentsAndInitializer(
argsToParamsOpt: default(ImmutableArray<int>),
constantValueOpt: ConstantValueOpt,
initializerExpressionOpt: newInitializerExpression,
binderOpt: BinderOpt,
type: changeTypeOpt ?? Type);
}
}
Expand Down
10 changes: 10 additions & 0 deletions src/Compilers/CSharp/Portable/BoundTree/BoundNodes.xml
Original file line number Diff line number Diff line change
Expand Up @@ -1201,6 +1201,9 @@
<Field Name="InvokedAsExtensionMethod" Type="bool"/>
<Field Name="ArgsToParamsOpt" Type="ImmutableArray&lt;int&gt;" Null="allow"/>
<Field Name="ResultKind" PropertyOverrides="true" Type="LookupResultKind"/>

<!-- BinderOpt is added as a temporary solution for IOperation implementation and should probably be removed in the future -->
<Field Name="BinderOpt" Type="Binder" Null="allow"/>
</Node>

<Node Name="BoundEventAssignmentOperator" Base="BoundExpression">
Expand Down Expand Up @@ -1246,6 +1249,9 @@
<Field Name="ArgsToParamsOpt" Type="ImmutableArray&lt;int&gt;" Null="allow"/>
<Field Name="ConstantValueOpt" Type="ConstantValue" Null="allow"/>
<Field Name="InitializerExpressionOpt" Type="BoundExpression" Null="allow"/>

<!-- BinderOpt is added as a temporary solution for IOperation implementation and should probably be removed in the future -->
<Field Name="BinderOpt" Type="Binder" Null="allow"/>
</Node>


Expand Down Expand Up @@ -1491,6 +1497,10 @@
<Field Name="ArgumentRefKindsOpt" Type="ImmutableArray&lt;RefKind&gt;" Null="allow"/>
<Field Name="Expanded" Type="bool"/>
<Field Name="ArgsToParamsOpt" Type="ImmutableArray&lt;int&gt;" Null="allow"/>

<!-- BinderOpt and UseSetterForDefaultArgumentGeneration are added as a temporary solution for IOperation implementation and should probably be removed in the future -->
<Field Name="BinderOpt" Type="Binder" Null="allow"/>
<Field Name="UseSetterForDefaultArgumentGeneration" Type="bool"/>
</Node>

<Node Name="BoundDynamicIndexerAccess" Base="BoundExpression">
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -7,13 +7,13 @@ namespace Microsoft.CodeAnalysis.CSharp
{
internal partial class BoundObjectCreationExpression
{
public BoundObjectCreationExpression(SyntaxNode syntax, MethodSymbol constructor, ImmutableArray<BoundExpression> arguments, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, ConstantValue constantValueOpt, BoundExpression initializerExpressionOpt, TypeSymbol type, bool hasErrors = false)
: this(syntax, constructor, ImmutableArray<MethodSymbol>.Empty, arguments, argumentNamesOpt, argumentRefKindsOpt, expanded, argsToParamsOpt, constantValueOpt, initializerExpressionOpt, type, hasErrors)
public BoundObjectCreationExpression(SyntaxNode syntax, MethodSymbol constructor, ImmutableArray<BoundExpression> arguments, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, ConstantValue constantValueOpt, BoundExpression initializerExpressionOpt, Binder binderOpt, TypeSymbol type, bool hasErrors = false)
: this(syntax, constructor, ImmutableArray<MethodSymbol>.Empty, arguments, argumentNamesOpt, argumentRefKindsOpt, expanded, argsToParamsOpt, constantValueOpt, initializerExpressionOpt, binderOpt, type, hasErrors)
{ }

public BoundObjectCreationExpression Update(MethodSymbol constructor, ImmutableArray<BoundExpression> arguments, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, ConstantValue constantValueOpt, BoundExpression initializerExpressionOpt, TypeSymbol type)
public BoundObjectCreationExpression Update(MethodSymbol constructor, ImmutableArray<BoundExpression> arguments, ImmutableArray<string> argumentNamesOpt, ImmutableArray<RefKind> argumentRefKindsOpt, bool expanded, ImmutableArray<int> argsToParamsOpt, ConstantValue constantValueOpt, BoundExpression initializerExpressionOpt, Binder binderOpt, TypeSymbol type)
{
return this.Update(constructor, ImmutableArray<MethodSymbol>.Empty, arguments, argumentNamesOpt, argumentRefKindsOpt, expanded, argsToParamsOpt, constantValueOpt, initializerExpressionOpt, type);
return this.Update(constructor, ImmutableArray<MethodSymbol>.Empty, arguments, argumentNamesOpt, argumentRefKindsOpt, expanded, argsToParamsOpt, constantValueOpt, initializerExpressionOpt, binderOpt, type);
}
}
}
18 changes: 11 additions & 7 deletions src/Compilers/CSharp/Portable/BoundTree/Constructors.cs
Original file line number Diff line number Diff line change
Expand Up @@ -75,7 +75,8 @@ public static BoundCall ErrorCall(
bool isDelegateCall,
bool invokedAsExtensionMethod,
ImmutableArray<MethodSymbol> originalMethods,
LookupResultKind resultKind)
LookupResultKind resultKind,
Binder binder)
{
if (!originalMethods.IsEmpty)
resultKind = resultKind.WorseResultKind(LookupResultKind.OverloadResolutionFailure);
Expand All @@ -84,14 +85,14 @@ public static BoundCall ErrorCall(

var call = new BoundCall(node, receiverOpt, method, arguments, namedArguments,
refKinds, isDelegateCall: isDelegateCall, expanded: false, invokedAsExtensionMethod: invokedAsExtensionMethod, argsToParamsOpt: default(ImmutableArray<int>),
resultKind: resultKind, type: method.ReturnType, hasErrors: true);
resultKind: resultKind, binderOpt: binder, type: method.ReturnType, hasErrors: true);
call.OriginalMethodsOpt = originalMethods;
return call;
}

public BoundCall Update(BoundExpression receiverOpt, MethodSymbol method, ImmutableArray<BoundExpression> arguments)
{
return this.Update(receiverOpt, method, arguments, ArgumentNamesOpt, ArgumentRefKindsOpt, IsDelegateCall, Expanded, InvokedAsExtensionMethod, ArgsToParamsOpt, ResultKind, Type);
return this.Update(receiverOpt, method, arguments, ArgumentNamesOpt, ArgumentRefKindsOpt, IsDelegateCall, Expanded, InvokedAsExtensionMethod, ArgsToParamsOpt, ResultKind, BinderOpt, Type);
}

public static BoundCall Synthesized(SyntaxNode syntax, BoundExpression receiverOpt, MethodSymbol method)
Expand Down Expand Up @@ -122,6 +123,7 @@ public static BoundCall Synthesized(SyntaxNode syntax, BoundExpression receiverO
invokedAsExtensionMethod: false,
argsToParamsOpt: default(ImmutableArray<int>),
resultKind: LookupResultKind.Viable,
binderOpt: null,
type: method.ReturnType,
hasErrors: method.OriginalDefinition is ErrorMethodSymbol
)
Expand All @@ -131,12 +133,12 @@ public static BoundCall Synthesized(SyntaxNode syntax, BoundExpression receiverO

internal sealed partial class BoundObjectCreationExpression
{
public BoundObjectCreationExpression(SyntaxNode syntax, MethodSymbol constructor, params BoundExpression[] arguments)
: this(syntax, constructor, ImmutableArray.Create<BoundExpression>(arguments), default(ImmutableArray<string>), default(ImmutableArray<RefKind>), false, default(ImmutableArray<int>), null, null, constructor.ContainingType)
public BoundObjectCreationExpression(SyntaxNode syntax, MethodSymbol constructor, Binder binderOpt, params BoundExpression[] arguments)
: this(syntax, constructor, ImmutableArray.Create<BoundExpression>(arguments), default(ImmutableArray<string>), default(ImmutableArray<RefKind>), false, default(ImmutableArray<int>), null, null, binderOpt, constructor.ContainingType)
{
}
public BoundObjectCreationExpression(SyntaxNode syntax, MethodSymbol constructor, ImmutableArray<BoundExpression> arguments)
: this(syntax, constructor, arguments, default(ImmutableArray<string>), default(ImmutableArray<RefKind>), false, default(ImmutableArray<int>), null, null, constructor.ContainingType)
public BoundObjectCreationExpression(SyntaxNode syntax, MethodSymbol constructor, Binder binderOpt, ImmutableArray<BoundExpression> arguments)
: this(syntax, constructor, arguments, default(ImmutableArray<string>), default(ImmutableArray<RefKind>), false, default(ImmutableArray<int>), null, null, binderOpt, constructor.ContainingType)
{
}
}
Expand All @@ -161,6 +163,8 @@ public static BoundIndexerAccess ErrorAccess(
refKinds,
expanded: false,
argsToParamsOpt: default(ImmutableArray<int>),
binderOpt: null,
useSetterForDefaultArgumentGeneration: false,
type: indexer.Type,
hasErrors: true)
{
Expand Down
Loading

0 comments on commit c5f8e63

Please sign in to comment.