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

Side by Side Diff: pkg/compiler/lib/src/resolution/members.dart

Issue 1414913002: Introduce .isMalformed (Closed) Base URL: https://github.com/dart-lang/sdk.git@master
Patch Set: Address review Created 5 years, 2 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 unified diff | Download patch
OLDNEW
1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2012, the Dart project authors. Please see the AUTHORS file
2 // for details. All rights reserved. Use of this source code is governed by a 2 // for details. All rights reserved. Use of this source code is governed by a
3 // BSD-style license that can be found in the LICENSE file. 3 // BSD-style license that can be found in the LICENSE file.
4 4
5 library dart2js.resolution.members; 5 library dart2js.resolution.members;
6 6
7 import '../common.dart'; 7 import '../common.dart';
8 import '../common/names.dart' show 8 import '../common/names.dart' show
9 Selectors; 9 Selectors;
10 import '../compiler.dart' show 10 import '../compiler.dart' show
(...skipping 358 matching lines...) Expand 10 before | Expand all | Expand 10 after
369 // objects than [Element] from this method. 369 // objects than [Element] from this method.
370 element = compiler.typeClass; 370 element = compiler.typeClass;
371 // Set the type to be `dynamic` to mark that this is a type literal. 371 // Set the type to be `dynamic` to mark that this is a type literal.
372 registry.setType(node, const DynamicType()); 372 registry.setType(node, const DynamicType());
373 } 373 }
374 element = reportLookupErrorIfAny(element, node, name); 374 element = reportLookupErrorIfAny(element, node, name);
375 if (element == null) { 375 if (element == null) {
376 if (!inInstanceContext) { 376 if (!inInstanceContext) {
377 element = reportCannotResolve(node, name); 377 element = reportCannotResolve(node, name);
378 } 378 }
379 } else if (element.isErroneous) { 379 } else if (element.isMalformed) {
380 // Use the erroneous element. 380 // Use the malformed element.
381 } else { 381 } else {
382 if ((element.kind.category & allowedCategory) == 0) { 382 if ((element.kind.category & allowedCategory) == 0) {
383 element = reportAndCreateErroneousElement( 383 element = reportAndCreateErroneousElement(
384 node, name, MessageKind.GENERIC, 384 node, name, MessageKind.GENERIC,
385 // TODO(ahe): Improve error message. Need UX input. 385 // TODO(ahe): Improve error message. Need UX input.
386 {'text': "is not an expression $element"}); 386 {'text': "is not an expression $element"});
387 } 387 }
388 } 388 }
389 if (!Elements.isUnresolved(element) && element.isClass) { 389 if (!Elements.isUnresolved(element) && element.isClass) {
390 ClassElement classElement = element; 390 ClassElement classElement = element;
(...skipping 426 matching lines...) Expand 10 before | Expand all | Expand 10 after
817 MessageKind.NO_THIS_AVAILABLE, const {}, 817 MessageKind.NO_THIS_AVAILABLE, const {},
818 isError: true); 818 isError: true);
819 registry.registerCompileTimeError(error); 819 registry.registerCompileTimeError(error);
820 return new StaticAccess.invalid(error); 820 return new StaticAccess.invalid(error);
821 } 821 }
822 return null; 822 return null;
823 } 823 }
824 824
825 /// Compute the [AccessSemantics] corresponding to a super access of [target]. 825 /// Compute the [AccessSemantics] corresponding to a super access of [target].
826 AccessSemantics computeSuperAccessSemantics(Spannable node, Element target) { 826 AccessSemantics computeSuperAccessSemantics(Spannable node, Element target) {
827 if (target.isErroneous) { 827 if (target.isMalformed) {
828 return new StaticAccess.unresolvedSuper(target); 828 return new StaticAccess.unresolvedSuper(target);
829 } else if (target.isGetter) { 829 } else if (target.isGetter) {
830 return new StaticAccess.superGetter(target); 830 return new StaticAccess.superGetter(target);
831 } else if (target.isSetter) { 831 } else if (target.isSetter) {
832 return new StaticAccess.superSetter(target); 832 return new StaticAccess.superSetter(target);
833 } else if (target.isField) { 833 } else if (target.isField) {
834 if (target.isFinal) { 834 if (target.isFinal) {
835 return new StaticAccess.superFinalField(target); 835 return new StaticAccess.superFinalField(target);
836 } else { 836 } else {
837 return new StaticAccess.superField(target); 837 return new StaticAccess.superField(target);
838 } 838 }
839 } else { 839 } else {
840 assert(invariant(node, target.isFunction, 840 assert(invariant(node, target.isFunction,
841 message: "Unexpected super target '$target'.")); 841 message: "Unexpected super target '$target'."));
842 return new StaticAccess.superMethod(target); 842 return new StaticAccess.superMethod(target);
843 } 843 }
844 } 844 }
845 845
846 /// Compute the [AccessSemantics] corresponding to a compound super access 846 /// Compute the [AccessSemantics] corresponding to a compound super access
847 /// reading from [getter] and writing to [setter]. 847 /// reading from [getter] and writing to [setter].
848 AccessSemantics computeCompoundSuperAccessSemantics( 848 AccessSemantics computeCompoundSuperAccessSemantics(
849 Spannable node, 849 Spannable node,
850 Element getter, 850 Element getter,
851 Element setter, 851 Element setter,
852 {bool isIndex: false}) { 852 {bool isIndex: false}) {
853 if (getter.isErroneous) { 853 if (getter.isMalformed) {
854 if (setter.isErroneous) { 854 if (setter.isMalformed) {
855 return new StaticAccess.unresolvedSuper(getter); 855 return new StaticAccess.unresolvedSuper(getter);
856 } else if (setter.isFunction) { 856 } else if (setter.isFunction) {
857 assert(invariant(node, setter.name == '[]=', 857 assert(invariant(node, setter.name == '[]=',
858 message: "Unexpected super setter '$setter'.")); 858 message: "Unexpected super setter '$setter'."));
859 return new CompoundAccessSemantics( 859 return new CompoundAccessSemantics(
860 CompoundAccessKind.UNRESOLVED_SUPER_GETTER, getter, setter); 860 CompoundAccessKind.UNRESOLVED_SUPER_GETTER, getter, setter);
861 } else { 861 } else {
862 assert(invariant(node, setter.isSetter, 862 assert(invariant(node, setter.isSetter,
863 message: "Unexpected super setter '$setter'.")); 863 message: "Unexpected super setter '$setter'."));
864 return new CompoundAccessSemantics( 864 return new CompoundAccessSemantics(
865 CompoundAccessKind.UNRESOLVED_SUPER_GETTER, getter, setter); 865 CompoundAccessKind.UNRESOLVED_SUPER_GETTER, getter, setter);
866 } 866 }
867 } else if (getter.isField) { 867 } else if (getter.isField) {
868 if (setter.isErroneous) { 868 if (setter.isMalformed) {
869 assert(invariant(node, getter.isFinal, 869 assert(invariant(node, getter.isFinal,
870 message: "Unexpected super setter '$setter' for getter '$getter.")); 870 message: "Unexpected super setter '$setter' for getter '$getter."));
871 return new StaticAccess.superFinalField(getter); 871 return new StaticAccess.superFinalField(getter);
872 } else if (setter.isField) { 872 } else if (setter.isField) {
873 if (getter == setter) { 873 if (getter == setter) {
874 return new StaticAccess.superField(getter); 874 return new StaticAccess.superField(getter);
875 } else { 875 } else {
876 return new CompoundAccessSemantics( 876 return new CompoundAccessSemantics(
877 CompoundAccessKind.SUPER_FIELD_FIELD, getter, setter); 877 CompoundAccessKind.SUPER_FIELD_FIELD, getter, setter);
878 } 878 }
879 } else { 879 } else {
880 // Either the field is accessible directly, or a setter shadows the 880 // Either the field is accessible directly, or a setter shadows the
881 // setter access. If there was another instance member it would shadow 881 // setter access. If there was another instance member it would shadow
882 // the field. 882 // the field.
883 assert(invariant(node, setter.isSetter, 883 assert(invariant(node, setter.isSetter,
884 message: "Unexpected super setter '$setter'.")); 884 message: "Unexpected super setter '$setter'."));
885 return new CompoundAccessSemantics( 885 return new CompoundAccessSemantics(
886 CompoundAccessKind.SUPER_FIELD_SETTER, getter, setter); 886 CompoundAccessKind.SUPER_FIELD_SETTER, getter, setter);
887 } 887 }
888 } else if (getter.isGetter) { 888 } else if (getter.isGetter) {
889 if (setter.isErroneous) { 889 if (setter.isMalformed) {
890 return new CompoundAccessSemantics( 890 return new CompoundAccessSemantics(
891 CompoundAccessKind.UNRESOLVED_SUPER_SETTER, getter, setter); 891 CompoundAccessKind.UNRESOLVED_SUPER_SETTER, getter, setter);
892 } else if (setter.isField) { 892 } else if (setter.isField) {
893 return new CompoundAccessSemantics( 893 return new CompoundAccessSemantics(
894 CompoundAccessKind.SUPER_GETTER_FIELD, getter, setter); 894 CompoundAccessKind.SUPER_GETTER_FIELD, getter, setter);
895 } else { 895 } else {
896 assert(invariant(node, setter.isSetter, 896 assert(invariant(node, setter.isSetter,
897 message: "Unexpected super setter '$setter'.")); 897 message: "Unexpected super setter '$setter'."));
898 return new CompoundAccessSemantics( 898 return new CompoundAccessSemantics(
899 CompoundAccessKind.SUPER_GETTER_SETTER, getter, setter); 899 CompoundAccessKind.SUPER_GETTER_SETTER, getter, setter);
900 } 900 }
901 } else { 901 } else {
902 assert(invariant(node, getter.isFunction, 902 assert(invariant(node, getter.isFunction,
903 message: "Unexpected super getter '$getter'.")); 903 message: "Unexpected super getter '$getter'."));
904 if (setter.isErroneous) { 904 if (setter.isMalformed) {
905 if (isIndex) { 905 if (isIndex) {
906 return new CompoundAccessSemantics( 906 return new CompoundAccessSemantics(
907 CompoundAccessKind.UNRESOLVED_SUPER_SETTER, getter, setter); 907 CompoundAccessKind.UNRESOLVED_SUPER_SETTER, getter, setter);
908 } else { 908 } else {
909 return new StaticAccess.superMethod(getter); 909 return new StaticAccess.superMethod(getter);
910 } 910 }
911 } else if (setter.isFunction) { 911 } else if (setter.isFunction) {
912 assert(invariant(node, setter.name == '[]=', 912 assert(invariant(node, setter.name == '[]=',
913 message: "Unexpected super setter '$setter'.")); 913 message: "Unexpected super setter '$setter'."));
914 assert(invariant(node, getter.name == '[]', 914 assert(invariant(node, getter.name == '[]',
(...skipping 31 matching lines...) Expand 10 before | Expand all | Expand 10 after
946 } 946 }
947 } 947 }
948 948
949 /// Compute the [AccessSemantics] corresponding to a static or toplevel access 949 /// Compute the [AccessSemantics] corresponding to a static or toplevel access
950 /// of [target]. 950 /// of [target].
951 AccessSemantics computeStaticOrTopLevelAccessSemantics( 951 AccessSemantics computeStaticOrTopLevelAccessSemantics(
952 Spannable node, 952 Spannable node,
953 Element target) { 953 Element target) {
954 954
955 target = target.declaration; 955 target = target.declaration;
956 if (target.isErroneous) { 956 if (target.isMalformed) {
957 // This handles elements with parser errors. 957 // This handles elements with parser errors.
958 // TODO(johnniwinther): Elements with parse error should not set
959 // [isErroneous] to `true`.
960 return new StaticAccess.unresolved(target); 958 return new StaticAccess.unresolved(target);
961 } 959 }
962 if (target.isStatic) { 960 if (target.isStatic) {
963 if (target.isGetter) { 961 if (target.isGetter) {
964 return new StaticAccess.staticGetter(target); 962 return new StaticAccess.staticGetter(target);
965 } else if (target.isSetter) { 963 } else if (target.isSetter) {
966 return new StaticAccess.staticSetter(target); 964 return new StaticAccess.staticSetter(target);
967 } else if (target.isField) { 965 } else if (target.isField) {
968 if (target.isFinal || target.isConst) { 966 if (target.isFinal || target.isConst) {
969 return new StaticAccess.finalStaticField(target); 967 return new StaticAccess.finalStaticField(target);
(...skipping 1914 matching lines...) Expand 10 before | Expand all | Expand 10 after
2884 ? new StaticAccess.topLevelSetter(abstractField.setter) 2882 ? new StaticAccess.topLevelSetter(abstractField.setter)
2885 : new StaticAccess.staticSetter(abstractField.setter); 2883 : new StaticAccess.staticSetter(abstractField.setter);
2886 registry.registerStaticUse(abstractField.setter); 2884 registry.registerStaticUse(abstractField.setter);
2887 } 2885 }
2888 } else { 2886 } else {
2889 MemberElement member = element; 2887 MemberElement member = element;
2890 // TODO(johnniwinther): Needed to provoke a parsing and with it discovery 2888 // TODO(johnniwinther): Needed to provoke a parsing and with it discovery
2891 // of parse errors to make [element] erroneous. Fix this! 2889 // of parse errors to make [element] erroneous. Fix this!
2892 member.computeType(resolution); 2890 member.computeType(resolution);
2893 registry.registerStaticUse(member); 2891 registry.registerStaticUse(member);
2894 if (member.isErroneous) { 2892 if (member.isMalformed) {
2895 // [member] has parse errors. 2893 // [member] has parse errors.
2896 semantics = new StaticAccess.unresolved(member); 2894 semantics = new StaticAccess.unresolved(member);
2897 } else if (member.isFunction) { 2895 } else if (member.isFunction) {
2898 // `a = b`, `a++` or `a += b` where `a` is a function. 2896 // `a = b`, `a++` or `a += b` where `a` is a function.
2899 ErroneousElement error = reportAndCreateErroneousElement( 2897 ErroneousElement error = reportAndCreateErroneousElement(
2900 node.selector, name.text, 2898 node.selector, name.text,
2901 MessageKind.ASSIGNING_METHOD, const {}); 2899 MessageKind.ASSIGNING_METHOD, const {});
2902 registry.registerThrowNoSuchMethod(); 2900 registry.registerThrowNoSuchMethod();
2903 if (node.isComplex) { 2901 if (node.isComplex) {
2904 // `a++` or `a += b` where `a` is a function. 2902 // `a++` or `a += b` where `a` is a function.
(...skipping 22 matching lines...) Expand all
2927 } 2925 }
2928 } 2926 }
2929 return handleUpdate(node, name, semantics); 2927 return handleUpdate(node, name, semantics);
2930 } 2928 }
2931 2929
2932 /// Handle access to resolved [element]. 2930 /// Handle access to resolved [element].
2933 ResolutionResult handleResolvedSend(Send node, Name name, Element element) { 2931 ResolutionResult handleResolvedSend(Send node, Name name, Element element) {
2934 if (element.isAmbiguous) { 2932 if (element.isAmbiguous) {
2935 return handleAmbiguousSend(node, name, element); 2933 return handleAmbiguousSend(node, name, element);
2936 } 2934 }
2937 if (element.isErroneous) { 2935 if (element.isMalformed) {
2938 // This handles elements with parser errors. 2936 // This handles elements with parser errors.
2939 // TODO(johnniwinther): Elements with parse error should not set
2940 // [isErroneous] to `true`.
2941 assert(invariant(node, element is! ErroneousElement, 2937 assert(invariant(node, element is! ErroneousElement,
2942 message: "Unexpected erroneous element $element.")); 2938 message: "Unexpected erroneous element $element."));
2943 return handleErroneousAccess(node, name, 2939 return handleErroneousAccess(node, name,
2944 new StaticAccess.unresolved(element)); 2940 new StaticAccess.unresolved(element));
2945 } 2941 }
2946 if (element.isInstanceMember) { 2942 if (element.isInstanceMember) {
2947 if (inInstanceContext) { 2943 if (inInstanceContext) {
2948 // TODO(johnniwinther): Maybe use the found [element]. 2944 // TODO(johnniwinther): Maybe use the found [element].
2949 return handleThisPropertyAccess(node, name); 2945 return handleThisPropertyAccess(node, name);
2950 } else { 2946 } else {
(...skipping 18 matching lines...) Expand all
2969 } 2965 }
2970 return reporter.internalError(node, "Unexpected resolved send: $element"); 2966 return reporter.internalError(node, "Unexpected resolved send: $element");
2971 } 2967 }
2972 2968
2973 /// Handle update to resolved [element]. 2969 /// Handle update to resolved [element].
2974 ResolutionResult handleResolvedSendSet( 2970 ResolutionResult handleResolvedSendSet(
2975 SendSet node, Name name, Element element) { 2971 SendSet node, Name name, Element element) {
2976 if (element.isAmbiguous) { 2972 if (element.isAmbiguous) {
2977 return handleAmbiguousUpdate(node, name, element); 2973 return handleAmbiguousUpdate(node, name, element);
2978 } 2974 }
2979 if (element.isErroneous) { 2975 if (element.isMalformed) {
2980 // This handles elements with parser errors. 2976 // This handles elements with parser errors..
2981 // TODO(johnniwinther): Elements with parse error should not set
2982 // [isErroneous] to `true`.
2983 assert(invariant(node, element is! ErroneousElement, 2977 assert(invariant(node, element is! ErroneousElement,
2984 message: "Unexpected erroneous element $element.")); 2978 message: "Unexpected erroneous element $element."));
2985 return handleUpdate(node, name,new StaticAccess.unresolved(element)); 2979 return handleUpdate(node, name,new StaticAccess.unresolved(element));
2986 } 2980 }
2987 if (element.isInstanceMember) { 2981 if (element.isInstanceMember) {
2988 if (inInstanceContext) { 2982 if (inInstanceContext) {
2989 return handleThisPropertyUpdate(node, name, element); 2983 return handleThisPropertyUpdate(node, name, element);
2990 } else { 2984 } else {
2991 return handleUpdate(node, name, reportStaticInstanceAccess(node, name)); 2985 return handleUpdate(node, name, reportStaticInstanceAccess(node, name));
2992 } 2986 }
(...skipping 1689 matching lines...) Expand 10 before | Expand all | Expand 10 after
4682 } 4676 }
4683 return const NoneResult(); 4677 return const NoneResult();
4684 } 4678 }
4685 } 4679 }
4686 4680
4687 /// Looks up [name] in [scope] and unwraps the result. 4681 /// Looks up [name] in [scope] and unwraps the result.
4688 Element lookupInScope(DiagnosticReporter reporter, Node node, 4682 Element lookupInScope(DiagnosticReporter reporter, Node node,
4689 Scope scope, String name) { 4683 Scope scope, String name) {
4690 return Elements.unwrap(scope.lookup(name), reporter, node); 4684 return Elements.unwrap(scope.lookup(name), reporter, node);
4691 } 4685 }
OLDNEW
« no previous file with comments | « pkg/compiler/lib/src/resolution/member_impl.dart ('k') | pkg/compiler/lib/src/resolution/resolution.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698