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

Side by Side Diff: lib/compiler/implementation/resolver.dart

Issue 10996039: Bring type variables into static scope, but produce compile-time error when they are used. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Just rebased Created 8 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 | Annotate | Revision Log
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 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 1158 matching lines...) Expand 10 before | Expand all | Expand 10 after
1169 return element; 1169 return element;
1170 } 1170 }
1171 1171
1172 Element useElement(Node node, Element element) { 1172 Element useElement(Node node, Element element) {
1173 if (element === null) return null; 1173 if (element === null) return null;
1174 return mapping[node] = element; 1174 return mapping[node] = element;
1175 } 1175 }
1176 1176
1177 DartType useType(TypeAnnotation annotation, DartType type) { 1177 DartType useType(TypeAnnotation annotation, DartType type) {
1178 if (type !== null) { 1178 if (type !== null) {
1179 if (type.element.isTypeVariable() && enclosingElement.inStaticContext()) {
1180 error(annotation,
1181 MessageKind.CANNOT_ACCESS_TYPE_VARIABLE_IN_STATIC_CONTEXT,
1182 [type.name]);
1183 }
1179 mapping.setType(annotation, type); 1184 mapping.setType(annotation, type);
1180 useElement(annotation, type.element); 1185 useElement(annotation, type.element);
1181 } 1186 }
1182 return type; 1187 return type;
1183 } 1188 }
1184 1189
1185 void setupFunction(FunctionExpression node, FunctionElement function) { 1190 void setupFunction(FunctionExpression node, FunctionElement function) {
1186 // If [function] is the [enclosingElement], the [scope] has 1191 // If [function] is the [enclosingElement], the [scope] has
1187 // already been set in the constructor of [ResolverVisitor]. 1192 // already been set in the constructor of [ResolverVisitor].
1188 if (function != enclosingElement) scope = new MethodScope(scope, function); 1193 if (function != enclosingElement) scope = new MethodScope(scope, function);
(...skipping 1624 matching lines...) Expand 10 before | Expand all | Expand 10 after
2813 2818
2814 Element lexicalLookup(SourceString name) { 2819 Element lexicalLookup(SourceString name) {
2815 Element result = localLookup(name); 2820 Element result = localLookup(name);
2816 if (result != null) return result; 2821 if (result != null) return result;
2817 return parent.lexicalLookup(name); 2822 return parent.lexicalLookup(name);
2818 } 2823 }
2819 2824
2820 abstract Element localLookup(SourceString name); 2825 abstract Element localLookup(SourceString name);
2821 } 2826 }
2822 2827
2823 class VariableScope extends Scope {
2824 VariableScope(parent, element) : super(parent, element);
2825
2826 Element add(Element newElement) {
2827 throw "Cannot add element to VariableScope";
2828 }
2829
2830 Element localLookup(SourceString name) => null;
2831
2832 String toString() => '$element > $parent';
2833 }
2834
2835 /** 2828 /**
2836 * [TypeDeclarationScope] defines the outer scope of a type declaration in 2829 * [TypeDeclarationScope] defines the outer scope of a type declaration in
2837 * which the declared type variables and the entities in the enclosing scope are 2830 * which the declared type variables and the entities in the enclosing scope are
2838 * available but where declared and inherited members are not available. This 2831 * available but where declared and inherited members are not available. This
2839 * scope is only used for class/interface declarations during resolution of the 2832 * scope is only used for class/interface declarations during resolution of the
2840 * class hierarchy. In all other cases [ClassScope] is used. 2833 * class hierarchy. In all other cases [ClassScope] is used.
2841 */ 2834 */
2842 class TypeDeclarationScope extends Scope { 2835 class TypeDeclarationScope extends Scope {
2843 TypeDeclarationElement get element => super.element; 2836 TypeDeclarationElement get element => super.element;
2844 2837
(...skipping 49 matching lines...) Expand 10 before | Expand all | Expand 10 after
2894 2887
2895 String toString() => 'block${elements.getKeys()}'; 2888 String toString() => 'block${elements.getKeys()}';
2896 } 2889 }
2897 2890
2898 /** 2891 /**
2899 * [ClassScope] defines the inner scope of a class/interface declaration in 2892 * [ClassScope] defines the inner scope of a class/interface declaration in
2900 * which declared members, declared type variables, entities in the enclosing 2893 * which declared members, declared type variables, entities in the enclosing
2901 * scope and inherited members are available, in the given order. 2894 * scope and inherited members are available, in the given order.
2902 */ 2895 */
2903 class ClassScope extends TypeDeclarationScope { 2896 class ClassScope extends TypeDeclarationScope {
2904 bool inStaticContext = false;
2905
2906 ClassScope(Scope parentScope, ClassElement element) 2897 ClassScope(Scope parentScope, ClassElement element)
2907 : super(parentScope, element) { 2898 : super(parentScope, element) {
2908 assert(parent !== null); 2899 assert(parent !== null);
2909 } 2900 }
2910 2901
2911 Element localLookup(SourceString name) { 2902 Element localLookup(SourceString name) {
2912 ClassElement cls = element; 2903 ClassElement cls = element;
2913 Element result = cls.lookupLocalMember(name); 2904 Element result = cls.lookupLocalMember(name);
2914 if (result !== null) return result; 2905 if (result !== null) return result;
2915 if (!inStaticContext) { 2906 return super.localLookup(name);
2916 // If not in a static context, we can lookup in the
2917 // TypeDeclaration scope, which contains the type variables of
2918 // the class.
2919 result = super.localLookup(name);
2920 }
2921 return result;
2922 } 2907 }
2923 2908
2924 Element lookup(SourceString name) { 2909 Element lookup(SourceString name) {
2925 Element result = localLookup(name); 2910 Element result = localLookup(name);
2926 if (result !== null) return result; 2911 if (result !== null) return result;
2927 result = parent.lookup(name); 2912 result = parent.lookup(name);
2928 if (result !== null) return result; 2913 if (result !== null) return result;
2929 ClassElement cls = element; 2914 ClassElement cls = element;
2930 return cls.lookupSuperMember(name); 2915 return cls.lookupSuperMember(name);
2931 } 2916 }
(...skipping 123 matching lines...) Expand 10 before | Expand all | Expand 10 after
3055 return result; 3040 return result;
3056 } 3041 }
3057 Element lookup(SourceString name) => localLookup(name); 3042 Element lookup(SourceString name) => localLookup(name);
3058 Element lexicalLookup(SourceString name) => localLookup(name); 3043 Element lexicalLookup(SourceString name) => localLookup(name);
3059 3044
3060 Element add(Element newElement) { 3045 Element add(Element newElement) {
3061 throw "Cannot add an element in a patch library scope"; 3046 throw "Cannot add an element in a patch library scope";
3062 } 3047 }
3063 String toString() => 'PatchLibraryScope($origin,$patch)'; 3048 String toString() => 'PatchLibraryScope($origin,$patch)';
3064 } 3049 }
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698