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

Side by Side Diff: pkg/front_end/lib/src/fasta/builder/scope.dart

Issue 2691523002: Ensure locations are always provided, but don't store them yet. (Closed)
Patch Set: Address comments. Created 3 years, 10 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) 2016, the Dart project authors. Please see the AUTHORS file 1 // Copyright (c) 2016, 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 fasta.scope; 5 library fasta.scope;
6 6
7 import 'builder.dart' show 7 import 'builder.dart' show
8 Builder, 8 Builder,
9 MixedAccessor; 9 MixedAccessor;
10 10
(...skipping 11 matching lines...) Expand all
22 /// Indicates whether an attempt to declare new names in this scope should 22 /// Indicates whether an attempt to declare new names in this scope should
23 /// succeed. 23 /// succeed.
24 final bool isModifiable; 24 final bool isModifiable;
25 25
26 Scope(this.local, this.parent, {this.isModifiable: true}); 26 Scope(this.local, this.parent, {this.isModifiable: true});
27 27
28 Scope createNestedScope({bool isModifiable: true}) { 28 Scope createNestedScope({bool isModifiable: true}) {
29 return new Scope(<String, Builder>{}, this, isModifiable: isModifiable); 29 return new Scope(<String, Builder>{}, this, isModifiable: isModifiable);
30 } 30 }
31 31
32 Builder lookup(String name) { 32 Builder lookup(String name, int charOffset, Uri fileUri) {
33 Builder builder = local[name]; 33 Builder builder = local[name];
34 if (builder != null) { 34 if (builder != null) {
35 if (builder.next != null) return lookupAmbiguous(name, builder, false); 35 if (builder.next != null) {
36 return builder.isSetter ? new AccessErrorBuilder(builder) : builder; 36 return lookupAmbiguous(name, builder, false, charOffset, fileUri);
37 }
38 return builder.isSetter
39 ? new AccessErrorBuilder(builder, charOffset, fileUri)
40 : builder;
37 } else { 41 } else {
38 return parent?.lookup(name); 42 return parent?.lookup(name, charOffset, fileUri);
39 } 43 }
40 } 44 }
41 45
42 Builder lookupSetter(String name) { 46 Builder lookupSetter(String name, int charOffset, Uri fileUri) {
43 Builder builder = local[name]; 47 Builder builder = local[name];
44 if (builder != null) { 48 if (builder != null) {
45 if (builder.next != null) return lookupAmbiguous(name, builder, true); 49 if (builder.next != null) {
50 return lookupAmbiguous(name, builder, true, charOffset, fileUri);
51 }
46 if (builder.isField) { 52 if (builder.isField) {
47 if (builder.isFinal) { 53 if (builder.isFinal) {
48 return new AccessErrorBuilder(builder); 54 return new AccessErrorBuilder(builder, charOffset, fileUri);
49 } else { 55 } else {
50 return builder; 56 return builder;
51 } 57 }
52 } else if (builder.isSetter) { 58 } else if (builder.isSetter) {
53 return builder; 59 return builder;
54 } else { 60 } else {
55 return new AccessErrorBuilder(builder); 61 return new AccessErrorBuilder(builder, charOffset, fileUri);
56 } 62 }
57 } else { 63 } else {
58 return parent?.lookupSetter(name); 64 return parent?.lookupSetter(name, charOffset, fileUri);
59 } 65 }
60 } 66 }
61 67
62 Builder lookupAmbiguous(String name, Builder builder, bool setter) { 68 Builder lookupAmbiguous(String name, Builder builder, bool setter,
69 int charOffset, Uri fileUri) {
63 assert(builder.next != null); 70 assert(builder.next != null);
64 if (builder is MixedAccessor) { 71 if (builder is MixedAccessor) {
65 return setter ? builder.setter : builder.getter; 72 return setter ? builder.setter : builder.getter;
66 } 73 }
67 Builder setterBuilder; 74 Builder setterBuilder;
68 Builder getterBuilder; 75 Builder getterBuilder;
69 Builder current = builder; 76 Builder current = builder;
70 while (current != null) { 77 while (current != null) {
71 if (current.isGetter && getterBuilder == null) { 78 if (current.isGetter && getterBuilder == null) {
72 getterBuilder = current; 79 getterBuilder = current;
73 } else if (current.isSetter && setterBuilder == null) { 80 } else if (current.isSetter && setterBuilder == null) {
74 setterBuilder = current; 81 setterBuilder = current;
75 } else { 82 } else {
76 return new AmbiguousBuilder(builder); 83 return new AmbiguousBuilder(builder, charOffset, fileUri);
77 } 84 }
78 current = current.next; 85 current = current.next;
79 } 86 }
80 assert(getterBuilder != null); 87 assert(getterBuilder != null);
81 assert(setterBuilder != null); 88 assert(setterBuilder != null);
82 return setter ? setterBuilder : getterBuilder; 89 return setter ? setterBuilder : getterBuilder;
83 } 90 }
84 91
85 // TODO(ahe): Rename to extend or something. 92 // TODO(ahe): Rename to extend or something.
86 void operator[]= (String name, Builder member) { 93 void operator[]= (String name, Builder member) {
87 if (isModifiable) { 94 if (isModifiable) {
88 local[name] = member; 95 local[name] = member;
89 } else { 96 } else {
90 internalError("Can't extend an unmodifiable scope."); 97 internalError("Can't extend an unmodifiable scope.");
91 } 98 }
92 } 99 }
93 } 100 }
94 101
95 class AccessErrorBuilder extends Builder { 102 class AccessErrorBuilder extends Builder {
96 final Builder builder; 103 final Builder builder;
97 104
98 AccessErrorBuilder(this.builder); 105 AccessErrorBuilder(this.builder, int charOffset, Uri fileUri)
106 : super(null, charOffset, fileUri);
99 107
100 Builder get parent => builder; 108 Builder get parent => builder;
101 109
102 get target => null; 110 get target => null;
103 111
104 bool get isFinal => builder.isFinal; 112 bool get isFinal => builder.isFinal;
105 113
106 bool get isField => builder.isField; 114 bool get isField => builder.isField;
107 115
108 bool get isRegularMethod => builder.isRegularMethod; 116 bool get isRegularMethod => builder.isRegularMethod;
(...skipping 11 matching lines...) Expand all
120 bool get isTypeDeclaration => builder.isTypeDeclaration; 128 bool get isTypeDeclaration => builder.isTypeDeclaration;
121 129
122 bool get isLocal => builder.isLocal; 130 bool get isLocal => builder.isLocal;
123 131
124 bool get hasProblem => true; 132 bool get hasProblem => true;
125 } 133 }
126 134
127 class AmbiguousBuilder extends Builder { 135 class AmbiguousBuilder extends Builder {
128 final Builder builder; 136 final Builder builder;
129 137
130 AmbiguousBuilder(this.builder); 138 AmbiguousBuilder(this.builder, int charOffset, Uri fileUri)
139 : super(null, charOffset, fileUri);
131 140
132 get target => null; 141 get target => null;
133 142
134 bool get hasProblem => true; 143 bool get hasProblem => true;
135 } 144 }
OLDNEW
« no previous file with comments | « pkg/front_end/lib/src/fasta/builder/procedure_builder.dart ('k') | pkg/front_end/lib/src/fasta/builder/type_builder.dart » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698