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

Unified Diff: pkg/analyzer/lib/src/summary/resynthesize.dart

Issue 2665013002: Issue 28550. Fix for resynthesizing invalid elements as declared types. (Closed)
Patch Set: Update link.dart Created 3 years, 11 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 | « pkg/analyzer/lib/src/summary/link.dart ('k') | pkg/analyzer/test/src/summary/resynthesize_common.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/analyzer/lib/src/summary/resynthesize.dart
diff --git a/pkg/analyzer/lib/src/summary/resynthesize.dart b/pkg/analyzer/lib/src/summary/resynthesize.dart
index 25985f2d55f5ba0b22ce35c507fbb5442a36f8fb..fda2902493f1d4d7c47cc0b80fa95ffab52b282b 100644
--- a/pkg/analyzer/lib/src/summary/resynthesize.dart
+++ b/pkg/analyzer/lib/src/summary/resynthesize.dart
@@ -1194,6 +1194,11 @@ class _ReferenceInfo {
final String name;
/**
+ * Is `true` if the [element] can be used as a declared type.
+ */
+ final bool isDeclarableType;
+
+ /**
* The element referred to by this reference, or `null` if there is no
* associated element (e.g. because it is a reference to an undefined
* entity).
@@ -1221,8 +1226,14 @@ class _ReferenceInfo {
* the type itself. Otherwise, pass `null` and the type will be computed
* when appropriate.
*/
- _ReferenceInfo(this.libraryResynthesizer, this.enclosing, this.name,
- this.element, DartType specialType, this.numTypeParameters) {
+ _ReferenceInfo(
+ this.libraryResynthesizer,
+ this.enclosing,
+ this.name,
+ this.isDeclarableType,
+ this.element,
+ DartType specialType,
+ this.numTypeParameters) {
if (specialType != null) {
type = specialType;
} else {
@@ -1409,10 +1420,13 @@ class _ResynthesizerContext implements ResynthesizerContext {
@override
DartType resolveTypeRef(
EntityRef type, TypeParameterizedElementMixin typeParameterContext,
- {bool defaultVoid: false, bool instantiateToBoundsAllowed: true}) {
+ {bool defaultVoid: false,
+ bool instantiateToBoundsAllowed: true,
+ bool declaredType: false}) {
return _unitResynthesizer.buildType(type, typeParameterContext,
defaultVoid: defaultVoid,
- instantiateToBoundsAllowed: instantiateToBoundsAllowed);
+ instantiateToBoundsAllowed: instantiateToBoundsAllowed,
+ declaredType: declaredType);
}
}
@@ -1592,7 +1606,9 @@ class _UnitResynthesizer {
*/
DartType buildType(
EntityRef type, TypeParameterizedElementMixin typeParameterContext,
- {bool defaultVoid: false, bool instantiateToBoundsAllowed: true}) {
+ {bool defaultVoid: false,
+ bool instantiateToBoundsAllowed: true,
+ bool declaredType: false}) {
if (type == null) {
if (defaultVoid) {
return VoidTypeImpl.instance;
@@ -1616,6 +1632,9 @@ class _UnitResynthesizer {
}
_ReferenceInfo referenceInfo = getReferenceInfo(type.reference);
+ if (declaredType && !referenceInfo.isDeclarableType) {
+ return DynamicTypeImpl.instance;
+ }
return referenceInfo.buildType(
instantiateToBoundsAllowed,
type.typeArguments.length,
@@ -1715,19 +1734,24 @@ class _UnitResynthesizer {
: null;
Element element;
DartType type;
+ bool isDeclarableType = false;
int numTypeParameters = linkedReference.numTypeParameters;
if (linkedReference.kind == ReferenceKind.unresolved) {
type = UndefinedTypeImpl.instance;
element = null;
+ isDeclarableType = true;
} else if (name == 'dynamic') {
type = DynamicTypeImpl.instance;
element = type.element;
+ isDeclarableType = true;
} else if (name == 'void') {
type = VoidTypeImpl.instance;
element = type.element;
+ isDeclarableType = true;
} else if (name == '*bottom*') {
type = BottomTypeImpl.instance;
element = null;
+ isDeclarableType = true;
} else {
List<String> locationComponents;
if (enclosingInfo != null && enclosingInfo.element is ClassElement) {
@@ -1756,6 +1780,7 @@ class _UnitResynthesizer {
switch (linkedReference.kind) {
case ReferenceKind.classOrEnum:
element = new ClassElementHandle(summaryResynthesizer, location);
+ isDeclarableType = true;
break;
case ReferenceKind.constructor:
assert(location.components.length == 4);
@@ -1782,6 +1807,7 @@ class _UnitResynthesizer {
case ReferenceKind.typedef:
element = new FunctionTypeAliasElementHandle(
summaryResynthesizer, location);
+ isDeclarableType = true;
break;
case ReferenceKind.variable:
Element enclosingElement = enclosingInfo.element;
@@ -1811,7 +1837,7 @@ class _UnitResynthesizer {
}
}
result = new _ReferenceInfo(libraryResynthesizer, enclosingInfo, name,
- element, type, numTypeParameters);
+ isDeclarableType, element, type, numTypeParameters);
referenceInfos[index] = result;
}
return result;
« no previous file with comments | « pkg/analyzer/lib/src/summary/link.dart ('k') | pkg/analyzer/test/src/summary/resynthesize_common.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698