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

Unified Diff: pkg/compiler/lib/src/resolution/members.dart

Issue 1292673005: Refactor handling of unqualified static updates. (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Created 5 years, 4 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/compiler/lib/src/resolution/registry.dart » ('j') | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: pkg/compiler/lib/src/resolution/members.dart
diff --git a/pkg/compiler/lib/src/resolution/members.dart b/pkg/compiler/lib/src/resolution/members.dart
index c2814fd28db77a5d09ab66accd77f358a1853ad8..03207f4d68dfc0a1d1da72f39d91fe027c4f72e0 100644
--- a/pkg/compiler/lib/src/resolution/members.dart
+++ b/pkg/compiler/lib/src/resolution/members.dart
@@ -2798,6 +2798,109 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
return result;
}
+ /// Handle update of a static or top level [element].
+ ResolutionResult handleStaticOrTopLevelUpdate(
+ SendSet node, Name name, Element element) {
+ AccessSemantics semantics;
+ if (element.isAbstractField) {
+ AbstractFieldElement abstractField = element;
+ if (abstractField.setter == null) {
+ ErroneousElement error = reportAndCreateErroneousElement(
+ node.selector, name.text,
+ MessageKind.CANNOT_RESOLVE_SETTER, const {});
+ registry.registerThrowNoSuchMethod();
+
+ if (node.isComplex) {
+ // `a++` or `a += b` where `a` has no setter.
+ semantics = new CompoundAccessSemantics(
+ element.isTopLevel
+ ? CompoundAccessKind.UNRESOLVED_TOPLEVEL_SETTER
+ : CompoundAccessKind.UNRESOLVED_STATIC_SETTER,
+ abstractField.getter,
+ error);
+ } else {
+ // `a = b` where `a` has no setter.
+ semantics = element.isTopLevel
+ ? new StaticAccess.topLevelGetter(abstractField.getter)
+ : new StaticAccess.staticGetter(abstractField.getter);
+ }
+ registry.registerStaticUse(abstractField.getter);
+ } else if (node.isComplex) {
+ if (abstractField.getter == null) {
+ ErroneousElement error = reportAndCreateErroneousElement(
+ node.selector, name.text,
+ MessageKind.CANNOT_RESOLVE_GETTER, const {});
+ registry.registerThrowNoSuchMethod();
+ // `a++` or `a += b` where `a` has no getter.
+ semantics = new CompoundAccessSemantics(
+ element.isTopLevel
+ ? CompoundAccessKind.UNRESOLVED_TOPLEVEL_GETTER
+ : CompoundAccessKind.UNRESOLVED_STATIC_GETTER,
+ error,
+ abstractField.setter);
+ registry.registerStaticUse(abstractField.setter);
+ } else {
+ // `a++` or `a += b` where `a` has both a getter and a setter.
+ semantics = new CompoundAccessSemantics(
+ element.isTopLevel
+ ? CompoundAccessKind.TOPLEVEL_GETTER_SETTER
+ : CompoundAccessKind.STATIC_GETTER_SETTER,
+ abstractField.getter,
+ abstractField.setter);
+ registry.registerStaticUse(abstractField.getter);
+ registry.registerStaticUse(abstractField.setter);
+ }
+ } else {
+ // `a = b` where `a` has a setter.
+ semantics = element.isTopLevel
+ ? new StaticAccess.topLevelSetter(abstractField.setter)
+ : new StaticAccess.staticSetter(abstractField.setter);
+ registry.registerStaticUse(abstractField.setter);
+ }
+ } else {
+ MemberElement member = element;
+ // TODO(johnniwinther): Needed to provoke a parsing and with it discovery
+ // of parse errors to make [element] erroneous. Fix this!
+ member.computeType(compiler);
+ registry.registerStaticUse(member);
+ if (member.isErroneous) {
+ // [member] has parse errors.
+ semantics = new StaticAccess.unresolved(member);
+ } else if (member.isFunction) {
+ // `a = b`, `a++` or `a += b` where `a` is a function.
+ ErroneousElement error = reportAndCreateErroneousElement(
+ node.selector, name.text,
+ MessageKind.ASSIGNING_METHOD, const {});
+ registry.registerThrowNoSuchMethod();
+ if (node.isComplex) {
+ // `a++` or `a += b` where `a` is a function.
+ registry.registerGetOfStaticFunction(element);
+ }
+ semantics = member.isTopLevel
+ ? new StaticAccess.topLevelMethod(member)
+ : new StaticAccess.staticMethod(member);
+ } else {
+ // `a = b`, `a++` or `a += b` where `a` is a field.
+ assert(invariant(node, member.isField,
+ message: "Unexpected element: $member."));
+ if (member.isFinal || member.isConst) {
+ ErroneousElement error = reportAndCreateErroneousElement(
+ node.selector, name.text,
+ MessageKind.CANNOT_RESOLVE_SETTER, const {});
+ registry.registerThrowNoSuchMethod();
+ semantics = member.isTopLevel
+ ? new StaticAccess.finalTopLevelField(member)
+ : new StaticAccess.finalStaticField(member);
+ } else {
+ semantics = member.isTopLevel
+ ? new StaticAccess.topLevelField(member)
+ : new StaticAccess.staticField(member);
+ }
+ }
+ }
+ return handleUpdate(node, name, semantics);
+ }
+
/// Handle access to resolved [element].
ResolutionResult handleResolvedSend(Send node, Name name, Element element) {
if (element.isAmbiguous) {
@@ -2869,6 +2972,8 @@ class ResolverVisitor extends MappingVisitor<ResolutionResult> {
} else if (element.isTypeVariable) {
// `T = b`, `T++`, or 'T += b` where 'T' is a type variable.
return handleTypeVariableTypeLiteralUpdate(node, name, element);
+ } else if (element.isStatic || element.isTopLevel) {
+ return handleStaticOrTopLevelUpdate(node, name, element);
}
return oldVisitSendSet(node);
}
« no previous file with comments | « no previous file | pkg/compiler/lib/src/resolution/registry.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698