Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(1003)

Unified Diff: pkg/analyzer/lib/src/generated/constant.dart

Issue 1129143003: Store elements in the constant eval dependency graph rather than AST nodes. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 5 years, 7 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/generated/element.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/generated/constant.dart
diff --git a/pkg/analyzer/lib/src/generated/constant.dart b/pkg/analyzer/lib/src/generated/constant.dart
index b3d41078949be1f47eb86447d0b22bb13112331f..b15ebc6151b44caa58c8a2cc5cf870a1047fddd2 100644
--- a/pkg/analyzer/lib/src/generated/constant.dart
+++ b/pkg/analyzer/lib/src/generated/constant.dart
@@ -428,8 +428,8 @@ class ConstantEvaluationEngine {
// it an unknown value will suppress further errors.
return new DartObjectImpl.validWithUnknownValue(definingClass);
}
- validator.beforeGetConstantInitializers(constructor);
ConstructorElementImpl constructorBase = _getConstructorBase(constructor);
+ validator.beforeGetConstantInitializers(constructorBase);
List<ConstructorInitializer> initializers =
constructorBase.constantInitializers;
if (initializers == null) {
@@ -702,10 +702,10 @@ class ConstantEvaluationEngine {
abstract class ConstantEvaluationValidator {
/**
* This method is called just before computing the constant value associated
- * with [constNode]. Unit tests will override this method to introduce
+ * with [element]. Unit tests will override this method to introduce
* additional error checking.
*/
- void beforeComputeValue(AstNode constNode);
+ void beforeComputeValue(Element element);
/**
* This method is called just before getting the constant initializers
@@ -716,10 +716,10 @@ abstract class ConstantEvaluationValidator {
/**
* This method is called just before retrieving an evaluation result from an
- * AST node. Unit tests will override it to introduce additional error
+ * element. Unit tests will override it to introduce additional error
* checking.
*/
- void beforeGetEvaluationResult(AstNode node);
+ void beforeGetEvaluationResult(Element element);
/**
* This method is called just before getting the constant value of a field
@@ -742,13 +742,13 @@ abstract class ConstantEvaluationValidator {
class ConstantEvaluationValidator_ForProduction
implements ConstantEvaluationValidator {
@override
- void beforeComputeValue(AstNode constNode) {}
+ void beforeComputeValue(Element element) {}
@override
void beforeGetConstantInitializers(ConstructorElement constructor) {}
@override
- void beforeGetEvaluationResult(AstNode node) {}
+ void beforeGetEvaluationResult(Element element) {}
@override
void beforeGetFieldEvaluationResult(FieldElementImpl field) {}
@@ -852,18 +852,10 @@ class ConstantEvaluator {
*/
class ConstantFinder extends RecursiveAstVisitor<Object> {
/**
- * A table mapping constant variable elements to the declarations of those
- * variables.
+ * The elements whose constant values need to be computed, with the exception
+ * of annotations.
*/
- final HashMap<PotentiallyConstVariableElement, VariableDeclaration> variableMap =
- new HashMap<PotentiallyConstVariableElement, VariableDeclaration>();
-
- /**
- * A table mapping constant constructors to the declarations of those
- * constructors.
- */
- final HashMap<ConstructorElement, ConstructorDeclaration> constructorMap =
- new HashMap<ConstructorElement, ConstructorDeclaration>();
+ HashSet<Element> constantsToCompute = new HashSet<Element>();
/**
* A collection of annotations.
@@ -904,7 +896,8 @@ class ConstantFinder extends RecursiveAstVisitor<Object> {
if (node.constKeyword != null) {
ConstructorElement element = node.element;
if (element != null) {
- constructorMap[element] = node;
+ constantsToCompute.add(element);
+ constantsToCompute.addAll(element.parameters);
}
}
return null;
@@ -922,7 +915,7 @@ class ConstantFinder extends RecursiveAstVisitor<Object> {
node.isFinal &&
!element.isStatic)) {
if (node.element != null) {
- variableMap[node.element as PotentiallyConstVariableElement] = node;
+ constantsToCompute.add(node.element);
}
}
return null;
@@ -962,18 +955,16 @@ class ConstantValueComputer {
* A graph in which the nodes are the constants, and the edges are from each
* constant to the other constants that are referenced by it.
*/
- DirectedGraph<AstNode> referenceGraph = new DirectedGraph<AstNode>();
-
- /**
- * A table mapping constant variables to the declarations of those variables.
- */
- HashMap<PotentiallyConstVariableElement, VariableDeclaration> _variableDeclarationMap;
+ DirectedGraph<Element> referenceGraph = new DirectedGraph<Element>();
/**
- * A table mapping constant constructors to the declarations of those
- * constructors.
+ * The elements whose constant values need to be computed. Any elements
+ * which appear in [referenceGraph] but not in this set either belong to a
+ * different library cycle (and hence don't need to be recomputed) or were
+ * computed during a previous stage of resolution stage (e.g. constants
+ * associated with enums).
*/
- HashMap<ConstructorElement, ConstructorDeclaration> constructorDeclarationMap;
+ HashSet<Element> _constantsToCompute;
/**
* A collection of annotations.
@@ -1010,85 +1001,85 @@ class ConstantValueComputer {
* added.
*/
void computeValues() {
- _variableDeclarationMap = _constantFinder.variableMap;
- constructorDeclarationMap = _constantFinder.constructorMap;
+ _constantsToCompute = _constantFinder.constantsToCompute;
_annotations = _constantFinder.annotations;
- _variableDeclarationMap.values.forEach((VariableDeclaration declaration) {
- ReferenceFinder referenceFinder = new ReferenceFinder(declaration,
- referenceGraph, _variableDeclarationMap, constructorDeclarationMap);
- referenceGraph.addNode(declaration);
- declaration.initializer.accept(referenceFinder);
- });
- constructorDeclarationMap.forEach((ConstructorElementImpl element,
- ConstructorDeclaration declaration) {
- element.isCycleFree = false;
- ConstructorElement redirectedConstructor =
- evaluationEngine.getConstRedirectedConstructor(element);
- if (redirectedConstructor != null) {
- ConstructorElement redirectedConstructorBase =
- ConstantEvaluationEngine._getConstructorBase(redirectedConstructor);
- ConstructorDeclaration redirectedConstructorDeclaration =
- findConstructorDeclaration(redirectedConstructorBase);
- referenceGraph.addEdge(declaration, redirectedConstructorDeclaration);
- return;
- }
- ReferenceFinder referenceFinder = new ReferenceFinder(declaration,
- referenceGraph, _variableDeclarationMap, constructorDeclarationMap);
- referenceGraph.addNode(declaration);
- bool superInvocationFound = false;
- NodeList<ConstructorInitializer> initializers = declaration.initializers;
- for (ConstructorInitializer initializer in initializers) {
- if (initializer is SuperConstructorInvocation) {
- superInvocationFound = true;
+ for (Element element in _constantsToCompute) {
+ referenceGraph.addNode(element);
+ if (element is ParameterElement) {
+ if (element.initializer != null) {
+ Expression defaultValue =
+ (element as ConstVariableElement).constantInitializer;
+ if (defaultValue != null) {
+ ReferenceFinder parameterReferenceFinder =
+ new ReferenceFinder(element, referenceGraph);
+ defaultValue.accept(parameterReferenceFinder);
+ }
+ }
+ } else if (element is PotentiallyConstVariableElement) {
+ ReferenceFinder referenceFinder =
+ new ReferenceFinder(element, referenceGraph);
+ element.constantInitializer.accept(referenceFinder);
+ } else if (element is ConstructorElementImpl) {
+ element.isCycleFree = false;
+ ConstructorElement redirectedConstructor =
+ evaluationEngine.getConstRedirectedConstructor(element);
+ if (redirectedConstructor != null) {
+ ConstructorElement redirectedConstructorBase =
+ ConstantEvaluationEngine
+ ._getConstructorBase(redirectedConstructor);
+ referenceGraph.addEdge(element, redirectedConstructorBase);
+ continue;
}
- initializer.accept(referenceFinder);
- }
- if (!superInvocationFound) {
- // No explicit superconstructor invocation found, so we need to
- // manually insert a reference to the implicit superconstructor.
- InterfaceType superclass =
- (element.returnType as InterfaceType).superclass;
- if (superclass != null && !superclass.isObject) {
- ConstructorElement unnamedConstructor =
- superclass.element.unnamedConstructor;
- ConstructorDeclaration superConstructorDeclaration =
- findConstructorDeclaration(unnamedConstructor);
- if (superConstructorDeclaration != null) {
- referenceGraph.addEdge(declaration, superConstructorDeclaration);
+ ReferenceFinder referenceFinder =
+ new ReferenceFinder(element, referenceGraph);
+ bool superInvocationFound = false;
+ List<ConstructorInitializer> initializers =
+ element.constantInitializers;
+ for (ConstructorInitializer initializer in initializers) {
+ if (initializer is SuperConstructorInvocation) {
+ superInvocationFound = true;
}
+ initializer.accept(referenceFinder);
}
- }
- for (FieldElement field in element.enclosingElement.fields) {
- // Note: non-static const isn't allowed but we handle it anyway so that
- // we won't be confused by incorrect code.
- if ((field.isFinal || field.isConst) && !field.isStatic) {
- VariableDeclaration fieldDeclaration = _variableDeclarationMap[field];
- if (fieldDeclaration != null) {
- referenceGraph.addEdge(declaration, fieldDeclaration);
+ if (!superInvocationFound) {
+ // No explicit superconstructor invocation found, so we need to
+ // manually insert a reference to the implicit superconstructor.
+ InterfaceType superclass =
+ (element.returnType as InterfaceType).superclass;
+ if (superclass != null && !superclass.isObject) {
+ ConstructorElement unnamedConstructor = ConstantEvaluationEngine
+ ._getConstructorBase(superclass.element.unnamedConstructor);
+ if (unnamedConstructor != null) {
+ referenceGraph.addEdge(element, unnamedConstructor);
+ }
}
}
- }
- for (FormalParameter parameter in declaration.parameters.parameters) {
- referenceGraph.addNode(parameter);
- referenceGraph.addEdge(declaration, parameter);
- if (parameter is DefaultFormalParameter) {
- Expression defaultValue = parameter.defaultValue;
- if (defaultValue != null) {
- ReferenceFinder parameterReferenceFinder = new ReferenceFinder(
- parameter, referenceGraph, _variableDeclarationMap,
- constructorDeclarationMap);
- defaultValue.accept(parameterReferenceFinder);
+ for (FieldElement field in element.enclosingElement.fields) {
+ // Note: non-static const isn't allowed but we handle it anyway so that
+ // we won't be confused by incorrect code.
+ if ((field.isFinal || field.isConst) &&
+ !field.isStatic &&
+ field.initializer != null) {
+ referenceGraph.addEdge(element, field);
}
}
+ for (ParameterElement parameterElement in element.parameters) {
+ referenceGraph.addEdge(element, parameterElement);
+ }
+ } else {
+ // Should not happen.
+ assert(false);
+ AnalysisEngine.instance.logger.logError(
+ "Constant value computer trying to compute the value of a node of type ${element.runtimeType}");
}
- });
- List<List<AstNode>> topologicalSort =
+ }
+ List<List<Element>> topologicalSort =
referenceGraph.computeTopologicalSort();
- for (List<AstNode> constantsInCycle in topologicalSort) {
+ for (List<Element> constantsInCycle in topologicalSort) {
if (constantsInCycle.length == 1) {
_computeValueFor(constantsInCycle[0]);
} else {
- for (AstNode constant in constantsInCycle) {
+ for (Element constant in constantsInCycle) {
_generateCycleError(constantsInCycle, constant);
}
}
@@ -1097,25 +1088,35 @@ class ConstantValueComputer {
// including them in the topological sort. We just process all the
// annotations after all other constants are finished.
for (Annotation annotation in _annotations) {
- _computeValueFor(annotation);
+ _computeValueForAnnotation(annotation);
}
}
- ConstructorDeclaration findConstructorDeclaration(
- ConstructorElement constructor) => constructorDeclarationMap[
- ConstantEvaluationEngine._getConstructorBase(constructor)];
-
- VariableDeclaration findVariableDeclaration(
- PotentiallyConstVariableElement variable) =>
- _variableDeclarationMap[variable];
-
/**
- * Compute a value for the given [constNode].
+ * Compute a value for the given [element].
*/
- void _computeValueFor(AstNode constNode) {
- evaluationEngine.validator.beforeComputeValue(constNode);
- if (constNode is VariableDeclaration) {
- VariableElement element = constNode.element;
+ void _computeValueFor(Element element) {
+ if (!_constantsToCompute.contains(element)) {
+ // Element is in the dependency graph but should have been computed by
+ // a previous stage of analysis.
+ return;
+ }
+ evaluationEngine.validator.beforeComputeValue(element);
+ if (element is ParameterElement) {
+ if (element.initializer != null) {
+ Expression defaultValue =
+ (element as PotentiallyConstVariableElement).constantInitializer;
+ if (defaultValue != null) {
+ RecordingErrorListener errorListener = new RecordingErrorListener();
+ ErrorReporter errorReporter =
+ new ErrorReporter(errorListener, element.source);
+ DartObjectImpl dartObject = defaultValue
+ .accept(new ConstantVisitor(evaluationEngine, errorReporter));
+ (element as ParameterElementImpl).evaluationResult =
+ new EvaluationResultImpl.con2(dartObject, errorListener.errors);
+ }
+ }
+ } else if (element is VariableElement) {
RecordingErrorListener errorListener = new RecordingErrorListener();
ErrorReporter errorReporter =
new ErrorReporter(errorListener, element.source);
@@ -1126,7 +1127,7 @@ class ConstantValueComputer {
// fields with initializers, since their types may be generic. The type
// of the final field will be checked later, when the constructor is
// invoked).
- if (dartObject != null && constNode.isConst) {
+ if (dartObject != null && element.isConst) {
if (!evaluationEngine.runtimeTypeMatch(dartObject, element.type)) {
errorReporter.reportErrorForElement(
CheckedModeCompileTimeErrorCode.VARIABLE_TYPE_MISMATCH, element, [
@@ -1137,83 +1138,71 @@ class ConstantValueComputer {
}
(element as VariableElementImpl).evaluationResult =
new EvaluationResultImpl.con2(dartObject, errorListener.errors);
- } else if (constNode is ConstructorDeclaration) {
+ } else if (element is ConstructorElement) {
// No evaluation needs to be done; constructor declarations are only in
// the dependency graph to ensure that any constants referred to in
// initializer lists and parameter defaults are evaluated before
// invocations of the constructor. However we do need to annotate the
// element as being free of constant evaluation cycles so that later code
// will know that it is safe to evaluate.
- ConstructorElementImpl constructor = constNode.element;
- constructor.isCycleFree = true;
- } else if (constNode is FormalParameter) {
- if (constNode is DefaultFormalParameter) {
- ParameterElement element = constNode.element;
- Expression defaultValue =
- (element as PotentiallyConstVariableElement).constantInitializer;
- if (defaultValue != null) {
- RecordingErrorListener errorListener = new RecordingErrorListener();
- ErrorReporter errorReporter =
- new ErrorReporter(errorListener, element.source);
- DartObjectImpl dartObject = defaultValue
- .accept(new ConstantVisitor(evaluationEngine, errorReporter));
- (element as ParameterElementImpl).evaluationResult =
- new EvaluationResultImpl.con2(dartObject, errorListener.errors);
- }
- }
- } else if (constNode is Annotation) {
- ElementAnnotationImpl elementAnnotation = constNode.elementAnnotation;
- // elementAnnotation is null if the annotation couldn't be resolved, in
- // which case we skip it.
- if (elementAnnotation != null) {
- Element element = elementAnnotation.element;
- if (element is PropertyAccessorElement &&
- element.variable is VariableElementImpl) {
- // The annotation is a reference to a compile-time constant variable.
- // Just copy the evaluation result.
- VariableElementImpl variableElement =
- element.variable as VariableElementImpl;
- elementAnnotation.evaluationResult = variableElement.evaluationResult;
- } else if (element is ConstructorElementImpl &&
- constNode.arguments != null) {
- RecordingErrorListener errorListener = new RecordingErrorListener();
- CompilationUnit sourceCompilationUnit =
- constNode.getAncestor((node) => node is CompilationUnit);
- ErrorReporter errorReporter = new ErrorReporter(
- errorListener, sourceCompilationUnit.element.source);
- ConstantVisitor constantVisitor =
- new ConstantVisitor(evaluationEngine, errorReporter);
- DartObjectImpl result = evaluationEngine.evaluateConstructorCall(
- constNode, constNode.arguments.arguments, element,
- constantVisitor, errorReporter);
- elementAnnotation.evaluationResult =
- new EvaluationResultImpl.con2(result, errorListener.errors);
- } else {
- // This may happen for invalid code (e.g. failing to pass arguments
- // to an annotation which references a const constructor). The error
- // is detected elsewhere, so just silently ignore it here.
- elementAnnotation.evaluationResult =
- new EvaluationResultImpl.con1(null);
- }
- }
+ (element as ConstructorElementImpl).isCycleFree = true;
} else {
// Should not happen.
assert(false);
AnalysisEngine.instance.logger.logError(
- "Constant value computer trying to compute the value of a node which is not a VariableDeclaration, InstanceCreationExpression, FormalParameter, or ConstructorDeclaration");
+ "Constant value computer trying to compute the value of a node of type ${element.runtimeType}");
return;
}
}
/**
+ * Compute a value for the given annotation.
+ */
+ void _computeValueForAnnotation(Annotation constNode) {
+ ElementAnnotationImpl elementAnnotation = constNode.elementAnnotation;
+ // elementAnnotation is null if the annotation couldn't be resolved, in
+ // which case we skip it.
+ if (elementAnnotation != null) {
+ Element element = elementAnnotation.element;
+ if (element is PropertyAccessorElement &&
+ element.variable is VariableElementImpl) {
+ // The annotation is a reference to a compile-time constant variable.
+ // Just copy the evaluation result.
+ VariableElementImpl variableElement =
+ element.variable as VariableElementImpl;
+ elementAnnotation.evaluationResult = variableElement.evaluationResult;
+ } else if (element is ConstructorElementImpl &&
+ constNode.arguments != null) {
+ RecordingErrorListener errorListener = new RecordingErrorListener();
+ CompilationUnit sourceCompilationUnit =
+ constNode.getAncestor((node) => node is CompilationUnit);
+ ErrorReporter errorReporter = new ErrorReporter(
+ errorListener, sourceCompilationUnit.element.source);
+ ConstantVisitor constantVisitor =
+ new ConstantVisitor(evaluationEngine, errorReporter);
+ DartObjectImpl result = evaluationEngine.evaluateConstructorCall(
+ constNode, constNode.arguments.arguments, element, constantVisitor,
+ errorReporter);
+ elementAnnotation.evaluationResult =
+ new EvaluationResultImpl.con2(result, errorListener.errors);
+ } else {
+ // This may happen for invalid code (e.g. failing to pass arguments
+ // to an annotation which references a const constructor). The error
+ // is detected elsewhere, so just silently ignore it here.
+ elementAnnotation.evaluationResult =
+ new EvaluationResultImpl.con1(null);
+ }
+ }
+ }
+
+ /**
* Generate an error indicating that the given [constNode] is not a valid
* compile-time constant because it references at least one of the constants
* in the given [cycle], each of which directly or indirectly references the
* constant.
*/
- void _generateCycleError(List<AstNode> cycle, AstNode constNode) {
- if (constNode is VariableDeclaration) {
- VariableElement element = constNode.element;
+ void _generateCycleError(List<Element> cycle, Element element) {
+ if (element is VariableElement) {
RecordingErrorListener errorListener = new RecordingErrorListener();
ErrorReporter errorReporter =
new ErrorReporter(errorListener, element.source);
@@ -1224,7 +1213,7 @@ class ConstantValueComputer {
CompileTimeErrorCode.RECURSIVE_COMPILE_TIME_CONSTANT, element, []);
(element as VariableElementImpl).evaluationResult =
new EvaluationResultImpl.con2(null, errorListener.errors);
- } else if (constNode is ConstructorDeclaration) {
+ } else if (element is ConstructorElement) {
// We don't report cycle errors on constructor declarations since there
// is nowhere to put the error information.
} else {
@@ -1232,7 +1221,7 @@ class ConstantValueComputer {
// never appear as part of a cycle because they can't be referred to.
assert(false);
AnalysisEngine.instance.logger.logError(
- "Constant value computer trying to report a cycle error for a node of type ${constNode.runtimeType}");
+ "Constant value computer trying to report a cycle error for a node of type ${element.runtimeType}");
}
}
}
@@ -1723,7 +1712,7 @@ class ConstantVisitor extends UnifyingAstVisitor<DartObjectImpl> {
}
if (element is VariableElementImpl) {
VariableElementImpl variableElementImpl = element;
- evaluationEngine.validator.beforeGetEvaluationResult(node);
+ evaluationEngine.validator.beforeGetEvaluationResult(element);
EvaluationResultImpl value = variableElementImpl.evaluationResult;
if (variableElementImpl.isConst && value != null) {
return value.value;
@@ -4878,53 +4867,31 @@ class ReferenceFinder extends RecursiveAstVisitor<Object> {
/**
* The element representing the construct that will be visited.
*/
- final AstNode _source;
+ final Element _source;
/**
* A graph in which the nodes are the constant variables and the edges are
* from each variable to the other constant variables that are referenced in
* the head's initializer.
*/
- final DirectedGraph<AstNode> _referenceGraph;
-
- /**
- * A table mapping constant variables to the declarations of those variables.
- */
- final HashMap<PotentiallyConstVariableElement, VariableDeclaration> _variableDeclarationMap;
-
- /**
- * A table mapping constant constructors to the declarations of those
- * constructors.
- */
- final HashMap<ConstructorElement, ConstructorDeclaration> _constructorDeclarationMap;
+ final DirectedGraph<Element> _referenceGraph;
/**
* Initialize a newly created reference finder to find references from a given
* variable to other variables and to add those references to the given graph.
* The [source] is the element representing the variable whose initializer
* will be visited. The [referenceGraph] is a graph recording which variables
- * (heads) reference which other variables (tails) in their initializers. The
- * [variableDeclarationMap] is a table mapping constant variables to the
- * declarations of those variables. The [constructorDeclarationMap] is a table
- * mapping constant constructors to the declarations of those constructors.
+ * (heads) reference which other variables (tails) in their initializers.
*/
- ReferenceFinder(this._source, this._referenceGraph,
- this._variableDeclarationMap, this._constructorDeclarationMap);
-
- ConstructorDeclaration findConstructorDeclaration(
- ConstructorElement constructor) => _constructorDeclarationMap[
- ConstantEvaluationEngine._getConstructorBase(constructor)];
+ ReferenceFinder(this._source, this._referenceGraph);
@override
Object visitInstanceCreationExpression(InstanceCreationExpression node) {
if (node.isConst) {
- ConstructorElement constructor = node.staticElement;
+ ConstructorElement constructor =
+ ConstantEvaluationEngine._getConstructorBase(node.staticElement);
if (constructor != null) {
- ConstructorDeclaration declaration =
- findConstructorDeclaration(constructor);
- if (declaration != null) {
- _referenceGraph.addEdge(_source, declaration);
- }
+ _referenceGraph.addEdge(_source, constructor);
}
}
return super.visitInstanceCreationExpression(node);
@@ -4934,13 +4901,10 @@ class ReferenceFinder extends RecursiveAstVisitor<Object> {
Object visitRedirectingConstructorInvocation(
RedirectingConstructorInvocation node) {
super.visitRedirectingConstructorInvocation(node);
- ConstructorElement target = node.staticElement;
+ ConstructorElement target =
+ ConstantEvaluationEngine._getConstructorBase(node.staticElement);
if (target != null && target.isConst) {
- ConstructorDeclaration targetDeclaration =
- _constructorDeclarationMap[target];
- if (targetDeclaration != null) {
- _referenceGraph.addEdge(_source, targetDeclaration);
- }
+ _referenceGraph.addEdge(_source, target);
}
return null;
}
@@ -4953,16 +4917,7 @@ class ReferenceFinder extends RecursiveAstVisitor<Object> {
}
if (element is VariableElement) {
if (element.isConst) {
- VariableDeclaration variableDeclaration =
- _variableDeclarationMap[element];
- // The declaration will be null when the variable is not defined in the
- // compilation units that were used to produce the
- // variableDeclarationMap. In such cases, the variable should already
- // have a value associated with it, but we don't bother to check because
- // there's nothing we can do about it at this point.
- if (variableDeclaration != null) {
- _referenceGraph.addEdge(_source, variableDeclaration);
- }
+ _referenceGraph.addEdge(_source, element);
}
}
return null;
@@ -4971,18 +4926,10 @@ class ReferenceFinder extends RecursiveAstVisitor<Object> {
@override
Object visitSuperConstructorInvocation(SuperConstructorInvocation node) {
super.visitSuperConstructorInvocation(node);
- ConstructorElement constructor = node.staticElement;
+ ConstructorElement constructor =
+ ConstantEvaluationEngine._getConstructorBase(node.staticElement);
if (constructor != null && constructor.isConst) {
- ConstructorDeclaration constructorDeclaration =
- _constructorDeclarationMap[constructor];
- // The declaration will be null when the constructor is not defined in the
- // compilation units that were used to produce the
- // constructorDeclarationMap. In such cases, the constructor should
- // already have its initializer AST's stored in it, but we don't bother
- // to check because there's nothing we can do about it at this point.
- if (constructorDeclaration != null) {
- _referenceGraph.addEdge(_source, constructorDeclaration);
- }
+ _referenceGraph.addEdge(_source, constructor);
}
return null;
}
« no previous file with comments | « no previous file | pkg/analyzer/lib/src/generated/element.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698