Index: pkg/analyzer/lib/src/dart/constant/evaluation.dart |
diff --git a/pkg/analyzer/lib/src/dart/constant/evaluation.dart b/pkg/analyzer/lib/src/dart/constant/evaluation.dart |
index 2e0d063e80d1220a2c72c794010625cd64a073d0..df6c8191413ab7f029f9cdd62944ffba806266bf 100644 |
--- a/pkg/analyzer/lib/src/dart/constant/evaluation.dart |
+++ b/pkg/analyzer/lib/src/dart/constant/evaluation.dart |
@@ -422,7 +422,10 @@ class ConstantEvaluationEngine { |
List<Expression> arguments, |
ConstructorElement constructor, |
ConstantVisitor constantVisitor, |
- ErrorReporter errorReporter) { |
+ ErrorReporter errorReporter, |
+ {ConstructorElement originalConstructor, |
+ List<DartObjectImpl> originalArguments, |
+ Map<String, DartObjectImpl> originalNamedArguments}) { |
if (!getConstructorImpl(constructor).isCycleFree) { |
// It's not safe to evaluate this constructor, so bail out. |
// TODO(paulberry): ensure that a reasonable error message is produced |
@@ -434,6 +437,7 @@ class ConstantEvaluationEngine { |
int argumentCount = arguments.length; |
List<DartObjectImpl> argumentValues = |
new List<DartObjectImpl>(argumentCount); |
+ List<DartObjectImpl> positionalArguments = <DartObjectImpl>[]; |
List<Expression> argumentNodes = new List<Expression>(argumentCount); |
HashMap<String, DartObjectImpl> namedArgumentValues = |
new HashMap<String, DartObjectImpl>(); |
@@ -448,10 +452,17 @@ class ConstantEvaluationEngine { |
namedArgumentNodes[name] = argument; |
argumentValues[i] = typeProvider.nullObject; |
} else { |
- argumentValues[i] = constantVisitor._valueOf(argument); |
+ var argumentValue = constantVisitor._valueOf(argument); |
+ argumentValues[i] = argumentValue; |
+ positionalArguments.add(argumentValue); |
argumentNodes[i] = argument; |
} |
} |
+ if (originalConstructor == null) { |
+ originalConstructor = constructor; |
+ originalArguments = positionalArguments; |
+ originalNamedArguments = namedArgumentValues; |
+ } |
constructor = followConstantRedirectionChain(constructor); |
InterfaceType definingClass = constructor.returnType as InterfaceType; |
if (constructor.isFactory) { |
@@ -709,7 +720,10 @@ class ConstantEvaluationEngine { |
initializer.argumentList.arguments, |
constructor, |
initializerVisitor, |
- errorReporter); |
+ errorReporter, |
+ originalConstructor: originalConstructor, |
+ originalArguments: originalArguments, |
+ originalNamedArguments: originalNamedArguments); |
} |
} |
} |
@@ -727,7 +741,12 @@ class ConstantEvaluationEngine { |
superArguments, initializerVisitor, errorReporter); |
} |
} |
- return new DartObjectImpl(definingClass, new GenericState(fieldMap)); |
+ return new DartObjectImpl( |
+ definingClass, |
+ new GenericState(fieldMap, |
+ constructor: originalConstructor, |
+ positionalArguments: originalArguments, |
+ namedArguments: originalNamedArguments)); |
} |
void evaluateSuperConstructorCall( |