| OLD | NEW |
| 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 Loading... |
| 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 Loading... |
| 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 } |
| OLD | NEW |