Chromium Code Reviews| OLD | NEW |
|---|---|
| 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 abstract class TreeElements { | 5 abstract class TreeElements { |
| 6 Element operator[](Node node); | 6 Element operator[](Node node); |
| 7 Selector getSelector(Send send); | 7 Selector getSelector(Send send); |
| 8 DartType getType(TypeAnnotation annotation); | 8 DartType getType(TypeAnnotation annotation); |
| 9 bool isParameterChecked(Element element); | 9 bool isParameterChecked(Element element); |
| 10 } | 10 } |
| (...skipping 1031 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 1042 } else if (element.isClass()) { | 1042 } else if (element.isClass()) { |
| 1043 ClassElement cls = element; | 1043 ClassElement cls = element; |
| 1044 cls.ensureResolved(compiler); | 1044 cls.ensureResolved(compiler); |
| 1045 Link<DartType> arguments = | 1045 Link<DartType> arguments = |
| 1046 resolveTypeArguments(node, cls.typeVariables, scope, | 1046 resolveTypeArguments(node, cls.typeVariables, scope, |
| 1047 onFailure, whenResolved); | 1047 onFailure, whenResolved); |
| 1048 if (cls.typeVariables.isEmpty() && arguments.isEmpty()) { | 1048 if (cls.typeVariables.isEmpty() && arguments.isEmpty()) { |
| 1049 // Use the canonical type if it has no type parameters. | 1049 // Use the canonical type if it has no type parameters. |
| 1050 type = cls.computeType(compiler); | 1050 type = cls.computeType(compiler); |
| 1051 } else { | 1051 } else { |
| 1052 type = new InterfaceType(cls, arguments); | 1052 bool isMalformedType = false; |
| 1053 for (Link<DartType> link = arguments; | |
| 1054 !link.isEmpty(); | |
| 1055 link = link.tail) { | |
| 1056 DartType dtype = link.head; | |
|
karlklose
2012/10/10 07:19:33
dtype -> type. (The class is only called DartType
| |
| 1057 if (dtype is MalformedType) { | |
| 1058 isMalformedType = true; | |
| 1059 break; | |
| 1060 } | |
| 1061 } | |
| 1062 if (isMalformedType) { | |
| 1063 type = new MalformedType( | |
| 1064 new MalformedTypeElement(node, scope.element)); | |
| 1065 } else { | |
| 1066 type = new InterfaceType(cls, arguments); | |
| 1067 } | |
| 1053 } | 1068 } |
| 1054 } else if (element.isTypedef()) { | 1069 } else if (element.isTypedef()) { |
| 1055 TypedefElement typdef = element; | 1070 TypedefElement typdef = element; |
| 1056 // TODO(ahe): Should be [ensureResolved]. | 1071 // TODO(ahe): Should be [ensureResolved]. |
| 1057 compiler.resolveTypedef(typdef); | 1072 compiler.resolveTypedef(typdef); |
| 1058 typdef.computeType(compiler); | 1073 typdef.computeType(compiler); |
| 1059 Link<DartType> arguments = resolveTypeArguments( | 1074 Link<DartType> arguments = resolveTypeArguments( |
| 1060 node, typdef.typeVariables, | 1075 node, typdef.typeVariables, |
| 1061 scope, onFailure, whenResolved); | 1076 scope, onFailure, whenResolved); |
| 1062 if (typdef.typeVariables.isEmpty() && arguments.isEmpty()) { | 1077 if (typdef.typeVariables.isEmpty() && arguments.isEmpty()) { |
| 1063 // Return the canonical type if it has no type parameters. | 1078 // Return the canonical type if it has no type parameters. |
| 1064 type = typdef.computeType(compiler); | 1079 type = typdef.computeType(compiler); |
| 1065 } else { | 1080 } else { |
| 1066 type = new TypedefType(typdef, arguments); | 1081 type = new TypedefType(typdef, arguments); |
| 1067 } | 1082 } |
| 1068 } else if (element.isTypeVariable()) { | 1083 } else if (element.isTypeVariable()) { |
| 1069 type = element.computeType(compiler); | 1084 if (scope.inStaticContext) { |
| 1085 onFailure(node, MessageKind.CANNOT_ACCESS_TYPE_VARIABLE_IN_STATIC_CONT EXT, [element.name]); | |
|
karlklose
2012/10/10 07:19:33
Long line.
| |
| 1086 type = new MalformedType( | |
| 1087 new MalformedTypeElement(node, scope.element)); | |
| 1088 } else { | |
| 1089 type = element.computeType(compiler); | |
| 1090 } | |
| 1070 } else { | 1091 } else { |
| 1071 compiler.cancel("unexpected element kind ${element.kind}", | 1092 compiler.cancel("unexpected element kind ${element.kind}", |
| 1072 node: node); | 1093 node: node); |
| 1073 } | 1094 } |
| 1074 } | 1095 } |
| 1075 whenResolved(node, type); | 1096 whenResolved(node, type); |
| 1076 return type; | 1097 return type; |
| 1077 } | 1098 } |
| 1078 | 1099 |
| 1079 Link<DartType> resolveTypeArguments(TypeAnnotation node, | 1100 Link<DartType> resolveTypeArguments(TypeAnnotation node, |
| (...skipping 1795 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2875 } else if (e.kind !== ElementKind.CLASS && e.kind !== ElementKind.PREFIX) { | 2896 } else if (e.kind !== ElementKind.CLASS && e.kind !== ElementKind.PREFIX) { |
| 2876 error(node, MessageKind.NOT_A_TYPE, [name]); | 2897 error(node, MessageKind.NOT_A_TYPE, [name]); |
| 2877 } | 2898 } |
| 2878 return e; | 2899 return e; |
| 2879 } | 2900 } |
| 2880 } | 2901 } |
| 2881 | 2902 |
| 2882 abstract class Scope { | 2903 abstract class Scope { |
| 2883 final Element element; | 2904 final Element element; |
| 2884 final Scope parent; | 2905 final Scope parent; |
| 2906 bool get inStaticContext => false; | |
| 2885 | 2907 |
| 2886 Scope(this.parent, this.element); | 2908 Scope(this.parent, this.element); |
| 2887 abstract Element add(Element element); | 2909 abstract Element add(Element element); |
| 2888 | 2910 |
| 2889 Element lookup(SourceString name) { | 2911 Element lookup(SourceString name) { |
| 2890 Element result = localLookup(name); | 2912 Element result = localLookup(name); |
| 2891 if (result != null) return result; | 2913 if (result != null) return result; |
| 2892 return parent.lookup(name); | 2914 return parent.lookup(name); |
| 2893 } | 2915 } |
| 2894 | 2916 |
| 2895 Element lexicalLookup(SourceString name) { | 2917 Element lexicalLookup(SourceString name) { |
| 2896 Element result = localLookup(name); | 2918 Element result = localLookup(name); |
| 2897 if (result != null) return result; | 2919 if (result != null) return result; |
| 2898 return parent.lexicalLookup(name); | 2920 return parent.lexicalLookup(name); |
| 2899 } | 2921 } |
| 2900 | 2922 |
| 2901 abstract Element localLookup(SourceString name); | 2923 abstract Element localLookup(SourceString name); |
| 2902 } | 2924 } |
| 2903 | 2925 |
| 2904 class VariableScope extends Scope { | 2926 class VariableScope extends Scope { |
| 2905 VariableScope(parent, element) : super(parent, element); | 2927 VariableScope(parent, element) : super(parent, element); |
| 2906 | 2928 |
| 2907 Element add(Element newElement) { | 2929 Element add(Element newElement) { |
| 2908 throw "Cannot add element to VariableScope"; | 2930 throw "Cannot add element to VariableScope"; |
| 2909 } | 2931 } |
| 2910 | 2932 |
| 2911 Element localLookup(SourceString name) => null; | 2933 Element localLookup(SourceString name) => null; |
| 2912 | 2934 |
| 2913 String toString() => '$element > $parent'; | 2935 String toString() => '$element > $parent'; |
| 2936 | |
| 2937 bool get inStaticContext => element.inStaticContext();//parent.inStaticContext (); | |
|
karlklose
2012/10/10 07:19:33
Remove code in comment.
| |
| 2914 } | 2938 } |
| 2915 | 2939 |
| 2916 /** | 2940 /** |
| 2917 * [TypeDeclarationScope] defines the outer scope of a type declaration in | 2941 * [TypeDeclarationScope] defines the outer scope of a type declaration in |
| 2918 * which the declared type variables and the entities in the enclosing scope are | 2942 * which the declared type variables and the entities in the enclosing scope are |
| 2919 * available but where declared and inherited members are not available. This | 2943 * available but where declared and inherited members are not available. This |
| 2920 * scope is only used for class/interface declarations during resolution of the | 2944 * scope is only used for class/interface declarations during resolution of the |
| 2921 * class hierarchy. In all other cases [ClassScope] is used. | 2945 * class hierarchy. In all other cases [ClassScope] is used. |
| 2922 */ | 2946 */ |
| 2923 class TypeDeclarationScope extends Scope { | 2947 class TypeDeclarationScope extends Scope { |
| (...skipping 37 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 2961 | 2985 |
| 2962 Element add(Element newElement) { | 2986 Element add(Element newElement) { |
| 2963 if (elements.containsKey(newElement.name)) { | 2987 if (elements.containsKey(newElement.name)) { |
| 2964 return elements[newElement.name]; | 2988 return elements[newElement.name]; |
| 2965 } | 2989 } |
| 2966 elements[newElement.name] = newElement; | 2990 elements[newElement.name] = newElement; |
| 2967 return newElement; | 2991 return newElement; |
| 2968 } | 2992 } |
| 2969 | 2993 |
| 2970 String toString() => '$element${elements.getKeys()}'; | 2994 String toString() => '$element${elements.getKeys()}'; |
| 2995 | |
| 2996 bool get inStaticContext => parent.inStaticContext; | |
| 2971 } | 2997 } |
| 2972 | 2998 |
| 2973 class BlockScope extends MethodScope { | 2999 class BlockScope extends MethodScope { |
| 2974 BlockScope(Scope parent) : super(parent, parent.element); | 3000 BlockScope(Scope parent) : super(parent, parent.element); |
| 2975 | 3001 |
| 2976 String toString() => 'block${elements.getKeys()}'; | 3002 String toString() => 'block${elements.getKeys()}'; |
| 2977 } | 3003 } |
| 2978 | 3004 |
| 2979 /** | 3005 /** |
| 2980 * [ClassScope] defines the inner scope of a class/interface declaration in | 3006 * [ClassScope] defines the inner scope of a class/interface declaration in |
| 2981 * which declared members, declared type variables, entities in the enclosing | 3007 * which declared members, declared type variables, entities in the enclosing |
| 2982 * scope and inherited members are available, in the given order. | 3008 * scope and inherited members are available, in the given order. |
| 2983 */ | 3009 */ |
| 2984 class ClassScope extends TypeDeclarationScope { | 3010 class ClassScope extends TypeDeclarationScope { |
| 2985 bool inStaticContext = false; | 3011 bool inStaticContext = false; |
| 2986 | 3012 |
| 2987 ClassScope(Scope parentScope, ClassElement element) | 3013 ClassScope(Scope parentScope, ClassElement element) |
| 2988 : super(parentScope, element) { | 3014 : super(parentScope, element) { |
| 2989 assert(parent !== null); | 3015 assert(parent !== null); |
| 2990 } | 3016 } |
| 2991 | 3017 |
| 2992 Element localLookup(SourceString name) { | 3018 Element localLookup(SourceString name) { |
| 2993 ClassElement cls = element; | 3019 ClassElement cls = element; |
| 2994 Element result = cls.lookupLocalMember(name); | 3020 Element result = cls.lookupLocalMember(name); |
| 2995 if (result !== null) return result; | 3021 if (result !== null) return result; |
| 2996 if (!inStaticContext) { | 3022 result = super.localLookup(name); |
| 2997 // If not in a static context, we can lookup in the | |
| 2998 // TypeDeclaration scope, which contains the type variables of | |
| 2999 // the class. | |
| 3000 result = super.localLookup(name); | |
| 3001 } | |
| 3002 return result; | 3023 return result; |
| 3003 } | 3024 } |
| 3004 | 3025 |
| 3005 Element lookup(SourceString name) { | 3026 Element lookup(SourceString name) { |
| 3006 Element result = localLookup(name); | 3027 Element result = localLookup(name); |
| 3007 if (result !== null) return result; | 3028 if (result !== null) return result; |
| 3008 result = parent.lookup(name); | 3029 result = parent.lookup(name); |
| 3009 if (result !== null) return result; | 3030 if (result !== null) return result; |
| 3010 ClassElement cls = element; | 3031 ClassElement cls = element; |
| 3011 return cls.lookupSuperMember(name); | 3032 return cls.lookupSuperMember(name); |
| (...skipping 16 matching lines...) Expand all Loading... | |
| 3028 ClassElement origin, ClassElement this.patch) | 3049 ClassElement origin, ClassElement this.patch) |
| 3029 : super(parentScope, origin) { | 3050 : super(parentScope, origin) { |
| 3030 assert(parent !== null); | 3051 assert(parent !== null); |
| 3031 } | 3052 } |
| 3032 | 3053 |
| 3033 Element localLookup(SourceString name) { | 3054 Element localLookup(SourceString name) { |
| 3034 Element result = patch.lookupLocalMember(name); | 3055 Element result = patch.lookupLocalMember(name); |
| 3035 if (result !== null) return result; | 3056 if (result !== null) return result; |
| 3036 result = origin.lookupLocalMember(name); | 3057 result = origin.lookupLocalMember(name); |
| 3037 if (result !== null) return result; | 3058 if (result !== null) return result; |
| 3038 if (!inStaticContext) { | 3059 result = super.localLookup(name); |
| 3039 // If not in a static context, we can lookup in the | 3060 if (result !== null) return result; |
| 3040 // TypeDeclaration scope, which contains the type variables of | |
| 3041 // the class. | |
| 3042 result = super.localLookup(name); | |
| 3043 if (result !== null) return result; | |
| 3044 } | |
| 3045 result = parent.lookup(name); | 3061 result = parent.lookup(name); |
| 3046 if (result !== null) return result; | 3062 if (result !== null) return result; |
| 3047 return result; | 3063 return result; |
| 3048 } | 3064 } |
| 3049 | 3065 |
| 3050 Element lookup(SourceString name) { | 3066 Element lookup(SourceString name) { |
| 3051 Element result = localLookup(name); | 3067 Element result = localLookup(name); |
| 3052 if (result !== null) return result; | 3068 if (result !== null) return result; |
| 3053 // TODO(johnniwinther): Should we support patch lookup on supertypes? | 3069 // TODO(johnniwinther): Should we support patch lookup on supertypes? |
| 3054 return origin.lookupSuperMember(name); | 3070 return origin.lookupSuperMember(name); |
| (...skipping 81 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... | |
| 3136 return result; | 3152 return result; |
| 3137 } | 3153 } |
| 3138 Element lookup(SourceString name) => localLookup(name); | 3154 Element lookup(SourceString name) => localLookup(name); |
| 3139 Element lexicalLookup(SourceString name) => localLookup(name); | 3155 Element lexicalLookup(SourceString name) => localLookup(name); |
| 3140 | 3156 |
| 3141 Element add(Element newElement) { | 3157 Element add(Element newElement) { |
| 3142 throw "Cannot add an element in a patch library scope"; | 3158 throw "Cannot add an element in a patch library scope"; |
| 3143 } | 3159 } |
| 3144 String toString() => 'PatchLibraryScope($origin,$patch)'; | 3160 String toString() => 'PatchLibraryScope($origin,$patch)'; |
| 3145 } | 3161 } |
| OLD | NEW |